tungsten 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -76,7 +76,7 @@
76
76
 
77
77
  function embed() {
78
78
  if (!document.querySelector('#esvg-svg-icons')) {
79
- document.querySelector('body').insertAdjacentHTML('afterbegin', '<svg id="esvg-svg-icons" data-symbol-class="svg-symbol" data-prefix="svg" version="1.1" style="height:0;position:absolute" data-turbolinks-permanent><symbol id="svg-angle-down" data-name="angle-down" viewBox="0 0 27 15" width="27" height="15" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M25.304.005c.092.012.116.012.206.036.135.037.263.097.377.177.348.244.545.665.508 1.088-.01.104-.032.207-.068.305-.048.132-.12.254-.21.36-.02.028-.046.053-.07.08l-12 12c-.025.022-.05.047-.077.07-.08.067-.17.123-.264.168-.32.148-.695.148-1.014 0-.095-.045-.184-.1-.264-.17-.027-.02-.052-.046-.077-.07l-12-12C.29 1.98.27 1.966.217 1.89c-.08-.114-.14-.242-.176-.377C-.08 1.066.074.578.428.28.535.19.658.12.788.073.92.025 1.06 0 1.2 0c.246 0 .49.076.69.217.076.053.09.072.16.134l11.15 11.153L24.352.35l.078-.07c.073-.056.09-.073.17-.12.122-.07.255-.118.393-.142.093-.016.116-.014.21-.018l.104.005z" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-down-circle" data-name="arrow-down-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.218 18.943l-5.243 5.243c-.226.282-.558.48-.95.48-.006 0-.01-.006-.018-.006-.008 0-.013.005-.02.005-.315 0-.63-.12-.87-.36l-5.36-5.362c-.483-.48-.483-1.26 0-1.738.478-.48 1.255-.48 1.737 0l3.3 3.3V9.323c0-.678.55-1.23 1.23-1.23.68 0 1.23.552 1.23 1.23V20.43l3.226-3.225c.48-.48 1.26-.48 1.738 0 .48.48.48 1.258 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-up-circle" data-name="arrow-up-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.294 14.798c-.24.24-.556.36-.87.36-.315 0-.627-.12-.868-.36l-3.303-3.305V22.68c0 .677-.548 1.23-1.23 1.23-.678 0-1.228-.553-1.228-1.23V11.57l-3.227 3.228c-.482.48-1.26.48-1.738 0-.482-.48-.482-1.258 0-1.737l5.243-5.247c.226-.282.56-.48.95-.48.008 0 .013.006.02.006.008 0 .013-.006.02-.006.327 0 .64.13.868.36l5.364 5.367c.48.48.48 1.26 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-backup" data-name="backup" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.04 23.89c-.905.073-1.812.11-2.706.11C8.047 24 2.484 22.656 0 20.483v2.85c0 3.364 5.856 6 13.334 6 1.358 0 2.66-.088 3.888-.25C16.452 27.787 16 26.28 16 24.667c0-.263.015-.522.04-.778zm-2.707-1.223c1.004 0 1.988-.047 2.943-.13.556-2.19 1.943-4.045 3.807-5.213-2.15.436-4.49.676-6.75.676C8.047 18 2.483 16.656 0 14.483V18c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.44V8.893C23.82 10.807 18.377 12 13.333 12 8.047 12 2.483 10.656 0 8.483V12c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.438V6c0-3.364-5.858-6-13.334-6S0 2.636 0 6c0 2.113 5.948 4.667 13.333 4.667z" fill-opacity=".502"/><path d="M28 25.333h-2.667V28c0 .368-.3.667-.666.667-.368 0-.667-.3-.667-.667v-2.667h-2.667c-.368 0-.666-.298-.666-.666 0-.368.298-.667.666-.667H24v-2.667c0-.368.3-.666.667-.666.366 0 .666.298.666.666V24H28c.367 0 .667.3.667.667 0 .368-.3.666-.667.666m-3.333-8c-4.044 0-7.334 3.29-7.334 7.334S20.623 32 24.667 32C28.71 32 32 28.71 32 24.667c0-4.044-3.29-7.334-7.333-7.334" fill-rule="nonzero"/></symbol><symbol id="svg-check-circle" data-name="check-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M24.925 12.745l-10.22 11.2-7.59-7.588c-.48-.483-.48-1.255 0-1.732.477-.483 1.252-.483 1.732 0l5.776 5.775 8.49-9.307c.457-.502 1.233-.536 1.733-.08.5.455.534 1.232.08 1.732" fill-rule="nonzero"/></symbol><symbol id="svg-cluster" data-name="cluster" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 32c-.056 0-.113-.002-.17-.005-.112-.007-.224-.02-.335-.04-.332-.06-.653-.18-.942-.354-.13-.078-.256-.167-.373-.266-.055-.047-.108-.096-.16-.147C9.604 26.8 5.2 22.397.813 17.98c-.076-.077-.148-.158-.214-.243-.127-.16-.236-.335-.324-.52-.09-.184-.157-.38-.203-.58C.023 16.43 0 16.215 0 16c0-.214.024-.43.073-.638.046-.2.114-.395.203-.58.088-.184.197-.358.323-.52.065-.084.137-.165.213-.242C5.2 9.604 9.603 5.2 14.02.813c.077-.076.158-.148.243-.214.16-.127.335-.236.52-.324.184-.09.38-.157.58-.203C15.57.023 15.785 0 16 0c.214 0 .43.024.638.073.2.046.395.114.58.203.184.088.358.197.52.323.084.065.165.137.242.213C22.396 5.2 26.8 9.603 31.187 14.02c.076.077.148.158.214.243.127.16.236.335.324.52.09.184.157.38.203.58.05.208.073.423.073.637 0 .214-.024.43-.073.638-.046.2-.114.395-.203.58-.088.184-.197.358-.323.52-.065.084-.137.165-.213.242-4.388 4.416-8.79 8.82-13.207 13.207-.052.05-.105.1-.16.147-.117.1-.242.188-.373.267-.275.166-.578.282-.892.345-.11.022-.223.038-.335.046-.05.005-.102.008-.152.01H16zm0-1.883c.055 0 .11-.005.164-.014.107-.02.21-.057.305-.112.068-.04.13-.087.187-.143 4.412-4.384 8.84-8.755 13.195-13.195.026-.027.052-.056.075-.087.042-.054.077-.113.106-.176.05-.112.08-.234.083-.356.005-.145-.023-.29-.083-.423-.03-.062-.064-.12-.106-.175-.023-.03-.05-.06-.075-.087-4.358-4.442-8.758-8.842-13.2-13.2-.027-.026-.056-.052-.087-.075-.054-.042-.113-.077-.176-.106-.112-.05-.234-.08-.356-.083-.145-.005-.29.023-.423.083-.06.028-.117.062-.17.102-.033.024-.063.05-.092.078-4.442 4.358-8.842 8.758-13.2 13.2l-.08.09c-.04.055-.073.112-.1.173-.06.133-.09.28-.084.424.004.122.032.244.083.355.03.062.064.12.106.175.023.03.05.06.075.087 4.358 4.442 8.758 8.842 13.2 13.2.055.053.116.1.183.14.088.05.184.087.284.106.056.012.112.018.17.02H16z" fill-opacity=".502" fill-rule="nonzero"/><path d="M17.482 26.93l-.847.846c-.17.17-.397.263-.635.263s-.466-.095-.635-.264l-11.14-11.14c-.17-.17-.264-.398-.264-.636s.095-.466.264-.635l11.14-11.14c.17-.17.398-.264.636-.264s.466.095.635.264l4.05 4.05v5.456c-.104.03-.205.064-.303.106-.27.116-.517.283-.725.49-.2.195-.362.426-.48.68-.102.22-.17.454-.2.695-.033.248-.025.5.022.745.04.213.11.42.21.614.122.244.288.466.487.654.193.18.416.33.658.438.2.09.412.15.628.18.11.015.22.022.328.023h.062c.11-.004.218-.014.326-.032.215-.036.425-.102.622-.195.243-.115.466-.273.656-.463s.348-.414.464-.657c.095-.2.162-.416.197-.636.038-.24.04-.488.002-.73-.038-.24-.112-.472-.22-.69-.123-.248-.292-.475-.494-.666-.214-.2-.465-.362-.738-.472-.08-.032-.164-.06-.25-.084V9.528l5.838 5.837c.17.17.263.397.263.635s-.095.466-.264.635l-6.64 6.64-4.508-4.51v-6.51c.13-.036.258-.083.38-.14.243-.116.466-.274.657-.464.187-.186.342-.405.457-.643.097-.2.164-.415.2-.634.042-.246.043-.5.005-.745-.036-.24-.11-.472-.218-.69-.125-.248-.293-.475-.496-.666-.214-.2-.465-.362-.737-.472-.144-.058-.294-.1-.447-.13-.15-.027-.306-.04-.46-.04-.15.003-.298.02-.444.05-.156.03-.31.08-.456.142-.27.116-.516.283-.725.49-.198.195-.36.426-.48.68-.102.218-.17.454-.2.695-.032.247-.024.5.023.744.04.214.11.422.21.615.12.24.283.46.478.645.195.186.422.338.668.448.106.047.216.087.328.118v6.768c.002.05 0 .06.01.11.016.09.05.176.104.25.028.04.037.048.07.084l4.693 4.694-1.88 1.88-6.962-6.962v-.81c.13-.036.258-.084.38-.142.244-.115.467-.273.657-.463s.348-.414.464-.657c.094-.2.16-.416.196-.636.038-.24.04-.488.002-.73-.037-.24-.11-.472-.218-.69-.124-.248-.293-.475-.495-.666-.214-.2-.465-.362-.738-.472-.144-.057-.293-.1-.446-.13-.15-.027-.305-.04-.46-.038-.154.002-.307.018-.458.05-.15.032-.3.08-.44.14-.27.116-.518.283-.726.49-.198.195-.362.426-.48.68-.102.22-.17.454-.2.695-.033.248-.025.5.022.745.043.223.118.44.223.64.125.238.29.455.487.638.19.178.41.323.647.43.107.046.217.086.33.117v1.07c0 .04 0 .05.005.09.012.088.044.173.092.25.017.024.035.048.054.07l.03.033 7.146 7.146zm-6.7-9.83c.055 0 .11-.005.166-.014.096-.014.19-.042.278-.08.103-.047.2-.11.283-.184.09-.08.168-.176.228-.28.05-.093.09-.19.114-.293.03-.13.035-.26.02-.39-.015-.11-.046-.217-.092-.318-.055-.12-.133-.23-.227-.324-.098-.096-.213-.174-.34-.228-.13-.057-.274-.087-.418-.09-.145 0-.29.025-.423.08-.125.05-.24.123-.34.215-.097.09-.178.2-.237.317-.05.1-.083.205-.1.313-.02.13-.018.262.007.39.02.1.055.2.102.29.053.102.123.196.204.277.087.085.187.156.297.21.09.042.183.073.28.09.055.01.11.015.167.017h.03zm10.53 0c.056 0 .112-.005.167-.014.095-.014.19-.042.277-.08.107-.05.206-.114.293-.192.087-.08.16-.172.22-.273.05-.09.087-.185.11-.285.032-.13.04-.264.022-.396-.014-.11-.045-.217-.09-.318-.056-.12-.134-.23-.228-.324-.098-.096-.213-.174-.34-.228-.13-.057-.274-.087-.418-.09-.145 0-.29.025-.423.08-.126.05-.24.123-.34.215-.097.09-.178.2-.237.317-.05.1-.083.205-.1.313-.02.13-.018.262.007.39.02.106.058.208.108.302.058.105.13.2.218.283.082.077.176.142.278.19.09.044.183.075.28.092.055.01.11.015.167.017h.028zM16 11.084c.056 0 .112-.004.168-.013.096-.014.19-.042.278-.08.103-.047.198-.11.283-.184.09-.08.167-.176.227-.282.05-.09.09-.185.112-.285.03-.128.037-.263.02-.395-.014-.11-.044-.217-.09-.317-.056-.12-.133-.23-.228-.324-.097-.096-.213-.174-.34-.23-.13-.055-.274-.085-.418-.087-.144-.002-.29.024-.423.078-.124.05-.24.124-.338.216-.097.092-.178.2-.237.318-.05.1-.083.204-.1.313-.02.13-.02.263.007.39.02.106.057.208.108.303.057.107.133.205.222.287.08.076.173.14.272.187.09.044.188.075.288.092.053.008.106.013.16.015H16z"/></symbol><symbol id="svg-copy" data-name="copy" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill-rule="nonzero"><path d="M22.667 4.667c0-.368-.3-.667-.667-.667h-3.333v10.495c1.208-.64 2.562-1.032 4-1.127v-8.7zM4 25.333V4H.667C.3 4 0 4.3 0 4.667V26c0 1.837 1.496 3.333 3.333 3.333h12.02c-.878-1.165-1.517-2.52-1.818-4H4z" fill-opacity=".302"/><path d="M14 12H7.333c-.368 0-.666.3-.666.667 0 .368.298.666.666.666H14c.368 0 .667-.298.667-.666 0-.368-.3-.667-.667-.667M14 14.667H7.333c-.368 0-.666.298-.666.666 0 .368.298.667.666.667H14c.368 0 .667-.3.667-.667 0-.368-.3-.666-.667-.666M14.667 18c0-.368-.3-.667-.667-.667H7.333c-.368 0-.666.3-.666.667 0 .368.298.667.666.667H14c.368 0 .667-.3.667-.667M7.333 20c-.368 0-.666.3-.666.667 0 .368.298.666.666.666h4c.368 0 .667-.298.667-.666 0-.368-.3-.667-.667-.667h-4z" fill-opacity=".502"/><path d="M6 9.333h10.667c.368 0 .666-.298.666-.666V3.333c0-.368-.298-.666-.666-.666h-2.06C14.33 1.115 13.087 0 11.333 0 9.687 0 8.363 1 8.06 2.667H6c-.368 0-.667.298-.667.666v5.334c0 .368.3.666.667.666" fill-opacity=".302"/><path d="M26.97 24H24v2.97c0 .367-.3.666-.667.666-.368 0-.666-.3-.666-.667V24h-2.97c-.368 0-.666-.3-.666-.667 0-.368.3-.666.667-.666h2.97v-2.97c0-.37.298-.666.666-.666.368 0 .667.298.667.667v2.97h2.97c.367 0 .666.298.666.666 0 .368-.3.667-.667.667m-3.637-9.333c-4.78 0-8.666 3.888-8.666 8.666 0 4.78 3.886 8.667 8.666 8.667S32 28.112 32 23.333c0-4.778-3.888-8.666-8.667-8.666"/></g></symbol><symbol id="svg-deployment" data-name="deployment" viewBox="0 0 176 201" width="176" height="201" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M88 5.985l82.272 47.5v95L88 195.985l-82.272-47.5v-95L88 5.985z"/></symbol><symbol id="svg-dice" data-name="dice" viewBox="0 0 45 32" width="45" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M30.762 10.232c1.183.684 1.59 2.2.906 3.382l-9.9 17.148c-.683 1.183-2.2 1.59-3.382.906l-17.148-9.9c-1.183-.684-1.59-2.2-.906-3.382l9.9-17.148c.684-1.183 2.2-1.59 3.382-.906l17.148 9.9z" fill-opacity=".149"/><path d="M22.13 5.25c.02-.002.04-.002.06-.002h19.803c1.366 0 2.475 1.11 2.475 2.475v19.802c0 1.366-1.11 2.475-2.475 2.475H22.208l2.44-4.23c.273.11.57.17.88.17 1.29 0 2.34-1.047 2.34-2.338 0-.75-.354-1.416-.902-1.844l4.702-8.144c.683-1.183.277-2.698-.906-3.382L22.13 5.25zm16.35 16.013c1.29 0 2.34 1.048 2.34 2.34 0 1.29-1.05 2.338-2.34 2.338-1.29 0-2.34-1.047-2.34-2.338 0-1.29 1.05-2.34 2.34-2.34zm0-11.956c1.29 0 2.34 1.048 2.34 2.34 0 1.29-1.05 2.338-2.34 2.338-1.29 0-2.34-1.048-2.34-2.34 0-1.29 1.05-2.338 2.34-2.338zM19.712 22.345c1.118.645 1.502 2.077.857 3.196-.647 1.12-2.08 1.502-3.197.857-1.118-.646-1.502-2.078-.856-3.196.645-1.117 2.077-1.5 3.195-.855zM17.093 13.93c1.118.645 1.502 2.077.856 3.195-.647 1.118-2.078 1.502-3.197.857-1.118-.646-1.5-2.078-.856-3.196.646-1.118 2.078-1.502 3.196-.856zM14.473 5.514c1.118.646 1.502 2.078.856 3.196-.646 1.118-2.078 1.502-3.196.856-1.118-.645-1.502-2.077-.856-3.195.645-1.118 2.077-1.5 3.195-.856z"/></symbol><symbol id="svg-download" data-name="download" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="none" d="M0 0h32.978v32H0z"/><path d="M15.5 28.627V16.92c.005-.1.015-.195.045-.29.08-.262.27-.48.515-.6.113-.054.23-.08.355-.095.074-.003.074-.003.148 0 .124.014.24.04.355.095.245.12.435.338.515.6.03.095.04.19.044.29v11.707l2.54-2.54.043-.04c.12-.1.25-.176.4-.216.13-.034.267-.042.4-.023.326.048.613.262.752.56.04.087.068.18.082.275.014.094.014.19 0 .286-.02.133-.066.26-.137.376-.03.05-.065.093-.102.138-1.38 1.462-2.842 2.844-4.264 4.266l-.03.03c-.052.048-.11.09-.17.126-.027.016-.055.03-.084.044-.108.05-.225.08-.344.09-.097.007-.196 0-.293-.022-.097-.022-.19-.06-.275-.108-.075-.043-.145-.097-.206-.158-1.45-1.37-2.82-2.818-4.227-4.227-.107-.112-.19-.24-.24-.387-.11-.332-.032-.707.2-.968.064-.07.138-.134.22-.184.15-.092.315-.136.49-.147.057 0 .057 0 .114.004.058.007.114.016.17.03.17.046.316.136.443.256l2.54 2.54zm10.424-4.984h-4.52c-.036-.002-.072-.002-.107-.006-.142-.015-.28-.062-.403-.136-.09-.054-.174-.124-.243-.206-.258-.305-.307-.748-.12-1.102.05-.094.116-.18.194-.254.13-.123.293-.21.467-.248.094-.02.12-.018.214-.023h4.444c.43-.075.854-.197 1.264-.348 1.132-.42 2.194-1.103 2.908-2.09.165-.23.31-.47.433-.724.287-.59.45-1.234.516-1.886.037-.383.045-.77.015-1.155-.033-.436-.117-.868-.25-1.285-.37-1.173-1.124-2.212-2.122-2.932-.48-.348-1.017-.62-1.583-.802-.42-.135-.857-.22-1.297-.257-.232-.02-.463-.022-.696-.016l-.103-.002c-.09-.012-.115-.01-.204-.037-.2-.058-.378-.18-.505-.345-.056-.073-.064-.095-.108-.176-.054-.113-.11-.224-.168-.335-.347-.65-.77-1.255-1.27-1.796-.6-.647-1.297-1.2-2.064-1.634-.824-.465-1.727-.79-2.66-.952-.792-.14-1.604-.164-2.403-.076-.8.088-1.588.292-2.33.604-.875.368-1.685.885-2.388 1.52-.775.702-1.418 1.546-1.887 2.48-.343.683-.593 1.414-.74 2.165-.07.373-.116.748-.14 1.127l-.013.104c-.008.035-.014.07-.024.104-.018.067-.045.133-.078.195-.133.248-.373.43-.65.495-.067.016-.137.024-.207.025-.035 0-.07-.003-.106-.004-.137-.02-.272-.048-.408-.068-.496-.063-.996-.043-1.483.073-1.008.242-1.902.874-2.468 1.74-.173.264-.315.55-.42.846-.11.308-.182.628-.215.953-.04.392-.025.794.03 1.184.075.536.243 1.06.54 1.517.09.14.19.27.3.393.632.704 1.546 1.09 2.458 1.275.34.07.692.116 1.04.12h5.17l.107.005c.094.015.118.015.21.046.168.056.32.16.436.295.07.082.125.175.165.274.04.1.063.204.07.31.018.363-.168.715-.478.9-.123.075-.26.122-.403.137-.035.004-.07.004-.107.006-1.744 0-3.49.014-5.233 0-.42-.012-.836-.057-1.247-.134-1.186-.223-2.346-.7-3.253-1.512-.167-.15-.324-.31-.47-.48-.177-.203-.337-.42-.48-.65-.397-.64-.645-1.363-.764-2.106-.047-.296-.074-.594-.084-.894-.01-.296-.003-.592.027-.887.047-.455.145-.905.292-1.338.338-.99.94-1.883 1.723-2.575.656-.578 1.436-1.01 2.274-1.26.61-.184 1.25-.265 1.888-.25l.06-.344c.067-.326.144-.648.238-.967.198-.665.462-1.31.788-1.923.66-1.243 1.576-2.348 2.672-3.23.883-.713 1.882-1.278 2.947-1.668.702-.256 1.43-.436 2.172-.536.337-.047.676-.074 1.017-.088.16-.005.323-.008.485-.007.918.012 1.83.137 2.715.385 1.845.518 3.527 1.556 4.828 2.963.575.622 1.068 1.313 1.48 2.053l.004.006c.092.005.185.01.277.018.102.008.202.018.302.03.23.03.46.065.687.114.57.12 1.128.308 1.657.556 1.148.54 2.155 1.364 2.912 2.38.57.768.998 1.64 1.252 2.562.277 1.007.338 2.06.218 3.097-.097.834-.322 1.654-.69 2.41-.173.356-.377.696-.608 1.016-.154.212-.32.415-.495.61-.903.992-2.076 1.712-3.33 2.176-.553.205-1.128.367-1.712.458-.047.006-.046.006-.093.01l-.068.003z"/></symbol><symbol id="svg-gear-circle" data-name="gear-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M24.253 6.97c.168.045.32.117.445.24.054.052.064.068.11.128 1.096 1.71 2.035 3.514 3.05 5.272.04.077.074.15.095.236.07.277.004.578-.175.8-.073.09-.16.16-.257.22l-1.64.95c.022.154.034.308.048.464.013.193.023.385.026.58.003.423-.023.842-.07 1.263v.013l1.64.95.072.044c.07.053.13.107.186.174.16.2.23.464.192.718-.013.086-.04.164-.073.244-.932 1.803-2.025 3.52-3.04 5.277-.046.073-.094.14-.156.2-.206.2-.5.294-.783.25-.114-.018-.216-.06-.318-.113l-1.635-.95c-.13.098-.262.188-.396.28-.19.123-.19.122-.384.242-.39.23-.787.435-1.2.623l-.013.006v1.91l-.004.084c-.013.086-.028.167-.06.248-.092.24-.285.432-.525.525-.08.03-.162.046-.247.058-2.03.094-4.062.004-6.094.004-.086-.005-.168-.012-.25-.036-.277-.078-.504-.286-.607-.552-.042-.11-.057-.218-.063-.333V25.08c-.142-.06-.282-.128-.422-.195-.203-.102-.203-.1-.404-.207-.404-.222-.79-.464-1.168-.73l-.027-.02-1.66.952-.074.038c-.08.033-.16.06-.245.073-.253.04-.517-.032-.716-.193-.07-.054-.122-.117-.175-.185C6.14 22.905 5.2 21.1 4.185 19.34c-.052-.1-.094-.203-.11-.318-.045-.282.048-.576.247-.78.06-.064.128-.11.2-.157l1.642-.948c-.02-.156-.033-.31-.046-.467-.014-.23-.014-.23-.023-.46-.006-.464.018-.922.07-1.382v-.014l-1.64-.947-.07-.046c-.07-.052-.13-.106-.186-.173-.162-.2-.232-.465-.193-.718.014-.087.04-.165.074-.245.935-1.803 2.03-3.518 3.047-5.276.062-.098.13-.184.22-.257.222-.18.523-.245.8-.176.084.02.16.056.235.096l1.652.95c.07-.052.143-.102.214-.152.19-.128.19-.128.385-.252.454-.278.92-.523 1.407-.743l.014-.006V4.96l.004-.085c.012-.085.027-.166.06-.247.09-.24.285-.433.524-.526.08-.03.162-.046.248-.058 2.028-.094 4.062-.004 6.093-.004.115.006.224.02.332.062.267.104.474.33.553.607.023.084.03.166.035.252V6.87c.142.06.28.13.42.196.202.102.2.102.4.208.4.224.782.466 1.154.733l.02.014 1.628-.946.076-.04c.138-.055.266-.08.414-.084.085.007.085.006.17.02zm-2.23 14.94c.118.025.22.06.325.115l1.38.8 2.08-3.607-1.39-.802c-.064-.04-.082-.05-.14-.1-.153-.132-.26-.313-.3-.51-.018-.087-.02-.17-.017-.258.028-.216.07-.43.098-.645.04-.37.067-.74.055-1.11-.015-.44-.068-.87-.143-1.304l-.01-.086c-.003-.088-.002-.17.016-.257.04-.198.147-.38.3-.51.058-.052.076-.06.14-.1l1.388-.803-2.08-3.605-1.375.798c-.07.035-.085.046-.158.072-.19.067-.402.07-.594.006-.084-.028-.157-.07-.232-.115-.123-.092-.24-.194-.362-.29-.348-.262-.71-.502-1.093-.71-.382-.21-.78-.386-1.187-.542l-.078-.034c-.066-.037-.084-.044-.145-.09-.16-.12-.277-.29-.332-.483-.024-.082-.03-.165-.035-.25V5.88h-4.168V7.49c-.004.086-.012.168-.036.252-.056.192-.174.363-.333.483-.06.045-.08.052-.145.09-.2.086-.402.16-.602.245-.745.337-1.446.748-2.072 1.276l-.07.052c-.074.047-.147.088-.23.116-.192.065-.404.064-.595-.003-.073-.024-.09-.035-.157-.07L8.33 9.125l-2.086 3.608 1.387.802c.066.04.083.05.142.1.153.132.26.314.3.512.018.087.02.17.016.258-.02.154-.05.307-.073.46-.058.43-.09.862-.08 1.297.01.437.065.868.14 1.297l.01.086c.004.077.007.096 0 .172-.023.202-.113.393-.253.54-.06.062-.13.11-.203.158l-1.39.802 2.084 3.61 1.403-.805c.078-.04.154-.075.24-.096.196-.048.407-.03.59.053.072.032.087.044.152.085.12.092.236.192.356.286.3.226.61.433.938.618.44.25.9.455 1.37.636l.08.034c.065.037.083.044.143.09.16.12.278.29.332.482.023.084.03.166.035.253v1.606h4.168v-1.607c.004-.087.01-.17.035-.253.055-.19.172-.363.332-.483.06-.045.078-.052.144-.09.197-.085.4-.16.598-.245.455-.207.895-.44 1.31-.716.26-.173.506-.362.745-.56l.07-.054c.064-.04.08-.052.15-.083.108-.05.218-.068.335-.078.086 0 .086 0 .172.01z"/><path d="M16.148 11.052c.698.026 1.378.18 2.01.484.533.257 1.02.613 1.43 1.042.41.43.74.934.97 1.48.19.45.313.93.363 1.415.052.498.027 1.005-.074 1.495-.314 1.533-1.372 2.853-2.797 3.497-.598.27-1.247.418-1.902.434-.658.016-1.32-.1-1.932-.34-.553-.22-1.066-.54-1.506-.938-.44-.4-.805-.876-1.075-1.403-.22-.432-.377-.896-.462-1.373-.08-.452-.1-.916-.052-1.374.06-.565.215-1.12.462-1.632.43-.89 1.13-1.643 1.987-2.137.637-.366 1.342-.573 2.073-.638.17-.01.336-.016.505-.013zm-.206 1.84c-.437.016-.863.112-1.257.302-.81.39-1.428 1.138-1.652 2.01-.09.354-.118.725-.08 1.088.032.33.12.652.255.954.153.34.37.65.632.91.263.264.573.48.912.632.374.17.78.26 1.19.27.413.012.826-.06 1.21-.21.347-.138.668-.338.944-.59.275-.248.504-.548.673-.878.137-.27.234-.56.288-.857.06-.336.063-.68.012-1.018-.14-.92-.71-1.743-1.514-2.207-.4-.23-.84-.358-1.297-.4-.107-.005-.212-.008-.318-.007z"/></g></symbol><symbol id="svg-gear" data-name="gear" viewBox="0 0 32 33" width="32" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M23.018 1.842c.258.022.51.08.746.185.198.088.386.2.553.338.132.106.25.227.355.36.336.432.486.97.495 1.51.007.384-.054.762-.14 1.135l-.584 2.148.02.02.02.02 2.14-.583.198-.046c.2-.04.402-.074.606-.088.42-.03.85.01 1.246.157.27.1.522.25.736.442.397.36.668.867.74 1.4.037.26.025.524-.03.78-.095.444-.313.85-.583 1.212-.125.166-.262.322-.403.474l-1.572 1.56.008.03.01.035c.716.19 1.426.4 2.148.567.09.026.09.026.18.055.195.065.385.137.57.227.36.176.698.41.962.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.09.224-.22.432-.377.615-.286.334-.66.58-1.055.76-.22.102-.45.18-.68.252l-2.142.566-.01.036-.008.03 1.567 1.554c.07.073.07.073.138.147.136.153.265.31.38.48.235.35.415.74.487 1.157.05.285.045.577-.016.86-.112.524-.418 1.012-.84 1.342-.193.15-.41.265-.64.345-.412.144-.858.17-1.29.128-.243-.023-.48-.068-.716-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.1.024.1.047.198.04.2.072.4.087.605.027.4-.007.81-.14 1.19-.092.27-.233.524-.42.742-.36.424-.888.713-1.44.79-.26.035-.525.023-.78-.032-.655-.14-1.208-.54-1.69-.988l-1.555-1.57-.03.01-.038.01-.563 2.132c-.03.098-.028.097-.06.194-.053.16-.11.32-.18.474-.19.415-.452.802-.804 1.094-.205.17-.44.305-.69.395-.506.18-1.083.173-1.586-.015-.246-.093-.475-.23-.674-.4-.36-.31-.616-.718-.8-1.15-.083-.19-.15-.387-.21-.585l-.566-2.14-.036-.01-.03-.01-1.555 1.568c-.073.07-.073.07-.147.138-.127.113-.257.22-.395.32-.354.253-.754.452-1.185.536-.28.054-.57.058-.852.006-.528-.097-1.024-.39-1.366-.804-.168-.204-.298-.438-.385-.687-.156-.446-.175-.927-.12-1.394.025-.206.066-.41.112-.612l.585-2.148-.02-.02-.02-.02-2.14.582-.198.046c-.166.034-.333.063-.502.08-.434.043-.88.015-1.296-.128-.27-.093-.524-.234-.742-.42-.423-.362-.713-.89-.79-1.442-.033-.24-.025-.484.02-.722.126-.677.537-1.25.997-1.745l1.57-1.56-.01-.03-.008-.036-2.134-.563-.194-.058c-.193-.065-.384-.138-.568-.227-.38-.185-.73-.434-1-.76-.17-.205-.306-.438-.395-.69-.186-.525-.173-1.127.038-1.644.1-.242.242-.466.417-.66.446-.496 1.07-.774 1.696-.968l2.142-.565.01-.035.008-.03-1.566-1.555-.14-.148c-.413-.467-.76-1.015-.865-1.64-.045-.262-.045-.532.003-.794.098-.527.392-1.024.807-1.365.203-.167.435-.296.683-.383.414-.145.86-.172 1.293-.13.242.022.48.068.716.122l2.147.585.02-.022.02-.02-.584-2.14c-.025-.1-.025-.1-.047-.2-.04-.2-.074-.4-.088-.604-.03-.42.01-.85.157-1.246.092-.25.228-.484.4-.687.35-.406.852-.69 1.38-.777.26-.044.527-.04.786.01.43.08.83.28 1.184.532.198.14.38.3.56.464l1.558 1.57.03-.008.036-.01.563-2.136.06-.193c.053-.16.11-.32.182-.474.18-.398.426-.77.757-1.057.232-.2.502-.358.794-.452.492-.158 1.044-.146 1.528.036.246.092.474.23.674.4.358.31.615.717.8 1.148.082.19.148.387.21.585l.565 2.142.035.01.032.008 1.553-1.566.148-.14c.453-.4.98-.738 1.58-.854.16-.03.32-.043.48-.043.062 0 .06 0 .123.005zm-6.932 7.48c.34.006.678.033 1.013.09.595.098 1.177.278 1.724.533 1.24.58 2.288 1.543 2.97 2.73.354.615.61 1.286.75 1.98.153.75.177 1.522.07 2.278-.094.68-.295 1.345-.593 1.964-.336.7-.797 1.34-1.353 1.883-.595.582-1.3 1.05-2.066 1.375-.794.336-1.65.513-2.513.525-.865.01-1.73-.146-2.536-.463-.774-.306-1.49-.76-2.1-1.327-.588-.548-1.076-1.2-1.434-1.92-.306-.614-.515-1.276-.618-1.954-.115-.755-.1-1.53.042-2.28.134-.696.38-1.37.726-1.99.654-1.172 1.664-2.133 2.865-2.73.59-.293 1.223-.498 1.872-.605.278-.045.56-.072.84-.084.115-.004.23-.005.344-.005z" fill-opacity=".149"/><path d="M23.018 1.842c.258.022.51.08.746.185.198.088.386.2.553.338.132.106.25.227.355.36.336.432.486.97.495 1.51.007.384-.054.762-.14 1.135l-.584 2.148.02.02.02.02 2.14-.583.198-.046c.2-.04.402-.074.606-.088.42-.03.85.01 1.246.157.27.1.522.25.736.442.397.36.668.867.74 1.4.037.26.025.524-.03.78-.095.444-.313.85-.583 1.212-.125.166-.262.322-.403.474l-1.572 1.56.008.03.01.035c.716.19 1.426.4 2.148.567.09.026.09.026.18.055.195.065.385.137.57.227.36.176.698.41.962.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.09.224-.22.432-.377.615-.286.334-.66.58-1.055.76-.22.102-.45.18-.68.252l-2.142.566-.01.036-.008.03 1.567 1.554c.07.073.07.073.138.147.136.153.265.31.38.48.235.35.415.74.487 1.157.05.285.045.577-.016.86-.112.524-.418 1.012-.84 1.342-.193.15-.41.265-.64.345-.412.144-.858.17-1.29.128-.243-.023-.48-.068-.716-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.1.024.1.047.198.04.2.072.4.087.605.027.4-.007.81-.14 1.19-.092.27-.233.524-.42.742-.36.424-.888.713-1.44.79-.26.035-.525.023-.78-.032-.655-.14-1.208-.54-1.69-.988l-1.555-1.57-.03.01-.038.01-.563 2.132c-.03.098-.028.097-.06.194-.053.16-.11.32-.18.474-.19.415-.452.802-.804 1.094-.205.17-.44.305-.69.395-.506.18-1.083.173-1.586-.015-.246-.093-.475-.23-.674-.4-.36-.31-.616-.718-.8-1.15-.083-.19-.15-.387-.21-.585l-.566-2.14-.036-.01-.03-.01-1.555 1.568c-.073.07-.073.07-.147.138-.127.113-.257.22-.395.32-.354.253-.754.452-1.185.536-.28.054-.57.058-.852.006-.528-.097-1.024-.39-1.366-.804-.168-.204-.298-.438-.385-.687-.156-.446-.175-.927-.12-1.394.025-.206.066-.41.112-.612l.585-2.148-.02-.02-.02-.02-2.14.582-.198.046c-.166.034-.333.063-.502.08-.434.043-.88.015-1.296-.128-.27-.093-.524-.234-.742-.42-.423-.362-.713-.89-.79-1.442-.033-.24-.025-.484.02-.722.126-.677.537-1.25.997-1.745l1.57-1.56-.01-.03-.008-.036-2.134-.563-.194-.058c-.193-.065-.384-.138-.568-.227-.38-.185-.73-.434-1-.76-.17-.205-.306-.438-.395-.69-.186-.525-.173-1.127.038-1.644.1-.242.242-.466.417-.66.446-.496 1.07-.774 1.696-.968l2.142-.565.01-.035.008-.03-1.566-1.555-.14-.148c-.413-.467-.76-1.015-.865-1.64-.045-.262-.045-.532.003-.794.098-.527.392-1.024.807-1.365.203-.167.435-.296.683-.383.414-.145.86-.172 1.293-.13.242.022.48.068.716.122l2.147.585.02-.022.02-.02-.584-2.14c-.025-.1-.025-.1-.047-.2-.04-.2-.074-.4-.088-.604-.03-.42.01-.85.157-1.246.092-.25.228-.484.4-.687.35-.406.852-.69 1.38-.777.26-.044.527-.04.786.01.43.08.83.28 1.184.532.198.14.38.3.56.464l1.558 1.57.03-.008.036-.01.563-2.136.06-.193c.053-.16.11-.32.182-.474.18-.398.426-.77.757-1.057.232-.2.502-.358.794-.452.492-.158 1.044-.146 1.528.036.246.092.474.23.674.4.358.31.615.717.8 1.148.082.19.148.387.21.585l.565 2.142.035.01.032.008 1.553-1.566.148-.14c.453-.4.98-.738 1.58-.854.16-.03.32-.043.48-.043.062 0 .06 0 .123.005zM12.783 25.575l.1.026c.126.04.252.08.38.117.21.06.423.11.638.158l.1.027c.086.034.11.04.188.087.147.09.27.22.348.372.043.082.046.105.075.192l.7 2.647c.024.084.05.167.082.248.022.057.045.114.07.17.017.036.03.062.05.098.015.03.03.057.047.087.065.11.153.235.277.286.068.027.147.032.22.024.05-.006.1-.022.144-.048.056-.033.104-.08.146-.13.06-.072.112-.154.156-.238.08-.156.14-.322.188-.49l.7-2.654c.03-.087.032-.11.075-.192.095-.184.25-.334.44-.42.143-.068.303-.09.456-.126.128-.03.127-.03.254-.064.17-.047.336-.097.502-.15l.1-.027c.092-.014.114-.02.207-.02.173.004.344.056.49.15.077.05.092.067.16.13l1.93 1.944c.062.058.127.116.194.17.048.04.096.078.146.113.03.022.06.04.09.06.03.02.057.036.087.053.11.062.25.127.382.108.074-.01.145-.045.204-.09.042-.03.077-.068.102-.113.032-.056.05-.12.06-.184.018-.094.02-.19.017-.285-.008-.174-.04-.347-.08-.516l-.726-2.662c-.02-.09-.03-.112-.033-.204-.01-.208.05-.416.17-.586.092-.128.218-.226.332-.332l.274-.27.27-.29.074-.07c.072-.057.088-.075.168-.12.15-.08.324-.12.495-.113.093.004.115.013.204.032l2.653.72c.085.02.17.037.256.05.06.01.12.02.182.025.036.003.073.006.11.007.032.002.066.003.1.002.126-.002.28-.015.384-.096.058-.046.102-.113.132-.18.02-.048.032-.098.03-.15 0-.064-.017-.128-.04-.19-.03-.09-.077-.173-.128-.253-.094-.148-.21-.28-.33-.408l-1.95-1.935c-.062-.068-.08-.083-.13-.16-.112-.175-.163-.386-.145-.592.008-.092.017-.114.04-.203.04-.126.08-.253.117-.38.058-.21.11-.423.158-.637l.028-.1c.034-.084.04-.108.087-.186.09-.148.22-.27.372-.35.082-.04.105-.044.192-.073l2.648-.698c.083-.025.166-.052.247-.083l.168-.07.1-.05c.03-.015.056-.03.086-.048.11-.065.235-.153.285-.276.027-.07.032-.15.023-.222-.005-.05-.02-.1-.047-.145-.033-.057-.08-.104-.128-.146-.073-.062-.155-.112-.24-.156-.155-.08-.32-.14-.49-.188l-2.653-.7c-.088-.028-.11-.032-.193-.074-.184-.096-.334-.252-.42-.44-.067-.143-.09-.303-.126-.455-.03-.125-.064-.25-.1-.377-.037-.127-.075-.254-.116-.38l-.026-.1c-.013-.09-.02-.114-.018-.206.003-.173.055-.343.148-.49.05-.076.068-.09.13-.16L27.78 10c.058-.065.116-.13.17-.196.04-.048.077-.096.113-.146.02-.03.042-.06.06-.09.018-.027.038-.06.053-.087.062-.11.127-.25.11-.38-.01-.072-.044-.138-.084-.196-.03-.045-.072-.084-.12-.11-.057-.032-.12-.05-.184-.062-.094-.017-.19-.02-.286-.015-.176.007-.348.04-.518.08l-2.66.726c-.088.02-.11.028-.202.032-.207.01-.415-.05-.585-.17-.075-.052-.09-.07-.154-.136l-.27-.29c-.153-.153-.31-.304-.47-.45l-.072-.074c-.056-.072-.073-.088-.118-.168-.083-.152-.123-.325-.115-.497.004-.09.013-.113.032-.203l.722-2.654c.02-.085.037-.17.05-.255.01-.06.018-.12.024-.18.004-.038.006-.07.008-.11v-.1c0-.127-.014-.28-.096-.385-.044-.056-.107-.097-.17-.127-.05-.024-.105-.038-.16-.037-.065 0-.13.016-.19.037-.09.033-.173.078-.254.13-.148.094-.28.21-.408.33l-1.933 1.948c-.068.062-.082.08-.16.13-.174.11-.384.163-.59.145-.092-.008-.114-.018-.202-.04-.126-.04-.252-.08-.38-.116-.21-.058-.423-.11-.638-.157l-.1-.027c-.085-.034-.11-.04-.188-.087-.148-.09-.27-.22-.35-.373-.042-.082-.045-.105-.074-.193L16.692 2.8c-.025-.084-.052-.166-.083-.248l-.07-.168c-.024-.05-.048-.097-.074-.144-.016-.03-.03-.054-.048-.08-.065-.1-.148-.21-.263-.252-.066-.025-.142-.03-.21-.02-.052.004-.1.02-.146.046-.056.033-.103.08-.144.128-.062.073-.113.155-.157.24-.082.156-.14.32-.19.49l-.7 2.655c-.028.088-.03.11-.074.193-.095.185-.252.335-.44.422-.144.066-.304.088-.457.123-.127.032-.253.064-.378.1-.128.036-.255.075-.38.115l-.1.025c-.092.013-.114.02-.206.018-.172-.003-.342-.055-.487-.148-.078-.05-.093-.068-.16-.13L10 4.222c-.064-.06-.128-.117-.196-.172-.047-.038-.095-.076-.145-.11-.03-.022-.062-.043-.093-.063-.028-.018-.056-.035-.085-.05-.112-.063-.25-.128-.382-.11-.07.01-.138.044-.196.084-.047.033-.084.073-.112.122-.032.056-.05.12-.06.182-.017.094-.02.19-.015.285.007.174.04.346.08.515l.727 2.66c.02.09.027.112.032.204.01.206-.05.413-.17.582-.052.076-.07.09-.135.155l-.287.27c-.155.154-.305.31-.45.47l-.075.073c-.072.057-.088.075-.17.12-.15.082-.324.123-.496.115-.092-.004-.115-.013-.204-.032L4.914 8.8c-.084-.02-.17-.037-.255-.05-.06-.01-.12-.02-.182-.025l-.11-.008h-.1c-.13 0-.287.015-.394.103-.052.042-.09.102-.12.163-.023.05-.036.104-.035.16 0 .064.016.128.038.19.032.088.078.173.13.254.094.148.208.28.33.407l1.947 1.934c.062.068.08.083.13.16.112.175.163.384.145.59-.008.092-.018.114-.04.203-.04.127-.08.254-.117.382-.058.21-.11.423-.157.638L6.1 14c-.035.085-.04.108-.088.187-.09.147-.22.27-.373.35-.083.04-.106.045-.194.073l-2.647.698c-.084.025-.166.052-.247.083l-.17.07c-.034.017-.065.032-.098.05-.03.016-.057.03-.087.048-.11.066-.236.154-.286.277-.028.07-.034.15-.025.223.005.05.02.1.047.144.033.056.08.103.13.145.072.06.154.112.24.156.154.08.32.138.488.187l2.655.7c.087.03.11.033.192.076.183.095.333.25.42.44.067.143.09.303.124.455.032.127.065.253.1.378.037.128.075.255.115.38l.025.1c.013.092.02.115.018.206-.003.173-.055.343-.148.488-.05.077-.068.092-.13.16l-1.943 1.93c-.06.064-.117.128-.172.195-.04.048-.076.096-.11.146-.023.03-.043.06-.063.09-.018.03-.035.058-.05.087-.063.112-.128.25-.11.382.01.07.044.138.083.196.032.045.072.084.12.11.057.032.12.05.183.06.094.018.19.02.285.016.176-.008.35-.04.52-.083l2.66-.72c.09-.02.112-.03.204-.033.206-.01.413.05.583.17.075.052.09.07.154.135.088.097.178.192.27.287.153.155.31.305.47.453l.072.073c.057.072.074.088.118.17.083.15.123.323.115.495-.004.093-.013.115-.032.204L8.8 27.087c-.02.084-.037.17-.05.254-.01.06-.02.122-.024.183-.004.037-.007.074-.008.11-.002.035-.002.066-.002.1.003.128.016.28.098.386.046.058.112.102.18.132.047.02.098.032.15.03.064 0 .128-.016.188-.038.09-.033.175-.078.255-.13.148-.094.28-.208.407-.33l1.935-1.95c.067-.06.082-.08.16-.13.115-.073.248-.122.384-.14.092-.01.115-.007.207-.004l.103.015zM16.086 9.32c.34.008.678.035 1.013.09.595.1 1.177.28 1.724.535 1.24.58 2.288 1.543 2.97 2.73.354.615.61 1.286.75 1.98.153.75.177 1.522.07 2.278-.094.68-.295 1.345-.593 1.964-.336.7-.797 1.34-1.353 1.883-.595.582-1.3 1.05-2.066 1.375-.794.336-1.65.513-2.513.525-.865.01-1.73-.146-2.536-.463-.774-.306-1.49-.76-2.1-1.327-.588-.548-1.076-1.2-1.434-1.92-.306-.614-.515-1.276-.618-1.954-.115-.755-.1-1.53.042-2.28.134-.696.38-1.37.726-1.99.654-1.172 1.664-2.133 2.865-2.73.59-.293 1.223-.498 1.872-.605.278-.045.56-.072.84-.084.115-.004.23-.005.344-.005zm-.148 1.884c-.68.012-1.348.16-1.964.447-.54.253-1.034.608-1.446 1.04-.386.405-.7.877-.925 1.39-.198.453-.325.937-.375 1.43-.055.545-.018 1.1.112 1.633.092.38.23.747.414 1.092.515.975 1.364 1.756 2.38 2.186.57.243 1.186.37 1.804.377.622.008 1.243-.103 1.82-.332.558-.22 1.072-.544 1.51-.952.423-.394.774-.863 1.032-1.38.21-.423.356-.876.433-1.34.087-.524.087-1.06 0-1.584-.074-.447-.212-.882-.408-1.29-.47-.974-1.27-1.775-2.245-2.244-.612-.295-1.278-.45-1.955-.47-.062-.002-.125-.003-.187-.002z" fill-rule="nonzero"/></symbol><symbol id="svg-heart-circle" data-name="heart-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M11.228 6.83c.45.027.894.1 1.326.234 1.488.46 2.712 1.564 3.47 2.912.08-.146.172-.287.263-.427.49-.72 1.086-1.355 1.816-1.83.545-.357 1.15-.617 1.785-.762.565-.13 1.15-.166 1.727-.112.482.046.958.155 1.413.32.416.152.815.353 1.186.594.934.607 1.685 1.475 2.174 2.473.358.732.576 1.527.66 2.336.04.374.056.753.034 1.13-.044.792-.254 1.57-.55 2.304-.44 1.098-1.07 2.116-1.77 3.068-1.223 1.67-2.673 3.174-4.192 4.577-1.256 1.16-2.568 2.265-3.944 3.282l-.07.048c-.258.144-.545.194-.83.106-.085-.025-.16-.063-.236-.106-.177-.12-.346-.253-.517-.383-1.207-.932-2.376-1.913-3.497-2.948C10.3 22.56 9.173 21.415 8.15 20.18c-.7-.848-1.355-1.74-1.905-2.693-.41-.71-.762-1.46-.998-2.244-.15-.503-.252-1.02-.282-1.546-.018-.323-.01-.648.018-.97.08-.96.346-1.906.81-2.753.443-.812 1.065-1.524 1.817-2.064.397-.285.83-.52 1.285-.7.578-.226 1.183-.35 1.802-.385.178-.006.354-.006.53 0zm9.778 2.024c-.31.012-.615.058-.912.15-.224.07-.44.162-.646.275-1.17.64-1.877 1.87-2.267 3.106-.065.206-.12.414-.172.624l-.026.086c-.067.17-.16.32-.3.44-.4.342-1.016.315-1.385-.06-.107-.11-.178-.238-.234-.38-.055-.186-.1-.375-.153-.562-.377-1.234-1.023-2.467-2.154-3.163-.153-.093-.312-.177-.477-.247-.367-.155-.76-.245-1.155-.265-.336-.018-.674.015-1 .093-.28.068-.55.167-.805.295-.833.418-1.49 1.13-1.88 1.973-.228.492-.365 1.024-.422 1.563-.042.407-.044.816.02 1.22.104.646.344 1.267.633 1.852.446.902 1.02 1.738 1.638 2.53.806 1.03 1.7 1.992 2.636 2.908 1.277 1.253 2.635 2.42 4.043 3.524l.036.027c1.015-.783 1.997-1.613 2.945-2.478.787-.717 1.55-1.46 2.276-2.24.978-1.05 1.903-2.167 2.65-3.395.47-.777.887-1.617 1.075-2.512.098-.474.11-.953.06-1.433-.054-.506-.177-1.005-.38-1.47-.35-.803-.937-1.496-1.693-1.94-.248-.148-.513-.266-.788-.353-.324-.103-.657-.155-.995-.166h-.17z" fill-rule="nonzero"/></symbol><symbol id="svg-lock-circle" data-name="lock-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M9.558 11.134c0-.338.007-.676.01-1.014.03-.753.17-1.492.446-2.194.668-1.696 2.063-3.057 3.775-3.683.658-.24 1.345-.362 2.044-.388.166-.002.165-.002.332 0 .7.026 1.386.147 2.045.388 1.712.626 3.108 1.987 3.776 3.683.277.702.416 1.44.445 2.194.005.338.01.676.013 1.014.634.02 1.27.044 1.903.07.077.01.15.02.223.046.24.083.44.267.542.5.042.095.062.192.074.294.18 4.31.004 8.627.004 12.94-.005.103-.017.202-.05.3-.083.24-.267.44-.5.542-.095.042-.192.062-.294.075-5.534.23-11.078.004-16.617.004-.103-.004-.2-.016-.3-.05-.24-.083-.44-.266-.542-.5-.042-.095-.062-.19-.074-.293-.18-4.31-.004-8.627-.004-12.94.005-.103.017-.2.05-.3.083-.24.267-.44.5-.542.095-.04.192-.062.294-.074.634-.026 1.27-.05 1.904-.07zm13.794 1.905H8.648v11.026h14.704V13.04zm-8.303 5.247c-.57-.347-.92-.992-.886-1.667.01-.183.046-.365.11-.538.07-.195.176-.378.31-.54.15-.18.334-.332.54-.444.244-.132.507-.2.782-.22.095-.002.094-.002.188 0 .275.02.538.088.78.22.208.112.394.264.544.445.132.16.237.344.31.54.062.172.098.354.108.537.034.682-.324 1.333-.902 1.677.023 1.03.043 2.06-.018 3.085-.015.147-.057.287-.136.413-.218.35-.656.514-1.05.392-.105-.032-.204-.083-.29-.15-.097-.074-.18-.168-.24-.274-.066-.118-.103-.246-.116-.38-.06-1.03-.073-2.065-.035-3.096zm5.54-7.204c.003-.305.007-.61.003-.917-.022-.575-.134-1.138-.36-1.67-.522-1.234-1.586-2.2-2.867-2.6-.517-.16-1.062-.227-1.603-.2-.496.026-.986.13-1.448.313-.516.202-.994.5-1.404.873-.436.397-.796.878-1.052 1.41-.283.588-.426 1.223-.45 1.873-.005.306 0 .612.002.917 3.06-.07 6.12-.07 9.18 0z"/></symbol><symbol id="svg-logo" data-name="logo" viewBox="0 0 54 32" width="54" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M32.207 25.946L21.72 32l-11.234-6.486L0 19.46V6.485L11.235 0 21.72 6.054 32.207 0 43.44 6.486l10.487 6.055v12.974L42.693 32l-10.486-6.054zm.66-1.343V14.27l9.054 5.19.003 10.378-9.055-5.235zm-20.884.046V14.27l9.085 5.218.002 10.44-9.086-5.28zM1.498 18.594V8.215l8.988 5.19v10.38l-8.988-5.19zM21.72 7.785l8.99 5.188-8.99 5.19-8.988-5.19 8.99-5.19zm20.973 0l8.988 5.188-8.987 5.19-8.99-5.19 8.99-5.19zM11.235 1.728l8.988 5.19-8.988 5.188-8.99-5.19 8.99-5.188zm20.97 0l8.99 5.19-8.99 5.188-8.987-5.19 8.988-5.188z"/><path d="M1.437 18.643L1.442 8.11l19.652 11.35.01 10.545L1.436 18.643zm31.37 6l.03-10.464 9.147 5.243-.01 10.582-9.168-5.363z" fill-opacity=".345"/></symbol><symbol id="svg-message-circle" data-name="message-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M17.342 23.582l-3.53 3.53-.066.06c-.12.088-.245.155-.392.185-.38.076-.778-.112-.96-.455-.072-.133-.1-.272-.107-.42v-2.9c-.087 0-.174-.002-.26-.003l-.41-.022c-.333-.03-.665-.072-.994-.14-.64-.132-1.266-.344-1.856-.63-1.33-.643-2.473-1.658-3.273-2.9-.457-.713-.8-1.496-1.012-2.314-.203-.783-.284-1.597-.243-2.405.043-.864.228-1.718.546-2.52.357-.9.877-1.73 1.527-2.446.692-.76 1.53-1.388 2.455-1.836.71-.343 1.47-.58 2.248-.7.335-.05.672-.077 1.01-.09 2.665-.034 5.33-.034 7.996 0 .338.013.674.04 1.01.09.778.12 1.54.357 2.248.7.926.448 1.763 1.075 2.454 1.836.65.715 1.17 1.547 1.527 2.445.32.802.505 1.656.55 2.52.04.807-.04 1.62-.244 2.404-.212.818-.556 1.6-1.013 2.313-.87 1.353-2.146 2.434-3.627 3.063-.668.283-1.374.475-2.094.567-.336.043-.672.06-1.01.065h-2.48zm.123-5.826c.128.01.25.04.364.1.097.05.186.12.26.203.267.305.29.767.058 1.1-.055.078-.122.146-.198.203-.143.106-.31.16-.485.175-2.205.06-4.412.06-6.617 0-.176-.014-.342-.07-.485-.175-.326-.242-.448-.69-.29-1.063.037-.088.088-.17.15-.24.074-.084.163-.154.26-.205.115-.06.237-.09.365-.1 2.205-.058 4.412-.058 6.617 0zm3.747-2.847c.18.017.35.075.493.19.373.293.447.846.166 1.228-.07.096-.16.178-.263.24-.122.07-.255.107-.395.12-3.457.117-6.92.117-10.376 0-.18-.017-.35-.075-.494-.19-.372-.293-.447-.846-.165-1.228.07-.096.16-.178.264-.24.123-.07.255-.107.396-.12 3.457-.117 6.92-.117 10.376 0zm0-2.85c.14.015.273.05.395.123.103.06.193.143.264.24.282.38.208.934-.165 1.228-.144.115-.312.173-.493.192-3.457.115-6.92.115-10.376 0-.18-.02-.35-.077-.494-.19-.372-.295-.447-.848-.165-1.23.07-.096.16-.178.264-.24.123-.07.255-.107.396-.12 3.457-.117 6.92-.117 10.376 0z"/></symbol><symbol id="svg-no-circle" data-name="no-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M16.288 3.93c.48.018.958.052 1.434.12 1.2.174 2.37.53 3.463 1.053 2.135 1.02 3.95 2.69 5.153 4.727.596 1.01 1.042 2.104 1.32 3.242.272 1.12.384 2.28.33 3.43-.06 1.254-.318 2.495-.76 3.67-1.17 3.098-3.644 5.633-6.713 6.877-1.43.58-2.97.878-4.515.878-1.544 0-3.084-.3-4.515-.88-2.284-.925-4.256-2.57-5.59-4.642-.555-.866-1-1.805-1.315-2.785-.355-1.1-.55-2.25-.577-3.404-.028-1.154.11-2.31.412-3.425.318-1.18.82-2.31 1.48-3.34 1.2-1.866 2.92-3.39 4.92-4.347 1.092-.524 2.264-.88 3.463-1.052.476-.068.954-.102 1.434-.12.29-.003.288-.003.576 0zM23.67 9.8L9.874 23.597c.736.59 1.556 1.074 2.432 1.43 1.17.474 2.432.718 3.695.718s2.524-.244 3.695-.72c2.51-1.017 4.536-3.09 5.49-5.625.363-.96.573-1.976.622-3 .05-1.023-.062-2.053-.33-3.04-.26-.966-.67-1.89-1.21-2.73-.183-.288-.383-.565-.596-.83zM22.13 8.256c-.58-.465-1.213-.865-1.885-1.186-.894-.427-1.852-.718-2.833-.86-.39-.056-.78-.083-1.175-.098-.235-.003-.234-.003-.47 0-.394.015-.785.042-1.175.1-.98.14-1.94.43-2.833.86-1.637.783-3.044 2.03-4.025 3.557-.54.84-.95 1.764-1.21 2.73-.246.912-.36 1.86-.338 2.803.023.946.182 1.888.472 2.788.26.802.62 1.57 1.076 2.276.184.287.384.564.597.83l13.798-13.8z"/></symbol><symbol id="svg-pencil-circle" data-name="pencil-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.925 18.165c3.857-4.193 8.057-8.058 12.086-12.087.123-.112.256-.198.417-.24.07-.02.088-.02.16-.03.08-.002.08-.002.162 0 .07.01.088.01.158.03.134.035.248.1.357.185 1.634 1.497 3.137 3.132 4.704 4.7.055.06.106.12.147.192.136.236.16.526.068.782-.037.104-.094.192-.16.28-3.865 4.216-8.087 8.09-12.132 12.135l-.022.02c-.07.066-.15.12-.237.16-.022.012-.044.022-.067.032-2.164.718-4.384 1.256-6.577 1.882-.137.033-.27.047-.41.024-.357-.06-.654-.332-.746-.684-.035-.136-.033-.27-.013-.408.53-2.22 1.252-4.39 1.878-6.582.006-.02.013-.037.02-.055.034-.095.084-.186.148-.267l.016-.02.017-.02c.008-.01.016-.02.025-.028zm.16 5.796l3.335-.952c-.81-.77-1.616-1.546-2.39-2.35l-.944 3.303zm5.185-1.852l7.013-7.013-3.33-3.33-7.032 7.03c1.14 1.082 2.28 2.164 3.35 3.313zm4.996-11.658l3.33 3.33L24 11.38l-3.332-3.332-2.402 2.402z"/></symbol><symbol id="svg-plus-circle" data-name="plus-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.24 17.376h-5.792v5.792c0 .8-.65 1.448-1.448 1.448-.8 0-1.448-.648-1.448-1.448v-5.792H8.76c-.8 0-1.448-.65-1.448-1.448 0-.8.65-1.448 1.448-1.448h5.792V8.688c0-.8.65-1.448 1.448-1.448.8 0 1.448.65 1.448 1.448v5.792h5.792c.8 0 1.448.65 1.448 1.448 0 .8-.65 1.448-1.448 1.448" fill-rule="nonzero"/></symbol><symbol id="svg-progress-circle" data-name="progress-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M16 21.288c-.58 0-1.048.47-1.048 1.048v3.52c0 .58.47 1.05 1.048 1.05.578 0 1.048-.47 1.048-1.05v-3.52c0-.58-.47-1.048-1.048-1.048" fill-opacity=".502"/><path d="M25.955 14.9l-3.458-.008c-.597.013-1.05.467-1.05 1.046-.002.58.467 1.05 1.046 1.05l3.458.007h.003c.577 0 1.046-.468 1.048-1.046 0-.58-.467-1.05-1.045-1.05" fill-opacity=".251"/><path d="M16.025 2.832h-.003c-.577 0-1.045.468-1.047 1.046l-.01 5.46c-.002.58.466 1.05 1.044 1.05h.002c.578 0 1.046-.467 1.047-1.045l.01-5.46c.002-.58-.466-1.05-1.045-1.05"/><path d="M13.75 20.81c-.536-.223-1.148.03-1.37.565l-1.375 3.298c-.223.534.03 1.147.563 1.37.133.054.27.082.403.082.412 0 .8-.243.97-.647l1.373-3.297c.224-.533-.028-1.147-.562-1.37" fill-opacity=".6"/><path d="M19.604 21.393c-.22-.537-.833-.79-1.367-.572-.535.22-.79.833-.57 1.37l1.354 3.298c.168.406.56.65.97.65.133 0 .27-.024.398-.078.536-.22.79-.833.572-1.367l-1.356-3.3z" fill-opacity=".4"/><path d="M9.5 16.964h.002c.578 0 1.046-.468 1.048-1.046 0-.58-.467-1.05-1.046-1.05L6.05 14.86h-.003C5.47 14.86 5 15.33 5 15.908c-.003.578.465 1.05 1.045 1.05l3.455.007z" fill-opacity=".902"/><path d="M21.075 13.83c.166.405.557.65.97.65.132 0 .267-.026.398-.08l3.158-1.296c.535-.22.79-.833.57-1.366-.22-.535-.83-.793-1.367-.57l-3.158 1.294c-.536.22-.79.833-.57 1.367" fill-opacity=".2"/><path d="M10.992 17.99c-.22-.536-.83-.794-1.367-.57l-3.228 1.332c-.535.22-.79.833-.57 1.366.167.405.558.65.97.65.13 0 1.557-.558 1.688-.613l1.938-.798c.535-.22.79-.833.57-1.367" fill-opacity=".8"/><path d="M21.28 19.75c-.407-.408-1.07-.41-1.48-.002-.41.41-.412 1.072-.002 1.482l2.482 2.49c.205.204.475.308.743.308s.535-.103.74-.306c.41-.41.41-1.07.003-1.482l-2.485-2.49z" fill-opacity=".349"/><path d="M19.902 12.04c.205.205.474.308.743.308.268 0 .536-.102.74-.305l2.405-2.397c.41-.41.412-1.072.002-1.482-.408-.41-1.07-.41-1.48-.003l-2.405 2.398c-.412.41-.412 1.07-.005 1.482" fill-opacity=".149"/><path d="M18.13 10.813c.132.054.27.08.403.08.41 0 .8-.242.968-.645l1.292-3.107c.223-.532-.03-1.145-.564-1.368-.535-.222-1.15.032-1.37.565l-1.292 3.106c-.222.534.03 1.147.564 1.37" fill-opacity=".102"/><path d="M13.176 6.326c-.22-.535-.834-.793-1.368-.57-.534.222-.79.834-.57 1.37l1.287 3.115c.166.406.556.65.97.65.13 0 .267-.025.397-.08.536-.22.79-.833.57-1.367l-1.286-3.117zM10.626 12.015c.204.205.473.308.742.308.267 0 .535-.102.74-.305.41-.41.41-1.073.002-1.482l-2.393-2.4c-.41-.41-1.072-.41-1.48-.002-.412.41-.413 1.07-.005 1.482l2.394 2.4z"/><path d="M12.186 19.73c-.41-.412-1.072-.413-1.482-.004L8.208 22.21c-.41.41-.41 1.072-.002 1.482.204.206.472.308.743.308.265 0 .533-.1.737-.305l2.495-2.485c.41-.408.41-1.07.004-1.48" fill-opacity=".702"/><path d="M25.59 18.787l-3.214-1.338c-.534-.223-1.148.03-1.37.563-.222.535.03 1.148.565 1.37l3.214 1.34c.13.054.268.08.403.08.41 0 .8-.243.967-.644.223-.537-.03-1.15-.564-1.373" fill-opacity=".302"/><path d="M6.407 13.07l3.16 1.314c.13.054.267.08.4.08.41 0 .8-.243.968-.646.223-.533-.03-1.146-.564-1.37l-3.156-1.314c-.535-.222-1.15.03-1.37.564-.223.535.03 1.148.563 1.37"/></g></symbol><symbol id="svg-progress" data-name="progress" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill="none"/><g fill-rule="nonzero"><path d="M16 22.915c-.758 0-1.37.613-1.37 1.37v4.605c0 .756.612 1.37 1.37 1.37.756 0 1.37-.614 1.37-1.37v-4.605c0-.757-.614-1.37-1.37-1.37" fill-opacity=".502"/><path d="M29.018 14.56l-4.522-.008c-.78.016-1.373.61-1.373 1.367-.002.756.61 1.37 1.368 1.372l4.522.01h.003c.755 0 1.367-.612 1.37-1.37 0-.755-.61-1.37-1.367-1.37" fill-opacity=".251"/><path d="M16.033.242h-.002c-.754 0-1.367.61-1.37 1.367l-.015 5.68c0 .755.61 1.37 1.367 1.372h.003c.756 0 1.37-.61 1.37-1.368l.016-5.68c.003-.757-.61-1.37-1.367-1.372"/><path d="M13.06 22.29c-.703-.292-1.503.04-1.795.738L9.468 27.34c-.29.7.04 1.5.736 1.79.174.074.352.11.528.11.537 0 1.045-.318 1.266-.846l1.796-4.31c.292-.7-.037-1.503-.735-1.793" fill-opacity=".6"/><path d="M20.713 23.052c-.287-.702-1.09-1.035-1.788-.748-.7.287-1.035 1.09-.747 1.79l1.773 4.313c.22.53.73.85 1.27.85.172 0 .35-.032.52-.1.7-.29 1.033-1.09.747-1.79l-1.774-4.315z" fill-opacity=".4"/><path d="M7.5 17.26h.003c.755 0 1.368-.61 1.37-1.367 0-.758-.61-1.372-1.367-1.373l-4.518-.01h-.003c-.756 0-1.37.612-1.37 1.368-.003.757.61 1.372 1.367 1.373l4.52.01z" fill-opacity=".902"/><path d="M22.636 13.162c.218.53.73.85 1.267.85.174 0 .35-.034.522-.105l4.13-1.694c.698-.287 1.033-1.09.744-1.786-.29-.7-1.088-1.037-1.79-.745l-4.13 1.692c-.7.287-1.032 1.09-.744 1.788" fill-opacity=".2"/><path d="M9.45 18.602c-.287-.7-1.085-1.04-1.787-.745l-4.22 1.74c-.7.29-1.033 1.09-.745 1.788.217.53.728.85 1.267.85.172 0 2.036-.73 2.208-.8l2.534-1.045c.7-.288 1.033-1.09.744-1.788" fill-opacity=".8"/><path d="M22.906 20.904c-.533-.534-1.4-.537-1.937-.002-.537.534-.54 1.4-.004 1.937l3.246 3.255c.27.267.62.402.97.402.352 0 .7-.134.97-.4.536-.534.537-1.4.003-1.937l-3.25-3.256z" fill-opacity=".349"/><path d="M21.103 10.822c.267.268.62.402.97.402.352 0 .7-.133.97-.398l3.144-3.135c.536-.534.538-1.4.003-1.937-.535-.535-1.4-.537-1.938-.004L21.11 8.883c-.54.535-.54 1.4-.007 1.938" fill-opacity=".149"/><path d="M18.786 9.217c.173.07.35.106.526.106.536 0 1.047-.318 1.266-.844l1.69-4.064c.29-.697-.04-1.5-.74-1.79-.7-.29-1.5.04-1.792.738l-1.69 4.06c-.29.7.04 1.5.74 1.793" fill-opacity=".102"/><path d="M12.307 3.35c-.29-.7-1.09-1.037-1.79-.744-.698.288-1.032 1.09-.743 1.79l1.682 4.074c.216.528.727.848 1.267.848.173 0 .35-.033.52-.105.7-.287 1.034-1.09.746-1.787L12.306 3.35zM8.973 10.79c.267.267.618.4.97.4.35 0 .7-.132.967-.397.536-.535.54-1.403.003-1.938l-3.13-3.137c-.533-.537-1.4-.538-1.936-.004-.537.535-.54 1.4-.004 1.938l3.13 3.137z"/><path d="M11.012 20.876c-.536-.537-1.402-.538-1.937-.004l-3.265 3.25c-.535.533-.537 1.4-.002 1.936.267.27.618.403.97.403.35 0 .7-.13.967-.398l3.263-3.25c.536-.533.537-1.4.004-1.936" fill-opacity=".702"/><path d="M28.54 19.645l-4.203-1.75c-.697-.29-1.5.04-1.79.738-.29.698.04 1.5.738 1.792l4.202 1.75c.17.07.35.106.526.106.537 0 1.045-.317 1.264-.842.292-.7-.038-1.502-.737-1.793" fill-opacity=".302"/><path d="M3.456 12.167l4.13 1.72c.172.07.35.105.526.105.537 0 1.047-.318 1.264-.846.292-.697-.038-1.498-.737-1.79l-4.13-1.72c-.698-.29-1.5.04-1.79.74-.292.698.038 1.5.736 1.79"/></g></symbol><symbol id="svg-question-circle" data-name="question-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M17.46 17.292v3.053c0 .807-.653 1.46-1.46 1.46-.807 0-1.46-.653-1.46-1.46v-4.33c0-.804.653-1.46 1.46-1.46 1.584 0 2.87-1.284 2.87-2.868 0-1.584-1.286-2.87-2.87-2.87s-2.87 1.286-2.87 2.87c0 .806-.654 1.46-1.46 1.46-.81 0-1.462-.654-1.462-1.46 0-3.194 2.598-5.792 5.792-5.792s5.792 2.598 5.792 5.792c0 2.69-1.84 4.956-4.33 5.605M16 25.398c-.798 0-1.444-.643-1.444-1.444 0-.795.646-1.438 1.444-1.438.798 0 1.444.643 1.444 1.438 0 .8-.646 1.444-1.444 1.444" fill-rule="nonzero"/></symbol><symbol id="svg-refresh-circle" data-name="refresh-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.628 10.107l-1.048 4.12c-.012.046-.044.086-.064.135-.172.46-.638.794-1.13.794-.033 0-.065-.01-.1-.012-.032-.003-.06-.008-.09-.013-.038-.006-.077-.004-.114-.013l-4.117-1.05c-.66-.168-1.06-.836-.893-1.497.17-.663.836-1.062 1.502-.89l1.462.37c-.506-.614-1.122-1.137-1.842-1.53-1.47-.81-3.17-.99-4.775-.526-1.613.47-2.945 1.538-3.75 3.01-.81 1.47-1 3.168-.526 4.777.967 3.327 4.46 5.247 7.785 4.276.655-.185 1.338.185 1.525.838.193.654-.182 1.336-.838 1.53-.813.235-1.632.35-2.44.35-3.79 0-7.29-2.486-8.402-6.302-.653-2.246-.392-4.608.732-6.656 1.125-2.046 2.98-3.533 5.224-4.19 2.242-.65 4.604-.393 6.65.73 1.015.56 1.893 1.298 2.598 2.173l.26-1.03c.17-.662.842-1.064 1.5-.89.658.166 1.058.837.89 1.497" fill-rule="nonzero"/></symbol><symbol id="svg-restore" data-name="restore" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill="none"/><path d="M24.34 7.216c-2.384-2.223-5.49-3.388-8.75-3.273-3.396.12-6.64 1.703-8.9 4.348-1.456 1.707-2.397 3.723-2.777 5.888l-1.456-2.193c-.356-.535-1.076-.68-1.612-.325-.535.354-.682 1.076-.325 1.61l3.478 5.24c.415.658 1.42.695 1.9.057l4.02-4.575c.423-.483.375-1.217-.107-1.642-.482-.422-1.216-.374-1.64.107l-1.982 2.256c.295-1.81 1.06-3.496 2.27-4.91 1.838-2.152 4.467-3.44 7.212-3.536 2.638-.096 5.154.85 7.085 2.65 1.93 1.8 3.044 4.244 3.136 6.883.094 2.638-.846 5.153-2.647 7.085-1.8 1.93-4.246 3.044-6.884 3.136-.643.023-1.145.56-1.123 1.203.023.628.538 1.122 1.163 1.122h.04c3.26-.114 6.28-1.49 8.503-3.874 2.225-2.385 3.387-5.494 3.272-8.75-.114-3.26-1.49-6.28-3.874-8.504" fill-rule="nonzero"/></symbol><symbol id="svg-search-circle" data-name="search-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.716 13.77c0-3.362 2.738-6.102 6.105-6.102 3.363 0 6.1 2.74 6.1 6.103 0 3.365-2.737 6.105-6.1 6.105-3.366 0-6.104-2.74-6.104-6.104m18.19 10.785l-5.88-5.882c1.073-1.353 1.74-3.042 1.74-4.902 0-4.38-3.564-7.948-7.945-7.948-4.383 0-7.95 3.567-7.95 7.95 0 4.382 3.567 7.95 7.95 7.95 1.857 0 3.548-.67 4.9-1.744l5.883 5.882c.18.18.415.27.652.27.236 0 .472-.09.65-.27.363-.358.363-.943 0-1.305" fill-rule="nonzero"/></symbol><symbol id="svg-star-circle" data-name="star-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.08 5.155c.28.025.535.142.71.367.053.067.09.137.126.213l2.607 6.106h6.06l.082.005c.17.022.325.07.466.17.376.263.512.773.317 1.188-.06.13-.15.233-.254.328l-5.213 4.342 2.63 7.014.025.08c.04.167.048.33.004.5-.118.445-.554.75-1.014.708-.172-.016-.323-.08-.467-.174l-6.136-4.38L9.89 26l-.072.046c-.15.08-.307.13-.48.132-.462.002-.87-.34-.947-.796-.028-.17-.004-.333.05-.496l2.628-7.014-5.213-4.34-.062-.057c-.096-.104-.175-.215-.224-.35-.16-.43.02-.926.418-1.156.15-.087.308-.122.478-.13h6.062l2.632-6.108.036-.074c.042-.072.086-.14.144-.2.155-.167.354-.258.576-.296.082-.007.082-.007.164-.007zm-2.045 8.02c-.035.072-.072.14-.12.205-.13.168-.316.29-.522.343-.08.02-.156.026-.236.03h-4.05l3.706 3.084.062.057c.058.063.11.125.154.2.097.17.14.37.123.567-.01.087-.03.166-.057.247l-1.768 4.717 4.14-2.955.072-.047c.076-.04.15-.076.233-.098.19-.052.397-.043.583.025.08.03.15.072.223.12l4.14 2.954-1.768-4.717-.026-.08c-.02-.083-.034-.164-.035-.25 0-.197.06-.393.175-.554.05-.07.107-.128.17-.186l3.705-3.084h-4.05l-.078-.004c-.08-.01-.157-.024-.234-.05-.26-.09-.45-.283-.566-.528l-1.98-4.637c-.665 1.547-1.33 3.093-1.997 4.64z" fill-rule="nonzero"/></symbol><symbol id="svg-status-failed" data-name="status-failed" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.217 26.67c-.754 0-1.362-.61-1.362-1.36 0-.752.608-1.36 1.362-1.36.75 0 1.36.608 1.36 1.36 0 .75-.61 1.36-1.36 1.36M14.97 13.06c0-.688.558-1.247 1.247-1.247.688 0 1.247.56 1.247 1.247v8.163c0 .69-.56 1.248-1.247 1.248-.69 0-1.248-.557-1.248-1.248v-8.163zm17.423 17.32L17.65.89c-.026-.05-.06-.08-.086-.126-.192-.312-.477-.54-.816-.66 0 0 .003-.004.005-.004C16.58.04 16.403 0 16.217 0c-.567 0-1.063.294-1.348.76-.025.043-.058.076-.08.118L.133 30.194c-.195.386-.175.846.052 1.212.23.37.63.594 1.063.594H31.21c.69 0 1.247-.56 1.247-1.247 0-.13-.027-.252-.064-.372" fill-rule="nonzero"/></symbol><symbol id="svg-status-partial" data-name="status-partial" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm.013 2.472v27.055l.102.01c1.764-.014 3.52-.375 5.147-1.064 1.555-.658 2.982-1.61 4.19-2.79 1.168-1.142 2.13-2.492 2.82-3.97.566-1.21.95-2.5 1.135-3.82.207-1.478.17-2.99-.11-4.454-.24-1.25-.66-2.463-1.24-3.594-1.32-2.57-3.46-4.69-6.05-5.977-1.19-.594-2.468-1.007-3.78-1.226-.565-.095-1.133-.147-1.703-.173-.17-.004-.34-.015-.51.002z"/><path d="M16.013 2.472v27.055l.102.01c1.764-.014 3.52-.375 5.147-1.064 1.555-.658 2.982-1.61 4.19-2.79 1.168-1.142 2.13-2.492 2.82-3.97.566-1.21.95-2.5 1.135-3.82.207-1.478.17-2.99-.11-4.454-.24-1.25-.66-2.463-1.24-3.594-1.32-2.57-3.46-4.69-6.05-5.977-1.19-.594-2.468-1.007-3.78-1.226-.565-.095-1.133-.147-1.703-.173-.17-.004-.34-.015-.51.002z" fill-opacity=".149"/></symbol><symbol id="svg-status-pending" data-name="status-pending" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M20 18.666h-6.666V8c0-.736.596-1.332 1.332-1.332C15.404 6.668 16 7.264 16 8v8h4c.738 0 1.334.596 1.334 1.334 0 .74-.596 1.332-1.334 1.332M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol><symbol id="svg-sync-circle" data-name="sync-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.754 19.267c-1.384 3.912-5.102 6.538-9.254 6.538-2.776 0-5.45-1.168-7.36-3.014v.833c0 .68-.547 1.227-1.227 1.227-.677 0-1.227-.547-1.227-1.227v-4.77c0-.678.55-1.228 1.227-1.228h4.77c.68 0 1.228.55 1.228 1.227 0 .678-.547 1.227-1.226 1.227h-2.668c1.41 1.958 3.88 3.27 6.484 3.27 3.114 0 5.905-1.97 6.943-4.903.223-.638.922-.974 1.565-.748.638.225.972.93.746 1.567M6.294 12.78c1.383-3.91 5.1-6.537 9.254-6.537 2.775 0 5.453 1.17 7.36 3.018v-.835c0-.675.547-1.227 1.227-1.227.677 0 1.227.552 1.227 1.227v4.77c0 .68-.55 1.227-1.227 1.227h-4.77c-.678 0-1.228-.547-1.228-1.227 0-.677.55-1.227 1.227-1.227h2.667c-1.407-1.956-3.88-3.27-6.482-3.27-3.115 0-5.905 1.97-6.94 4.902-.18.503-.653.818-1.157.818-.136 0-.273-.02-.408-.07-.64-.227-.975-.927-.75-1.567" fill-rule="nonzero"/></symbol><symbol id="svg-thumbs-up-circle" data-name="thumbs-up-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.07 18.6c.78 0 1.413.634 1.413 1.415 0 .78-.632 1.414-1.413 1.414h-.943c.78 0 1.414.632 1.414 1.413 0 .78-.632 1.414-1.413 1.414H16c-3.77 0-2.828-1.886-10.37-1.886V13.89h2.83c3.298 0 7.07-3.037 7.07-7.54 0-1.49 2.827-1.68 2.827 1.148 0 1.885-.943 5.45-.943 5.45h7.54c.782 0 1.415.633 1.415 1.413s-.634 1.413-1.415 1.413h-.943c.782 0 1.414.634 1.414 1.414 0 .782-.632 1.414-1.414 1.414h-.942" fill-rule="nonzero"/></symbol><symbol id="svg-warning-circle" data-name="warning-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.898 17.985c0 .493-.4.892-.892.892s-.89-.4-.89-.892V13.12c0-.49.398-.89.89-.89s.892.4.892.89v4.865zm-.892 3.242c-.446 0-.81-.364-.81-.81 0-.45.364-.81.81-.81.448 0 .81.36.81.81 0 .446-.362.81-.81.81m9.614 1.837L16.803 5.43c-.303-.605-1.29-.605-1.594 0L6.293 23.26c-.14.276-.125.604.04.866.16.264.448.425.757.425h17.867c.492 0 .892-.4.892-.89 0-.23-.087-.44-.23-.596" fill-rule="nonzero"/></symbol><symbol id="svg-x-circle" data-name="x-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.484 21.68c.478.477.478 1.254 0 1.732-.24.24-.554.36-.868.36-.31 0-.625-.12-.865-.36L16 17.662l-5.75 5.75c-.24.24-.555.36-.866.36-.314 0-.628-.12-.868-.36-.478-.478-.478-1.255 0-1.733l5.752-5.752-5.752-5.75c-.478-.477-.478-1.253 0-1.73.478-.48 1.255-.48 1.735 0L16 14.195l5.75-5.75c.48-.48 1.256-.48 1.734 0s.478 1.255 0 1.733l-5.752 5.748 5.752 5.75z" fill-rule="nonzero"/></symbol><symbol id="svg-buttons" data-name="buttons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M326.9 41c1.6 0 3 1.4 3 3v29.8c0 1.6-1.4 3-3 3H140.8c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h186.1m0-5H140.8c-4.4 0-8 3.6-8 8v29.8c0 4.4 3.6 8 8 8h186.1c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8z"/><path fill="#8c9ba5" d="M198.7 54.1h70.2v9.6h-70.2z"/><path fill="#dd2f41" d="M327.4 94.1H140.6c-4.2 0-7.7 3.5-7.7 7.7v30.4c0 4.2 3.5 7.7 7.7 7.7h186.7c4.2 0 7.7-3.5 7.7-7.7v-30.4c.1-4.2-3.4-7.7-7.6-7.7zm-58.6 27.7h-70.2v-9.6h70.2v9.6z"/><path fill="#297adf" d="M327.1 152.2H140.9c-4.4 0-7.9 3.6-7.9 7.9V190c0 4.4 3.6 7.9 7.9 7.9h186.2c4.4 0 7.9-3.6 7.9-7.9v-29.9c.1-4.3-3.5-7.9-7.9-7.9zm-58.3 27.6h-70.2v-9.6h70.2v9.6z"/></symbol><symbol id="svg-cards" data-name="cards" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M405.9 36H258.5c-4.5 0-8.1 3.6-8.1 8.1v145.8c0 4.5 3.6 8.1 8.1 8.1h147.4c4.5 0 8.1-3.6 8.1-8.1V44.1c0-4.5-3.6-8.1-8.1-8.1zm-150.4 8.1c0-1.6 1.4-3 3-3h147.4c1.6 0 3 1.4 3 3V156H255.5V44.1zM209.6 40.7c1.6 0 3 1.4 3 3v146.1c0 1.6-1.4 3-3 3H61.9c-1.6 0-3-1.4-3-3v-146c0-1.6 1.4-3 3-3h147.7m0-5.1H61.9c-4.5 0-8.1 3.7-8.1 8.1v146.1c0 4.5 3.7 8.1 8.1 8.1h147.7c4.5 0 8.1-3.7 8.1-8.1V43.8c.1-4.5-3.6-8.1-8.1-8.1z"/><path fill="#fff" d="M401.5 187.1h-53.6c-1.9 0-3.5-1.6-3.5-3.5v-12.7c0-1.9 1.6-3.5 3.5-3.5h53.6c1.9 0 3.5 1.6 3.5 3.5v12.7c0 1.9-1.6 3.5-3.5 3.5z"/></symbol><symbol id="svg-color-wheel" data-name="color-wheel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#2ac84f" d="M306.8 81.8c-7.9-16.1-20.9-29.1-37-37-.8.8-1.4 1.8-1.9 2.8l-11.3 26.2-11.2 26.2c-2.1 4.8 1.4 8.2 6.2 6.2l26.2-11.3L304 83.6c1-.4 2-1.1 2.8-1.8z"/><path fill="#59a702" d="M310.6 91.1c-1.1 0-2.2.3-3.3.7l-26.5 10.6-26.5 10.6c-4.9 1.9-4.9 6.8 0 8.7l26.5 10.6 26.5 10.6c1.1.4 2.2.6 3.3.7 2.8-8.2 4.3-17 4.3-26.2s-1.5-18.1-4.3-26.3z"/><path fill="#efc102" d="M306.8 152.7c-.8-.8-1.8-1.4-2.8-1.9l-26.2-11.3-26.2-11.3c-4.8-2.1-8.2 1.4-6.2 6.2l11.3 26.2 11.3 26.2c.5 1.1 1.1 2 1.9 2.8 15.9-7.8 29-20.8 36.9-36.9z"/><path fill="#f69524" d="M234.3 197.9c9.2 0 18-1.5 26.2-4.3 0-1.1-.3-2.2-.7-3.3l-10.6-26.5-10.6-26.5c-1.9-4.9-6.8-4.9-8.7 0l-10.6 26.5-10.6 26.5c-.4 1.1-.6 2.2-.7 3.3 8.3 2.8 17.1 4.3 26.3 4.3z"/><path fill="#f96623" d="M217.1 128.3l-26.2 11.3-26.2 11.3c-1.1.5-2 1.1-2.8 1.9 7.9 16.1 20.9 29.1 37 37 .8-.8 1.4-1.8 1.9-2.8l11.3-26.2 11.3-26.2c1.9-4.9-1.5-8.3-6.3-6.3z"/><path fill="#a81d27" d="M214.3 112.9l-26.5-10.6-26.5-10.6c-1.1-.4-2.2-.6-3.3-.7-2.8 8.2-4.3 17-4.3 26.2s1.5 18 4.3 26.2c1.1 0 2.2-.3 3.3-.7l26.5-10.6 26.5-10.6c4.8-1.8 4.8-6.7 0-8.6z"/><path fill="#a346ce" d="M161.8 81.8c.8.8 1.8 1.4 2.8 1.9L190.8 95l26.2 11.3c4.8 2.1 8.2-1.4 6.2-6.2L212 73.8l-11.3-26.2c-.5-1.1-1.1-2-1.9-2.8-16 7.8-29.1 20.9-37 37z"/><path fill="#297adf" d="M234.3 36.6c-9.2 0-18 1.5-26.2 4.3 0 1.1.3 2.2.7 3.3l10.6 26.5L230 97.2c1.9 4.9 6.8 4.9 8.7 0l10.6-26.5 10.6-26.5c.4-1.1.6-2.2.7-3.3-8.3-2.8-17.1-4.3-26.3-4.3z"/></symbol><symbol id="svg-dialog" data-name="dialog" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#fff" d="M177.8 170.8c-3 0-5.5-2.5-5.5-5.5V63.7c0-3 2.5-5.5 5.5-5.5h112.4c3 0 5.5 2.5 5.5 5.5v101.6c0 3-2.5 5.5-5.5 5.5H177.8z"/><path fill="#d6dde7" d="M290.2 60.7c1.6 0 3 1.4 3 3v101.6c0 1.6-1.4 3-3 3H177.8c-1.6 0-3-1.4-3-3V63.7c0-1.6 1.4-3 3-3h112.4m0-5H177.8c-4.4 0-8 3.6-8 8v101.6c0 4.4 3.6 8 8 8h112.4c4.4 0 8-3.6 8-8V63.7c0-4.4-3.6-8-8-8z"/><path fill="#297adf" d="M260.4 158.2h-52.9c-1.9 0-3.5-1.6-3.5-3.5v-12.5c0-1.9 1.6-3.5 3.5-3.5h52.9c1.9 0 3.5 1.6 3.5 3.5v12.5c0 1.9-1.5 3.5-3.5 3.5z"/></symbol><symbol id="svg-feedback" data-name="feedback" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill="#f96623"><path fill-opacity=".48" d="M315.294 144.15l-4.098 10.1L250.69 129.7l4.097-10.1z"/><path d="M217.264 104.368l-4.1 10.1-60.506-24.553 4.1-10.1z"/><path fill-opacity=".24" d="M206.906 198.23l-10.1-4.098 24.553-60.507 10.1 4.098z"/><path fill-opacity=".72" d="M246.706 100.272l-10.1-4.098 24.553-60.507 10.098 4.098z"/><path fill-opacity=".36" d="M272.328 193.588l-10.04 4.245-25.428-60.148 10.04-4.244z"/><path fill-opacity=".84" d="M231.086 96.223l-10.04 4.244-25.428-60.148 10.04-4.245z"/><path fill-opacity=".12" d="M157.39 155.246l-4.246-10.04 60.148-25.428 4.244 10.04z"/><path fill-opacity=".6" d="M254.762 114.076l-4.245-10.04 60.148-25.428 4.244 10.04z"/></g></symbol><symbol id="svg-icons" data-name="icons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f0f3f6" d="M334.8 119s-50.5 62.4-112.8 62.4S109.3 119 109.3 119s50.5-62.4 112.8-62.4S334.8 119 334.8 119z"/><path fill="#d6dde7" d="M222.1 183.9c-18.1 0-47-5.5-81.3-31.7-20.4-15.6-32.9-31-33.5-31.6L106 119l1.3-1.6c.5-.6 13-16 33.5-31.6 34.3-26.2 63.1-31.7 81.3-31.7 18.1 0 47 5.5 81.3 31.7 20.4 15.6 32.9 31 33.5 31.6l1.3 1.6-1.3 1.6c-.5.6-13 16-33.5 31.6-34.4 26.2-63.2 31.7-81.3 31.7zM112.6 119c8.3 9.6 54.6 59.9 109.5 59.9s101.2-50.3 109.5-59.9c-8.3-9.6-54.6-59.9-109.5-59.9S120.9 109.4 112.6 119z"/><path fill="#59a702" d="M222.1 69.4c-27 0-49 21.9-49 49s21.9 49 49 49c27 0 49-21.9 49-49s-22-49-49-49zm11.5 40.9c-6.4 0-11.5-5.2-11.5-11.5s5.2-11.5 11.5-11.5c6.4 0 11.5 5.2 11.5 11.5s-5.2 11.5-11.5 11.5z"/><path fill="#549103" d="M233.6 110.3c-6.4 0-11.5-5.2-11.5-11.5 0-.6.1-1.3.2-1.9h-.2c-11.9 0-21.5 9.6-21.5 21.5s9.6 21.5 21.5 21.5 21.5-9.6 21.5-21.5c0-3.8-1-7.4-2.8-10.6-2 1.6-4.5 2.5-7.2 2.5z"/></symbol><symbol id="svg-inputs" data-name="inputs" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M278.9 64.2h-89.8c-29.1 0-52.8 23.8-52.8 52.8 0 29.1 23.8 52.8 52.8 52.8h89.8c29.1 0 52.8-23.8 52.8-52.8 0-29.1-23.7-52.8-52.8-52.8zm-.8 95.8c-23.3 0-42.2-18.9-42.2-42.2 0-23.3 18.9-42.2 42.2-42.2 23.3 0 42.2 18.9 42.2 42.2 0 23.3-18.9 42.2-42.2 42.2z"/></symbol><symbol id="svg-messages" data-name="messages" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" class="st0" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#59a702" d="M327.1 80.3H140.6c-2.1 0-3.8-1.7-3.8-3.8V36h194.1v40.5c0 2.1-1.7 3.8-3.8 3.8z"/><path fill="#549103" d="M140.6 80.3h40.5V36h-44.3v40.5c0 2.1 1.7 3.8 3.8 3.8z"/><circle fill="#7bc117" cx="307.7" cy="58.1" r="11.8"/></symbol><symbol id="svg-panel" data-name="panel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M371.4 41c1.6 0 3 1.4 3 3v56c0 1.6-1.4 3-3 3H96.6c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h274.8m0-5H96.6c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h274.8c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8zM371.4 198H96.6c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h274.8c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8z"/></symbol><symbol id="svg-progress-bars" data-name="progress-bars" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dfe3e6" d="M401.6 129.5H66.4c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h335.3c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.6 12.5z"/><path fill="#efc102" d="M333.4 129.5h-267c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h267c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.5 12.5z"/></symbol><symbol id="svg-section" data-name="section" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f69524" d="M228.9 112.3h-76.1V55.9c0-10.9 8.8-19.7 19.7-19.7h56.4v76.1z"/><path fill="#d6dde7" d="M228.9 197.8h-56.6c-10.8 0-19.5-8.7-19.5-19.5v-56.6h76.1v76.1zM315.2 112.3h-76.1V36.2H296c10.6 0 19.2 8.6 19.2 19.2v56.9zM295.7 197.8h-56.6v-76.1h76.1v56.6c0 10.7-8.7 19.5-19.5 19.5z"/></symbol><symbol id="svg-sliders" data-name="sliders" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#297adf" cx="164.6" cy="117" r="6.6"/><path fill="#297adf" d="M145.7 117c0-1.7.3-3.4.7-5H80.2c-2-5-6.8-8.5-12.5-8.5-7.5 0-13.5 6-13.5 13.5s6 13.5 13.5 13.5c5.7 0 10.5-3.5 12.5-8.5h66.2c-.5-1.6-.7-3.3-.7-5z"/><path fill="#d6dde7" d="M400.3 103.5c-5.7 0-10.5 3.5-12.5 8.5H246.5c-2-5-6.8-8.5-12.5-8.5s-10.5 3.5-12.5 8.5h-38.6c-2.2-8-9.5-13.9-18.2-13.9-10.4 0-18.9 8.5-18.9 18.9 0 10.4 8.5 18.9 18.9 18.9 8.7 0 16-5.9 18.2-13.9h38.6c2 5 6.8 8.5 12.5 8.5s10.5-3.5 12.5-8.5h141.3c2 5 6.8 8.5 12.5 8.5 7.5 0 13.5-6 13.5-13.5s-6-13.5-13.5-13.5zm-235.7 27.4c-7.7 0-13.9-6.2-13.9-13.9s6.2-13.9 13.9-13.9 13.9 6.2 13.9 13.9-6.2 13.9-13.9 13.9zm18.9-12.3c0-.5.1-1.1.1-1.6s0-1.1-.1-1.6c0 .5.1 1.1.1 1.6s-.1 1.1-.1 1.6zm-.2 1.4c0-.2.1-.5.1-.7 0 .3-.1.5-.1.7zm0-6c0 .2.1.5.1.7 0-.3-.1-.5-.1-.7z"/></symbol><symbol id="svg-tables" data-name="tables" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M366.6 197.9c4.4 0 8.1-3.6 8.1-8.1V44.2c0-4.4-3.6-8.1-8.1-8.1H101.4c-4.4 0-8.1 3.6-8.1 8.1V189.8c0 4.4 3.6 8.1 8.1 8.1h265.2zm3-153.7v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zm-180 43.6V41.2h88.7v46.6h-88.7zm88.8 5.1V142h-88.7V92.9h88.7zm-180-48.7c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2zm0 48.7h86.2V142H98.4V92.9zm3 99.9c-1.6 0-3-1.4-3-3V147h86.2v45.8h-83.2zm88.2 0V147h88.7v45.8h-88.7zm180-3c0 1.6-1.4 3-3 3h-83.2V147h86.2v42.8zm0-47.8h-86.2V92.9h86.2V142z"/><path fill="#a346ce" d="M369.6 44.2v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zM189.6 41.2h88.7v46.6h-88.7zM98.4 44.2c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2z"/></symbol><symbol id="svg-text" data-name="text" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M228 172.7l-8.3-21.8h-52.1l-8.3 21.8h-22.6l44.6-113.5h24.9l44.6 113.5H228zm-34.3-93.4l-20.4 54.1h40.9l-20.5-54.1zM313.5 172.7v-8.9c-6.1 7-15.7 10.9-26.6 10.9-13.4 0-28.6-9-28.6-27.2 0-18.9 15.1-26.7 28.6-26.7 11.1 0 20.6 3.6 26.6 10.6v-12.3c0-9.5-7.8-15.3-19.2-15.3-9.2 0-17.2 3.4-24.3 10.4l-7.3-12.4c9.5-9 21.4-13.3 34.6-13.3 18.2 0 34.2 7.7 34.2 29.8v54.5h-18zm0-18.7v-12.4c-4.1-5.6-11.7-8.5-19.6-8.5-10 0-17.5 5.8-17.5 14.8 0 8.9 7.5 14.6 17.5 14.6 7.8 0 15.5-2.9 19.6-8.5z"/></symbol><symbol id="svg-time" data-name="time" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#c3cddb" cx="234" cy="117" r="80.8"/><path fill="#fff" d="M261.1 148.1c-1 0-2-.4-2.8-1.2l-27.1-27.1c-.8-.8-1.2-1.8-1.2-2.8V56.2c0-2.2 1.8-4 4-4s4 1.8 4 4v59.2l25.9 25.9c1.6 1.6 1.6 4.1 0 5.7-.8.7-1.8 1.1-2.8 1.1z"/></symbol><symbol id="svg-validation" data-name="validation" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dd2f41" d="M332 69.7H136c-4.4 0-8 3.6-8 8v83.2c0 1.9 1.5 3.4 3.4 3.4h205.2c1.9 0 3.4-1.5 3.4-3.4V77.7c0-4.4-3.6-8-8-8zm-141.7 75.5h-52.1v-9.3h52.1v9.3zM335 111.8H133V77.7c0-1.6 1.4-3 3-3h196c1.6 0 3 1.4 3 3v34.1z"/></symbol><symbol id="svg-status-completed" data-name="status-completed" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M24.965 12.802l-10.267 11.25-7.626-7.62c-.48-.486-.48-1.262 0-1.742.482-.484 1.26-.484 1.74 0l5.805 5.802 8.53-9.35c.46-.503 1.24-.538 1.74-.08s.538 1.238.078 1.74M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol></svg>')
79
+ document.querySelector('body').insertAdjacentHTML('afterbegin', '<svg id="esvg-svg-icons" data-symbol-class="svg-symbol" data-prefix="svg" version="1.1" style="height:0;position:absolute" data-turbolinks-permanent><symbol id="svg-angle-down" data-name="angle-down" viewBox="0 0 27 15" width="27" height="15" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M25.304.005c.092.012.116.012.206.036.135.037.263.097.377.177.348.244.545.665.508 1.088-.01.104-.032.207-.068.305-.048.132-.12.254-.21.36-.02.028-.046.053-.07.08l-12 12c-.025.022-.05.047-.077.07-.08.067-.17.123-.264.168-.32.148-.695.148-1.014 0-.095-.045-.184-.1-.264-.17-.027-.02-.052-.046-.077-.07l-12-12C.29 1.98.27 1.966.217 1.89c-.08-.114-.14-.242-.176-.377C-.08 1.066.074.578.428.28.535.19.658.12.788.073.92.025 1.06 0 1.2 0c.246 0 .49.076.69.217.076.053.09.072.16.134l11.15 11.153L24.352.35l.078-.07c.073-.056.09-.073.17-.12.122-.07.255-.118.393-.142.093-.016.116-.014.21-.018l.104.005z" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-down-circle" data-name="arrow-down-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.218 18.943l-5.243 5.243c-.226.282-.558.48-.95.48-.006 0-.01-.006-.018-.006-.008 0-.013.005-.02.005-.315 0-.63-.12-.87-.36l-5.36-5.362c-.483-.48-.483-1.26 0-1.738.478-.48 1.255-.48 1.737 0l3.3 3.3V9.323c0-.678.55-1.23 1.23-1.23.68 0 1.23.552 1.23 1.23V20.43l3.226-3.225c.48-.48 1.26-.48 1.738 0 .48.48.48 1.258 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-arrow-up-circle" data-name="arrow-up-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M22.294 14.798c-.24.24-.556.36-.87.36-.315 0-.627-.12-.868-.36l-3.303-3.305V22.68c0 .677-.548 1.23-1.23 1.23-.678 0-1.228-.553-1.228-1.23V11.57l-3.227 3.228c-.482.48-1.26.48-1.738 0-.482-.48-.482-1.258 0-1.737l5.243-5.247c.226-.282.56-.48.95-.48.008 0 .013.006.02.006.008 0 .013-.006.02-.006.327 0 .64.13.868.36l5.364 5.367c.48.48.48 1.26 0 1.738" fill-rule="nonzero"/></symbol><symbol id="svg-backup" data-name="backup" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.04 23.89c-.905.073-1.812.11-2.706.11C8.047 24 2.484 22.656 0 20.483v2.85c0 3.364 5.856 6 13.334 6 1.358 0 2.66-.088 3.888-.25C16.452 27.787 16 26.28 16 24.667c0-.263.015-.522.04-.778zm-2.707-1.223c1.004 0 1.988-.047 2.943-.13.556-2.19 1.943-4.045 3.807-5.213-2.15.436-4.49.676-6.75.676C8.047 18 2.483 16.656 0 14.483V18c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.44V8.893C23.82 10.807 18.377 12 13.333 12 8.047 12 2.483 10.656 0 8.483V12c0 2.113 5.947 4.667 13.333 4.667zm0-6c6.106 0 11.5-1.683 13.334-3.438V6c0-3.364-5.858-6-13.334-6S0 2.636 0 6c0 2.113 5.948 4.667 13.333 4.667z" fill-opacity=".502"/><path d="M28 25.333h-2.667V28c0 .368-.3.667-.666.667-.368 0-.667-.3-.667-.667v-2.667h-2.667c-.368 0-.666-.298-.666-.666 0-.368.298-.667.666-.667H24v-2.667c0-.368.3-.666.667-.666.366 0 .666.298.666.666V24H28c.367 0 .667.3.667.667 0 .368-.3.666-.667.666m-3.333-8c-4.044 0-7.334 3.29-7.334 7.334S20.623 32 24.667 32C28.71 32 32 28.71 32 24.667c0-4.044-3.29-7.334-7.333-7.334" fill-rule="nonzero"/></symbol><symbol id="svg-check-circle" data-name="check-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M24.925 12.745l-10.22 11.2-7.59-7.588c-.48-.483-.48-1.255 0-1.732.477-.483 1.252-.483 1.732 0l5.776 5.775 8.49-9.307c.457-.502 1.233-.536 1.733-.08.5.455.534 1.232.08 1.732" fill-rule="nonzero"/></symbol><symbol id="svg-cluster" data-name="cluster" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 32c-.056 0-.113-.002-.17-.005-.112-.007-.224-.02-.335-.04-.332-.06-.653-.18-.942-.354-.13-.078-.256-.167-.373-.266-.055-.047-.108-.096-.16-.147C9.604 26.8 5.2 22.397.813 17.98c-.076-.077-.148-.158-.214-.243-.127-.16-.236-.335-.324-.52-.09-.184-.157-.38-.203-.58C.023 16.43 0 16.215 0 16c0-.214.024-.43.073-.638.046-.2.114-.395.203-.58.088-.184.197-.358.323-.52.065-.084.137-.165.213-.242C5.2 9.604 9.603 5.2 14.02.813c.077-.076.158-.148.243-.214.16-.127.335-.236.52-.324.184-.09.38-.157.58-.203C15.57.023 15.785 0 16 0c.214 0 .43.024.638.073.2.046.395.114.58.203.184.088.358.197.52.323.084.065.165.137.242.213C22.396 5.2 26.8 9.603 31.187 14.02c.076.077.148.158.214.243.127.16.236.335.324.52.09.184.157.38.203.58.05.208.073.423.073.637 0 .214-.024.43-.073.638-.046.2-.114.395-.203.58-.088.184-.197.358-.323.52-.065.084-.137.165-.213.242-4.388 4.416-8.79 8.82-13.207 13.207-.052.05-.105.1-.16.147-.117.1-.242.188-.373.267-.275.166-.578.282-.892.345-.11.022-.223.038-.335.046-.05.005-.102.008-.152.01H16zm0-1.883c.055 0 .11-.005.164-.014.107-.02.21-.057.305-.112.068-.04.13-.087.187-.143 4.412-4.384 8.84-8.755 13.195-13.195.026-.027.052-.056.075-.087.042-.054.077-.113.106-.176.05-.112.08-.234.083-.356.005-.145-.023-.29-.083-.423-.03-.062-.064-.12-.106-.175-.023-.03-.05-.06-.075-.087-4.358-4.442-8.758-8.842-13.2-13.2-.027-.026-.056-.052-.087-.075-.054-.042-.113-.077-.176-.106-.112-.05-.234-.08-.356-.083-.145-.005-.29.023-.423.083-.06.028-.117.062-.17.102-.033.024-.063.05-.092.078-4.442 4.358-8.842 8.758-13.2 13.2l-.08.09c-.04.055-.073.112-.1.173-.06.133-.09.28-.084.424.004.122.032.244.083.355.03.062.064.12.106.175.023.03.05.06.075.087 4.358 4.442 8.758 8.842 13.2 13.2.055.053.116.1.183.14.088.05.184.087.284.106.056.012.112.018.17.02H16z" fill-opacity=".502" fill-rule="nonzero"/><path d="M17.482 26.93l-.847.846c-.17.17-.397.263-.635.263s-.466-.095-.635-.264l-11.14-11.14c-.17-.17-.264-.398-.264-.636s.095-.466.264-.635l11.14-11.14c.17-.17.398-.264.636-.264s.466.095.635.264l4.05 4.05v5.456c-.104.03-.205.064-.303.106-.27.116-.517.283-.725.49-.2.195-.362.426-.48.68-.102.22-.17.454-.2.695-.033.248-.025.5.022.745.04.213.11.42.21.614.122.244.288.466.487.654.193.18.416.33.658.438.2.09.412.15.628.18.11.015.22.022.328.023h.062c.11-.004.218-.014.326-.032.215-.036.425-.102.622-.195.243-.115.466-.273.656-.463s.348-.414.464-.657c.095-.2.162-.416.197-.636.038-.24.04-.488.002-.73-.038-.24-.112-.472-.22-.69-.123-.248-.292-.475-.494-.666-.214-.2-.465-.362-.738-.472-.08-.032-.164-.06-.25-.084V9.528l5.838 5.837c.17.17.263.397.263.635s-.095.466-.264.635l-6.64 6.64-4.508-4.51v-6.51c.13-.036.258-.083.38-.14.243-.116.466-.274.657-.464.187-.186.342-.405.457-.643.097-.2.164-.415.2-.634.042-.246.043-.5.005-.745-.036-.24-.11-.472-.218-.69-.125-.248-.293-.475-.496-.666-.214-.2-.465-.362-.737-.472-.144-.058-.294-.1-.447-.13-.15-.027-.306-.04-.46-.04-.15.003-.298.02-.444.05-.156.03-.31.08-.456.142-.27.116-.516.283-.725.49-.198.195-.36.426-.48.68-.102.218-.17.454-.2.695-.032.247-.024.5.023.744.04.214.11.422.21.615.12.24.283.46.478.645.195.186.422.338.668.448.106.047.216.087.328.118v6.768c.002.05 0 .06.01.11.016.09.05.176.104.25.028.04.037.048.07.084l4.693 4.694-1.88 1.88-6.962-6.962v-.81c.13-.036.258-.084.38-.142.244-.115.467-.273.657-.463s.348-.414.464-.657c.094-.2.16-.416.196-.636.038-.24.04-.488.002-.73-.037-.24-.11-.472-.218-.69-.124-.248-.293-.475-.495-.666-.214-.2-.465-.362-.738-.472-.144-.057-.293-.1-.446-.13-.15-.027-.305-.04-.46-.038-.154.002-.307.018-.458.05-.15.032-.3.08-.44.14-.27.116-.518.283-.726.49-.198.195-.362.426-.48.68-.102.22-.17.454-.2.695-.033.248-.025.5.022.745.043.223.118.44.223.64.125.238.29.455.487.638.19.178.41.323.647.43.107.046.217.086.33.117v1.07c0 .04 0 .05.005.09.012.088.044.173.092.25.017.024.035.048.054.07l.03.033 7.146 7.146zm-6.7-9.83c.055 0 .11-.005.166-.014.096-.014.19-.042.278-.08.103-.047.2-.11.283-.184.09-.08.168-.176.228-.28.05-.093.09-.19.114-.293.03-.13.035-.26.02-.39-.015-.11-.046-.217-.092-.318-.055-.12-.133-.23-.227-.324-.098-.096-.213-.174-.34-.228-.13-.057-.274-.087-.418-.09-.145 0-.29.025-.423.08-.125.05-.24.123-.34.215-.097.09-.178.2-.237.317-.05.1-.083.205-.1.313-.02.13-.018.262.007.39.02.1.055.2.102.29.053.102.123.196.204.277.087.085.187.156.297.21.09.042.183.073.28.09.055.01.11.015.167.017h.03zm10.53 0c.056 0 .112-.005.167-.014.095-.014.19-.042.277-.08.107-.05.206-.114.293-.192.087-.08.16-.172.22-.273.05-.09.087-.185.11-.285.032-.13.04-.264.022-.396-.014-.11-.045-.217-.09-.318-.056-.12-.134-.23-.228-.324-.098-.096-.213-.174-.34-.228-.13-.057-.274-.087-.418-.09-.145 0-.29.025-.423.08-.126.05-.24.123-.34.215-.097.09-.178.2-.237.317-.05.1-.083.205-.1.313-.02.13-.018.262.007.39.02.106.058.208.108.302.058.105.13.2.218.283.082.077.176.142.278.19.09.044.183.075.28.092.055.01.11.015.167.017h.028zM16 11.084c.056 0 .112-.004.168-.013.096-.014.19-.042.278-.08.103-.047.198-.11.283-.184.09-.08.167-.176.227-.282.05-.09.09-.185.112-.285.03-.128.037-.263.02-.395-.014-.11-.044-.217-.09-.317-.056-.12-.133-.23-.228-.324-.097-.096-.213-.174-.34-.23-.13-.055-.274-.085-.418-.087-.144-.002-.29.024-.423.078-.124.05-.24.124-.338.216-.097.092-.178.2-.237.318-.05.1-.083.204-.1.313-.02.13-.02.263.007.39.02.106.057.208.108.303.057.107.133.205.222.287.08.076.173.14.272.187.09.044.188.075.288.092.053.008.106.013.16.015H16z"/></symbol><symbol id="svg-copy" data-name="copy" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill-rule="nonzero"><path d="M22.667 4.667c0-.368-.3-.667-.667-.667h-3.333v10.495c1.208-.64 2.562-1.032 4-1.127v-8.7zM4 25.333V4H.667C.3 4 0 4.3 0 4.667V26c0 1.837 1.496 3.333 3.333 3.333h12.02c-.878-1.165-1.517-2.52-1.818-4H4z" fill-opacity=".302"/><path d="M14 12H7.333c-.368 0-.666.3-.666.667 0 .368.298.666.666.666H14c.368 0 .667-.298.667-.666 0-.368-.3-.667-.667-.667M14 14.667H7.333c-.368 0-.666.298-.666.666 0 .368.298.667.666.667H14c.368 0 .667-.3.667-.667 0-.368-.3-.666-.667-.666M14.667 18c0-.368-.3-.667-.667-.667H7.333c-.368 0-.666.3-.666.667 0 .368.298.667.666.667H14c.368 0 .667-.3.667-.667M7.333 20c-.368 0-.666.3-.666.667 0 .368.298.666.666.666h4c.368 0 .667-.298.667-.666 0-.368-.3-.667-.667-.667h-4z" fill-opacity=".502"/><path d="M6 9.333h10.667c.368 0 .666-.298.666-.666V3.333c0-.368-.298-.666-.666-.666h-2.06C14.33 1.115 13.087 0 11.333 0 9.687 0 8.363 1 8.06 2.667H6c-.368 0-.667.298-.667.666v5.334c0 .368.3.666.667.666" fill-opacity=".302"/><path d="M26.97 24H24v2.97c0 .367-.3.666-.667.666-.368 0-.666-.3-.666-.667V24h-2.97c-.368 0-.666-.3-.666-.667 0-.368.3-.666.667-.666h2.97v-2.97c0-.37.298-.666.666-.666.368 0 .667.298.667.667v2.97h2.97c.367 0 .666.298.666.666 0 .368-.3.667-.667.667m-3.637-9.333c-4.78 0-8.666 3.888-8.666 8.666 0 4.78 3.886 8.667 8.666 8.667S32 28.112 32 23.333c0-4.778-3.888-8.666-8.667-8.666"/></g></symbol><symbol id="svg-deployment" data-name="deployment" viewBox="0 0 176 201" width="176" height="201" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M88 5.985l82.272 47.5v95L88 195.985l-82.272-47.5v-95L88 5.985z"/></symbol><symbol id="svg-dice" data-name="dice" viewBox="0 0 45 32" width="45" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M30.762 10.232c1.183.684 1.59 2.2.906 3.382l-9.9 17.148c-.683 1.183-2.2 1.59-3.382.906l-17.148-9.9c-1.183-.684-1.59-2.2-.906-3.382l9.9-17.148c.684-1.183 2.2-1.59 3.382-.906l17.148 9.9z" fill-opacity=".149"/><path d="M22.13 5.25c.02-.002.04-.002.06-.002h19.803c1.366 0 2.475 1.11 2.475 2.475v19.802c0 1.366-1.11 2.475-2.475 2.475H22.208l2.44-4.23c.273.11.57.17.88.17 1.29 0 2.34-1.047 2.34-2.338 0-.75-.354-1.416-.902-1.844l4.702-8.144c.683-1.183.277-2.698-.906-3.382L22.13 5.25zm16.35 16.013c1.29 0 2.34 1.048 2.34 2.34 0 1.29-1.05 2.338-2.34 2.338-1.29 0-2.34-1.047-2.34-2.338 0-1.29 1.05-2.34 2.34-2.34zm0-11.956c1.29 0 2.34 1.048 2.34 2.34 0 1.29-1.05 2.338-2.34 2.338-1.29 0-2.34-1.048-2.34-2.34 0-1.29 1.05-2.338 2.34-2.338zM19.712 22.345c1.118.645 1.502 2.077.857 3.196-.647 1.12-2.08 1.502-3.197.857-1.118-.646-1.502-2.078-.856-3.196.645-1.117 2.077-1.5 3.195-.855zM17.093 13.93c1.118.645 1.502 2.077.856 3.195-.647 1.118-2.078 1.502-3.197.857-1.118-.646-1.5-2.078-.856-3.196.646-1.118 2.078-1.502 3.196-.856zM14.473 5.514c1.118.646 1.502 2.078.856 3.196-.646 1.118-2.078 1.502-3.196.856-1.118-.645-1.502-2.077-.856-3.195.645-1.118 2.077-1.5 3.195-.856z"/></symbol><symbol id="svg-download" data-name="download" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="none" d="M0 0h32.978v32H0z"/><path d="M15.5 28.627V16.92c.005-.1.015-.195.045-.29.08-.262.27-.48.515-.6.113-.054.23-.08.355-.095.074-.003.074-.003.148 0 .124.014.24.04.355.095.245.12.435.338.515.6.03.095.04.19.044.29v11.707l2.54-2.54.043-.04c.12-.1.25-.176.4-.216.13-.034.267-.042.4-.023.326.048.613.262.752.56.04.087.068.18.082.275.014.094.014.19 0 .286-.02.133-.066.26-.137.376-.03.05-.065.093-.102.138-1.38 1.462-2.842 2.844-4.264 4.266l-.03.03c-.052.048-.11.09-.17.126-.027.016-.055.03-.084.044-.108.05-.225.08-.344.09-.097.007-.196 0-.293-.022-.097-.022-.19-.06-.275-.108-.075-.043-.145-.097-.206-.158-1.45-1.37-2.82-2.818-4.227-4.227-.107-.112-.19-.24-.24-.387-.11-.332-.032-.707.2-.968.064-.07.138-.134.22-.184.15-.092.315-.136.49-.147.057 0 .057 0 .114.004.058.007.114.016.17.03.17.046.316.136.443.256l2.54 2.54zm10.424-4.984h-4.52c-.036-.002-.072-.002-.107-.006-.142-.015-.28-.062-.403-.136-.09-.054-.174-.124-.243-.206-.258-.305-.307-.748-.12-1.102.05-.094.116-.18.194-.254.13-.123.293-.21.467-.248.094-.02.12-.018.214-.023h4.444c.43-.075.854-.197 1.264-.348 1.132-.42 2.194-1.103 2.908-2.09.165-.23.31-.47.433-.724.287-.59.45-1.234.516-1.886.037-.383.045-.77.015-1.155-.033-.436-.117-.868-.25-1.285-.37-1.173-1.124-2.212-2.122-2.932-.48-.348-1.017-.62-1.583-.802-.42-.135-.857-.22-1.297-.257-.232-.02-.463-.022-.696-.016l-.103-.002c-.09-.012-.115-.01-.204-.037-.2-.058-.378-.18-.505-.345-.056-.073-.064-.095-.108-.176-.054-.113-.11-.224-.168-.335-.347-.65-.77-1.255-1.27-1.796-.6-.647-1.297-1.2-2.064-1.634-.824-.465-1.727-.79-2.66-.952-.792-.14-1.604-.164-2.403-.076-.8.088-1.588.292-2.33.604-.875.368-1.685.885-2.388 1.52-.775.702-1.418 1.546-1.887 2.48-.343.683-.593 1.414-.74 2.165-.07.373-.116.748-.14 1.127l-.013.104c-.008.035-.014.07-.024.104-.018.067-.045.133-.078.195-.133.248-.373.43-.65.495-.067.016-.137.024-.207.025-.035 0-.07-.003-.106-.004-.137-.02-.272-.048-.408-.068-.496-.063-.996-.043-1.483.073-1.008.242-1.902.874-2.468 1.74-.173.264-.315.55-.42.846-.11.308-.182.628-.215.953-.04.392-.025.794.03 1.184.075.536.243 1.06.54 1.517.09.14.19.27.3.393.632.704 1.546 1.09 2.458 1.275.34.07.692.116 1.04.12h5.17l.107.005c.094.015.118.015.21.046.168.056.32.16.436.295.07.082.125.175.165.274.04.1.063.204.07.31.018.363-.168.715-.478.9-.123.075-.26.122-.403.137-.035.004-.07.004-.107.006-1.744 0-3.49.014-5.233 0-.42-.012-.836-.057-1.247-.134-1.186-.223-2.346-.7-3.253-1.512-.167-.15-.324-.31-.47-.48-.177-.203-.337-.42-.48-.65-.397-.64-.645-1.363-.764-2.106-.047-.296-.074-.594-.084-.894-.01-.296-.003-.592.027-.887.047-.455.145-.905.292-1.338.338-.99.94-1.883 1.723-2.575.656-.578 1.436-1.01 2.274-1.26.61-.184 1.25-.265 1.888-.25l.06-.344c.067-.326.144-.648.238-.967.198-.665.462-1.31.788-1.923.66-1.243 1.576-2.348 2.672-3.23.883-.713 1.882-1.278 2.947-1.668.702-.256 1.43-.436 2.172-.536.337-.047.676-.074 1.017-.088.16-.005.323-.008.485-.007.918.012 1.83.137 2.715.385 1.845.518 3.527 1.556 4.828 2.963.575.622 1.068 1.313 1.48 2.053l.004.006c.092.005.185.01.277.018.102.008.202.018.302.03.23.03.46.065.687.114.57.12 1.128.308 1.657.556 1.148.54 2.155 1.364 2.912 2.38.57.768.998 1.64 1.252 2.562.277 1.007.338 2.06.218 3.097-.097.834-.322 1.654-.69 2.41-.173.356-.377.696-.608 1.016-.154.212-.32.415-.495.61-.903.992-2.076 1.712-3.33 2.176-.553.205-1.128.367-1.712.458-.047.006-.046.006-.093.01l-.068.003z"/></symbol><symbol id="svg-gear-circle" data-name="gear-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M24.253 6.97c.168.045.32.117.445.24.054.052.064.068.11.128 1.096 1.71 2.035 3.514 3.05 5.272.04.077.074.15.095.236.07.277.004.578-.175.8-.073.09-.16.16-.257.22l-1.64.95c.022.154.034.308.048.464.013.193.023.385.026.58.003.423-.023.842-.07 1.263v.013l1.64.95.072.044c.07.053.13.107.186.174.16.2.23.464.192.718-.013.086-.04.164-.073.244-.932 1.803-2.025 3.52-3.04 5.277-.046.073-.094.14-.156.2-.206.2-.5.294-.783.25-.114-.018-.216-.06-.318-.113l-1.635-.95c-.13.098-.262.188-.396.28-.19.123-.19.122-.384.242-.39.23-.787.435-1.2.623l-.013.006v1.91l-.004.084c-.013.086-.028.167-.06.248-.092.24-.285.432-.525.525-.08.03-.162.046-.247.058-2.03.094-4.062.004-6.094.004-.086-.005-.168-.012-.25-.036-.277-.078-.504-.286-.607-.552-.042-.11-.057-.218-.063-.333V25.08c-.142-.06-.282-.128-.422-.195-.203-.102-.203-.1-.404-.207-.404-.222-.79-.464-1.168-.73l-.027-.02-1.66.952-.074.038c-.08.033-.16.06-.245.073-.253.04-.517-.032-.716-.193-.07-.054-.122-.117-.175-.185C6.14 22.905 5.2 21.1 4.185 19.34c-.052-.1-.094-.203-.11-.318-.045-.282.048-.576.247-.78.06-.064.128-.11.2-.157l1.642-.948c-.02-.156-.033-.31-.046-.467-.014-.23-.014-.23-.023-.46-.006-.464.018-.922.07-1.382v-.014l-1.64-.947-.07-.046c-.07-.052-.13-.106-.186-.173-.162-.2-.232-.465-.193-.718.014-.087.04-.165.074-.245.935-1.803 2.03-3.518 3.047-5.276.062-.098.13-.184.22-.257.222-.18.523-.245.8-.176.084.02.16.056.235.096l1.652.95c.07-.052.143-.102.214-.152.19-.128.19-.128.385-.252.454-.278.92-.523 1.407-.743l.014-.006V4.96l.004-.085c.012-.085.027-.166.06-.247.09-.24.285-.433.524-.526.08-.03.162-.046.248-.058 2.028-.094 4.062-.004 6.093-.004.115.006.224.02.332.062.267.104.474.33.553.607.023.084.03.166.035.252V6.87c.142.06.28.13.42.196.202.102.2.102.4.208.4.224.782.466 1.154.733l.02.014 1.628-.946.076-.04c.138-.055.266-.08.414-.084.085.007.085.006.17.02zm-2.23 14.94c.118.025.22.06.325.115l1.38.8 2.08-3.607-1.39-.802c-.064-.04-.082-.05-.14-.1-.153-.132-.26-.313-.3-.51-.018-.087-.02-.17-.017-.258.028-.216.07-.43.098-.645.04-.37.067-.74.055-1.11-.015-.44-.068-.87-.143-1.304l-.01-.086c-.003-.088-.002-.17.016-.257.04-.198.147-.38.3-.51.058-.052.076-.06.14-.1l1.388-.803-2.08-3.605-1.375.798c-.07.035-.085.046-.158.072-.19.067-.402.07-.594.006-.084-.028-.157-.07-.232-.115-.123-.092-.24-.194-.362-.29-.348-.262-.71-.502-1.093-.71-.382-.21-.78-.386-1.187-.542l-.078-.034c-.066-.037-.084-.044-.145-.09-.16-.12-.277-.29-.332-.483-.024-.082-.03-.165-.035-.25V5.88h-4.168V7.49c-.004.086-.012.168-.036.252-.056.192-.174.363-.333.483-.06.045-.08.052-.145.09-.2.086-.402.16-.602.245-.745.337-1.446.748-2.072 1.276l-.07.052c-.074.047-.147.088-.23.116-.192.065-.404.064-.595-.003-.073-.024-.09-.035-.157-.07L8.33 9.125l-2.086 3.608 1.387.802c.066.04.083.05.142.1.153.132.26.314.3.512.018.087.02.17.016.258-.02.154-.05.307-.073.46-.058.43-.09.862-.08 1.297.01.437.065.868.14 1.297l.01.086c.004.077.007.096 0 .172-.023.202-.113.393-.253.54-.06.062-.13.11-.203.158l-1.39.802 2.084 3.61 1.403-.805c.078-.04.154-.075.24-.096.196-.048.407-.03.59.053.072.032.087.044.152.085.12.092.236.192.356.286.3.226.61.433.938.618.44.25.9.455 1.37.636l.08.034c.065.037.083.044.143.09.16.12.278.29.332.482.023.084.03.166.035.253v1.606h4.168v-1.607c.004-.087.01-.17.035-.253.055-.19.172-.363.332-.483.06-.045.078-.052.144-.09.197-.085.4-.16.598-.245.455-.207.895-.44 1.31-.716.26-.173.506-.362.745-.56l.07-.054c.064-.04.08-.052.15-.083.108-.05.218-.068.335-.078.086 0 .086 0 .172.01z"/><path d="M16.148 11.052c.698.026 1.378.18 2.01.484.533.257 1.02.613 1.43 1.042.41.43.74.934.97 1.48.19.45.313.93.363 1.415.052.498.027 1.005-.074 1.495-.314 1.533-1.372 2.853-2.797 3.497-.598.27-1.247.418-1.902.434-.658.016-1.32-.1-1.932-.34-.553-.22-1.066-.54-1.506-.938-.44-.4-.805-.876-1.075-1.403-.22-.432-.377-.896-.462-1.373-.08-.452-.1-.916-.052-1.374.06-.565.215-1.12.462-1.632.43-.89 1.13-1.643 1.987-2.137.637-.366 1.342-.573 2.073-.638.17-.01.336-.016.505-.013zm-.206 1.84c-.437.016-.863.112-1.257.302-.81.39-1.428 1.138-1.652 2.01-.09.354-.118.725-.08 1.088.032.33.12.652.255.954.153.34.37.65.632.91.263.264.573.48.912.632.374.17.78.26 1.19.27.413.012.826-.06 1.21-.21.347-.138.668-.338.944-.59.275-.248.504-.548.673-.878.137-.27.234-.56.288-.857.06-.336.063-.68.012-1.018-.14-.92-.71-1.743-1.514-2.207-.4-.23-.84-.358-1.297-.4-.107-.005-.212-.008-.318-.007z"/></g></symbol><symbol id="svg-gear" data-name="gear" viewBox="0 0 32 33" width="32" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M23.018 1.842c.258.022.51.08.746.185.198.088.386.2.553.338.132.106.25.227.355.36.336.432.486.97.495 1.51.007.384-.054.762-.14 1.135l-.584 2.148.02.02.02.02 2.14-.583.198-.046c.2-.04.402-.074.606-.088.42-.03.85.01 1.246.157.27.1.522.25.736.442.397.36.668.867.74 1.4.037.26.025.524-.03.78-.095.444-.313.85-.583 1.212-.125.166-.262.322-.403.474l-1.572 1.56.008.03.01.035c.716.19 1.426.4 2.148.567.09.026.09.026.18.055.195.065.385.137.57.227.36.176.698.41.962.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.09.224-.22.432-.377.615-.286.334-.66.58-1.055.76-.22.102-.45.18-.68.252l-2.142.566-.01.036-.008.03 1.567 1.554c.07.073.07.073.138.147.136.153.265.31.38.48.235.35.415.74.487 1.157.05.285.045.577-.016.86-.112.524-.418 1.012-.84 1.342-.193.15-.41.265-.64.345-.412.144-.858.17-1.29.128-.243-.023-.48-.068-.716-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.1.024.1.047.198.04.2.072.4.087.605.027.4-.007.81-.14 1.19-.092.27-.233.524-.42.742-.36.424-.888.713-1.44.79-.26.035-.525.023-.78-.032-.655-.14-1.208-.54-1.69-.988l-1.555-1.57-.03.01-.038.01-.563 2.132c-.03.098-.028.097-.06.194-.053.16-.11.32-.18.474-.19.415-.452.802-.804 1.094-.205.17-.44.305-.69.395-.506.18-1.083.173-1.586-.015-.246-.093-.475-.23-.674-.4-.36-.31-.616-.718-.8-1.15-.083-.19-.15-.387-.21-.585l-.566-2.14-.036-.01-.03-.01-1.555 1.568c-.073.07-.073.07-.147.138-.127.113-.257.22-.395.32-.354.253-.754.452-1.185.536-.28.054-.57.058-.852.006-.528-.097-1.024-.39-1.366-.804-.168-.204-.298-.438-.385-.687-.156-.446-.175-.927-.12-1.394.025-.206.066-.41.112-.612l.585-2.148-.02-.02-.02-.02-2.14.582-.198.046c-.166.034-.333.063-.502.08-.434.043-.88.015-1.296-.128-.27-.093-.524-.234-.742-.42-.423-.362-.713-.89-.79-1.442-.033-.24-.025-.484.02-.722.126-.677.537-1.25.997-1.745l1.57-1.56-.01-.03-.008-.036-2.134-.563-.194-.058c-.193-.065-.384-.138-.568-.227-.38-.185-.73-.434-1-.76-.17-.205-.306-.438-.395-.69-.186-.525-.173-1.127.038-1.644.1-.242.242-.466.417-.66.446-.496 1.07-.774 1.696-.968l2.142-.565.01-.035.008-.03-1.566-1.555-.14-.148c-.413-.467-.76-1.015-.865-1.64-.045-.262-.045-.532.003-.794.098-.527.392-1.024.807-1.365.203-.167.435-.296.683-.383.414-.145.86-.172 1.293-.13.242.022.48.068.716.122l2.147.585.02-.022.02-.02-.584-2.14c-.025-.1-.025-.1-.047-.2-.04-.2-.074-.4-.088-.604-.03-.42.01-.85.157-1.246.092-.25.228-.484.4-.687.35-.406.852-.69 1.38-.777.26-.044.527-.04.786.01.43.08.83.28 1.184.532.198.14.38.3.56.464l1.558 1.57.03-.008.036-.01.563-2.136.06-.193c.053-.16.11-.32.182-.474.18-.398.426-.77.757-1.057.232-.2.502-.358.794-.452.492-.158 1.044-.146 1.528.036.246.092.474.23.674.4.358.31.615.717.8 1.148.082.19.148.387.21.585l.565 2.142.035.01.032.008 1.553-1.566.148-.14c.453-.4.98-.738 1.58-.854.16-.03.32-.043.48-.043.062 0 .06 0 .123.005zm-6.932 7.48c.34.006.678.033 1.013.09.595.098 1.177.278 1.724.533 1.24.58 2.288 1.543 2.97 2.73.354.615.61 1.286.75 1.98.153.75.177 1.522.07 2.278-.094.68-.295 1.345-.593 1.964-.336.7-.797 1.34-1.353 1.883-.595.582-1.3 1.05-2.066 1.375-.794.336-1.65.513-2.513.525-.865.01-1.73-.146-2.536-.463-.774-.306-1.49-.76-2.1-1.327-.588-.548-1.076-1.2-1.434-1.92-.306-.614-.515-1.276-.618-1.954-.115-.755-.1-1.53.042-2.28.134-.696.38-1.37.726-1.99.654-1.172 1.664-2.133 2.865-2.73.59-.293 1.223-.498 1.872-.605.278-.045.56-.072.84-.084.115-.004.23-.005.344-.005z" fill-opacity=".149"/><path d="M23.018 1.842c.258.022.51.08.746.185.198.088.386.2.553.338.132.106.25.227.355.36.336.432.486.97.495 1.51.007.384-.054.762-.14 1.135l-.584 2.148.02.02.02.02 2.14-.583.198-.046c.2-.04.402-.074.606-.088.42-.03.85.01 1.246.157.27.1.522.25.736.442.397.36.668.867.74 1.4.037.26.025.524-.03.78-.095.444-.313.85-.583 1.212-.125.166-.262.322-.403.474l-1.572 1.56.008.03.01.035c.716.19 1.426.4 2.148.567.09.026.09.026.18.055.195.065.385.137.57.227.36.176.698.41.962.716.174.2.315.428.41.676.208.54.203 1.165-.016 1.702-.09.224-.22.432-.377.615-.286.334-.66.58-1.055.76-.22.102-.45.18-.68.252l-2.142.566-.01.036-.008.03 1.567 1.554c.07.073.07.073.138.147.136.153.265.31.38.48.235.35.415.74.487 1.157.05.285.045.577-.016.86-.112.524-.418 1.012-.84 1.342-.193.15-.41.265-.64.345-.412.144-.858.17-1.29.128-.243-.023-.48-.068-.716-.123l-2.147-.583-.02.02-.02.02.583 2.142c.025.1.024.1.047.198.04.2.072.4.087.605.027.4-.007.81-.14 1.19-.092.27-.233.524-.42.742-.36.424-.888.713-1.44.79-.26.035-.525.023-.78-.032-.655-.14-1.208-.54-1.69-.988l-1.555-1.57-.03.01-.038.01-.563 2.132c-.03.098-.028.097-.06.194-.053.16-.11.32-.18.474-.19.415-.452.802-.804 1.094-.205.17-.44.305-.69.395-.506.18-1.083.173-1.586-.015-.246-.093-.475-.23-.674-.4-.36-.31-.616-.718-.8-1.15-.083-.19-.15-.387-.21-.585l-.566-2.14-.036-.01-.03-.01-1.555 1.568c-.073.07-.073.07-.147.138-.127.113-.257.22-.395.32-.354.253-.754.452-1.185.536-.28.054-.57.058-.852.006-.528-.097-1.024-.39-1.366-.804-.168-.204-.298-.438-.385-.687-.156-.446-.175-.927-.12-1.394.025-.206.066-.41.112-.612l.585-2.148-.02-.02-.02-.02-2.14.582-.198.046c-.166.034-.333.063-.502.08-.434.043-.88.015-1.296-.128-.27-.093-.524-.234-.742-.42-.423-.362-.713-.89-.79-1.442-.033-.24-.025-.484.02-.722.126-.677.537-1.25.997-1.745l1.57-1.56-.01-.03-.008-.036-2.134-.563-.194-.058c-.193-.065-.384-.138-.568-.227-.38-.185-.73-.434-1-.76-.17-.205-.306-.438-.395-.69-.186-.525-.173-1.127.038-1.644.1-.242.242-.466.417-.66.446-.496 1.07-.774 1.696-.968l2.142-.565.01-.035.008-.03-1.566-1.555-.14-.148c-.413-.467-.76-1.015-.865-1.64-.045-.262-.045-.532.003-.794.098-.527.392-1.024.807-1.365.203-.167.435-.296.683-.383.414-.145.86-.172 1.293-.13.242.022.48.068.716.122l2.147.585.02-.022.02-.02-.584-2.14c-.025-.1-.025-.1-.047-.2-.04-.2-.074-.4-.088-.604-.03-.42.01-.85.157-1.246.092-.25.228-.484.4-.687.35-.406.852-.69 1.38-.777.26-.044.527-.04.786.01.43.08.83.28 1.184.532.198.14.38.3.56.464l1.558 1.57.03-.008.036-.01.563-2.136.06-.193c.053-.16.11-.32.182-.474.18-.398.426-.77.757-1.057.232-.2.502-.358.794-.452.492-.158 1.044-.146 1.528.036.246.092.474.23.674.4.358.31.615.717.8 1.148.082.19.148.387.21.585l.565 2.142.035.01.032.008 1.553-1.566.148-.14c.453-.4.98-.738 1.58-.854.16-.03.32-.043.48-.043.062 0 .06 0 .123.005zM12.783 25.575l.1.026c.126.04.252.08.38.117.21.06.423.11.638.158l.1.027c.086.034.11.04.188.087.147.09.27.22.348.372.043.082.046.105.075.192l.7 2.647c.024.084.05.167.082.248.022.057.045.114.07.17.017.036.03.062.05.098.015.03.03.057.047.087.065.11.153.235.277.286.068.027.147.032.22.024.05-.006.1-.022.144-.048.056-.033.104-.08.146-.13.06-.072.112-.154.156-.238.08-.156.14-.322.188-.49l.7-2.654c.03-.087.032-.11.075-.192.095-.184.25-.334.44-.42.143-.068.303-.09.456-.126.128-.03.127-.03.254-.064.17-.047.336-.097.502-.15l.1-.027c.092-.014.114-.02.207-.02.173.004.344.056.49.15.077.05.092.067.16.13l1.93 1.944c.062.058.127.116.194.17.048.04.096.078.146.113.03.022.06.04.09.06.03.02.057.036.087.053.11.062.25.127.382.108.074-.01.145-.045.204-.09.042-.03.077-.068.102-.113.032-.056.05-.12.06-.184.018-.094.02-.19.017-.285-.008-.174-.04-.347-.08-.516l-.726-2.662c-.02-.09-.03-.112-.033-.204-.01-.208.05-.416.17-.586.092-.128.218-.226.332-.332l.274-.27.27-.29.074-.07c.072-.057.088-.075.168-.12.15-.08.324-.12.495-.113.093.004.115.013.204.032l2.653.72c.085.02.17.037.256.05.06.01.12.02.182.025.036.003.073.006.11.007.032.002.066.003.1.002.126-.002.28-.015.384-.096.058-.046.102-.113.132-.18.02-.048.032-.098.03-.15 0-.064-.017-.128-.04-.19-.03-.09-.077-.173-.128-.253-.094-.148-.21-.28-.33-.408l-1.95-1.935c-.062-.068-.08-.083-.13-.16-.112-.175-.163-.386-.145-.592.008-.092.017-.114.04-.203.04-.126.08-.253.117-.38.058-.21.11-.423.158-.637l.028-.1c.034-.084.04-.108.087-.186.09-.148.22-.27.372-.35.082-.04.105-.044.192-.073l2.648-.698c.083-.025.166-.052.247-.083l.168-.07.1-.05c.03-.015.056-.03.086-.048.11-.065.235-.153.285-.276.027-.07.032-.15.023-.222-.005-.05-.02-.1-.047-.145-.033-.057-.08-.104-.128-.146-.073-.062-.155-.112-.24-.156-.155-.08-.32-.14-.49-.188l-2.653-.7c-.088-.028-.11-.032-.193-.074-.184-.096-.334-.252-.42-.44-.067-.143-.09-.303-.126-.455-.03-.125-.064-.25-.1-.377-.037-.127-.075-.254-.116-.38l-.026-.1c-.013-.09-.02-.114-.018-.206.003-.173.055-.343.148-.49.05-.076.068-.09.13-.16L27.78 10c.058-.065.116-.13.17-.196.04-.048.077-.096.113-.146.02-.03.042-.06.06-.09.018-.027.038-.06.053-.087.062-.11.127-.25.11-.38-.01-.072-.044-.138-.084-.196-.03-.045-.072-.084-.12-.11-.057-.032-.12-.05-.184-.062-.094-.017-.19-.02-.286-.015-.176.007-.348.04-.518.08l-2.66.726c-.088.02-.11.028-.202.032-.207.01-.415-.05-.585-.17-.075-.052-.09-.07-.154-.136l-.27-.29c-.153-.153-.31-.304-.47-.45l-.072-.074c-.056-.072-.073-.088-.118-.168-.083-.152-.123-.325-.115-.497.004-.09.013-.113.032-.203l.722-2.654c.02-.085.037-.17.05-.255.01-.06.018-.12.024-.18.004-.038.006-.07.008-.11v-.1c0-.127-.014-.28-.096-.385-.044-.056-.107-.097-.17-.127-.05-.024-.105-.038-.16-.037-.065 0-.13.016-.19.037-.09.033-.173.078-.254.13-.148.094-.28.21-.408.33l-1.933 1.948c-.068.062-.082.08-.16.13-.174.11-.384.163-.59.145-.092-.008-.114-.018-.202-.04-.126-.04-.252-.08-.38-.116-.21-.058-.423-.11-.638-.157l-.1-.027c-.085-.034-.11-.04-.188-.087-.148-.09-.27-.22-.35-.373-.042-.082-.045-.105-.074-.193L16.692 2.8c-.025-.084-.052-.166-.083-.248l-.07-.168c-.024-.05-.048-.097-.074-.144-.016-.03-.03-.054-.048-.08-.065-.1-.148-.21-.263-.252-.066-.025-.142-.03-.21-.02-.052.004-.1.02-.146.046-.056.033-.103.08-.144.128-.062.073-.113.155-.157.24-.082.156-.14.32-.19.49l-.7 2.655c-.028.088-.03.11-.074.193-.095.185-.252.335-.44.422-.144.066-.304.088-.457.123-.127.032-.253.064-.378.1-.128.036-.255.075-.38.115l-.1.025c-.092.013-.114.02-.206.018-.172-.003-.342-.055-.487-.148-.078-.05-.093-.068-.16-.13L10 4.222c-.064-.06-.128-.117-.196-.172-.047-.038-.095-.076-.145-.11-.03-.022-.062-.043-.093-.063-.028-.018-.056-.035-.085-.05-.112-.063-.25-.128-.382-.11-.07.01-.138.044-.196.084-.047.033-.084.073-.112.122-.032.056-.05.12-.06.182-.017.094-.02.19-.015.285.007.174.04.346.08.515l.727 2.66c.02.09.027.112.032.204.01.206-.05.413-.17.582-.052.076-.07.09-.135.155l-.287.27c-.155.154-.305.31-.45.47l-.075.073c-.072.057-.088.075-.17.12-.15.082-.324.123-.496.115-.092-.004-.115-.013-.204-.032L4.914 8.8c-.084-.02-.17-.037-.255-.05-.06-.01-.12-.02-.182-.025l-.11-.008h-.1c-.13 0-.287.015-.394.103-.052.042-.09.102-.12.163-.023.05-.036.104-.035.16 0 .064.016.128.038.19.032.088.078.173.13.254.094.148.208.28.33.407l1.947 1.934c.062.068.08.083.13.16.112.175.163.384.145.59-.008.092-.018.114-.04.203-.04.127-.08.254-.117.382-.058.21-.11.423-.157.638L6.1 14c-.035.085-.04.108-.088.187-.09.147-.22.27-.373.35-.083.04-.106.045-.194.073l-2.647.698c-.084.025-.166.052-.247.083l-.17.07c-.034.017-.065.032-.098.05-.03.016-.057.03-.087.048-.11.066-.236.154-.286.277-.028.07-.034.15-.025.223.005.05.02.1.047.144.033.056.08.103.13.145.072.06.154.112.24.156.154.08.32.138.488.187l2.655.7c.087.03.11.033.192.076.183.095.333.25.42.44.067.143.09.303.124.455.032.127.065.253.1.378.037.128.075.255.115.38l.025.1c.013.092.02.115.018.206-.003.173-.055.343-.148.488-.05.077-.068.092-.13.16l-1.943 1.93c-.06.064-.117.128-.172.195-.04.048-.076.096-.11.146-.023.03-.043.06-.063.09-.018.03-.035.058-.05.087-.063.112-.128.25-.11.382.01.07.044.138.083.196.032.045.072.084.12.11.057.032.12.05.183.06.094.018.19.02.285.016.176-.008.35-.04.52-.083l2.66-.72c.09-.02.112-.03.204-.033.206-.01.413.05.583.17.075.052.09.07.154.135.088.097.178.192.27.287.153.155.31.305.47.453l.072.073c.057.072.074.088.118.17.083.15.123.323.115.495-.004.093-.013.115-.032.204L8.8 27.087c-.02.084-.037.17-.05.254-.01.06-.02.122-.024.183-.004.037-.007.074-.008.11-.002.035-.002.066-.002.1.003.128.016.28.098.386.046.058.112.102.18.132.047.02.098.032.15.03.064 0 .128-.016.188-.038.09-.033.175-.078.255-.13.148-.094.28-.208.407-.33l1.935-1.95c.067-.06.082-.08.16-.13.115-.073.248-.122.384-.14.092-.01.115-.007.207-.004l.103.015zM16.086 9.32c.34.008.678.035 1.013.09.595.1 1.177.28 1.724.535 1.24.58 2.288 1.543 2.97 2.73.354.615.61 1.286.75 1.98.153.75.177 1.522.07 2.278-.094.68-.295 1.345-.593 1.964-.336.7-.797 1.34-1.353 1.883-.595.582-1.3 1.05-2.066 1.375-.794.336-1.65.513-2.513.525-.865.01-1.73-.146-2.536-.463-.774-.306-1.49-.76-2.1-1.327-.588-.548-1.076-1.2-1.434-1.92-.306-.614-.515-1.276-.618-1.954-.115-.755-.1-1.53.042-2.28.134-.696.38-1.37.726-1.99.654-1.172 1.664-2.133 2.865-2.73.59-.293 1.223-.498 1.872-.605.278-.045.56-.072.84-.084.115-.004.23-.005.344-.005zm-.148 1.884c-.68.012-1.348.16-1.964.447-.54.253-1.034.608-1.446 1.04-.386.405-.7.877-.925 1.39-.198.453-.325.937-.375 1.43-.055.545-.018 1.1.112 1.633.092.38.23.747.414 1.092.515.975 1.364 1.756 2.38 2.186.57.243 1.186.37 1.804.377.622.008 1.243-.103 1.82-.332.558-.22 1.072-.544 1.51-.952.423-.394.774-.863 1.032-1.38.21-.423.356-.876.433-1.34.087-.524.087-1.06 0-1.584-.074-.447-.212-.882-.408-1.29-.47-.974-1.27-1.775-2.245-2.244-.612-.295-1.278-.45-1.955-.47-.062-.002-.125-.003-.187-.002z" fill-rule="nonzero"/></symbol><symbol id="svg-heart-circle" data-name="heart-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M11.228 6.83c.45.027.894.1 1.326.234 1.488.46 2.712 1.564 3.47 2.912.08-.146.172-.287.263-.427.49-.72 1.086-1.355 1.816-1.83.545-.357 1.15-.617 1.785-.762.565-.13 1.15-.166 1.727-.112.482.046.958.155 1.413.32.416.152.815.353 1.186.594.934.607 1.685 1.475 2.174 2.473.358.732.576 1.527.66 2.336.04.374.056.753.034 1.13-.044.792-.254 1.57-.55 2.304-.44 1.098-1.07 2.116-1.77 3.068-1.223 1.67-2.673 3.174-4.192 4.577-1.256 1.16-2.568 2.265-3.944 3.282l-.07.048c-.258.144-.545.194-.83.106-.085-.025-.16-.063-.236-.106-.177-.12-.346-.253-.517-.383-1.207-.932-2.376-1.913-3.497-2.948C10.3 22.56 9.173 21.415 8.15 20.18c-.7-.848-1.355-1.74-1.905-2.693-.41-.71-.762-1.46-.998-2.244-.15-.503-.252-1.02-.282-1.546-.018-.323-.01-.648.018-.97.08-.96.346-1.906.81-2.753.443-.812 1.065-1.524 1.817-2.064.397-.285.83-.52 1.285-.7.578-.226 1.183-.35 1.802-.385.178-.006.354-.006.53 0zm9.778 2.024c-.31.012-.615.058-.912.15-.224.07-.44.162-.646.275-1.17.64-1.877 1.87-2.267 3.106-.065.206-.12.414-.172.624l-.026.086c-.067.17-.16.32-.3.44-.4.342-1.016.315-1.385-.06-.107-.11-.178-.238-.234-.38-.055-.186-.1-.375-.153-.562-.377-1.234-1.023-2.467-2.154-3.163-.153-.093-.312-.177-.477-.247-.367-.155-.76-.245-1.155-.265-.336-.018-.674.015-1 .093-.28.068-.55.167-.805.295-.833.418-1.49 1.13-1.88 1.973-.228.492-.365 1.024-.422 1.563-.042.407-.044.816.02 1.22.104.646.344 1.267.633 1.852.446.902 1.02 1.738 1.638 2.53.806 1.03 1.7 1.992 2.636 2.908 1.277 1.253 2.635 2.42 4.043 3.524l.036.027c1.015-.783 1.997-1.613 2.945-2.478.787-.717 1.55-1.46 2.276-2.24.978-1.05 1.903-2.167 2.65-3.395.47-.777.887-1.617 1.075-2.512.098-.474.11-.953.06-1.433-.054-.506-.177-1.005-.38-1.47-.35-.803-.937-1.496-1.693-1.94-.248-.148-.513-.266-.788-.353-.324-.103-.657-.155-.995-.166h-.17z" fill-rule="nonzero"/></symbol><symbol id="svg-lock-circle" data-name="lock-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M9.558 11.134c0-.338.007-.676.01-1.014.03-.753.17-1.492.446-2.194.668-1.696 2.063-3.057 3.775-3.683.658-.24 1.345-.362 2.044-.388.166-.002.165-.002.332 0 .7.026 1.386.147 2.045.388 1.712.626 3.108 1.987 3.776 3.683.277.702.416 1.44.445 2.194.005.338.01.676.013 1.014.634.02 1.27.044 1.903.07.077.01.15.02.223.046.24.083.44.267.542.5.042.095.062.192.074.294.18 4.31.004 8.627.004 12.94-.005.103-.017.202-.05.3-.083.24-.267.44-.5.542-.095.042-.192.062-.294.075-5.534.23-11.078.004-16.617.004-.103-.004-.2-.016-.3-.05-.24-.083-.44-.266-.542-.5-.042-.095-.062-.19-.074-.293-.18-4.31-.004-8.627-.004-12.94.005-.103.017-.2.05-.3.083-.24.267-.44.5-.542.095-.04.192-.062.294-.074.634-.026 1.27-.05 1.904-.07zm13.794 1.905H8.648v11.026h14.704V13.04zm-8.303 5.247c-.57-.347-.92-.992-.886-1.667.01-.183.046-.365.11-.538.07-.195.176-.378.31-.54.15-.18.334-.332.54-.444.244-.132.507-.2.782-.22.095-.002.094-.002.188 0 .275.02.538.088.78.22.208.112.394.264.544.445.132.16.237.344.31.54.062.172.098.354.108.537.034.682-.324 1.333-.902 1.677.023 1.03.043 2.06-.018 3.085-.015.147-.057.287-.136.413-.218.35-.656.514-1.05.392-.105-.032-.204-.083-.29-.15-.097-.074-.18-.168-.24-.274-.066-.118-.103-.246-.116-.38-.06-1.03-.073-2.065-.035-3.096zm5.54-7.204c.003-.305.007-.61.003-.917-.022-.575-.134-1.138-.36-1.67-.522-1.234-1.586-2.2-2.867-2.6-.517-.16-1.062-.227-1.603-.2-.496.026-.986.13-1.448.313-.516.202-.994.5-1.404.873-.436.397-.796.878-1.052 1.41-.283.588-.426 1.223-.45 1.873-.005.306 0 .612.002.917 3.06-.07 6.12-.07 9.18 0z"/></symbol><symbol id="svg-logo" data-name="logo" viewBox="0 0 54 32" width="54" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M32.207 25.946L21.72 32l-11.234-6.486L0 19.46V6.485L11.235 0 21.72 6.054 32.207 0 43.44 6.486l10.487 6.055v12.974L42.693 32l-10.486-6.054zm.66-1.343V14.27l9.054 5.19.003 10.378-9.055-5.235zm-20.884.046V14.27l9.085 5.218.002 10.44-9.086-5.28zM1.498 18.594V8.215l8.988 5.19v10.38l-8.988-5.19zM21.72 7.785l8.99 5.188-8.99 5.19-8.988-5.19 8.99-5.19zm20.973 0l8.988 5.188-8.987 5.19-8.99-5.19 8.99-5.19zM11.235 1.728l8.988 5.19-8.988 5.188-8.99-5.19 8.99-5.188zm20.97 0l8.99 5.19-8.99 5.188-8.987-5.19 8.988-5.188z"/><path d="M1.437 18.643L1.442 8.11l19.652 11.35.01 10.545L1.436 18.643zm31.37 6l.03-10.464 9.147 5.243-.01 10.582-9.168-5.363z" fill-opacity=".345"/></symbol><symbol id="svg-message-circle" data-name="message-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M17.342 23.582l-3.53 3.53-.066.06c-.12.088-.245.155-.392.185-.38.076-.778-.112-.96-.455-.072-.133-.1-.272-.107-.42v-2.9c-.087 0-.174-.002-.26-.003l-.41-.022c-.333-.03-.665-.072-.994-.14-.64-.132-1.266-.344-1.856-.63-1.33-.643-2.473-1.658-3.273-2.9-.457-.713-.8-1.496-1.012-2.314-.203-.783-.284-1.597-.243-2.405.043-.864.228-1.718.546-2.52.357-.9.877-1.73 1.527-2.446.692-.76 1.53-1.388 2.455-1.836.71-.343 1.47-.58 2.248-.7.335-.05.672-.077 1.01-.09 2.665-.034 5.33-.034 7.996 0 .338.013.674.04 1.01.09.778.12 1.54.357 2.248.7.926.448 1.763 1.075 2.454 1.836.65.715 1.17 1.547 1.527 2.445.32.802.505 1.656.55 2.52.04.807-.04 1.62-.244 2.404-.212.818-.556 1.6-1.013 2.313-.87 1.353-2.146 2.434-3.627 3.063-.668.283-1.374.475-2.094.567-.336.043-.672.06-1.01.065h-2.48zm.123-5.826c.128.01.25.04.364.1.097.05.186.12.26.203.267.305.29.767.058 1.1-.055.078-.122.146-.198.203-.143.106-.31.16-.485.175-2.205.06-4.412.06-6.617 0-.176-.014-.342-.07-.485-.175-.326-.242-.448-.69-.29-1.063.037-.088.088-.17.15-.24.074-.084.163-.154.26-.205.115-.06.237-.09.365-.1 2.205-.058 4.412-.058 6.617 0zm3.747-2.847c.18.017.35.075.493.19.373.293.447.846.166 1.228-.07.096-.16.178-.263.24-.122.07-.255.107-.395.12-3.457.117-6.92.117-10.376 0-.18-.017-.35-.075-.494-.19-.372-.293-.447-.846-.165-1.228.07-.096.16-.178.264-.24.123-.07.255-.107.396-.12 3.457-.117 6.92-.117 10.376 0zm0-2.85c.14.015.273.05.395.123.103.06.193.143.264.24.282.38.208.934-.165 1.228-.144.115-.312.173-.493.192-3.457.115-6.92.115-10.376 0-.18-.02-.35-.077-.494-.19-.372-.295-.447-.848-.165-1.23.07-.096.16-.178.264-.24.123-.07.255-.107.396-.12 3.457-.117 6.92-.117 10.376 0z"/></symbol><symbol id="svg-no-circle" data-name="no-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M16.288 3.93c.48.018.958.052 1.434.12 1.2.174 2.37.53 3.463 1.053 2.135 1.02 3.95 2.69 5.153 4.727.596 1.01 1.042 2.104 1.32 3.242.272 1.12.384 2.28.33 3.43-.06 1.254-.318 2.495-.76 3.67-1.17 3.098-3.644 5.633-6.713 6.877-1.43.58-2.97.878-4.515.878-1.544 0-3.084-.3-4.515-.88-2.284-.925-4.256-2.57-5.59-4.642-.555-.866-1-1.805-1.315-2.785-.355-1.1-.55-2.25-.577-3.404-.028-1.154.11-2.31.412-3.425.318-1.18.82-2.31 1.48-3.34 1.2-1.866 2.92-3.39 4.92-4.347 1.092-.524 2.264-.88 3.463-1.052.476-.068.954-.102 1.434-.12.29-.003.288-.003.576 0zM23.67 9.8L9.874 23.597c.736.59 1.556 1.074 2.432 1.43 1.17.474 2.432.718 3.695.718s2.524-.244 3.695-.72c2.51-1.017 4.536-3.09 5.49-5.625.363-.96.573-1.976.622-3 .05-1.023-.062-2.053-.33-3.04-.26-.966-.67-1.89-1.21-2.73-.183-.288-.383-.565-.596-.83zM22.13 8.256c-.58-.465-1.213-.865-1.885-1.186-.894-.427-1.852-.718-2.833-.86-.39-.056-.78-.083-1.175-.098-.235-.003-.234-.003-.47 0-.394.015-.785.042-1.175.1-.98.14-1.94.43-2.833.86-1.637.783-3.044 2.03-4.025 3.557-.54.84-.95 1.764-1.21 2.73-.246.912-.36 1.86-.338 2.803.023.946.182 1.888.472 2.788.26.802.62 1.57 1.076 2.276.184.287.384.564.597.83l13.798-13.8z"/></symbol><symbol id="svg-pencil-circle" data-name="pencil-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.925 18.165c3.857-4.193 8.057-8.058 12.086-12.087.123-.112.256-.198.417-.24.07-.02.088-.02.16-.03.08-.002.08-.002.162 0 .07.01.088.01.158.03.134.035.248.1.357.185 1.634 1.497 3.137 3.132 4.704 4.7.055.06.106.12.147.192.136.236.16.526.068.782-.037.104-.094.192-.16.28-3.865 4.216-8.087 8.09-12.132 12.135l-.022.02c-.07.066-.15.12-.237.16-.022.012-.044.022-.067.032-2.164.718-4.384 1.256-6.577 1.882-.137.033-.27.047-.41.024-.357-.06-.654-.332-.746-.684-.035-.136-.033-.27-.013-.408.53-2.22 1.252-4.39 1.878-6.582.006-.02.013-.037.02-.055.034-.095.084-.186.148-.267l.016-.02.017-.02c.008-.01.016-.02.025-.028zm.16 5.796l3.335-.952c-.81-.77-1.616-1.546-2.39-2.35l-.944 3.303zm5.185-1.852l7.013-7.013-3.33-3.33-7.032 7.03c1.14 1.082 2.28 2.164 3.35 3.313zm4.996-11.658l3.33 3.33L24 11.38l-3.332-3.332-2.402 2.402z"/></symbol><symbol id="svg-plus-circle" data-name="plus-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.24 17.376h-5.792v5.792c0 .8-.65 1.448-1.448 1.448-.8 0-1.448-.648-1.448-1.448v-5.792H8.76c-.8 0-1.448-.65-1.448-1.448 0-.8.65-1.448 1.448-1.448h5.792V8.688c0-.8.65-1.448 1.448-1.448.8 0 1.448.65 1.448 1.448v5.792h5.792c.8 0 1.448.65 1.448 1.448 0 .8-.65 1.448-1.448 1.448" fill-rule="nonzero"/></symbol><symbol id="svg-progress-circle" data-name="progress-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><g fill-rule="nonzero"><path d="M16 21.288c-.58 0-1.048.47-1.048 1.048v3.52c0 .58.47 1.05 1.048 1.05.578 0 1.048-.47 1.048-1.05v-3.52c0-.58-.47-1.048-1.048-1.048" fill-opacity=".502"/><path d="M25.955 14.9l-3.458-.008c-.597.013-1.05.467-1.05 1.046-.002.58.467 1.05 1.046 1.05l3.458.007h.003c.577 0 1.046-.468 1.048-1.046 0-.58-.467-1.05-1.045-1.05" fill-opacity=".251"/><path d="M16.025 2.832h-.003c-.577 0-1.045.468-1.047 1.046l-.01 5.46c-.002.58.466 1.05 1.044 1.05h.002c.578 0 1.046-.467 1.047-1.045l.01-5.46c.002-.58-.466-1.05-1.045-1.05"/><path d="M13.75 20.81c-.536-.223-1.148.03-1.37.565l-1.375 3.298c-.223.534.03 1.147.563 1.37.133.054.27.082.403.082.412 0 .8-.243.97-.647l1.373-3.297c.224-.533-.028-1.147-.562-1.37" fill-opacity=".6"/><path d="M19.604 21.393c-.22-.537-.833-.79-1.367-.572-.535.22-.79.833-.57 1.37l1.354 3.298c.168.406.56.65.97.65.133 0 .27-.024.398-.078.536-.22.79-.833.572-1.367l-1.356-3.3z" fill-opacity=".4"/><path d="M9.5 16.964h.002c.578 0 1.046-.468 1.048-1.046 0-.58-.467-1.05-1.046-1.05L6.05 14.86h-.003C5.47 14.86 5 15.33 5 15.908c-.003.578.465 1.05 1.045 1.05l3.455.007z" fill-opacity=".902"/><path d="M21.075 13.83c.166.405.557.65.97.65.132 0 .267-.026.398-.08l3.158-1.296c.535-.22.79-.833.57-1.366-.22-.535-.83-.793-1.367-.57l-3.158 1.294c-.536.22-.79.833-.57 1.367" fill-opacity=".2"/><path d="M10.992 17.99c-.22-.536-.83-.794-1.367-.57l-3.228 1.332c-.535.22-.79.833-.57 1.366.167.405.558.65.97.65.13 0 1.557-.558 1.688-.613l1.938-.798c.535-.22.79-.833.57-1.367" fill-opacity=".8"/><path d="M21.28 19.75c-.407-.408-1.07-.41-1.48-.002-.41.41-.412 1.072-.002 1.482l2.482 2.49c.205.204.475.308.743.308s.535-.103.74-.306c.41-.41.41-1.07.003-1.482l-2.485-2.49z" fill-opacity=".349"/><path d="M19.902 12.04c.205.205.474.308.743.308.268 0 .536-.102.74-.305l2.405-2.397c.41-.41.412-1.072.002-1.482-.408-.41-1.07-.41-1.48-.003l-2.405 2.398c-.412.41-.412 1.07-.005 1.482" fill-opacity=".149"/><path d="M18.13 10.813c.132.054.27.08.403.08.41 0 .8-.242.968-.645l1.292-3.107c.223-.532-.03-1.145-.564-1.368-.535-.222-1.15.032-1.37.565l-1.292 3.106c-.222.534.03 1.147.564 1.37" fill-opacity=".102"/><path d="M13.176 6.326c-.22-.535-.834-.793-1.368-.57-.534.222-.79.834-.57 1.37l1.287 3.115c.166.406.556.65.97.65.13 0 .267-.025.397-.08.536-.22.79-.833.57-1.367l-1.286-3.117zM10.626 12.015c.204.205.473.308.742.308.267 0 .535-.102.74-.305.41-.41.41-1.073.002-1.482l-2.393-2.4c-.41-.41-1.072-.41-1.48-.002-.412.41-.413 1.07-.005 1.482l2.394 2.4z"/><path d="M12.186 19.73c-.41-.412-1.072-.413-1.482-.004L8.208 22.21c-.41.41-.41 1.072-.002 1.482.204.206.472.308.743.308.265 0 .533-.1.737-.305l2.495-2.485c.41-.408.41-1.07.004-1.48" fill-opacity=".702"/><path d="M25.59 18.787l-3.214-1.338c-.534-.223-1.148.03-1.37.563-.222.535.03 1.148.565 1.37l3.214 1.34c.13.054.268.08.403.08.41 0 .8-.243.967-.644.223-.537-.03-1.15-.564-1.373" fill-opacity=".302"/><path d="M6.407 13.07l3.16 1.314c.13.054.267.08.4.08.41 0 .8-.243.968-.646.223-.533-.03-1.146-.564-1.37l-3.156-1.314c-.535-.222-1.15.03-1.37.564-.223.535.03 1.148.563 1.37"/></g></symbol><symbol id="svg-progress" data-name="progress" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill="none"/><g fill-rule="nonzero"><path d="M16 22.915c-.758 0-1.37.613-1.37 1.37v4.605c0 .756.612 1.37 1.37 1.37.756 0 1.37-.614 1.37-1.37v-4.605c0-.757-.614-1.37-1.37-1.37" fill-opacity=".502"/><path d="M29.018 14.56l-4.522-.008c-.78.016-1.373.61-1.373 1.367-.002.756.61 1.37 1.368 1.372l4.522.01h.003c.755 0 1.367-.612 1.37-1.37 0-.755-.61-1.37-1.367-1.37" fill-opacity=".251"/><path d="M16.033.242h-.002c-.754 0-1.367.61-1.37 1.367l-.015 5.68c0 .755.61 1.37 1.367 1.372h.003c.756 0 1.37-.61 1.37-1.368l.016-5.68c.003-.757-.61-1.37-1.367-1.372"/><path d="M13.06 22.29c-.703-.292-1.503.04-1.795.738L9.468 27.34c-.29.7.04 1.5.736 1.79.174.074.352.11.528.11.537 0 1.045-.318 1.266-.846l1.796-4.31c.292-.7-.037-1.503-.735-1.793" fill-opacity=".6"/><path d="M20.713 23.052c-.287-.702-1.09-1.035-1.788-.748-.7.287-1.035 1.09-.747 1.79l1.773 4.313c.22.53.73.85 1.27.85.172 0 .35-.032.52-.1.7-.29 1.033-1.09.747-1.79l-1.774-4.315z" fill-opacity=".4"/><path d="M7.5 17.26h.003c.755 0 1.368-.61 1.37-1.367 0-.758-.61-1.372-1.367-1.373l-4.518-.01h-.003c-.756 0-1.37.612-1.37 1.368-.003.757.61 1.372 1.367 1.373l4.52.01z" fill-opacity=".902"/><path d="M22.636 13.162c.218.53.73.85 1.267.85.174 0 .35-.034.522-.105l4.13-1.694c.698-.287 1.033-1.09.744-1.786-.29-.7-1.088-1.037-1.79-.745l-4.13 1.692c-.7.287-1.032 1.09-.744 1.788" fill-opacity=".2"/><path d="M9.45 18.602c-.287-.7-1.085-1.04-1.787-.745l-4.22 1.74c-.7.29-1.033 1.09-.745 1.788.217.53.728.85 1.267.85.172 0 2.036-.73 2.208-.8l2.534-1.045c.7-.288 1.033-1.09.744-1.788" fill-opacity=".8"/><path d="M22.906 20.904c-.533-.534-1.4-.537-1.937-.002-.537.534-.54 1.4-.004 1.937l3.246 3.255c.27.267.62.402.97.402.352 0 .7-.134.97-.4.536-.534.537-1.4.003-1.937l-3.25-3.256z" fill-opacity=".349"/><path d="M21.103 10.822c.267.268.62.402.97.402.352 0 .7-.133.97-.398l3.144-3.135c.536-.534.538-1.4.003-1.937-.535-.535-1.4-.537-1.938-.004L21.11 8.883c-.54.535-.54 1.4-.007 1.938" fill-opacity=".149"/><path d="M18.786 9.217c.173.07.35.106.526.106.536 0 1.047-.318 1.266-.844l1.69-4.064c.29-.697-.04-1.5-.74-1.79-.7-.29-1.5.04-1.792.738l-1.69 4.06c-.29.7.04 1.5.74 1.793" fill-opacity=".102"/><path d="M12.307 3.35c-.29-.7-1.09-1.037-1.79-.744-.698.288-1.032 1.09-.743 1.79l1.682 4.074c.216.528.727.848 1.267.848.173 0 .35-.033.52-.105.7-.287 1.034-1.09.746-1.787L12.306 3.35zM8.973 10.79c.267.267.618.4.97.4.35 0 .7-.132.967-.397.536-.535.54-1.403.003-1.938l-3.13-3.137c-.533-.537-1.4-.538-1.936-.004-.537.535-.54 1.4-.004 1.938l3.13 3.137z"/><path d="M11.012 20.876c-.536-.537-1.402-.538-1.937-.004l-3.265 3.25c-.535.533-.537 1.4-.002 1.936.267.27.618.403.97.403.35 0 .7-.13.967-.398l3.263-3.25c.536-.533.537-1.4.004-1.936" fill-opacity=".702"/><path d="M28.54 19.645l-4.203-1.75c-.697-.29-1.5.04-1.79.738-.29.698.04 1.5.738 1.792l4.202 1.75c.17.07.35.106.526.106.537 0 1.045-.317 1.264-.842.292-.7-.038-1.502-.737-1.793" fill-opacity=".302"/><path d="M3.456 12.167l4.13 1.72c.172.07.35.105.526.105.537 0 1.047-.318 1.264-.846.292-.697-.038-1.498-.737-1.79l-4.13-1.72c-.698-.29-1.5.04-1.79.74-.292.698.038 1.5.736 1.79"/></g></symbol><symbol id="svg-question-circle" data-name="question-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M17.46 17.292v3.053c0 .807-.653 1.46-1.46 1.46-.807 0-1.46-.653-1.46-1.46v-4.33c0-.804.653-1.46 1.46-1.46 1.584 0 2.87-1.284 2.87-2.868 0-1.584-1.286-2.87-2.87-2.87s-2.87 1.286-2.87 2.87c0 .806-.654 1.46-1.46 1.46-.81 0-1.462-.654-1.462-1.46 0-3.194 2.598-5.792 5.792-5.792s5.792 2.598 5.792 5.792c0 2.69-1.84 4.956-4.33 5.605M16 25.398c-.798 0-1.444-.643-1.444-1.444 0-.795.646-1.438 1.444-1.438.798 0 1.444.643 1.444 1.438 0 .8-.646 1.444-1.444 1.444" fill-rule="nonzero"/></symbol><symbol id="svg-refresh-circle" data-name="refresh-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.628 10.107l-1.048 4.12c-.012.046-.044.086-.064.135-.172.46-.638.794-1.13.794-.033 0-.065-.01-.1-.012-.032-.003-.06-.008-.09-.013-.038-.006-.077-.004-.114-.013l-4.117-1.05c-.66-.168-1.06-.836-.893-1.497.17-.663.836-1.062 1.502-.89l1.462.37c-.506-.614-1.122-1.137-1.842-1.53-1.47-.81-3.17-.99-4.775-.526-1.613.47-2.945 1.538-3.75 3.01-.81 1.47-1 3.168-.526 4.777.967 3.327 4.46 5.247 7.785 4.276.655-.185 1.338.185 1.525.838.193.654-.182 1.336-.838 1.53-.813.235-1.632.35-2.44.35-3.79 0-7.29-2.486-8.402-6.302-.653-2.246-.392-4.608.732-6.656 1.125-2.046 2.98-3.533 5.224-4.19 2.242-.65 4.604-.393 6.65.73 1.015.56 1.893 1.298 2.598 2.173l.26-1.03c.17-.662.842-1.064 1.5-.89.658.166 1.058.837.89 1.497" fill-rule="nonzero"/></symbol><symbol id="svg-restore" data-name="restore" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill="none"/><path d="M24.34 7.216c-2.384-2.223-5.49-3.388-8.75-3.273-3.396.12-6.64 1.703-8.9 4.348-1.456 1.707-2.397 3.723-2.777 5.888l-1.456-2.193c-.356-.535-1.076-.68-1.612-.325-.535.354-.682 1.076-.325 1.61l3.478 5.24c.415.658 1.42.695 1.9.057l4.02-4.575c.423-.483.375-1.217-.107-1.642-.482-.422-1.216-.374-1.64.107l-1.982 2.256c.295-1.81 1.06-3.496 2.27-4.91 1.838-2.152 4.467-3.44 7.212-3.536 2.638-.096 5.154.85 7.085 2.65 1.93 1.8 3.044 4.244 3.136 6.883.094 2.638-.846 5.153-2.647 7.085-1.8 1.93-4.246 3.044-6.884 3.136-.643.023-1.145.56-1.123 1.203.023.628.538 1.122 1.163 1.122h.04c3.26-.114 6.28-1.49 8.503-3.874 2.225-2.385 3.387-5.494 3.272-8.75-.114-3.26-1.49-6.28-3.874-8.504" fill-rule="nonzero"/></symbol><symbol id="svg-search-circle" data-name="search-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M7.716 13.77c0-3.362 2.738-6.102 6.105-6.102 3.363 0 6.1 2.74 6.1 6.103 0 3.365-2.737 6.105-6.1 6.105-3.366 0-6.104-2.74-6.104-6.104m18.19 10.785l-5.88-5.882c1.073-1.353 1.74-3.042 1.74-4.902 0-4.38-3.564-7.948-7.945-7.948-4.383 0-7.95 3.567-7.95 7.95 0 4.382 3.567 7.95 7.95 7.95 1.857 0 3.548-.67 4.9-1.744l5.883 5.882c.18.18.415.27.652.27.236 0 .472-.09.65-.27.363-.358.363-.943 0-1.305" fill-rule="nonzero"/></symbol><symbol id="svg-star-circle" data-name="star-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.08 5.155c.28.025.535.142.71.367.053.067.09.137.126.213l2.607 6.106h6.06l.082.005c.17.022.325.07.466.17.376.263.512.773.317 1.188-.06.13-.15.233-.254.328l-5.213 4.342 2.63 7.014.025.08c.04.167.048.33.004.5-.118.445-.554.75-1.014.708-.172-.016-.323-.08-.467-.174l-6.136-4.38L9.89 26l-.072.046c-.15.08-.307.13-.48.132-.462.002-.87-.34-.947-.796-.028-.17-.004-.333.05-.496l2.628-7.014-5.213-4.34-.062-.057c-.096-.104-.175-.215-.224-.35-.16-.43.02-.926.418-1.156.15-.087.308-.122.478-.13h6.062l2.632-6.108.036-.074c.042-.072.086-.14.144-.2.155-.167.354-.258.576-.296.082-.007.082-.007.164-.007zm-2.045 8.02c-.035.072-.072.14-.12.205-.13.168-.316.29-.522.343-.08.02-.156.026-.236.03h-4.05l3.706 3.084.062.057c.058.063.11.125.154.2.097.17.14.37.123.567-.01.087-.03.166-.057.247l-1.768 4.717 4.14-2.955.072-.047c.076-.04.15-.076.233-.098.19-.052.397-.043.583.025.08.03.15.072.223.12l4.14 2.954-1.768-4.717-.026-.08c-.02-.083-.034-.164-.035-.25 0-.197.06-.393.175-.554.05-.07.107-.128.17-.186l3.705-3.084h-4.05l-.078-.004c-.08-.01-.157-.024-.234-.05-.26-.09-.45-.283-.566-.528l-1.98-4.637c-.665 1.547-1.33 3.093-1.997 4.64z" fill-rule="nonzero"/></symbol><symbol id="svg-status-failed" data-name="status-failed" viewBox="0 0 33 32" width="33" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16.217 26.67c-.754 0-1.362-.61-1.362-1.36 0-.752.608-1.36 1.362-1.36.75 0 1.36.608 1.36 1.36 0 .75-.61 1.36-1.36 1.36M14.97 13.06c0-.688.558-1.247 1.247-1.247.688 0 1.247.56 1.247 1.247v8.163c0 .69-.56 1.248-1.247 1.248-.69 0-1.248-.557-1.248-1.248v-8.163zm17.423 17.32L17.65.89c-.026-.05-.06-.08-.086-.126-.192-.312-.477-.54-.816-.66 0 0 .003-.004.005-.004C16.58.04 16.403 0 16.217 0c-.567 0-1.063.294-1.348.76-.025.043-.058.076-.08.118L.133 30.194c-.195.386-.175.846.052 1.212.23.37.63.594 1.063.594H31.21c.69 0 1.247-.56 1.247-1.247 0-.13-.027-.252-.064-.372" fill-rule="nonzero"/></symbol><symbol id="svg-status-partial" data-name="status-partial" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm.013 2.472v27.055l.102.01c1.764-.014 3.52-.375 5.147-1.064 1.555-.658 2.982-1.61 4.19-2.79 1.168-1.142 2.13-2.492 2.82-3.97.566-1.21.95-2.5 1.135-3.82.207-1.478.17-2.99-.11-4.454-.24-1.25-.66-2.463-1.24-3.594-1.32-2.57-3.46-4.69-6.05-5.977-1.19-.594-2.468-1.007-3.78-1.226-.565-.095-1.133-.147-1.703-.173-.17-.004-.34-.015-.51.002z"/><path d="M16.013 2.472v27.055l.102.01c1.764-.014 3.52-.375 5.147-1.064 1.555-.658 2.982-1.61 4.19-2.79 1.168-1.142 2.13-2.492 2.82-3.97.566-1.21.95-2.5 1.135-3.82.207-1.478.17-2.99-.11-4.454-.24-1.25-.66-2.463-1.24-3.594-1.32-2.57-3.46-4.69-6.05-5.977-1.19-.594-2.468-1.007-3.78-1.226-.565-.095-1.133-.147-1.703-.173-.17-.004-.34-.015-.51.002z" fill-opacity=".149"/></symbol><symbol id="svg-status-pending" data-name="status-pending" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M20 18.666h-6.666V8c0-.736.596-1.332 1.332-1.332C15.404 6.668 16 7.264 16 8v8h4c.738 0 1.334.596 1.334 1.334 0 .74-.596 1.332-1.334 1.332M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol><symbol id="svg-sync-circle" data-name="sync-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M25.754 19.267c-1.384 3.912-5.102 6.538-9.254 6.538-2.776 0-5.45-1.168-7.36-3.014v.833c0 .68-.547 1.227-1.227 1.227-.677 0-1.227-.547-1.227-1.227v-4.77c0-.678.55-1.228 1.227-1.228h4.77c.68 0 1.228.55 1.228 1.227 0 .678-.547 1.227-1.226 1.227h-2.668c1.41 1.958 3.88 3.27 6.484 3.27 3.114 0 5.905-1.97 6.943-4.903.223-.638.922-.974 1.565-.748.638.225.972.93.746 1.567M6.294 12.78c1.383-3.91 5.1-6.537 9.254-6.537 2.775 0 5.453 1.17 7.36 3.018v-.835c0-.675.547-1.227 1.227-1.227.677 0 1.227.552 1.227 1.227v4.77c0 .68-.55 1.227-1.227 1.227h-4.77c-.678 0-1.228-.547-1.228-1.227 0-.677.55-1.227 1.227-1.227h2.667c-1.407-1.956-3.88-3.27-6.482-3.27-3.115 0-5.905 1.97-6.94 4.902-.18.503-.653.818-1.157.818-.136 0-.273-.02-.408-.07-.64-.227-.975-.927-.75-1.567" fill-rule="nonzero"/></symbol><symbol id="svg-thumbs-up-circle" data-name="thumbs-up-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.07 18.6c.78 0 1.413.634 1.413 1.415 0 .78-.632 1.414-1.413 1.414h-.943c.78 0 1.414.632 1.414 1.413 0 .78-.632 1.414-1.413 1.414H16c-3.77 0-2.828-1.886-10.37-1.886V13.89h2.83c3.298 0 7.07-3.037 7.07-7.54 0-1.49 2.827-1.68 2.827 1.148 0 1.885-.943 5.45-.943 5.45h7.54c.782 0 1.415.633 1.415 1.413s-.634 1.413-1.415 1.413h-.943c.782 0 1.414.634 1.414 1.414 0 .782-.632 1.414-1.414 1.414h-.942" fill-rule="nonzero"/></symbol><symbol id="svg-warning-circle" data-name="warning-circle" viewBox="0 0 33 33" width="33" height="33" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16.024" cy="16.024" r="16.024" fill-opacity=".149"/><path d="M16.898 17.985c0 .493-.4.892-.892.892s-.89-.4-.89-.892V13.12c0-.49.398-.89.89-.89s.892.4.892.89v4.865zm-.892 3.242c-.446 0-.81-.364-.81-.81 0-.45.364-.81.81-.81.448 0 .81.36.81.81 0 .446-.362.81-.81.81m9.614 1.837L16.803 5.43c-.303-.605-1.29-.605-1.594 0L6.293 23.26c-.14.276-.125.604.04.866.16.264.448.425.757.425h17.867c.492 0 .892-.4.892-.89 0-.23-.087-.44-.23-.596" fill-rule="nonzero"/></symbol><symbol id="svg-x-circle" data-name="x-circle" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle cx="16" cy="16" r="16" fill-opacity=".149"/><path d="M23.484 21.68c.478.477.478 1.254 0 1.732-.24.24-.554.36-.868.36-.31 0-.625-.12-.865-.36L16 17.662l-5.75 5.75c-.24.24-.555.36-.866.36-.314 0-.628-.12-.868-.36-.478-.478-.478-1.255 0-1.733l5.752-5.752-5.752-5.75c-.478-.477-.478-1.253 0-1.73.478-.48 1.255-.48 1.735 0L16 14.195l5.75-5.75c.48-.48 1.256-.48 1.734 0s.478 1.255 0 1.733l-5.752 5.748 5.752 5.75z" fill-rule="nonzero"/></symbol><symbol id="svg-buttons" data-name="buttons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M326.9 41c1.6 0 3 1.4 3 3v29.8c0 1.6-1.4 3-3 3H140.8c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h186.1m0-5H140.8c-4.4 0-8 3.6-8 8v29.8c0 4.4 3.6 8 8 8h186.1c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8z"/><path fill="#8c9ba5" d="M198.7 54.1h70.2v9.6h-70.2z"/><path fill="#dd2f41" d="M327.4 94.1H140.6c-4.2 0-7.7 3.5-7.7 7.7v30.4c0 4.2 3.5 7.7 7.7 7.7h186.7c4.2 0 7.7-3.5 7.7-7.7v-30.4c.1-4.2-3.4-7.7-7.6-7.7zm-58.6 27.7h-70.2v-9.6h70.2v9.6z"/><path fill="#297adf" d="M327.1 152.2H140.9c-4.4 0-7.9 3.6-7.9 7.9V190c0 4.4 3.6 7.9 7.9 7.9h186.2c4.4 0 7.9-3.6 7.9-7.9v-29.9c.1-4.3-3.5-7.9-7.9-7.9zm-58.3 27.6h-70.2v-9.6h70.2v9.6z"/></symbol><symbol id="svg-cards" data-name="cards" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M405.9 36H258.5c-4.5 0-8.1 3.6-8.1 8.1v145.8c0 4.5 3.6 8.1 8.1 8.1h147.4c4.5 0 8.1-3.6 8.1-8.1V44.1c0-4.5-3.6-8.1-8.1-8.1zm-150.4 8.1c0-1.6 1.4-3 3-3h147.4c1.6 0 3 1.4 3 3V156H255.5V44.1zM209.6 40.7c1.6 0 3 1.4 3 3v146.1c0 1.6-1.4 3-3 3H61.9c-1.6 0-3-1.4-3-3v-146c0-1.6 1.4-3 3-3h147.7m0-5.1H61.9c-4.5 0-8.1 3.7-8.1 8.1v146.1c0 4.5 3.7 8.1 8.1 8.1h147.7c4.5 0 8.1-3.7 8.1-8.1V43.8c.1-4.5-3.6-8.1-8.1-8.1z"/><path fill="#fff" d="M401.5 187.1h-53.6c-1.9 0-3.5-1.6-3.5-3.5v-12.7c0-1.9 1.6-3.5 3.5-3.5h53.6c1.9 0 3.5 1.6 3.5 3.5v12.7c0 1.9-1.6 3.5-3.5 3.5z"/></symbol><symbol id="svg-color-wheel" data-name="color-wheel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#2ac84f" d="M306.8 81.8c-7.9-16.1-20.9-29.1-37-37-.8.8-1.4 1.8-1.9 2.8l-11.3 26.2-11.2 26.2c-2.1 4.8 1.4 8.2 6.2 6.2l26.2-11.3L304 83.6c1-.4 2-1.1 2.8-1.8z"/><path fill="#59a702" d="M310.6 91.1c-1.1 0-2.2.3-3.3.7l-26.5 10.6-26.5 10.6c-4.9 1.9-4.9 6.8 0 8.7l26.5 10.6 26.5 10.6c1.1.4 2.2.6 3.3.7 2.8-8.2 4.3-17 4.3-26.2s-1.5-18.1-4.3-26.3z"/><path fill="#efc102" d="M306.8 152.7c-.8-.8-1.8-1.4-2.8-1.9l-26.2-11.3-26.2-11.3c-4.8-2.1-8.2 1.4-6.2 6.2l11.3 26.2 11.3 26.2c.5 1.1 1.1 2 1.9 2.8 15.9-7.8 29-20.8 36.9-36.9z"/><path fill="#f69524" d="M234.3 197.9c9.2 0 18-1.5 26.2-4.3 0-1.1-.3-2.2-.7-3.3l-10.6-26.5-10.6-26.5c-1.9-4.9-6.8-4.9-8.7 0l-10.6 26.5-10.6 26.5c-.4 1.1-.6 2.2-.7 3.3 8.3 2.8 17.1 4.3 26.3 4.3z"/><path fill="#f96623" d="M217.1 128.3l-26.2 11.3-26.2 11.3c-1.1.5-2 1.1-2.8 1.9 7.9 16.1 20.9 29.1 37 37 .8-.8 1.4-1.8 1.9-2.8l11.3-26.2 11.3-26.2c1.9-4.9-1.5-8.3-6.3-6.3z"/><path fill="#a81d27" d="M214.3 112.9l-26.5-10.6-26.5-10.6c-1.1-.4-2.2-.6-3.3-.7-2.8 8.2-4.3 17-4.3 26.2s1.5 18 4.3 26.2c1.1 0 2.2-.3 3.3-.7l26.5-10.6 26.5-10.6c4.8-1.8 4.8-6.7 0-8.6z"/><path fill="#a346ce" d="M161.8 81.8c.8.8 1.8 1.4 2.8 1.9L190.8 95l26.2 11.3c4.8 2.1 8.2-1.4 6.2-6.2L212 73.8l-11.3-26.2c-.5-1.1-1.1-2-1.9-2.8-16 7.8-29.1 20.9-37 37z"/><path fill="#297adf" d="M234.3 36.6c-9.2 0-18 1.5-26.2 4.3 0 1.1.3 2.2.7 3.3l10.6 26.5L230 97.2c1.9 4.9 6.8 4.9 8.7 0l10.6-26.5 10.6-26.5c.4-1.1.6-2.2.7-3.3-8.3-2.8-17.1-4.3-26.3-4.3z"/></symbol><symbol id="svg-dialog" data-name="dialog" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#fff" d="M177.8 170.8c-3 0-5.5-2.5-5.5-5.5V63.7c0-3 2.5-5.5 5.5-5.5h112.4c3 0 5.5 2.5 5.5 5.5v101.6c0 3-2.5 5.5-5.5 5.5H177.8z"/><path fill="#d6dde7" d="M290.2 60.7c1.6 0 3 1.4 3 3v101.6c0 1.6-1.4 3-3 3H177.8c-1.6 0-3-1.4-3-3V63.7c0-1.6 1.4-3 3-3h112.4m0-5H177.8c-4.4 0-8 3.6-8 8v101.6c0 4.4 3.6 8 8 8h112.4c4.4 0 8-3.6 8-8V63.7c0-4.4-3.6-8-8-8z"/><path fill="#297adf" d="M260.4 158.2h-52.9c-1.9 0-3.5-1.6-3.5-3.5v-12.5c0-1.9 1.6-3.5 3.5-3.5h52.9c1.9 0 3.5 1.6 3.5 3.5v12.5c0 1.9-1.5 3.5-3.5 3.5z"/></symbol><symbol id="svg-feedback" data-name="feedback" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><g fill="#f96623"><path fill-opacity=".48" d="M315.294 144.15l-4.098 10.1L250.69 129.7l4.097-10.1z"/><path d="M217.264 104.368l-4.1 10.1-60.506-24.553 4.1-10.1z"/><path fill-opacity=".24" d="M206.906 198.23l-10.1-4.098 24.553-60.507 10.1 4.098z"/><path fill-opacity=".72" d="M246.706 100.272l-10.1-4.098 24.553-60.507 10.098 4.098z"/><path fill-opacity=".36" d="M272.328 193.588l-10.04 4.245-25.428-60.148 10.04-4.244z"/><path fill-opacity=".84" d="M231.086 96.223l-10.04 4.244-25.428-60.148 10.04-4.245z"/><path fill-opacity=".12" d="M157.39 155.246l-4.246-10.04 60.148-25.428 4.244 10.04z"/><path fill-opacity=".6" d="M254.762 114.076l-4.245-10.04 60.148-25.428 4.244 10.04z"/></g></symbol><symbol id="svg-icons" data-name="icons" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f0f3f6" d="M334.8 119s-50.5 62.4-112.8 62.4S109.3 119 109.3 119s50.5-62.4 112.8-62.4S334.8 119 334.8 119z"/><path fill="#d6dde7" d="M222.1 183.9c-18.1 0-47-5.5-81.3-31.7-20.4-15.6-32.9-31-33.5-31.6L106 119l1.3-1.6c.5-.6 13-16 33.5-31.6 34.3-26.2 63.1-31.7 81.3-31.7 18.1 0 47 5.5 81.3 31.7 20.4 15.6 32.9 31 33.5 31.6l1.3 1.6-1.3 1.6c-.5.6-13 16-33.5 31.6-34.4 26.2-63.2 31.7-81.3 31.7zM112.6 119c8.3 9.6 54.6 59.9 109.5 59.9s101.2-50.3 109.5-59.9c-8.3-9.6-54.6-59.9-109.5-59.9S120.9 109.4 112.6 119z"/><path fill="#59a702" d="M222.1 69.4c-27 0-49 21.9-49 49s21.9 49 49 49c27 0 49-21.9 49-49s-22-49-49-49zm11.5 40.9c-6.4 0-11.5-5.2-11.5-11.5s5.2-11.5 11.5-11.5c6.4 0 11.5 5.2 11.5 11.5s-5.2 11.5-11.5 11.5z"/><path fill="#549103" d="M233.6 110.3c-6.4 0-11.5-5.2-11.5-11.5 0-.6.1-1.3.2-1.9h-.2c-11.9 0-21.5 9.6-21.5 21.5s9.6 21.5 21.5 21.5 21.5-9.6 21.5-21.5c0-3.8-1-7.4-2.8-10.6-2 1.6-4.5 2.5-7.2 2.5z"/></symbol><symbol id="svg-inputs" data-name="inputs" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M278.9 64.2h-89.8c-29.1 0-52.8 23.8-52.8 52.8 0 29.1 23.8 52.8 52.8 52.8h89.8c29.1 0 52.8-23.8 52.8-52.8 0-29.1-23.7-52.8-52.8-52.8zm-.8 95.8c-23.3 0-42.2-18.9-42.2-42.2 0-23.3 18.9-42.2 42.2-42.2 23.3 0 42.2 18.9 42.2 42.2 0 23.3-18.9 42.2-42.2 42.2z"/></symbol><symbol id="svg-messages" data-name="messages" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" class="st0" d="M349.1 197.3H118.9c-1.8 0-3.3-1.5-3.3-3.3V39.4c0-1.8 1.5-3.3 3.3-3.3h230.2c1.8 0 3.3 1.5 3.3 3.3V194c0 1.8-1.5 3.3-3.3 3.3z"/><path fill="#59a702" d="M327.1 80.3H140.6c-2.1 0-3.8-1.7-3.8-3.8V36h194.1v40.5c0 2.1-1.7 3.8-3.8 3.8z"/><path fill="#549103" d="M140.6 80.3h40.5V36h-44.3v40.5c0 2.1 1.7 3.8 3.8 3.8z"/><circle fill="#7bc117" cx="307.7" cy="58.1" r="11.8"/></symbol><symbol id="svg-panel" data-name="panel" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#d6dde7" d="M371.4 41c1.6 0 3 1.4 3 3v56c0 1.6-1.4 3-3 3H96.6c-1.6 0-3-1.4-3-3V44c0-1.6 1.4-3 3-3h274.8m0-5H96.6c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h274.8c4.4 0 8-3.6 8-8V44c0-4.4-3.6-8-8-8zM371.4 198H96.6c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h274.8c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8z"/></symbol><symbol id="svg-progress-bars" data-name="progress-bars" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dfe3e6" d="M401.6 129.5H66.4c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h335.3c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.6 12.5z"/><path fill="#efc102" d="M333.4 129.5h-267c-6.9 0-12.5-5.6-12.5-12.5s5.6-12.5 12.5-12.5h267c6.9 0 12.5 5.6 12.5 12.5-.1 6.9-5.7 12.5-12.5 12.5z"/></symbol><symbol id="svg-section" data-name="section" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#f69524" d="M228.9 112.3h-76.1V55.9c0-10.9 8.8-19.7 19.7-19.7h56.4v76.1z"/><path fill="#d6dde7" d="M228.9 197.8h-56.6c-10.8 0-19.5-8.7-19.5-19.5v-56.6h76.1v76.1zM315.2 112.3h-76.1V36.2H296c10.6 0 19.2 8.6 19.2 19.2v56.9zM295.7 197.8h-56.6v-76.1h76.1v56.6c0 10.7-8.7 19.5-19.5 19.5z"/></symbol><symbol id="svg-sliders" data-name="sliders" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#297adf" cx="164.6" cy="117" r="6.6"/><path fill="#297adf" d="M145.7 117c0-1.7.3-3.4.7-5H80.2c-2-5-6.8-8.5-12.5-8.5-7.5 0-13.5 6-13.5 13.5s6 13.5 13.5 13.5c5.7 0 10.5-3.5 12.5-8.5h66.2c-.5-1.6-.7-3.3-.7-5z"/><path fill="#d6dde7" d="M400.3 103.5c-5.7 0-10.5 3.5-12.5 8.5H246.5c-2-5-6.8-8.5-12.5-8.5s-10.5 3.5-12.5 8.5h-38.6c-2.2-8-9.5-13.9-18.2-13.9-10.4 0-18.9 8.5-18.9 18.9 0 10.4 8.5 18.9 18.9 18.9 8.7 0 16-5.9 18.2-13.9h38.6c2 5 6.8 8.5 12.5 8.5s10.5-3.5 12.5-8.5h141.3c2 5 6.8 8.5 12.5 8.5 7.5 0 13.5-6 13.5-13.5s-6-13.5-13.5-13.5zm-235.7 27.4c-7.7 0-13.9-6.2-13.9-13.9s6.2-13.9 13.9-13.9 13.9 6.2 13.9 13.9-6.2 13.9-13.9 13.9zm18.9-12.3c0-.5.1-1.1.1-1.6s0-1.1-.1-1.6c0 .5.1 1.1.1 1.6s-.1 1.1-.1 1.6zm-.2 1.4c0-.2.1-.5.1-.7 0 .3-.1.5-.1.7zm0-6c0 .2.1.5.1.7 0-.3-.1-.5-.1-.7z"/></symbol><symbol id="svg-tables" data-name="tables" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#c3cddb" d="M366.6 197.9c4.4 0 8.1-3.6 8.1-8.1V44.2c0-4.4-3.6-8.1-8.1-8.1H101.4c-4.4 0-8.1 3.6-8.1 8.1V189.8c0 4.4 3.6 8.1 8.1 8.1h265.2zm3-153.7v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zm-180 43.6V41.2h88.7v46.6h-88.7zm88.8 5.1V142h-88.7V92.9h88.7zm-180-48.7c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2zm0 48.7h86.2V142H98.4V92.9zm3 99.9c-1.6 0-3-1.4-3-3V147h86.2v45.8h-83.2zm88.2 0V147h88.7v45.8h-88.7zm180-3c0 1.6-1.4 3-3 3h-83.2V147h86.2v42.8zm0-47.8h-86.2V92.9h86.2V142z"/><path fill="#a346ce" d="M369.6 44.2v43.6h-86.2V41.2h83.2c1.6 0 3 1.4 3 3zM189.6 41.2h88.7v46.6h-88.7zM98.4 44.2c0-1.6 1.4-3 3-3h83.2v46.6H98.4V44.2z"/></symbol><symbol id="svg-text" data-name="text" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#297adf" d="M228 172.7l-8.3-21.8h-52.1l-8.3 21.8h-22.6l44.6-113.5h24.9l44.6 113.5H228zm-34.3-93.4l-20.4 54.1h40.9l-20.5-54.1zM313.5 172.7v-8.9c-6.1 7-15.7 10.9-26.6 10.9-13.4 0-28.6-9-28.6-27.2 0-18.9 15.1-26.7 28.6-26.7 11.1 0 20.6 3.6 26.6 10.6v-12.3c0-9.5-7.8-15.3-19.2-15.3-9.2 0-17.2 3.4-24.3 10.4l-7.3-12.4c9.5-9 21.4-13.3 34.6-13.3 18.2 0 34.2 7.7 34.2 29.8v54.5h-18zm0-18.7v-12.4c-4.1-5.6-11.7-8.5-19.6-8.5-10 0-17.5 5.8-17.5 14.8 0 8.9 7.5 14.6 17.5 14.6 7.8 0 15.5-2.9 19.6-8.5z"/></symbol><symbol id="svg-time" data-name="time" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><circle fill="#c3cddb" cx="234" cy="117" r="80.8"/><path fill="#fff" d="M261.1 148.1c-1 0-2-.4-2.8-1.2l-27.1-27.1c-.8-.8-1.2-1.8-1.2-2.8V56.2c0-2.2 1.8-4 4-4s4 1.8 4 4v59.2l25.9 25.9c1.6 1.6 1.6 4.1 0 5.7-.8.7-1.8 1.1-2.8 1.1z"/></symbol><symbol id="svg-validation" data-name="validation" viewBox="0 0 468 234" width="468" height="234" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#dd2f41" d="M332 69.7H136c-4.4 0-8 3.6-8 8v83.2c0 1.9 1.5 3.4 3.4 3.4h205.2c1.9 0 3.4-1.5 3.4-3.4V77.7c0-4.4-3.6-8-8-8zm-141.7 75.5h-52.1v-9.3h52.1v9.3zM335 111.8H133V77.7c0-1.6 1.4-3 3-3h196c1.6 0 3 1.4 3 3v34.1z"/></symbol><symbol id="svg-status-completed" data-name="status-completed" viewBox="0 0 32 32" width="32" height="32" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M24.965 12.802l-10.267 11.25-7.626-7.621a1.232 1.232 0 0 1 0-1.741 1.224 1.224 0 0 1 1.74 0l5.805 5.802 8.531-9.349a1.23 1.23 0 0 1 1.817 1.659M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0" fill-rule="nonzero"/></symbol></svg>')
80
80
  }
81
81
  }
82
82
 
@@ -15670,4 +15670,4 @@ function hasOwnProperty(obj, prop) {
15670
15670
  },{"./support/isBuffer":78,"_process":71,"inherits":68}]},{},[12])(12)
15671
15671
  });
15672
15672
 
15673
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9mbGFzaC1tZXNzYWdlcy5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2Zvcm0tc3VibWl0LWhlbHBlcnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9pbnB1dC1udW1iZXItb25seS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2lucHV0LXVuaXQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9saW5rLWhlcmUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90ZXh0YXJlYS1leHBhbmQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL21vZHVsZXMvY2xpcGJvYXJkLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9tb2R1bGVzL25vdGlmeS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vbW9kdWxlcy91bml0LWNvbnZlcnRlci5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vdHVuZ3N0ZW4uanMiLCJub2RlX21vZHVsZXMvYmVhbi9iZWFuLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1lbWl0dGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9mcm9tdG9wLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3Njcm9sbHRvLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvdGltZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2FuaW1hdGlvbi1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYnViYmxlLWZvcm0tZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2NhbGxiYWNrLW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvZGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvZGVsYXkuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvbWVkaWEuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvb3B0aW1pemVkLWV2ZW50LW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcGFnZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcmVzaXplLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Njcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zaGltcy9jdXN0b20tZXZlbnQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc3VibWl0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3RhcC1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGhyb3R0bGUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2dldC1sYWJlbC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2lucHV0LWNoYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3Byb2dyZXNzaXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvcmVzZXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3ZhbGlkYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1zbGlkZXIvbGliL29iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi9kYXRlLXRvLWh0bWwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9saWIvdGltZWFnby5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi90b2dnbGUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b2dnbGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvdGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2tleW1hc3Rlci9rZXltYXN0ZXIuanMiLCJub2RlX21vZHVsZXMvbHV4b24vYnVpbGQvY2pzLWJyb3dzZXIvbHV4b24uanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2FnZW50LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXF1ZXN0LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVzcG9uc2UtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3RVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25mQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDamFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6eU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0ckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBuYW1lc1xuXG4gIGZ1bmN0aW9uIGF0dHIoIHNvdXJjZSwgbmFtZSApe1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09ICdvYmplY3QnKVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSsnXCIgJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZSsnXCIgJyB9XG5cbiAgZnVuY3Rpb24gZGFzaGVyaXplKCBpbnB1dCApIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW1xcVyxfXS9nLCAnLScpLnJlcGxhY2UoLy17Mix9L2csICctJylcbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z05hbWUoIG5hbWUgKSB7XG4gICAgcmV0dXJuIFwic3ZnLVwiK2Rhc2hlcml6ZSggbmFtZSApXG4gIH1cblxuICBmdW5jdGlvbiB1c2UoIG5hbWUsIG9wdGlvbnMgKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB2YXIgaWQgPSBkYXNoZXJpemUoIG5hbWUgKVxuICAgIHZhciBzeW1ib2wgPSBzdmdzKClbaWRdXG5cbiAgICBpZiAoIHN5bWJvbCApIHtcbiAgICAgIHZhciBwYXJlbnQgPSBzeW1ib2wucGFyZW50RWxlbWVudFxuICAgICAgdmFyIHByZWZpeCA9IHBhcmVudC5kYXRhc2V0LnByZWZpeFxuICAgICAgdmFyIGJhc2UgICA9IHBhcmVudC5kYXRhc2V0LnN5bWJvbENsYXNzXG5cbiAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCggJzxzdmc+PHVzZSB4bGluazpocmVmPVwiIycgKyBwcmVmaXggKyAnLScgKyBpZCArICdcIi8+PC9zdmc+JyApLmZpcnN0Q2hpbGQ7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAnY2xhc3MnLCBiYXNlICsgJyAnICsgcHJlZml4ICsgJy0nICsgaWQgKyAnICcgKyAoIG9wdGlvbnMuY2xhc3MgfHwgJycgKS50cmltKCkgKVxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSggJ3ZpZXdCb3gnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCAndmlld0JveCcgKSApXG5cbiAgICAgIGlmICggISggb3B0aW9ucy53aWR0aCB8fCBvcHRpb25zLmhlaWdodCB8fCBvcHRpb25zLnNjYWxlICkgKSB7XG5cbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAgc3ltYm9sLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSlcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgc3ltYm9sLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKCBvcHRpb25zLndpZHRoICkgIHN2Zy5zZXRBdHRyaWJ1dGUoICd3aWR0aCcsICBvcHRpb25zLndpZHRoIClcbiAgICAgICAgaWYgKCBvcHRpb25zLmhlaWdodCApIHN2Zy5zZXRBdHRyaWJ1dGUoICdoZWlnaHQnLCBvcHRpb25zLmhlaWdodCApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdmdcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgXCInK25hbWUrJ1wiIHN2ZyBzeW1ib2wuIEVuc3VyZSB0aGF0IHN2ZyBzY3JpcHRzIGFyZSBsb2FkZWQnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z3MoKXtcbiAgICBpZiAoICFuYW1lcyApIHtcbiAgICAgIG5hbWVzID0ge31cbiAgICAgIGZvciggdmFyIHN5bWJvbCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnc3ZnW2lkXj1lc3ZnXSBzeW1ib2wnICkgKSB7XG4gICAgICAgIG5hbWVzW3N5bWJvbC5kYXRhc2V0Lm5hbWVdID0gc3ltYm9sXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lc1xuICB9XG5cbiAgdmFyIGVzdmcgPSB7XG4gICAgc3Znczogc3ZncyxcbiAgICB1c2U6IHVzZVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oIGV2ZW50ICkgeyBuYW1lcyA9IG51bGw7IGVzdmcuc3ZncygpIH0pXG4gIH1cblxuICBpZiggdHlwZW9mKCBtb2R1bGUgKSAhPSAndW5kZWZpbmVkJyApIHsgbW9kdWxlLmV4cG9ydHMgPSBlc3ZnIH1cbiAgZWxzZSB3aW5kb3cuZXN2ZyA9IGVzdmdcblxufSkoKSIsIihmdW5jdGlvbigpe1xuXG4gIGZ1bmN0aW9uIGVtYmVkKCkge1xuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vzdmctc3ZnLWljb25zJykpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCAnPHN2ZyBpZD1cImVzdmctc3ZnLWljb25zXCIgZGF0YS1zeW1ib2wtY2xhc3M9XCJzdmctc3ltYm9sXCIgZGF0YS1wcmVmaXg9XCJzdmdcIiB2ZXJzaW9uPVwiMS4xXCIgc3R5bGU9XCJoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZVwiIGRhdGEtdHVyYm9saW5rcy1wZXJtYW5lbnQ+PHN5bWJvbCBpZD1cInN2Zy1hbmdsZS1kb3duXCIgZGF0YS1uYW1lPVwiYW5nbGUtZG93blwiIHZpZXdCb3g9XCIwIDAgMjcgMTVcIiB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMTVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjUuMzA0LjAwNWMuMDkyLjAxMi4xMTYuMDEyLjIwNi4wMzYuMTM1LjAzNy4yNjMuMDk3LjM3Ny4xNzcuMzQ4LjI0NC41NDUuNjY1LjUwOCAxLjA4OC0uMDEuMTA0LS4wMzIuMjA3LS4wNjguMzA1LS4wNDguMTMyLS4xMi4yNTQtLjIxLjM2LS4wMi4wMjgtLjA0Ni4wNTMtLjA3LjA4bC0xMiAxMmMtLjAyNS4wMjItLjA1LjA0Ny0uMDc3LjA3LS4wOC4wNjctLjE3LjEyMy0uMjY0LjE2OC0uMzIuMTQ4LS42OTUuMTQ4LTEuMDE0IDAtLjA5NS0uMDQ1LS4xODQtLjEtLjI2NC0uMTctLjAyNy0uMDItLjA1Mi0uMDQ2LS4wNzctLjA3bC0xMi0xMkMuMjkgMS45OC4yNyAxLjk2Ni4yMTcgMS44OWMtLjA4LS4xMTQtLjE0LS4yNDItLjE3Ni0uMzc3Qy0uMDggMS4wNjYuMDc0LjU3OC40MjguMjguNTM1LjE5LjY1OC4xMi43ODguMDczLjkyLjAyNSAxLjA2IDAgMS4yIDBjLjI0NiAwIC40OS4wNzYuNjkuMjE3LjA3Ni4wNTMuMDkuMDcyLjE2LjEzNGwxMS4xNSAxMS4xNTNMMjQuMzUyLjM1bC4wNzgtLjA3Yy4wNzMtLjA1Ni4wOS0uMDczLjE3LS4xMi4xMjItLjA3LjI1NS0uMTE4LjM5My0uMTQyLjA5My0uMDE2LjExNi0uMDE0LjIxLS4wMThsLjEwNC4wMDV6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LWRvd24tY2lyY2xlXCIgZGF0YS1uYW1lPVwiYXJyb3ctZG93bi1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIyLjIxOCAxOC45NDNsLTUuMjQzIDUuMjQzYy0uMjI2LjI4Mi0uNTU4LjQ4LS45NS40OC0uMDA2IDAtLjAxLS4wMDYtLjAxOC0uMDA2LS4wMDggMC0uMDEzLjAwNS0uMDIuMDA1LS4zMTUgMC0uNjMtLjEyLS44Ny0uMzZsLTUuMzYtNS4zNjJjLS40ODMtLjQ4LS40ODMtMS4yNiAwLTEuNzM4LjQ3OC0uNDggMS4yNTUtLjQ4IDEuNzM3IDBsMy4zIDMuM1Y5LjMyM2MwLS42NzguNTUtMS4yMyAxLjIzLTEuMjMuNjggMCAxLjIzLjU1MiAxLjIzIDEuMjNWMjAuNDNsMy4yMjYtMy4yMjVjLjQ4LS40OCAxLjI2LS40OCAxLjczOCAwIC40OC40OC40OCAxLjI1OCAwIDEuNzM4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LXVwLWNpcmNsZVwiIGRhdGEtbmFtZT1cImFycm93LXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMjk0IDE0Ljc5OGMtLjI0LjI0LS41NTYuMzYtLjg3LjM2LS4zMTUgMC0uNjI3LS4xMi0uODY4LS4zNmwtMy4zMDMtMy4zMDVWMjIuNjhjMCAuNjc3LS41NDggMS4yMy0xLjIzIDEuMjMtLjY3OCAwLTEuMjI4LS41NTMtMS4yMjgtMS4yM1YxMS41N2wtMy4yMjcgMy4yMjhjLS40ODIuNDgtMS4yNi40OC0xLjczOCAwLS40ODItLjQ4LS40ODItMS4yNTggMC0xLjczN2w1LjI0My01LjI0N2MuMjI2LS4yODIuNTYtLjQ4Ljk1LS40OC4wMDggMCAuMDEzLjAwNi4wMi4wMDYuMDA4IDAgLjAxMy0uMDA2LjAyLS4wMDYuMzI3IDAgLjY0LjEzLjg2OC4zNmw1LjM2NCA1LjM2N2MuNDguNDguNDggMS4yNiAwIDEuNzM4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWJhY2t1cFwiIGRhdGEtbmFtZT1cImJhY2t1cFwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMTYuMDQgMjMuODljLS45MDUuMDczLTEuODEyLjExLTIuNzA2LjExQzguMDQ3IDI0IDIuNDg0IDIyLjY1NiAwIDIwLjQ4M3YyLjg1YzAgMy4zNjQgNS44NTYgNiAxMy4zMzQgNiAxLjM1OCAwIDIuNjYtLjA4OCAzLjg4OC0uMjVDMTYuNDUyIDI3Ljc4NyAxNiAyNi4yOCAxNiAyNC42NjdjMC0uMjYzLjAxNS0uNTIyLjA0LS43Nzh6bS0yLjcwNy0xLjIyM2MxLjAwNCAwIDEuOTg4LS4wNDcgMi45NDMtLjEzLjU1Ni0yLjE5IDEuOTQzLTQuMDQ1IDMuODA3LTUuMjEzLTIuMTUuNDM2LTQuNDkuNjc2LTYuNzUuNjc2QzguMDQ3IDE4IDIuNDgzIDE2LjY1NiAwIDE0LjQ4M1YxOGMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40NFY4Ljg5M0MyMy44MiAxMC44MDcgMTguMzc3IDEyIDEzLjMzMyAxMiA4LjA0NyAxMiAyLjQ4MyAxMC42NTYgMCA4LjQ4M1YxMmMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40MzhWNmMwLTMuMzY0LTUuODU4LTYtMTMuMzM0LTZTMCAyLjYzNiAwIDZjMCAyLjExMyA1Ljk0OCA0LjY2NyAxMy4zMzMgNC42Njd6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI4IDI1LjMzM2gtMi42NjdWMjhjMCAuMzY4LS4zLjY2Ny0uNjY2LjY2Ny0uMzY4IDAtLjY2Ny0uMy0uNjY3LS42Njd2LTIuNjY3aC0yLjY2N2MtLjM2OCAwLS42NjYtLjI5OC0uNjY2LS42NjYgMC0uMzY4LjI5OC0uNjY3LjY2Ni0uNjY3SDI0di0yLjY2N2MwLS4zNjguMy0uNjY2LjY2Ny0uNjY2LjM2NiAwIC42NjYuMjk4LjY2Ni42NjZWMjRIMjhjLjM2NyAwIC42NjcuMy42NjcuNjY3IDAgLjM2OC0uMy42NjYtLjY2Ny42NjZtLTMuMzMzLThjLTQuMDQ0IDAtNy4zMzQgMy4yOS03LjMzNCA3LjMzNFMyMC42MjMgMzIgMjQuNjY3IDMyQzI4LjcxIDMyIDMyIDI4LjcxIDMyIDI0LjY2N2MwLTQuMDQ0LTMuMjktNy4zMzQtNy4zMzMtNy4zMzRcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hlY2stY2lyY2xlXCIgZGF0YS1uYW1lPVwiY2hlY2stY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNC45MjUgMTIuNzQ1bC0xMC4yMiAxMS4yLTcuNTktNy41ODhjLS40OC0uNDgzLS40OC0xLjI1NSAwLTEuNzMyLjQ3Ny0uNDgzIDEuMjUyLS40ODMgMS43MzIgMGw1Ljc3NiA1Ljc3NSA4LjQ5LTkuMzA3Yy40NTctLjUwMiAxLjIzMy0uNTM2IDEuNzMzLS4wOC41LjQ1NS41MzQgMS4yMzIuMDggMS43MzJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2x1c3RlclwiIGRhdGEtbmFtZT1cImNsdXN0ZXJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2IDMyYy0uMDU2IDAtLjExMy0uMDAyLS4xNy0uMDA1LS4xMTItLjAwNy0uMjI0LS4wMi0uMzM1LS4wNC0uMzMyLS4wNi0uNjUzLS4xOC0uOTQyLS4zNTQtLjEzLS4wNzgtLjI1Ni0uMTY3LS4zNzMtLjI2Ni0uMDU1LS4wNDctLjEwOC0uMDk2LS4xNi0uMTQ3QzkuNjA0IDI2LjggNS4yIDIyLjM5Ny44MTMgMTcuOThjLS4wNzYtLjA3Ny0uMTQ4LS4xNTgtLjIxNC0uMjQzLS4xMjctLjE2LS4yMzYtLjMzNS0uMzI0LS41Mi0uMDktLjE4NC0uMTU3LS4zOC0uMjAzLS41OEMuMDIzIDE2LjQzIDAgMTYuMjE1IDAgMTZjMC0uMjE0LjAyNC0uNDMuMDczLS42MzguMDQ2LS4yLjExNC0uMzk1LjIwMy0uNTguMDg4LS4xODQuMTk3LS4zNTguMzIzLS41Mi4wNjUtLjA4NC4xMzctLjE2NS4yMTMtLjI0MkM1LjIgOS42MDQgOS42MDMgNS4yIDE0LjAyLjgxM2MuMDc3LS4wNzYuMTU4LS4xNDguMjQzLS4yMTQuMTYtLjEyNy4zMzUtLjIzNi41Mi0uMzI0LjE4NC0uMDkuMzgtLjE1Ny41OC0uMjAzQzE1LjU3LjAyMyAxNS43ODUgMCAxNiAwYy4yMTQgMCAuNDMuMDI0LjYzOC4wNzMuMi4wNDYuMzk1LjExNC41OC4yMDMuMTg0LjA4OC4zNTguMTk3LjUyLjMyMy4wODQuMDY1LjE2NS4xMzcuMjQyLjIxM0MyMi4zOTYgNS4yIDI2LjggOS42MDMgMzEuMTg3IDE0LjAyYy4wNzYuMDc3LjE0OC4xNTguMjE0LjI0My4xMjcuMTYuMjM2LjMzNS4zMjQuNTIuMDkuMTg0LjE1Ny4zOC4yMDMuNTguMDUuMjA4LjA3My40MjMuMDczLjYzNyAwIC4yMTQtLjAyNC40My0uMDczLjYzOC0uMDQ2LjItLjExNC4zOTUtLjIwMy41OC0uMDg4LjE4NC0uMTk3LjM1OC0uMzIzLjUyLS4wNjUuMDg0LS4xMzcuMTY1LS4yMTMuMjQyLTQuMzg4IDQuNDE2LTguNzkgOC44Mi0xMy4yMDcgMTMuMjA3LS4wNTIuMDUtLjEwNS4xLS4xNi4xNDctLjExNy4xLS4yNDIuMTg4LS4zNzMuMjY3LS4yNzUuMTY2LS41NzguMjgyLS44OTIuMzQ1LS4xMS4wMjItLjIyMy4wMzgtLjMzNS4wNDYtLjA1LjAwNS0uMTAyLjAwOC0uMTUyLjAxSDE2em0wLTEuODgzYy4wNTUgMCAuMTEtLjAwNS4xNjQtLjAxNC4xMDctLjAyLjIxLS4wNTcuMzA1LS4xMTIuMDY4LS4wNC4xMy0uMDg3LjE4Ny0uMTQzIDQuNDEyLTQuMzg0IDguODQtOC43NTUgMTMuMTk1LTEzLjE5NS4wMjYtLjAyNy4wNTItLjA1Ni4wNzUtLjA4Ny4wNDItLjA1NC4wNzctLjExMy4xMDYtLjE3Ni4wNS0uMTEyLjA4LS4yMzQuMDgzLS4zNTYuMDA1LS4xNDUtLjAyMy0uMjktLjA4My0uNDIzLS4wMy0uMDYyLS4wNjQtLjEyLS4xMDYtLjE3NS0uMDIzLS4wMy0uMDUtLjA2LS4wNzUtLjA4Ny00LjM1OC00LjQ0Mi04Ljc1OC04Ljg0Mi0xMy4yLTEzLjItLjAyNy0uMDI2LS4wNTYtLjA1Mi0uMDg3LS4wNzUtLjA1NC0uMDQyLS4xMTMtLjA3Ny0uMTc2LS4xMDYtLjExMi0uMDUtLjIzNC0uMDgtLjM1Ni0uMDgzLS4xNDUtLjAwNS0uMjkuMDIzLS40MjMuMDgzLS4wNi4wMjgtLjExNy4wNjItLjE3LjEwMi0uMDMzLjAyNC0uMDYzLjA1LS4wOTIuMDc4LTQuNDQyIDQuMzU4LTguODQyIDguNzU4LTEzLjIgMTMuMmwtLjA4LjA5Yy0uMDQuMDU1LS4wNzMuMTEyLS4xLjE3My0uMDYuMTMzLS4wOS4yOC0uMDg0LjQyNC4wMDQuMTIyLjAzMi4yNDQuMDgzLjM1NS4wMy4wNjIuMDY0LjEyLjEwNi4xNzUuMDIzLjAzLjA1LjA2LjA3NS4wODcgNC4zNTggNC40NDIgOC43NTggOC44NDIgMTMuMiAxMy4yLjA1NS4wNTMuMTE2LjEuMTgzLjE0LjA4OC4wNS4xODQuMDg3LjI4NC4xMDYuMDU2LjAxMi4xMTIuMDE4LjE3LjAySDE2elwiIGZpbGwtb3BhY2l0eT1cIi41MDJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjxwYXRoIGQ9XCJNMTcuNDgyIDI2LjkzbC0uODQ3Ljg0NmMtLjE3LjE3LS4zOTcuMjYzLS42MzUuMjYzcy0uNDY2LS4wOTUtLjYzNS0uMjY0bC0xMS4xNC0xMS4xNGMtLjE3LS4xNy0uMjY0LS4zOTgtLjI2NC0uNjM2cy4wOTUtLjQ2Ni4yNjQtLjYzNWwxMS4xNC0xMS4xNGMuMTctLjE3LjM5OC0uMjY0LjYzNi0uMjY0cy40NjYuMDk1LjYzNS4yNjRsNC4wNSA0LjA1djUuNDU2Yy0uMTA0LjAzLS4yMDUuMDY0LS4zMDMuMTA2LS4yNy4xMTYtLjUxNy4yODMtLjcyNS40OS0uMi4xOTUtLjM2Mi40MjYtLjQ4LjY4LS4xMDIuMjItLjE3LjQ1NC0uMi42OTUtLjAzMy4yNDgtLjAyNS41LjAyMi43NDUuMDQuMjEzLjExLjQyLjIxLjYxNC4xMjIuMjQ0LjI4OC40NjYuNDg3LjY1NC4xOTMuMTguNDE2LjMzLjY1OC40MzguMi4wOS40MTIuMTUuNjI4LjE4LjExLjAxNS4yMi4wMjIuMzI4LjAyM2guMDYyYy4xMS0uMDA0LjIxOC0uMDE0LjMyNi0uMDMyLjIxNS0uMDM2LjQyNS0uMTAyLjYyMi0uMTk1LjI0My0uMTE1LjQ2Ni0uMjczLjY1Ni0uNDYzcy4zNDgtLjQxNC40NjQtLjY1N2MuMDk1LS4yLjE2Mi0uNDE2LjE5Ny0uNjM2LjAzOC0uMjQuMDQtLjQ4OC4wMDItLjczLS4wMzgtLjI0LS4xMTItLjQ3Mi0uMjItLjY5LS4xMjMtLjI0OC0uMjkyLS40NzUtLjQ5NC0uNjY2LS4yMTQtLjItLjQ2NS0uMzYyLS43MzgtLjQ3Mi0uMDgtLjAzMi0uMTY0LS4wNi0uMjUtLjA4NFY5LjUyOGw1LjgzOCA1LjgzN2MuMTcuMTcuMjYzLjM5Ny4yNjMuNjM1cy0uMDk1LjQ2Ni0uMjY0LjYzNWwtNi42NCA2LjY0LTQuNTA4LTQuNTF2LTYuNTFjLjEzLS4wMzYuMjU4LS4wODMuMzgtLjE0LjI0My0uMTE2LjQ2Ni0uMjc0LjY1Ny0uNDY0LjE4Ny0uMTg2LjM0Mi0uNDA1LjQ1Ny0uNjQzLjA5Ny0uMi4xNjQtLjQxNS4yLS42MzQuMDQyLS4yNDYuMDQzLS41LjAwNS0uNzQ1LS4wMzYtLjI0LS4xMS0uNDcyLS4yMTgtLjY5LS4xMjUtLjI0OC0uMjkzLS40NzUtLjQ5Ni0uNjY2LS4yMTQtLjItLjQ2NS0uMzYyLS43MzctLjQ3Mi0uMTQ0LS4wNTgtLjI5NC0uMS0uNDQ3LS4xMy0uMTUtLjAyNy0uMzA2LS4wNC0uNDYtLjA0LS4xNS4wMDMtLjI5OC4wMi0uNDQ0LjA1LS4xNTYuMDMtLjMxLjA4LS40NTYuMTQyLS4yNy4xMTYtLjUxNi4yODMtLjcyNS40OS0uMTk4LjE5NS0uMzYuNDI2LS40OC42OC0uMTAyLjIxOC0uMTcuNDU0LS4yLjY5NS0uMDMyLjI0Ny0uMDI0LjUuMDIzLjc0NC4wNC4yMTQuMTEuNDIyLjIxLjYxNS4xMi4yNC4yODMuNDYuNDc4LjY0NS4xOTUuMTg2LjQyMi4zMzguNjY4LjQ0OC4xMDYuMDQ3LjIxNi4wODcuMzI4LjExOHY2Ljc2OGMuMDAyLjA1IDAgLjA2LjAxLjExLjAxNi4wOS4wNS4xNzYuMTA0LjI1LjAyOC4wNC4wMzcuMDQ4LjA3LjA4NGw0LjY5MyA0LjY5NC0xLjg4IDEuODgtNi45NjItNi45NjJ2LS44MWMuMTMtLjAzNi4yNTgtLjA4NC4zOC0uMTQyLjI0NC0uMTE1LjQ2Ny0uMjczLjY1Ny0uNDYzcy4zNDgtLjQxNC40NjQtLjY1N2MuMDk0LS4yLjE2LS40MTYuMTk2LS42MzYuMDM4LS4yNC4wNC0uNDg4LjAwMi0uNzMtLjAzNy0uMjQtLjExLS40NzItLjIxOC0uNjktLjEyNC0uMjQ4LS4yOTMtLjQ3NS0uNDk1LS42NjYtLjIxNC0uMi0uNDY1LS4zNjItLjczOC0uNDcyLS4xNDQtLjA1Ny0uMjkzLS4xLS40NDYtLjEzLS4xNS0uMDI3LS4zMDUtLjA0LS40Ni0uMDM4LS4xNTQuMDAyLS4zMDcuMDE4LS40NTguMDUtLjE1LjAzMi0uMy4wOC0uNDQuMTQtLjI3LjExNi0uNTE4LjI4My0uNzI2LjQ5LS4xOTguMTk1LS4zNjIuNDI2LS40OC42OC0uMTAyLjIyLS4xNy40NTQtLjIuNjk1LS4wMzMuMjQ4LS4wMjUuNS4wMjIuNzQ1LjA0My4yMjMuMTE4LjQ0LjIyMy42NC4xMjUuMjM4LjI5LjQ1NS40ODcuNjM4LjE5LjE3OC40MS4zMjMuNjQ3LjQzLjEwNy4wNDYuMjE3LjA4Ni4zMy4xMTd2MS4wN2MwIC4wNCAwIC4wNS4wMDUuMDkuMDEyLjA4OC4wNDQuMTczLjA5Mi4yNS4wMTcuMDI0LjAzNS4wNDguMDU0LjA3bC4wMy4wMzMgNy4xNDYgNy4xNDZ6bS02LjctOS44M2MuMDU1IDAgLjExLS4wMDUuMTY2LS4wMTQuMDk2LS4wMTQuMTktLjA0Mi4yNzgtLjA4LjEwMy0uMDQ3LjItLjExLjI4My0uMTg0LjA5LS4wOC4xNjgtLjE3Ni4yMjgtLjI4LjA1LS4wOTMuMDktLjE5LjExNC0uMjkzLjAzLS4xMy4wMzUtLjI2LjAyLS4zOS0uMDE1LS4xMS0uMDQ2LS4yMTctLjA5Mi0uMzE4LS4wNTUtLjEyLS4xMzMtLjIzLS4yMjctLjMyNC0uMDk4LS4wOTYtLjIxMy0uMTc0LS4zNC0uMjI4LS4xMy0uMDU3LS4yNzQtLjA4Ny0uNDE4LS4wOS0uMTQ1IDAtLjI5LjAyNS0uNDIzLjA4LS4xMjUuMDUtLjI0LjEyMy0uMzQuMjE1LS4wOTcuMDktLjE3OC4yLS4yMzcuMzE3LS4wNS4xLS4wODMuMjA1LS4xLjMxMy0uMDIuMTMtLjAxOC4yNjIuMDA3LjM5LjAyLjEuMDU1LjIuMTAyLjI5LjA1My4xMDIuMTIzLjE5Ni4yMDQuMjc3LjA4Ny4wODUuMTg3LjE1Ni4yOTcuMjEuMDkuMDQyLjE4My4wNzMuMjguMDkuMDU1LjAxLjExLjAxNS4xNjcuMDE3aC4wM3ptMTAuNTMgMGMuMDU2IDAgLjExMi0uMDA1LjE2Ny0uMDE0LjA5NS0uMDE0LjE5LS4wNDIuMjc3LS4wOC4xMDctLjA1LjIwNi0uMTE0LjI5My0uMTkyLjA4Ny0uMDguMTYtLjE3Mi4yMi0uMjczLjA1LS4wOS4wODctLjE4NS4xMS0uMjg1LjAzMi0uMTMuMDQtLjI2NC4wMjItLjM5Ni0uMDE0LS4xMS0uMDQ1LS4yMTctLjA5LS4zMTgtLjA1Ni0uMTItLjEzNC0uMjMtLjIyOC0uMzI0LS4wOTgtLjA5Ni0uMjEzLS4xNzQtLjM0LS4yMjgtLjEzLS4wNTctLjI3NC0uMDg3LS40MTgtLjA5LS4xNDUgMC0uMjkuMDI1LS40MjMuMDgtLjEyNi4wNS0uMjQuMTIzLS4zNC4yMTUtLjA5Ny4wOS0uMTc4LjItLjIzNy4zMTctLjA1LjEtLjA4My4yMDUtLjEuMzEzLS4wMi4xMy0uMDE4LjI2Mi4wMDcuMzkuMDIuMTA2LjA1OC4yMDguMTA4LjMwMi4wNTguMTA1LjEzLjIuMjE4LjI4My4wODIuMDc3LjE3Ni4xNDIuMjc4LjE5LjA5LjA0NC4xODMuMDc1LjI4LjA5Mi4wNTUuMDEuMTEuMDE1LjE2Ny4wMTdoLjAyOHpNMTYgMTEuMDg0Yy4wNTYgMCAuMTEyLS4wMDQuMTY4LS4wMTMuMDk2LS4wMTQuMTktLjA0Mi4yNzgtLjA4LjEwMy0uMDQ3LjE5OC0uMTEuMjgzLS4xODQuMDktLjA4LjE2Ny0uMTc2LjIyNy0uMjgyLjA1LS4wOS4wOS0uMTg1LjExMi0uMjg1LjAzLS4xMjguMDM3LS4yNjMuMDItLjM5NS0uMDE0LS4xMS0uMDQ0LS4yMTctLjA5LS4zMTctLjA1Ni0uMTItLjEzMy0uMjMtLjIyOC0uMzI0LS4wOTctLjA5Ni0uMjEzLS4xNzQtLjM0LS4yMy0uMTMtLjA1NS0uMjc0LS4wODUtLjQxOC0uMDg3LS4xNDQtLjAwMi0uMjkuMDI0LS40MjMuMDc4LS4xMjQuMDUtLjI0LjEyNC0uMzM4LjIxNi0uMDk3LjA5Mi0uMTc4LjItLjIzNy4zMTgtLjA1LjEtLjA4My4yMDQtLjEuMzEzLS4wMi4xMy0uMDIuMjYzLjAwNy4zOS4wMi4xMDYuMDU3LjIwOC4xMDguMzAzLjA1Ny4xMDcuMTMzLjIwNS4yMjIuMjg3LjA4LjA3Ni4xNzMuMTQuMjcyLjE4Ny4wOS4wNDQuMTg4LjA3NS4yODguMDkyLjA1My4wMDguMTA2LjAxMy4xNi4wMTVIMTZ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY29weVwiIGRhdGEtbmFtZT1cImNvcHlcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48ZyBmaWxsLXJ1bGU9XCJub256ZXJvXCI+PHBhdGggZD1cIk0yMi42NjcgNC42NjdjMC0uMzY4LS4zLS42NjctLjY2Ny0uNjY3aC0zLjMzM3YxMC40OTVjMS4yMDgtLjY0IDIuNTYyLTEuMDMyIDQtMS4xMjd2LTguN3pNNCAyNS4zMzNWNEguNjY3Qy4zIDQgMCA0LjMgMCA0LjY2N1YyNmMwIDEuODM3IDEuNDk2IDMuMzMzIDMuMzMzIDMuMzMzaDEyLjAyYy0uODc4LTEuMTY1LTEuNTE3LTIuNTItMS44MTgtNEg0elwiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk0xNCAxMkg3LjMzM2MtLjM2OCAwLS42NjYuMy0uNjY2LjY2NyAwIC4zNjguMjk4LjY2Ni42NjYuNjY2SDE0Yy4zNjggMCAuNjY3LS4yOTguNjY3LS42NjYgMC0uMzY4LS4zLS42NjctLjY2Ny0uNjY3TTE0IDE0LjY2N0g3LjMzM2MtLjM2OCAwLS42NjYuMjk4LS42NjYuNjY2IDAgLjM2OC4yOTguNjY3LjY2Ni42NjdIMTRjLjM2OCAwIC42NjctLjMuNjY3LS42NjcgMC0uMzY4LS4zLS42NjYtLjY2Ny0uNjY2TTE0LjY2NyAxOGMwLS4zNjgtLjMtLjY2Ny0uNjY3LS42NjdINy4zMzNjLS4zNjggMC0uNjY2LjMtLjY2Ni42NjcgMCAuMzY4LjI5OC42NjcuNjY2LjY2N0gxNGMuMzY4IDAgLjY2Ny0uMy42NjctLjY2N003LjMzMyAyMGMtLjM2OCAwLS42NjYuMy0uNjY2LjY2NyAwIC4zNjguMjk4LjY2Ni42NjYuNjY2aDRjLjM2OCAwIC42NjctLjI5OC42NjctLjY2NiAwLS4zNjgtLjMtLjY2Ny0uNjY3LS42NjdoLTR6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTYgOS4zMzNoMTAuNjY3Yy4zNjggMCAuNjY2LS4yOTguNjY2LS42NjZWMy4zMzNjMC0uMzY4LS4yOTgtLjY2Ni0uNjY2LS42NjZoLTIuMDZDMTQuMzMgMS4xMTUgMTMuMDg3IDAgMTEuMzMzIDAgOS42ODcgMCA4LjM2MyAxIDguMDYgMi42NjdINmMtLjM2OCAwLS42NjcuMjk4LS42NjcuNjY2djUuMzM0YzAgLjM2OC4zLjY2Ni42NjcuNjY2XCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTI2Ljk3IDI0SDI0djIuOTdjMCAuMzY3LS4zLjY2Ni0uNjY3LjY2Ni0uMzY4IDAtLjY2Ni0uMy0uNjY2LS42NjdWMjRoLTIuOTdjLS4zNjggMC0uNjY2LS4zLS42NjYtLjY2NyAwLS4zNjguMy0uNjY2LjY2Ny0uNjY2aDIuOTd2LTIuOTdjMC0uMzcuMjk4LS42NjYuNjY2LS42NjYuMzY4IDAgLjY2Ny4yOTguNjY3LjY2N3YyLjk3aDIuOTdjLjM2NyAwIC42NjYuMjk4LjY2Ni42NjYgMCAuMzY4LS4zLjY2Ny0uNjY3LjY2N20tMy42MzctOS4zMzNjLTQuNzggMC04LjY2NiAzLjg4OC04LjY2NiA4LjY2NiAwIDQuNzggMy44ODYgOC42NjcgOC42NjYgOC42NjdTMzIgMjguMTEyIDMyIDIzLjMzM2MwLTQuNzc4LTMuODg4LTguNjY2LTguNjY3LTguNjY2XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRlcGxveW1lbnRcIiBkYXRhLW5hbWU9XCJkZXBsb3ltZW50XCIgdmlld0JveD1cIjAgMCAxNzYgMjAxXCIgd2lkdGg9XCIxNzZcIiBoZWlnaHQ9XCIyMDFcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNODggNS45ODVsODIuMjcyIDQ3LjV2OTVMODggMTk1Ljk4NWwtODIuMjcyLTQ3LjV2LTk1TDg4IDUuOTg1elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRpY2VcIiBkYXRhLW5hbWU9XCJkaWNlXCIgdmlld0JveD1cIjAgMCA0NSAzMlwiIHdpZHRoPVwiNDVcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0zMC43NjIgMTAuMjMyYzEuMTgzLjY4NCAxLjU5IDIuMi45MDYgMy4zODJsLTkuOSAxNy4xNDhjLS42ODMgMS4xODMtMi4yIDEuNTktMy4zODIuOTA2bC0xNy4xNDgtOS45Yy0xLjE4My0uNjg0LTEuNTktMi4yLS45MDYtMy4zODJsOS45LTE3LjE0OGMuNjg0LTEuMTgzIDIuMi0xLjU5IDMuMzgyLS45MDZsMTcuMTQ4IDkuOXpcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMTMgNS4yNWMuMDItLjAwMi4wNC0uMDAyLjA2LS4wMDJoMTkuODAzYzEuMzY2IDAgMi40NzUgMS4xMSAyLjQ3NSAyLjQ3NXYxOS44MDJjMCAxLjM2Ni0xLjExIDIuNDc1LTIuNDc1IDIuNDc1SDIyLjIwOGwyLjQ0LTQuMjNjLjI3My4xMS41Ny4xNy44OC4xNyAxLjI5IDAgMi4zNC0xLjA0NyAyLjM0LTIuMzM4IDAtLjc1LS4zNTQtMS40MTYtLjkwMi0xLjg0NGw0LjcwMi04LjE0NGMuNjgzLTEuMTgzLjI3Ny0yLjY5OC0uOTA2LTMuMzgyTDIyLjEzIDUuMjV6bTE2LjM1IDE2LjAxM2MxLjI5IDAgMi4zNCAxLjA0OCAyLjM0IDIuMzQgMCAxLjI5LTEuMDUgMi4zMzgtMi4zNCAyLjMzOC0xLjI5IDAtMi4zNC0xLjA0Ny0yLjM0LTIuMzM4IDAtMS4yOSAxLjA1LTIuMzQgMi4zNC0yLjM0em0wLTExLjk1NmMxLjI5IDAgMi4zNCAxLjA0OCAyLjM0IDIuMzQgMCAxLjI5LTEuMDUgMi4zMzgtMi4zNCAyLjMzOC0xLjI5IDAtMi4zNC0xLjA0OC0yLjM0LTIuMzQgMC0xLjI5IDEuMDUtMi4zMzggMi4zNC0yLjMzOHpNMTkuNzEyIDIyLjM0NWMxLjExOC42NDUgMS41MDIgMi4wNzcuODU3IDMuMTk2LS42NDcgMS4xMi0yLjA4IDEuNTAyLTMuMTk3Ljg1Ny0xLjExOC0uNjQ2LTEuNTAyLTIuMDc4LS44NTYtMy4xOTYuNjQ1LTEuMTE3IDIuMDc3LTEuNSAzLjE5NS0uODU1ek0xNy4wOTMgMTMuOTNjMS4xMTguNjQ1IDEuNTAyIDIuMDc3Ljg1NiAzLjE5NS0uNjQ3IDEuMTE4LTIuMDc4IDEuNTAyLTMuMTk3Ljg1Ny0xLjExOC0uNjQ2LTEuNS0yLjA3OC0uODU2LTMuMTk2LjY0Ni0xLjExOCAyLjA3OC0xLjUwMiAzLjE5Ni0uODU2ek0xNC40NzMgNS41MTRjMS4xMTguNjQ2IDEuNTAyIDIuMDc4Ljg1NiAzLjE5Ni0uNjQ2IDEuMTE4LTIuMDc4IDEuNTAyLTMuMTk2Ljg1Ni0xLjExOC0uNjQ1LTEuNTAyLTIuMDc3LS44NTYtMy4xOTUuNjQ1LTEuMTE4IDIuMDc3LTEuNSAzLjE5NS0uODU2elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRvd25sb2FkXCIgZGF0YS1uYW1lPVwiZG93bmxvYWRcIiB2aWV3Qm94PVwiMCAwIDMzIDMyXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDMyLjk3OHYzMkgwelwiLz48cGF0aCBkPVwiTTE1LjUgMjguNjI3VjE2LjkyYy4wMDUtLjEuMDE1LS4xOTUuMDQ1LS4yOS4wOC0uMjYyLjI3LS40OC41MTUtLjYuMTEzLS4wNTQuMjMtLjA4LjM1NS0uMDk1LjA3NC0uMDAzLjA3NC0uMDAzLjE0OCAwIC4xMjQuMDE0LjI0LjA0LjM1NS4wOTUuMjQ1LjEyLjQzNS4zMzguNTE1LjYuMDMuMDk1LjA0LjE5LjA0NC4yOXYxMS43MDdsMi41NC0yLjU0LjA0My0uMDRjLjEyLS4xLjI1LS4xNzYuNC0uMjE2LjEzLS4wMzQuMjY3LS4wNDIuNC0uMDIzLjMyNi4wNDguNjEzLjI2Mi43NTIuNTYuMDQuMDg3LjA2OC4xOC4wODIuMjc1LjAxNC4wOTQuMDE0LjE5IDAgLjI4Ni0uMDIuMTMzLS4wNjYuMjYtLjEzNy4zNzYtLjAzLjA1LS4wNjUuMDkzLS4xMDIuMTM4LTEuMzggMS40NjItMi44NDIgMi44NDQtNC4yNjQgNC4yNjZsLS4wMy4wM2MtLjA1Mi4wNDgtLjExLjA5LS4xNy4xMjYtLjAyNy4wMTYtLjA1NS4wMy0uMDg0LjA0NC0uMTA4LjA1LS4yMjUuMDgtLjM0NC4wOS0uMDk3LjAwNy0uMTk2IDAtLjI5My0uMDIyLS4wOTctLjAyMi0uMTktLjA2LS4yNzUtLjEwOC0uMDc1LS4wNDMtLjE0NS0uMDk3LS4yMDYtLjE1OC0xLjQ1LTEuMzctMi44Mi0yLjgxOC00LjIyNy00LjIyNy0uMTA3LS4xMTItLjE5LS4yNC0uMjQtLjM4Ny0uMTEtLjMzMi0uMDMyLS43MDcuMi0uOTY4LjA2NC0uMDcuMTM4LS4xMzQuMjItLjE4NC4xNS0uMDkyLjMxNS0uMTM2LjQ5LS4xNDcuMDU3IDAgLjA1NyAwIC4xMTQuMDA0LjA1OC4wMDcuMTE0LjAxNi4xNy4wMy4xNy4wNDYuMzE2LjEzNi40NDMuMjU2bDIuNTQgMi41NHptMTAuNDI0LTQuOTg0aC00LjUyYy0uMDM2LS4wMDItLjA3Mi0uMDAyLS4xMDctLjAwNi0uMTQyLS4wMTUtLjI4LS4wNjItLjQwMy0uMTM2LS4wOS0uMDU0LS4xNzQtLjEyNC0uMjQzLS4yMDYtLjI1OC0uMzA1LS4zMDctLjc0OC0uMTItMS4xMDIuMDUtLjA5NC4xMTYtLjE4LjE5NC0uMjU0LjEzLS4xMjMuMjkzLS4yMS40NjctLjI0OC4wOTQtLjAyLjEyLS4wMTguMjE0LS4wMjNoNC40NDRjLjQzLS4wNzUuODU0LS4xOTcgMS4yNjQtLjM0OCAxLjEzMi0uNDIgMi4xOTQtMS4xMDMgMi45MDgtMi4wOS4xNjUtLjIzLjMxLS40Ny40MzMtLjcyNC4yODctLjU5LjQ1LTEuMjM0LjUxNi0xLjg4Ni4wMzctLjM4My4wNDUtLjc3LjAxNS0xLjE1NS0uMDMzLS40MzYtLjExNy0uODY4LS4yNS0xLjI4NS0uMzctMS4xNzMtMS4xMjQtMi4yMTItMi4xMjItMi45MzItLjQ4LS4zNDgtMS4wMTctLjYyLTEuNTgzLS44MDItLjQyLS4xMzUtLjg1Ny0uMjItMS4yOTctLjI1Ny0uMjMyLS4wMi0uNDYzLS4wMjItLjY5Ni0uMDE2bC0uMTAzLS4wMDJjLS4wOS0uMDEyLS4xMTUtLjAxLS4yMDQtLjAzNy0uMi0uMDU4LS4zNzgtLjE4LS41MDUtLjM0NS0uMDU2LS4wNzMtLjA2NC0uMDk1LS4xMDgtLjE3Ni0uMDU0LS4xMTMtLjExLS4yMjQtLjE2OC0uMzM1LS4zNDctLjY1LS43Ny0xLjI1NS0xLjI3LTEuNzk2LS42LS42NDctMS4yOTctMS4yLTIuMDY0LTEuNjM0LS44MjQtLjQ2NS0xLjcyNy0uNzktMi42Ni0uOTUyLS43OTItLjE0LTEuNjA0LS4xNjQtMi40MDMtLjA3Ni0uOC4wODgtMS41ODguMjkyLTIuMzMuNjA0LS44NzUuMzY4LTEuNjg1Ljg4NS0yLjM4OCAxLjUyLS43NzUuNzAyLTEuNDE4IDEuNTQ2LTEuODg3IDIuNDgtLjM0My42ODMtLjU5MyAxLjQxNC0uNzQgMi4xNjUtLjA3LjM3My0uMTE2Ljc0OC0uMTQgMS4xMjdsLS4wMTMuMTA0Yy0uMDA4LjAzNS0uMDE0LjA3LS4wMjQuMTA0LS4wMTguMDY3LS4wNDUuMTMzLS4wNzguMTk1LS4xMzMuMjQ4LS4zNzMuNDMtLjY1LjQ5NS0uMDY3LjAxNi0uMTM3LjAyNC0uMjA3LjAyNS0uMDM1IDAtLjA3LS4wMDMtLjEwNi0uMDA0LS4xMzctLjAyLS4yNzItLjA0OC0uNDA4LS4wNjgtLjQ5Ni0uMDYzLS45OTYtLjA0My0xLjQ4My4wNzMtMS4wMDguMjQyLTEuOTAyLjg3NC0yLjQ2OCAxLjc0LS4xNzMuMjY0LS4zMTUuNTUtLjQyLjg0Ni0uMTEuMzA4LS4xODIuNjI4LS4yMTUuOTUzLS4wNC4zOTItLjAyNS43OTQuMDMgMS4xODQuMDc1LjUzNi4yNDMgMS4wNi41NCAxLjUxNy4wOS4xNC4xOS4yNy4zLjM5My42MzIuNzA0IDEuNTQ2IDEuMDkgMi40NTggMS4yNzUuMzQuMDcuNjkyLjExNiAxLjA0LjEyaDUuMTdsLjEwNy4wMDVjLjA5NC4wMTUuMTE4LjAxNS4yMS4wNDYuMTY4LjA1Ni4zMi4xNi40MzYuMjk1LjA3LjA4Mi4xMjUuMTc1LjE2NS4yNzQuMDQuMS4wNjMuMjA0LjA3LjMxLjAxOC4zNjMtLjE2OC43MTUtLjQ3OC45LS4xMjMuMDc1LS4yNi4xMjItLjQwMy4xMzctLjAzNS4wMDQtLjA3LjAwNC0uMTA3LjAwNi0xLjc0NCAwLTMuNDkuMDE0LTUuMjMzIDAtLjQyLS4wMTItLjgzNi0uMDU3LTEuMjQ3LS4xMzQtMS4xODYtLjIyMy0yLjM0Ni0uNy0zLjI1My0xLjUxMi0uMTY3LS4xNS0uMzI0LS4zMS0uNDctLjQ4LS4xNzctLjIwMy0uMzM3LS40Mi0uNDgtLjY1LS4zOTctLjY0LS42NDUtMS4zNjMtLjc2NC0yLjEwNi0uMDQ3LS4yOTYtLjA3NC0uNTk0LS4wODQtLjg5NC0uMDEtLjI5Ni0uMDAzLS41OTIuMDI3LS44ODcuMDQ3LS40NTUuMTQ1LS45MDUuMjkyLTEuMzM4LjMzOC0uOTkuOTQtMS44ODMgMS43MjMtMi41NzUuNjU2LS41NzggMS40MzYtMS4wMSAyLjI3NC0xLjI2LjYxLS4xODQgMS4yNS0uMjY1IDEuODg4LS4yNWwuMDYtLjM0NGMuMDY3LS4zMjYuMTQ0LS42NDguMjM4LS45NjcuMTk4LS42NjUuNDYyLTEuMzEuNzg4LTEuOTIzLjY2LTEuMjQzIDEuNTc2LTIuMzQ4IDIuNjcyLTMuMjMuODgzLS43MTMgMS44ODItMS4yNzggMi45NDctMS42NjguNzAyLS4yNTYgMS40My0uNDM2IDIuMTcyLS41MzYuMzM3LS4wNDcuNjc2LS4wNzQgMS4wMTctLjA4OC4xNi0uMDA1LjMyMy0uMDA4LjQ4NS0uMDA3LjkxOC4wMTIgMS44My4xMzcgMi43MTUuMzg1IDEuODQ1LjUxOCAzLjUyNyAxLjU1NiA0LjgyOCAyLjk2My41NzUuNjIyIDEuMDY4IDEuMzEzIDEuNDggMi4wNTNsLjAwNC4wMDZjLjA5Mi4wMDUuMTg1LjAxLjI3Ny4wMTguMTAyLjAwOC4yMDIuMDE4LjMwMi4wMy4yMy4wMy40Ni4wNjUuNjg3LjExNC41Ny4xMiAxLjEyOC4zMDggMS42NTcuNTU2IDEuMTQ4LjU0IDIuMTU1IDEuMzY0IDIuOTEyIDIuMzguNTcuNzY4Ljk5OCAxLjY0IDEuMjUyIDIuNTYyLjI3NyAxLjAwNy4zMzggMi4wNi4yMTggMy4wOTctLjA5Ny44MzQtLjMyMiAxLjY1NC0uNjkgMi40MS0uMTczLjM1Ni0uMzc3LjY5Ni0uNjA4IDEuMDE2LS4xNTQuMjEyLS4zMi40MTUtLjQ5NS42MS0uOTAzLjk5Mi0yLjA3NiAxLjcxMi0zLjMzIDIuMTc2LS41NTMuMjA1LTEuMTI4LjM2Ny0xLjcxMi40NTgtLjA0Ny4wMDYtLjA0Ni4wMDYtLjA5My4wMWwtLjA2OC4wMDN6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZ2Vhci1jaXJjbGVcIiBkYXRhLW5hbWU9XCJnZWFyLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTI0LjI1MyA2Ljk3Yy4xNjguMDQ1LjMyLjExNy40NDUuMjQuMDU0LjA1Mi4wNjQuMDY4LjExLjEyOCAxLjA5NiAxLjcxIDIuMDM1IDMuNTE0IDMuMDUgNS4yNzIuMDQuMDc3LjA3NC4xNS4wOTUuMjM2LjA3LjI3Ny4wMDQuNTc4LS4xNzUuOC0uMDczLjA5LS4xNi4xNi0uMjU3LjIybC0xLjY0Ljk1Yy4wMjIuMTU0LjAzNC4zMDguMDQ4LjQ2NC4wMTMuMTkzLjAyMy4zODUuMDI2LjU4LjAwMy40MjMtLjAyMy44NDItLjA3IDEuMjYzdi4wMTNsMS42NC45NS4wNzIuMDQ0Yy4wNy4wNTMuMTMuMTA3LjE4Ni4xNzQuMTYuMi4yMy40NjQuMTkyLjcxOC0uMDEzLjA4Ni0uMDQuMTY0LS4wNzMuMjQ0LS45MzIgMS44MDMtMi4wMjUgMy41Mi0zLjA0IDUuMjc3LS4wNDYuMDczLS4wOTQuMTQtLjE1Ni4yLS4yMDYuMi0uNS4yOTQtLjc4My4yNS0uMTE0LS4wMTgtLjIxNi0uMDYtLjMxOC0uMTEzbC0xLjYzNS0uOTVjLS4xMy4wOTgtLjI2Mi4xODgtLjM5Ni4yOC0uMTkuMTIzLS4xOS4xMjItLjM4NC4yNDItLjM5LjIzLS43ODcuNDM1LTEuMi42MjNsLS4wMTMuMDA2djEuOTFsLS4wMDQuMDg0Yy0uMDEzLjA4Ni0uMDI4LjE2Ny0uMDYuMjQ4LS4wOTIuMjQtLjI4NS40MzItLjUyNS41MjUtLjA4LjAzLS4xNjIuMDQ2LS4yNDcuMDU4LTIuMDMuMDk0LTQuMDYyLjAwNC02LjA5NC4wMDQtLjA4Ni0uMDA1LS4xNjgtLjAxMi0uMjUtLjAzNi0uMjc3LS4wNzgtLjUwNC0uMjg2LS42MDctLjU1Mi0uMDQyLS4xMS0uMDU3LS4yMTgtLjA2My0uMzMzVjI1LjA4Yy0uMTQyLS4wNi0uMjgyLS4xMjgtLjQyMi0uMTk1LS4yMDMtLjEwMi0uMjAzLS4xLS40MDQtLjIwNy0uNDA0LS4yMjItLjc5LS40NjQtMS4xNjgtLjczbC0uMDI3LS4wMi0xLjY2Ljk1Mi0uMDc0LjAzOGMtLjA4LjAzMy0uMTYuMDYtLjI0NS4wNzMtLjI1My4wNC0uNTE3LS4wMzItLjcxNi0uMTkzLS4wNy0uMDU0LS4xMjItLjExNy0uMTc1LS4xODVDNi4xNCAyMi45MDUgNS4yIDIxLjEgNC4xODUgMTkuMzRjLS4wNTItLjEtLjA5NC0uMjAzLS4xMS0uMzE4LS4wNDUtLjI4Mi4wNDgtLjU3Ni4yNDctLjc4LjA2LS4wNjQuMTI4LS4xMS4yLS4xNTdsMS42NDItLjk0OGMtLjAyLS4xNTYtLjAzMy0uMzEtLjA0Ni0uNDY3LS4wMTQtLjIzLS4wMTQtLjIzLS4wMjMtLjQ2LS4wMDYtLjQ2NC4wMTgtLjkyMi4wNy0xLjM4MnYtLjAxNGwtMS42NC0uOTQ3LS4wNy0uMDQ2Yy0uMDctLjA1Mi0uMTMtLjEwNi0uMTg2LS4xNzMtLjE2Mi0uMi0uMjMyLS40NjUtLjE5My0uNzE4LjAxNC0uMDg3LjA0LS4xNjUuMDc0LS4yNDUuOTM1LTEuODAzIDIuMDMtMy41MTggMy4wNDctNS4yNzYuMDYyLS4wOTguMTMtLjE4NC4yMi0uMjU3LjIyMi0uMTguNTIzLS4yNDUuOC0uMTc2LjA4NC4wMi4xNi4wNTYuMjM1LjA5NmwxLjY1Mi45NWMuMDctLjA1Mi4xNDMtLjEwMi4yMTQtLjE1Mi4xOS0uMTI4LjE5LS4xMjguMzg1LS4yNTIuNDU0LS4yNzguOTItLjUyMyAxLjQwNy0uNzQzbC4wMTQtLjAwNlY0Ljk2bC4wMDQtLjA4NWMuMDEyLS4wODUuMDI3LS4xNjYuMDYtLjI0Ny4wOS0uMjQuMjg1LS40MzMuNTI0LS41MjYuMDgtLjAzLjE2Mi0uMDQ2LjI0OC0uMDU4IDIuMDI4LS4wOTQgNC4wNjItLjAwNCA2LjA5My0uMDA0LjExNS4wMDYuMjI0LjAyLjMzMi4wNjIuMjY3LjEwNC40NzQuMzMuNTUzLjYwNy4wMjMuMDg0LjAzLjE2Ni4wMzUuMjUyVjYuODdjLjE0Mi4wNi4yOC4xMy40Mi4xOTYuMjAyLjEwMi4yLjEwMi40LjIwOC40LjIyNC43ODIuNDY2IDEuMTU0LjczM2wuMDIuMDE0IDEuNjI4LS45NDYuMDc2LS4wNGMuMTM4LS4wNTUuMjY2LS4wOC40MTQtLjA4NC4wODUuMDA3LjA4NS4wMDYuMTcuMDJ6bS0yLjIzIDE0Ljk0Yy4xMTguMDI1LjIyLjA2LjMyNS4xMTVsMS4zOC44IDIuMDgtMy42MDctMS4zOS0uODAyYy0uMDY0LS4wNC0uMDgyLS4wNS0uMTQtLjEtLjE1My0uMTMyLS4yNi0uMzEzLS4zLS41MS0uMDE4LS4wODctLjAyLS4xNy0uMDE3LS4yNTguMDI4LS4yMTYuMDctLjQzLjA5OC0uNjQ1LjA0LS4zNy4wNjctLjc0LjA1NS0xLjExLS4wMTUtLjQ0LS4wNjgtLjg3LS4xNDMtMS4zMDRsLS4wMS0uMDg2Yy0uMDAzLS4wODgtLjAwMi0uMTcuMDE2LS4yNTcuMDQtLjE5OC4xNDctLjM4LjMtLjUxLjA1OC0uMDUyLjA3Ni0uMDYuMTQtLjFsMS4zODgtLjgwMy0yLjA4LTMuNjA1LTEuMzc1Ljc5OGMtLjA3LjAzNS0uMDg1LjA0Ni0uMTU4LjA3Mi0uMTkuMDY3LS40MDIuMDctLjU5NC4wMDYtLjA4NC0uMDI4LS4xNTctLjA3LS4yMzItLjExNS0uMTIzLS4wOTItLjI0LS4xOTQtLjM2Mi0uMjktLjM0OC0uMjYyLS43MS0uNTAyLTEuMDkzLS43MS0uMzgyLS4yMS0uNzgtLjM4Ni0xLjE4Ny0uNTQybC0uMDc4LS4wMzRjLS4wNjYtLjAzNy0uMDg0LS4wNDQtLjE0NS0uMDktLjE2LS4xMi0uMjc3LS4yOS0uMzMyLS40ODMtLjAyNC0uMDgyLS4wMy0uMTY1LS4wMzUtLjI1VjUuODhoLTQuMTY4VjcuNDljLS4wMDQuMDg2LS4wMTIuMTY4LS4wMzYuMjUyLS4wNTYuMTkyLS4xNzQuMzYzLS4zMzMuNDgzLS4wNi4wNDUtLjA4LjA1Mi0uMTQ1LjA5LS4yLjA4Ni0uNDAyLjE2LS42MDIuMjQ1LS43NDUuMzM3LTEuNDQ2Ljc0OC0yLjA3MiAxLjI3NmwtLjA3LjA1MmMtLjA3NC4wNDctLjE0Ny4wODgtLjIzLjExNi0uMTkyLjA2NS0uNDA0LjA2NC0uNTk1LS4wMDMtLjA3My0uMDI0LS4wOS0uMDM1LS4xNTctLjA3TDguMzMgOS4xMjVsLTIuMDg2IDMuNjA4IDEuMzg3LjgwMmMuMDY2LjA0LjA4My4wNS4xNDIuMS4xNTMuMTMyLjI2LjMxNC4zLjUxMi4wMTguMDg3LjAyLjE3LjAxNi4yNTgtLjAyLjE1NC0uMDUuMzA3LS4wNzMuNDYtLjA1OC40My0uMDkuODYyLS4wOCAxLjI5Ny4wMS40MzcuMDY1Ljg2OC4xNCAxLjI5N2wuMDEuMDg2Yy4wMDQuMDc3LjAwNy4wOTYgMCAuMTcyLS4wMjMuMjAyLS4xMTMuMzkzLS4yNTMuNTQtLjA2LjA2Mi0uMTMuMTEtLjIwMy4xNThsLTEuMzkuODAyIDIuMDg0IDMuNjEgMS40MDMtLjgwNWMuMDc4LS4wNC4xNTQtLjA3NS4yNC0uMDk2LjE5Ni0uMDQ4LjQwNy0uMDMuNTkuMDUzLjA3Mi4wMzIuMDg3LjA0NC4xNTIuMDg1LjEyLjA5Mi4yMzYuMTkyLjM1Ni4yODYuMy4yMjYuNjEuNDMzLjkzOC42MTguNDQuMjUuOS40NTUgMS4zNy42MzZsLjA4LjAzNGMuMDY1LjAzNy4wODMuMDQ0LjE0My4wOS4xNi4xMi4yNzguMjkuMzMyLjQ4Mi4wMjMuMDg0LjAzLjE2Ni4wMzUuMjUzdjEuNjA2aDQuMTY4di0xLjYwN2MuMDA0LS4wODcuMDEtLjE3LjAzNS0uMjUzLjA1NS0uMTkuMTcyLS4zNjMuMzMyLS40ODMuMDYtLjA0NS4wNzgtLjA1Mi4xNDQtLjA5LjE5Ny0uMDg1LjQtLjE2LjU5OC0uMjQ1LjQ1NS0uMjA3Ljg5NS0uNDQgMS4zMS0uNzE2LjI2LS4xNzMuNTA2LS4zNjIuNzQ1LS41NmwuMDctLjA1NGMuMDY0LS4wNC4wOC0uMDUyLjE1LS4wODMuMTA4LS4wNS4yMTgtLjA2OC4zMzUtLjA3OC4wODYgMCAuMDg2IDAgLjE3Mi4wMXpcIi8+PHBhdGggZD1cIk0xNi4xNDggMTEuMDUyYy42OTguMDI2IDEuMzc4LjE4IDIuMDEuNDg0LjUzMy4yNTcgMS4wMi42MTMgMS40MyAxLjA0Mi40MS40My43NC45MzQuOTcgMS40OC4xOS40NS4zMTMuOTMuMzYzIDEuNDE1LjA1Mi40OTguMDI3IDEuMDA1LS4wNzQgMS40OTUtLjMxNCAxLjUzMy0xLjM3MiAyLjg1My0yLjc5NyAzLjQ5Ny0uNTk4LjI3LTEuMjQ3LjQxOC0xLjkwMi40MzQtLjY1OC4wMTYtMS4zMi0uMS0xLjkzMi0uMzQtLjU1My0uMjItMS4wNjYtLjU0LTEuNTA2LS45MzgtLjQ0LS40LS44MDUtLjg3Ni0xLjA3NS0xLjQwMy0uMjItLjQzMi0uMzc3LS44OTYtLjQ2Mi0xLjM3My0uMDgtLjQ1Mi0uMS0uOTE2LS4wNTItMS4zNzQuMDYtLjU2NS4yMTUtMS4xMi40NjItMS42MzIuNDMtLjg5IDEuMTMtMS42NDMgMS45ODctMi4xMzcuNjM3LS4zNjYgMS4zNDItLjU3MyAyLjA3My0uNjM4LjE3LS4wMS4zMzYtLjAxNi41MDUtLjAxM3ptLS4yMDYgMS44NGMtLjQzNy4wMTYtLjg2My4xMTItMS4yNTcuMzAyLS44MS4zOS0xLjQyOCAxLjEzOC0xLjY1MiAyLjAxLS4wOS4zNTQtLjExOC43MjUtLjA4IDEuMDg4LjAzMi4zMy4xMi42NTIuMjU1Ljk1NC4xNTMuMzQuMzcuNjUuNjMyLjkxLjI2My4yNjQuNTczLjQ4LjkxMi42MzIuMzc0LjE3Ljc4LjI2IDEuMTkuMjcuNDEzLjAxMi44MjYtLjA2IDEuMjEtLjIxLjM0Ny0uMTM4LjY2OC0uMzM4Ljk0NC0uNTkuMjc1LS4yNDguNTA0LS41NDguNjczLS44NzguMTM3LS4yNy4yMzQtLjU2LjI4OC0uODU3LjA2LS4zMzYuMDYzLS42OC4wMTItMS4wMTgtLjE0LS45Mi0uNzEtMS43NDMtMS41MTQtMi4yMDctLjQtLjIzLS44NC0uMzU4LTEuMjk3LS40LS4xMDctLjAwNS0uMjEyLS4wMDgtLjMxOC0uMDA3elwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1nZWFyXCIgZGF0YS1uYW1lPVwiZ2VhclwiIHZpZXdCb3g9XCIwIDAgMzIgMzNcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjMuMDE4IDEuODQyYy4yNTguMDIyLjUxLjA4Ljc0Ni4xODUuMTk4LjA4OC4zODYuMi41NTMuMzM4LjEzMi4xMDYuMjUuMjI3LjM1NS4zNi4zMzYuNDMyLjQ4Ni45Ny40OTUgMS41MS4wMDcuMzg0LS4wNTQuNzYyLS4xNCAxLjEzNWwtLjU4NCAyLjE0OC4wMi4wMi4wMi4wMiAyLjE0LS41ODMuMTk4LS4wNDZjLjItLjA0LjQwMi0uMDc0LjYwNi0uMDg4LjQyLS4wMy44NS4wMSAxLjI0Ni4xNTcuMjcuMS41MjIuMjUuNzM2LjQ0Mi4zOTcuMzYuNjY4Ljg2Ny43NCAxLjQuMDM3LjI2LjAyNS41MjQtLjAzLjc4LS4wOTUuNDQ0LS4zMTMuODUtLjU4MyAxLjIxMi0uMTI1LjE2Ni0uMjYyLjMyMi0uNDAzLjQ3NGwtMS41NzIgMS41Ni4wMDguMDMuMDEuMDM1Yy43MTYuMTkgMS40MjYuNCAyLjE0OC41NjcuMDkuMDI2LjA5LjAyNi4xOC4wNTUuMTk1LjA2NS4zODUuMTM3LjU3LjIyNy4zNi4xNzYuNjk4LjQxLjk2Mi43MTYuMTc0LjIuMzE1LjQyOC40MS42NzYuMjA4LjU0LjIwMyAxLjE2NS0uMDE2IDEuNzAyLS4wOS4yMjQtLjIyLjQzMi0uMzc3LjYxNS0uMjg2LjMzNC0uNjYuNTgtMS4wNTUuNzYtLjIyLjEwMi0uNDUuMTgtLjY4LjI1MmwtMi4xNDIuNTY2LS4wMS4wMzYtLjAwOC4wMyAxLjU2NyAxLjU1NGMuMDcuMDczLjA3LjA3My4xMzguMTQ3LjEzNi4xNTMuMjY1LjMxLjM4LjQ4LjIzNS4zNS40MTUuNzQuNDg3IDEuMTU3LjA1LjI4NS4wNDUuNTc3LS4wMTYuODYtLjExMi41MjQtLjQxOCAxLjAxMi0uODQgMS4zNDItLjE5My4xNS0uNDEuMjY1LS42NC4zNDUtLjQxMi4xNDQtLjg1OC4xNy0xLjI5LjEyOC0uMjQzLS4wMjMtLjQ4LS4wNjgtLjcxNi0uMTIzbC0yLjE0Ny0uNTgzLS4wMi4wMi0uMDIuMDIuNTgzIDIuMTQyYy4wMjUuMS4wMjQuMS4wNDcuMTk4LjA0LjIuMDcyLjQuMDg3LjYwNS4wMjcuNC0uMDA3LjgxLS4xNCAxLjE5LS4wOTIuMjctLjIzMy41MjQtLjQyLjc0Mi0uMzYuNDI0LS44ODguNzEzLTEuNDQuNzktLjI2LjAzNS0uNTI1LjAyMy0uNzgtLjAzMi0uNjU1LS4xNC0xLjIwOC0uNTQtMS42OS0uOTg4bC0xLjU1NS0xLjU3LS4wMy4wMS0uMDM4LjAxLS41NjMgMi4xMzJjLS4wMy4wOTgtLjAyOC4wOTctLjA2LjE5NC0uMDUzLjE2LS4xMS4zMi0uMTguNDc0LS4xOS40MTUtLjQ1Mi44MDItLjgwNCAxLjA5NC0uMjA1LjE3LS40NC4zMDUtLjY5LjM5NS0uNTA2LjE4LTEuMDgzLjE3My0xLjU4Ni0uMDE1LS4yNDYtLjA5My0uNDc1LS4yMy0uNjc0LS40LS4zNi0uMzEtLjYxNi0uNzE4LS44LTEuMTUtLjA4My0uMTktLjE1LS4zODctLjIxLS41ODVsLS41NjYtMi4xNC0uMDM2LS4wMS0uMDMtLjAxLTEuNTU1IDEuNTY4Yy0uMDczLjA3LS4wNzMuMDctLjE0Ny4xMzgtLjEyNy4xMTMtLjI1Ny4yMi0uMzk1LjMyLS4zNTQuMjUzLS43NTQuNDUyLTEuMTg1LjUzNi0uMjguMDU0LS41Ny4wNTgtLjg1Mi4wMDYtLjUyOC0uMDk3LTEuMDI0LS4zOS0xLjM2Ni0uODA0LS4xNjgtLjIwNC0uMjk4LS40MzgtLjM4NS0uNjg3LS4xNTYtLjQ0Ni0uMTc1LS45MjctLjEyLTEuMzk0LjAyNS0uMjA2LjA2Ni0uNDEuMTEyLS42MTJsLjU4NS0yLjE0OC0uMDItLjAyLS4wMi0uMDItMi4xNC41ODItLjE5OC4wNDZjLS4xNjYuMDM0LS4zMzMuMDYzLS41MDIuMDgtLjQzNC4wNDMtLjg4LjAxNS0xLjI5Ni0uMTI4LS4yNy0uMDkzLS41MjQtLjIzNC0uNzQyLS40Mi0uNDIzLS4zNjItLjcxMy0uODktLjc5LTEuNDQyLS4wMzMtLjI0LS4wMjUtLjQ4NC4wMi0uNzIyLjEyNi0uNjc3LjUzNy0xLjI1Ljk5Ny0xLjc0NWwxLjU3LTEuNTYtLjAxLS4wMy0uMDA4LS4wMzYtMi4xMzQtLjU2My0uMTk0LS4wNThjLS4xOTMtLjA2NS0uMzg0LS4xMzgtLjU2OC0uMjI3LS4zOC0uMTg1LS43My0uNDM0LTEtLjc2LS4xNy0uMjA1LS4zMDYtLjQzOC0uMzk1LS42OS0uMTg2LS41MjUtLjE3My0xLjEyNy4wMzgtMS42NDQuMS0uMjQyLjI0Mi0uNDY2LjQxNy0uNjYuNDQ2LS40OTYgMS4wNy0uNzc0IDEuNjk2LS45NjhsMi4xNDItLjU2NS4wMS0uMDM1LjAwOC0uMDMtMS41NjYtMS41NTUtLjE0LS4xNDhjLS40MTMtLjQ2Ny0uNzYtMS4wMTUtLjg2NS0xLjY0LS4wNDUtLjI2Mi0uMDQ1LS41MzIuMDAzLS43OTQuMDk4LS41MjcuMzkyLTEuMDI0LjgwNy0xLjM2NS4yMDMtLjE2Ny40MzUtLjI5Ni42ODMtLjM4My40MTQtLjE0NS44Ni0uMTcyIDEuMjkzLS4xMy4yNDIuMDIyLjQ4LjA2OC43MTYuMTIybDIuMTQ3LjU4NS4wMi0uMDIyLjAyLS4wMi0uNTg0LTIuMTRjLS4wMjUtLjEtLjAyNS0uMS0uMDQ3LS4yLS4wNC0uMi0uMDc0LS40LS4wODgtLjYwNC0uMDMtLjQyLjAxLS44NS4xNTctMS4yNDYuMDkyLS4yNS4yMjgtLjQ4NC40LS42ODcuMzUtLjQwNi44NTItLjY5IDEuMzgtLjc3Ny4yNi0uMDQ0LjUyNy0uMDQuNzg2LjAxLjQzLjA4LjgzLjI4IDEuMTg0LjUzMi4xOTguMTQuMzguMy41Ni40NjRsMS41NTggMS41Ny4wMy0uMDA4LjAzNi0uMDEuNTYzLTIuMTM2LjA2LS4xOTNjLjA1My0uMTYuMTEtLjMyLjE4Mi0uNDc0LjE4LS4zOTguNDI2LS43Ny43NTctMS4wNTcuMjMyLS4yLjUwMi0uMzU4Ljc5NC0uNDUyLjQ5Mi0uMTU4IDEuMDQ0LS4xNDYgMS41MjguMDM2LjI0Ni4wOTIuNDc0LjIzLjY3NC40LjM1OC4zMS42MTUuNzE3LjggMS4xNDguMDgyLjE5LjE0OC4zODcuMjEuNTg1bC41NjUgMi4xNDIuMDM1LjAxLjAzMi4wMDggMS41NTMtMS41NjYuMTQ4LS4xNGMuNDUzLS40Ljk4LS43MzggMS41OC0uODU0LjE2LS4wMy4zMi0uMDQzLjQ4LS4wNDMuMDYyIDAgLjA2IDAgLjEyMy4wMDV6bS02LjkzMiA3LjQ4Yy4zNC4wMDYuNjc4LjAzMyAxLjAxMy4wOS41OTUuMDk4IDEuMTc3LjI3OCAxLjcyNC41MzMgMS4yNC41OCAyLjI4OCAxLjU0MyAyLjk3IDIuNzMuMzU0LjYxNS42MSAxLjI4Ni43NSAxLjk4LjE1My43NS4xNzcgMS41MjIuMDcgMi4yNzgtLjA5NC42OC0uMjk1IDEuMzQ1LS41OTMgMS45NjQtLjMzNi43LS43OTcgMS4zNC0xLjM1MyAxLjg4My0uNTk1LjU4Mi0xLjMgMS4wNS0yLjA2NiAxLjM3NS0uNzk0LjMzNi0xLjY1LjUxMy0yLjUxMy41MjUtLjg2NS4wMS0xLjczLS4xNDYtMi41MzYtLjQ2My0uNzc0LS4zMDYtMS40OS0uNzYtMi4xLTEuMzI3LS41ODgtLjU0OC0xLjA3Ni0xLjItMS40MzQtMS45Mi0uMzA2LS42MTQtLjUxNS0xLjI3Ni0uNjE4LTEuOTU0LS4xMTUtLjc1NS0uMS0xLjUzLjA0Mi0yLjI4LjEzNC0uNjk2LjM4LTEuMzcuNzI2LTEuOTkuNjU0LTEuMTcyIDEuNjY0LTIuMTMzIDIuODY1LTIuNzMuNTktLjI5MyAxLjIyMy0uNDk4IDEuODcyLS42MDUuMjc4LS4wNDUuNTYtLjA3Mi44NC0uMDg0LjExNS0uMDA0LjIzLS4wMDUuMzQ0LS4wMDV6XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIzLjAxOCAxLjg0MmMuMjU4LjAyMi41MS4wOC43NDYuMTg1LjE5OC4wODguMzg2LjIuNTUzLjMzOC4xMzIuMTA2LjI1LjIyNy4zNTUuMzYuMzM2LjQzMi40ODYuOTcuNDk1IDEuNTEuMDA3LjM4NC0uMDU0Ljc2Mi0uMTQgMS4xMzVsLS41ODQgMi4xNDguMDIuMDIuMDIuMDIgMi4xNC0uNTgzLjE5OC0uMDQ2Yy4yLS4wNC40MDItLjA3NC42MDYtLjA4OC40Mi0uMDMuODUuMDEgMS4yNDYuMTU3LjI3LjEuNTIyLjI1LjczNi40NDIuMzk3LjM2LjY2OC44NjcuNzQgMS40LjAzNy4yNi4wMjUuNTI0LS4wMy43OC0uMDk1LjQ0NC0uMzEzLjg1LS41ODMgMS4yMTItLjEyNS4xNjYtLjI2Mi4zMjItLjQwMy40NzRsLTEuNTcyIDEuNTYuMDA4LjAzLjAxLjAzNWMuNzE2LjE5IDEuNDI2LjQgMi4xNDguNTY3LjA5LjAyNi4wOS4wMjYuMTguMDU1LjE5NS4wNjUuMzg1LjEzNy41Ny4yMjcuMzYuMTc2LjY5OC40MS45NjIuNzE2LjE3NC4yLjMxNS40MjguNDEuNjc2LjIwOC41NC4yMDMgMS4xNjUtLjAxNiAxLjcwMi0uMDkuMjI0LS4yMi40MzItLjM3Ny42MTUtLjI4Ni4zMzQtLjY2LjU4LTEuMDU1Ljc2LS4yMi4xMDItLjQ1LjE4LS42OC4yNTJsLTIuMTQyLjU2Ni0uMDEuMDM2LS4wMDguMDMgMS41NjcgMS41NTRjLjA3LjA3My4wNy4wNzMuMTM4LjE0Ny4xMzYuMTUzLjI2NS4zMS4zOC40OC4yMzUuMzUuNDE1Ljc0LjQ4NyAxLjE1Ny4wNS4yODUuMDQ1LjU3Ny0uMDE2Ljg2LS4xMTIuNTI0LS40MTggMS4wMTItLjg0IDEuMzQyLS4xOTMuMTUtLjQxLjI2NS0uNjQuMzQ1LS40MTIuMTQ0LS44NTguMTctMS4yOS4xMjgtLjI0My0uMDIzLS40OC0uMDY4LS43MTYtLjEyM2wtMi4xNDctLjU4My0uMDIuMDItLjAyLjAyLjU4MyAyLjE0MmMuMDI1LjEuMDI0LjEuMDQ3LjE5OC4wNC4yLjA3Mi40LjA4Ny42MDUuMDI3LjQtLjAwNy44MS0uMTQgMS4xOS0uMDkyLjI3LS4yMzMuNTI0LS40Mi43NDItLjM2LjQyNC0uODg4LjcxMy0xLjQ0Ljc5LS4yNi4wMzUtLjUyNS4wMjMtLjc4LS4wMzItLjY1NS0uMTQtMS4yMDgtLjU0LTEuNjktLjk4OGwtMS41NTUtMS41Ny0uMDMuMDEtLjAzOC4wMS0uNTYzIDIuMTMyYy0uMDMuMDk4LS4wMjguMDk3LS4wNi4xOTQtLjA1My4xNi0uMTEuMzItLjE4LjQ3NC0uMTkuNDE1LS40NTIuODAyLS44MDQgMS4wOTQtLjIwNS4xNy0uNDQuMzA1LS42OS4zOTUtLjUwNi4xOC0xLjA4My4xNzMtMS41ODYtLjAxNS0uMjQ2LS4wOTMtLjQ3NS0uMjMtLjY3NC0uNC0uMzYtLjMxLS42MTYtLjcxOC0uOC0xLjE1LS4wODMtLjE5LS4xNS0uMzg3LS4yMS0uNTg1bC0uNTY2LTIuMTQtLjAzNi0uMDEtLjAzLS4wMS0xLjU1NSAxLjU2OGMtLjA3My4wNy0uMDczLjA3LS4xNDcuMTM4LS4xMjcuMTEzLS4yNTcuMjItLjM5NS4zMi0uMzU0LjI1My0uNzU0LjQ1Mi0xLjE4NS41MzYtLjI4LjA1NC0uNTcuMDU4LS44NTIuMDA2LS41MjgtLjA5Ny0xLjAyNC0uMzktMS4zNjYtLjgwNC0uMTY4LS4yMDQtLjI5OC0uNDM4LS4zODUtLjY4Ny0uMTU2LS40NDYtLjE3NS0uOTI3LS4xMi0xLjM5NC4wMjUtLjIwNi4wNjYtLjQxLjExMi0uNjEybC41ODUtMi4xNDgtLjAyLS4wMi0uMDItLjAyLTIuMTQuNTgyLS4xOTguMDQ2Yy0uMTY2LjAzNC0uMzMzLjA2My0uNTAyLjA4LS40MzQuMDQzLS44OC4wMTUtMS4yOTYtLjEyOC0uMjctLjA5My0uNTI0LS4yMzQtLjc0Mi0uNDItLjQyMy0uMzYyLS43MTMtLjg5LS43OS0xLjQ0Mi0uMDMzLS4yNC0uMDI1LS40ODQuMDItLjcyMi4xMjYtLjY3Ny41MzctMS4yNS45OTctMS43NDVsMS41Ny0xLjU2LS4wMS0uMDMtLjAwOC0uMDM2LTIuMTM0LS41NjMtLjE5NC0uMDU4Yy0uMTkzLS4wNjUtLjM4NC0uMTM4LS41NjgtLjIyNy0uMzgtLjE4NS0uNzMtLjQzNC0xLS43Ni0uMTctLjIwNS0uMzA2LS40MzgtLjM5NS0uNjktLjE4Ni0uNTI1LS4xNzMtMS4xMjcuMDM4LTEuNjQ0LjEtLjI0Mi4yNDItLjQ2Ni40MTctLjY2LjQ0Ni0uNDk2IDEuMDctLjc3NCAxLjY5Ni0uOTY4bDIuMTQyLS41NjUuMDEtLjAzNS4wMDgtLjAzLTEuNTY2LTEuNTU1LS4xNC0uMTQ4Yy0uNDEzLS40NjctLjc2LTEuMDE1LS44NjUtMS42NC0uMDQ1LS4yNjItLjA0NS0uNTMyLjAwMy0uNzk0LjA5OC0uNTI3LjM5Mi0xLjAyNC44MDctMS4zNjUuMjAzLS4xNjcuNDM1LS4yOTYuNjgzLS4zODMuNDE0LS4xNDUuODYtLjE3MiAxLjI5My0uMTMuMjQyLjAyMi40OC4wNjguNzE2LjEyMmwyLjE0Ny41ODUuMDItLjAyMi4wMi0uMDItLjU4NC0yLjE0Yy0uMDI1LS4xLS4wMjUtLjEtLjA0Ny0uMi0uMDQtLjItLjA3NC0uNC0uMDg4LS42MDQtLjAzLS40Mi4wMS0uODUuMTU3LTEuMjQ2LjA5Mi0uMjUuMjI4LS40ODQuNC0uNjg3LjM1LS40MDYuODUyLS42OSAxLjM4LS43NzcuMjYtLjA0NC41MjctLjA0Ljc4Ni4wMS40My4wOC44My4yOCAxLjE4NC41MzIuMTk4LjE0LjM4LjMuNTYuNDY0bDEuNTU4IDEuNTcuMDMtLjAwOC4wMzYtLjAxLjU2My0yLjEzNi4wNi0uMTkzYy4wNTMtLjE2LjExLS4zMi4xODItLjQ3NC4xOC0uMzk4LjQyNi0uNzcuNzU3LTEuMDU3LjIzMi0uMi41MDItLjM1OC43OTQtLjQ1Mi40OTItLjE1OCAxLjA0NC0uMTQ2IDEuNTI4LjAzNi4yNDYuMDkyLjQ3NC4yMy42NzQuNC4zNTguMzEuNjE1LjcxNy44IDEuMTQ4LjA4Mi4xOS4xNDguMzg3LjIxLjU4NWwuNTY1IDIuMTQyLjAzNS4wMS4wMzIuMDA4IDEuNTUzLTEuNTY2LjE0OC0uMTRjLjQ1My0uNC45OC0uNzM4IDEuNTgtLjg1NC4xNi0uMDMuMzItLjA0My40OC0uMDQzLjA2MiAwIC4wNiAwIC4xMjMuMDA1ek0xMi43ODMgMjUuNTc1bC4xLjAyNmMuMTI2LjA0LjI1Mi4wOC4zOC4xMTcuMjEuMDYuNDIzLjExLjYzOC4xNThsLjEuMDI3Yy4wODYuMDM0LjExLjA0LjE4OC4wODcuMTQ3LjA5LjI3LjIyLjM0OC4zNzIuMDQzLjA4Mi4wNDYuMTA1LjA3NS4xOTJsLjcgMi42NDdjLjAyNC4wODQuMDUuMTY3LjA4Mi4yNDguMDIyLjA1Ny4wNDUuMTE0LjA3LjE3LjAxNy4wMzYuMDMuMDYyLjA1LjA5OC4wMTUuMDMuMDMuMDU3LjA0Ny4wODcuMDY1LjExLjE1My4yMzUuMjc3LjI4Ni4wNjguMDI3LjE0Ny4wMzIuMjIuMDI0LjA1LS4wMDYuMS0uMDIyLjE0NC0uMDQ4LjA1Ni0uMDMzLjEwNC0uMDguMTQ2LS4xMy4wNi0uMDcyLjExMi0uMTU0LjE1Ni0uMjM4LjA4LS4xNTYuMTQtLjMyMi4xODgtLjQ5bC43LTIuNjU0Yy4wMy0uMDg3LjAzMi0uMTEuMDc1LS4xOTIuMDk1LS4xODQuMjUtLjMzNC40NC0uNDIuMTQzLS4wNjguMzAzLS4wOS40NTYtLjEyNi4xMjgtLjAzLjEyNy0uMDMuMjU0LS4wNjQuMTctLjA0Ny4zMzYtLjA5Ny41MDItLjE1bC4xLS4wMjdjLjA5Mi0uMDE0LjExNC0uMDIuMjA3LS4wMi4xNzMuMDA0LjM0NC4wNTYuNDkuMTUuMDc3LjA1LjA5Mi4wNjcuMTYuMTNsMS45MyAxLjk0NGMuMDYyLjA1OC4xMjcuMTE2LjE5NC4xNy4wNDguMDQuMDk2LjA3OC4xNDYuMTEzLjAzLjAyMi4wNi4wNC4wOS4wNi4wMy4wMi4wNTcuMDM2LjA4Ny4wNTMuMTEuMDYyLjI1LjEyNy4zODIuMTA4LjA3NC0uMDEuMTQ1LS4wNDUuMjA0LS4wOS4wNDItLjAzLjA3Ny0uMDY4LjEwMi0uMTEzLjAzMi0uMDU2LjA1LS4xMi4wNi0uMTg0LjAxOC0uMDk0LjAyLS4xOS4wMTctLjI4NS0uMDA4LS4xNzQtLjA0LS4zNDctLjA4LS41MTZsLS43MjYtMi42NjJjLS4wMi0uMDktLjAzLS4xMTItLjAzMy0uMjA0LS4wMS0uMjA4LjA1LS40MTYuMTctLjU4Ni4wOTItLjEyOC4yMTgtLjIyNi4zMzItLjMzMmwuMjc0LS4yNy4yNy0uMjkuMDc0LS4wN2MuMDcyLS4wNTcuMDg4LS4wNzUuMTY4LS4xMi4xNS0uMDguMzI0LS4xMi40OTUtLjExMy4wOTMuMDA0LjExNS4wMTMuMjA0LjAzMmwyLjY1My43MmMuMDg1LjAyLjE3LjAzNy4yNTYuMDUuMDYuMDEuMTIuMDIuMTgyLjAyNS4wMzYuMDAzLjA3My4wMDYuMTEuMDA3LjAzMi4wMDIuMDY2LjAwMy4xLjAwMi4xMjYtLjAwMi4yOC0uMDE1LjM4NC0uMDk2LjA1OC0uMDQ2LjEwMi0uMTEzLjEzMi0uMTguMDItLjA0OC4wMzItLjA5OC4wMy0uMTUgMC0uMDY0LS4wMTctLjEyOC0uMDQtLjE5LS4wMy0uMDktLjA3Ny0uMTczLS4xMjgtLjI1My0uMDk0LS4xNDgtLjIxLS4yOC0uMzMtLjQwOGwtMS45NS0xLjkzNWMtLjA2Mi0uMDY4LS4wOC0uMDgzLS4xMy0uMTYtLjExMi0uMTc1LS4xNjMtLjM4Ni0uMTQ1LS41OTIuMDA4LS4wOTIuMDE3LS4xMTQuMDQtLjIwMy4wNC0uMTI2LjA4LS4yNTMuMTE3LS4zOC4wNTgtLjIxLjExLS40MjMuMTU4LS42MzdsLjAyOC0uMWMuMDM0LS4wODQuMDQtLjEwOC4wODctLjE4Ni4wOS0uMTQ4LjIyLS4yNy4zNzItLjM1LjA4Mi0uMDQuMTA1LS4wNDQuMTkyLS4wNzNsMi42NDgtLjY5OGMuMDgzLS4wMjUuMTY2LS4wNTIuMjQ3LS4wODNsLjE2OC0uMDcuMS0uMDVjLjAzLS4wMTUuMDU2LS4wMy4wODYtLjA0OC4xMS0uMDY1LjIzNS0uMTUzLjI4NS0uMjc2LjAyNy0uMDcuMDMyLS4xNS4wMjMtLjIyMi0uMDA1LS4wNS0uMDItLjEtLjA0Ny0uMTQ1LS4wMzMtLjA1Ny0uMDgtLjEwNC0uMTI4LS4xNDYtLjA3My0uMDYyLS4xNTUtLjExMi0uMjQtLjE1Ni0uMTU1LS4wOC0uMzItLjE0LS40OS0uMTg4bC0yLjY1My0uN2MtLjA4OC0uMDI4LS4xMS0uMDMyLS4xOTMtLjA3NC0uMTg0LS4wOTYtLjMzNC0uMjUyLS40Mi0uNDQtLjA2Ny0uMTQzLS4wOS0uMzAzLS4xMjYtLjQ1NS0uMDMtLjEyNS0uMDY0LS4yNS0uMS0uMzc3LS4wMzctLjEyNy0uMDc1LS4yNTQtLjExNi0uMzhsLS4wMjYtLjFjLS4wMTMtLjA5LS4wMi0uMTE0LS4wMTgtLjIwNi4wMDMtLjE3My4wNTUtLjM0My4xNDgtLjQ5LjA1LS4wNzYuMDY4LS4wOS4xMy0uMTZMMjcuNzggMTBjLjA1OC0uMDY1LjExNi0uMTMuMTctLjE5Ni4wNC0uMDQ4LjA3Ny0uMDk2LjExMy0uMTQ2LjAyLS4wMy4wNDItLjA2LjA2LS4wOS4wMTgtLjAyNy4wMzgtLjA2LjA1My0uMDg3LjA2Mi0uMTEuMTI3LS4yNS4xMS0uMzgtLjAxLS4wNzItLjA0NC0uMTM4LS4wODQtLjE5Ni0uMDMtLjA0NS0uMDcyLS4wODQtLjEyLS4xMS0uMDU3LS4wMzItLjEyLS4wNS0uMTg0LS4wNjItLjA5NC0uMDE3LS4xOS0uMDItLjI4Ni0uMDE1LS4xNzYuMDA3LS4zNDguMDQtLjUxOC4wOGwtMi42Ni43MjZjLS4wODguMDItLjExLjAyOC0uMjAyLjAzMi0uMjA3LjAxLS40MTUtLjA1LS41ODUtLjE3LS4wNzUtLjA1Mi0uMDktLjA3LS4xNTQtLjEzNmwtLjI3LS4yOWMtLjE1My0uMTUzLS4zMS0uMzA0LS40Ny0uNDVsLS4wNzItLjA3NGMtLjA1Ni0uMDcyLS4wNzMtLjA4OC0uMTE4LS4xNjgtLjA4My0uMTUyLS4xMjMtLjMyNS0uMTE1LS40OTcuMDA0LS4wOS4wMTMtLjExMy4wMzItLjIwM2wuNzIyLTIuNjU0Yy4wMi0uMDg1LjAzNy0uMTcuMDUtLjI1NS4wMS0uMDYuMDE4LS4xMi4wMjQtLjE4LjAwNC0uMDM4LjAwNi0uMDcuMDA4LS4xMXYtLjFjMC0uMTI3LS4wMTQtLjI4LS4wOTYtLjM4NS0uMDQ0LS4wNTYtLjEwNy0uMDk3LS4xNy0uMTI3LS4wNS0uMDI0LS4xMDUtLjAzOC0uMTYtLjAzNy0uMDY1IDAtLjEzLjAxNi0uMTkuMDM3LS4wOS4wMzMtLjE3My4wNzgtLjI1NC4xMy0uMTQ4LjA5NC0uMjguMjEtLjQwOC4zM2wtMS45MzMgMS45NDhjLS4wNjguMDYyLS4wODIuMDgtLjE2LjEzLS4xNzQuMTEtLjM4NC4xNjMtLjU5LjE0NS0uMDkyLS4wMDgtLjExNC0uMDE4LS4yMDItLjA0LS4xMjYtLjA0LS4yNTItLjA4LS4zOC0uMTE2LS4yMS0uMDU4LS40MjMtLjExLS42MzgtLjE1N2wtLjEtLjAyN2MtLjA4NS0uMDM0LS4xMS0uMDQtLjE4OC0uMDg3LS4xNDgtLjA5LS4yNy0uMjItLjM1LS4zNzMtLjA0Mi0uMDgyLS4wNDUtLjEwNS0uMDc0LS4xOTNMMTYuNjkyIDIuOGMtLjAyNS0uMDg0LS4wNTItLjE2Ni0uMDgzLS4yNDhsLS4wNy0uMTY4Yy0uMDI0LS4wNS0uMDQ4LS4wOTctLjA3NC0uMTQ0LS4wMTYtLjAzLS4wMy0uMDU0LS4wNDgtLjA4LS4wNjUtLjEtLjE0OC0uMjEtLjI2My0uMjUyLS4wNjYtLjAyNS0uMTQyLS4wMy0uMjEtLjAyLS4wNTIuMDA0LS4xLjAyLS4xNDYuMDQ2LS4wNTYuMDMzLS4xMDMuMDgtLjE0NC4xMjgtLjA2Mi4wNzMtLjExMy4xNTUtLjE1Ny4yNC0uMDgyLjE1Ni0uMTQuMzItLjE5LjQ5bC0uNyAyLjY1NWMtLjAyOC4wODgtLjAzLjExLS4wNzQuMTkzLS4wOTUuMTg1LS4yNTIuMzM1LS40NC40MjItLjE0NC4wNjYtLjMwNC4wODgtLjQ1Ny4xMjMtLjEyNy4wMzItLjI1My4wNjQtLjM3OC4xLS4xMjguMDM2LS4yNTUuMDc1LS4zOC4xMTVsLS4xLjAyNWMtLjA5Mi4wMTMtLjExNC4wMi0uMjA2LjAxOC0uMTcyLS4wMDMtLjM0Mi0uMDU1LS40ODctLjE0OC0uMDc4LS4wNS0uMDkzLS4wNjgtLjE2LS4xM0wxMCA0LjIyMmMtLjA2NC0uMDYtLjEyOC0uMTE3LS4xOTYtLjE3Mi0uMDQ3LS4wMzgtLjA5NS0uMDc2LS4xNDUtLjExLS4wMy0uMDIyLS4wNjItLjA0My0uMDkzLS4wNjMtLjAyOC0uMDE4LS4wNTYtLjAzNS0uMDg1LS4wNS0uMTEyLS4wNjMtLjI1LS4xMjgtLjM4Mi0uMTEtLjA3LjAxLS4xMzguMDQ0LS4xOTYuMDg0LS4wNDcuMDMzLS4wODQuMDczLS4xMTIuMTIyLS4wMzIuMDU2LS4wNS4xMi0uMDYuMTgyLS4wMTcuMDk0LS4wMi4xOS0uMDE1LjI4NS4wMDcuMTc0LjA0LjM0Ni4wOC41MTVsLjcyNyAyLjY2Yy4wMi4wOS4wMjcuMTEyLjAzMi4yMDQuMDEuMjA2LS4wNS40MTMtLjE3LjU4Mi0uMDUyLjA3Ni0uMDcuMDktLjEzNS4xNTVsLS4yODcuMjdjLS4xNTUuMTU0LS4zMDUuMzEtLjQ1LjQ3bC0uMDc1LjA3M2MtLjA3Mi4wNTctLjA4OC4wNzUtLjE3LjEyLS4xNS4wODItLjMyNC4xMjMtLjQ5Ni4xMTUtLjA5Mi0uMDA0LS4xMTUtLjAxMy0uMjA0LS4wMzJMNC45MTQgOC44Yy0uMDg0LS4wMi0uMTctLjAzNy0uMjU1LS4wNS0uMDYtLjAxLS4xMi0uMDItLjE4Mi0uMDI1bC0uMTEtLjAwOGgtLjFjLS4xMyAwLS4yODcuMDE1LS4zOTQuMTAzLS4wNTIuMDQyLS4wOS4xMDItLjEyLjE2My0uMDIzLjA1LS4wMzYuMTA0LS4wMzUuMTYgMCAuMDY0LjAxNi4xMjguMDM4LjE5LjAzMi4wODguMDc4LjE3My4xMy4yNTQuMDk0LjE0OC4yMDguMjguMzMuNDA3bDEuOTQ3IDEuOTM0Yy4wNjIuMDY4LjA4LjA4My4xMy4xNi4xMTIuMTc1LjE2My4zODQuMTQ1LjU5LS4wMDguMDkyLS4wMTguMTE0LS4wNC4yMDMtLjA0LjEyNy0uMDguMjU0LS4xMTcuMzgyLS4wNTguMjEtLjExLjQyMy0uMTU3LjYzOEw2LjEgMTRjLS4wMzUuMDg1LS4wNC4xMDgtLjA4OC4xODctLjA5LjE0Ny0uMjIuMjctLjM3My4zNS0uMDgzLjA0LS4xMDYuMDQ1LS4xOTQuMDczbC0yLjY0Ny42OThjLS4wODQuMDI1LS4xNjYuMDUyLS4yNDcuMDgzbC0uMTcuMDdjLS4wMzQuMDE3LS4wNjUuMDMyLS4wOTguMDUtLjAzLjAxNi0uMDU3LjAzLS4wODcuMDQ4LS4xMS4wNjYtLjIzNi4xNTQtLjI4Ni4yNzctLjAyOC4wNy0uMDM0LjE1LS4wMjUuMjIzLjAwNS4wNS4wMi4xLjA0Ny4xNDQuMDMzLjA1Ni4wOC4xMDMuMTMuMTQ1LjA3Mi4wNi4xNTQuMTEyLjI0LjE1Ni4xNTQuMDguMzIuMTM4LjQ4OC4xODdsMi42NTUuN2MuMDg3LjAzLjExLjAzMy4xOTIuMDc2LjE4My4wOTUuMzMzLjI1LjQyLjQ0LjA2Ny4xNDMuMDkuMzAzLjEyNC40NTUuMDMyLjEyNy4wNjUuMjUzLjEuMzc4LjAzNy4xMjguMDc1LjI1NS4xMTUuMzhsLjAyNS4xYy4wMTMuMDkyLjAyLjExNS4wMTguMjA2LS4wMDMuMTczLS4wNTUuMzQzLS4xNDguNDg4LS4wNS4wNzctLjA2OC4wOTItLjEzLjE2bC0xLjk0MyAxLjkzYy0uMDYuMDY0LS4xMTcuMTI4LS4xNzIuMTk1LS4wNC4wNDgtLjA3Ni4wOTYtLjExLjE0Ni0uMDIzLjAzLS4wNDMuMDYtLjA2My4wOS0uMDE4LjAzLS4wMzUuMDU4LS4wNS4wODctLjA2My4xMTItLjEyOC4yNS0uMTEuMzgyLjAxLjA3LjA0NC4xMzguMDgzLjE5Ni4wMzIuMDQ1LjA3Mi4wODQuMTIuMTEuMDU3LjAzMi4xMi4wNS4xODMuMDYuMDk0LjAxOC4xOS4wMi4yODUuMDE2LjE3Ni0uMDA4LjM1LS4wNC41Mi0uMDgzbDIuNjYtLjcyYy4wOS0uMDIuMTEyLS4wMy4yMDQtLjAzMy4yMDYtLjAxLjQxMy4wNS41ODMuMTcuMDc1LjA1Mi4wOS4wNy4xNTQuMTM1LjA4OC4wOTcuMTc4LjE5Mi4yNy4yODcuMTUzLjE1NS4zMS4zMDUuNDcuNDUzbC4wNzIuMDczYy4wNTcuMDcyLjA3NC4wODguMTE4LjE3LjA4My4xNS4xMjMuMzIzLjExNS40OTUtLjAwNC4wOTMtLjAxMy4xMTUtLjAzMi4yMDRMOC44IDI3LjA4N2MtLjAyLjA4NC0uMDM3LjE3LS4wNS4yNTQtLjAxLjA2LS4wMi4xMjItLjAyNC4xODMtLjAwNC4wMzctLjAwNy4wNzQtLjAwOC4xMS0uMDAyLjAzNS0uMDAyLjA2Ni0uMDAyLjEuMDAzLjEyOC4wMTYuMjguMDk4LjM4Ni4wNDYuMDU4LjExMi4xMDIuMTguMTMyLjA0Ny4wMi4wOTguMDMyLjE1LjAzLjA2NCAwIC4xMjgtLjAxNi4xODgtLjAzOC4wOS0uMDMzLjE3NS0uMDc4LjI1NS0uMTMuMTQ4LS4wOTQuMjgtLjIwOC40MDctLjMzbDEuOTM1LTEuOTVjLjA2Ny0uMDYuMDgyLS4wOC4xNi0uMTMuMTE1LS4wNzMuMjQ4LS4xMjIuMzg0LS4xNC4wOTItLjAxLjExNS0uMDA3LjIwNy0uMDA0bC4xMDMuMDE1ek0xNi4wODYgOS4zMmMuMzQuMDA4LjY3OC4wMzUgMS4wMTMuMDkuNTk1LjEgMS4xNzcuMjggMS43MjQuNTM1IDEuMjQuNTggMi4yODggMS41NDMgMi45NyAyLjczLjM1NC42MTUuNjEgMS4yODYuNzUgMS45OC4xNTMuNzUuMTc3IDEuNTIyLjA3IDIuMjc4LS4wOTQuNjgtLjI5NSAxLjM0NS0uNTkzIDEuOTY0LS4zMzYuNy0uNzk3IDEuMzQtMS4zNTMgMS44ODMtLjU5NS41ODItMS4zIDEuMDUtMi4wNjYgMS4zNzUtLjc5NC4zMzYtMS42NS41MTMtMi41MTMuNTI1LS44NjUuMDEtMS43My0uMTQ2LTIuNTM2LS40NjMtLjc3NC0uMzA2LTEuNDktLjc2LTIuMS0xLjMyNy0uNTg4LS41NDgtMS4wNzYtMS4yLTEuNDM0LTEuOTItLjMwNi0uNjE0LS41MTUtMS4yNzYtLjYxOC0xLjk1NC0uMTE1LS43NTUtLjEtMS41My4wNDItMi4yOC4xMzQtLjY5Ni4zOC0xLjM3LjcyNi0xLjk5LjY1NC0xLjE3MiAxLjY2NC0yLjEzMyAyLjg2NS0yLjczLjU5LS4yOTMgMS4yMjMtLjQ5OCAxLjg3Mi0uNjA1LjI3OC0uMDQ1LjU2LS4wNzIuODQtLjA4NC4xMTUtLjAwNC4yMy0uMDA1LjM0NC0uMDA1em0tLjE0OCAxLjg4NGMtLjY4LjAxMi0xLjM0OC4xNi0xLjk2NC40NDctLjU0LjI1My0xLjAzNC42MDgtMS40NDYgMS4wNC0uMzg2LjQwNS0uNy44NzctLjkyNSAxLjM5LS4xOTguNDUzLS4zMjUuOTM3LS4zNzUgMS40My0uMDU1LjU0NS0uMDE4IDEuMS4xMTIgMS42MzMuMDkyLjM4LjIzLjc0Ny40MTQgMS4wOTIuNTE1Ljk3NSAxLjM2NCAxLjc1NiAyLjM4IDIuMTg2LjU3LjI0MyAxLjE4Ni4zNyAxLjgwNC4zNzcuNjIyLjAwOCAxLjI0My0uMTAzIDEuODItLjMzMi41NTgtLjIyIDEuMDcyLS41NDQgMS41MS0uOTUyLjQyMy0uMzk0Ljc3NC0uODYzIDEuMDMyLTEuMzguMjEtLjQyMy4zNTYtLjg3Ni40MzMtMS4zNC4wODctLjUyNC4wODctMS4wNiAwLTEuNTg0LS4wNzQtLjQ0Ny0uMjEyLS44ODItLjQwOC0xLjI5LS40Ny0uOTc0LTEuMjctMS43NzUtMi4yNDUtMi4yNDQtLjYxMi0uMjk1LTEuMjc4LS40NS0xLjk1NS0uNDctLjA2Mi0uMDAyLS4xMjUtLjAwMy0uMTg3LS4wMDJ6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWhlYXJ0LWNpcmNsZVwiIGRhdGEtbmFtZT1cImhlYXJ0LWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTEuMjI4IDYuODNjLjQ1LjAyNy44OTQuMSAxLjMyNi4yMzQgMS40ODguNDYgMi43MTIgMS41NjQgMy40NyAyLjkxMi4wOC0uMTQ2LjE3Mi0uMjg3LjI2My0uNDI3LjQ5LS43MiAxLjA4Ni0xLjM1NSAxLjgxNi0xLjgzLjU0NS0uMzU3IDEuMTUtLjYxNyAxLjc4NS0uNzYyLjU2NS0uMTMgMS4xNS0uMTY2IDEuNzI3LS4xMTIuNDgyLjA0Ni45NTguMTU1IDEuNDEzLjMyLjQxNi4xNTIuODE1LjM1MyAxLjE4Ni41OTQuOTM0LjYwNyAxLjY4NSAxLjQ3NSAyLjE3NCAyLjQ3My4zNTguNzMyLjU3NiAxLjUyNy42NiAyLjMzNi4wNC4zNzQuMDU2Ljc1My4wMzQgMS4xMy0uMDQ0Ljc5Mi0uMjU0IDEuNTctLjU1IDIuMzA0LS40NCAxLjA5OC0xLjA3IDIuMTE2LTEuNzcgMy4wNjgtMS4yMjMgMS42Ny0yLjY3MyAzLjE3NC00LjE5MiA0LjU3Ny0xLjI1NiAxLjE2LTIuNTY4IDIuMjY1LTMuOTQ0IDMuMjgybC0uMDcuMDQ4Yy0uMjU4LjE0NC0uNTQ1LjE5NC0uODMuMTA2LS4wODUtLjAyNS0uMTYtLjA2My0uMjM2LS4xMDYtLjE3Ny0uMTItLjM0Ni0uMjUzLS41MTctLjM4My0xLjIwNy0uOTMyLTIuMzc2LTEuOTEzLTMuNDk3LTIuOTQ4QzEwLjMgMjIuNTYgOS4xNzMgMjEuNDE1IDguMTUgMjAuMThjLS43LS44NDgtMS4zNTUtMS43NC0xLjkwNS0yLjY5My0uNDEtLjcxLS43NjItMS40Ni0uOTk4LTIuMjQ0LS4xNS0uNTAzLS4yNTItMS4wMi0uMjgyLTEuNTQ2LS4wMTgtLjMyMy0uMDEtLjY0OC4wMTgtLjk3LjA4LS45Ni4zNDYtMS45MDYuODEtMi43NTMuNDQzLS44MTIgMS4wNjUtMS41MjQgMS44MTctMi4wNjQuMzk3LS4yODUuODMtLjUyIDEuMjg1LS43LjU3OC0uMjI2IDEuMTgzLS4zNSAxLjgwMi0uMzg1LjE3OC0uMDA2LjM1NC0uMDA2LjUzIDB6bTkuNzc4IDIuMDI0Yy0uMzEuMDEyLS42MTUuMDU4LS45MTIuMTUtLjIyNC4wNy0uNDQuMTYyLS42NDYuMjc1LTEuMTcuNjQtMS44NzcgMS44Ny0yLjI2NyAzLjEwNi0uMDY1LjIwNi0uMTIuNDE0LS4xNzIuNjI0bC0uMDI2LjA4NmMtLjA2Ny4xNy0uMTYuMzItLjMuNDQtLjQuMzQyLTEuMDE2LjMxNS0xLjM4NS0uMDYtLjEwNy0uMTEtLjE3OC0uMjM4LS4yMzQtLjM4LS4wNTUtLjE4Ni0uMS0uMzc1LS4xNTMtLjU2Mi0uMzc3LTEuMjM0LTEuMDIzLTIuNDY3LTIuMTU0LTMuMTYzLS4xNTMtLjA5My0uMzEyLS4xNzctLjQ3Ny0uMjQ3LS4zNjctLjE1NS0uNzYtLjI0NS0xLjE1NS0uMjY1LS4zMzYtLjAxOC0uNjc0LjAxNS0xIC4wOTMtLjI4LjA2OC0uNTUuMTY3LS44MDUuMjk1LS44MzMuNDE4LTEuNDkgMS4xMy0xLjg4IDEuOTczLS4yMjguNDkyLS4zNjUgMS4wMjQtLjQyMiAxLjU2My0uMDQyLjQwNy0uMDQ0LjgxNi4wMiAxLjIyLjEwNC42NDYuMzQ0IDEuMjY3LjYzMyAxLjg1Mi40NDYuOTAyIDEuMDIgMS43MzggMS42MzggMi41My44MDYgMS4wMyAxLjcgMS45OTIgMi42MzYgMi45MDggMS4yNzcgMS4yNTMgMi42MzUgMi40MiA0LjA0MyAzLjUyNGwuMDM2LjAyN2MxLjAxNS0uNzgzIDEuOTk3LTEuNjEzIDIuOTQ1LTIuNDc4Ljc4Ny0uNzE3IDEuNTUtMS40NiAyLjI3Ni0yLjI0Ljk3OC0xLjA1IDEuOTAzLTIuMTY3IDIuNjUtMy4zOTUuNDctLjc3Ny44ODctMS42MTcgMS4wNzUtMi41MTIuMDk4LS40NzQuMTEtLjk1My4wNi0xLjQzMy0uMDU0LS41MDYtLjE3Ny0xLjAwNS0uMzgtMS40Ny0uMzUtLjgwMy0uOTM3LTEuNDk2LTEuNjkzLTEuOTQtLjI0OC0uMTQ4LS41MTMtLjI2Ni0uNzg4LS4zNTMtLjMyNC0uMTAzLS42NTctLjE1NS0uOTk1LS4xNjZoLS4xN3pcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbG9jay1jaXJjbGVcIiBkYXRhLW5hbWU9XCJsb2NrLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNOS41NTggMTEuMTM0YzAtLjMzOC4wMDctLjY3Ni4wMS0xLjAxNC4wMy0uNzUzLjE3LTEuNDkyLjQ0Ni0yLjE5NC42NjgtMS42OTYgMi4wNjMtMy4wNTcgMy43NzUtMy42ODMuNjU4LS4yNCAxLjM0NS0uMzYyIDIuMDQ0LS4zODguMTY2LS4wMDIuMTY1LS4wMDIuMzMyIDAgLjcuMDI2IDEuMzg2LjE0NyAyLjA0NS4zODggMS43MTIuNjI2IDMuMTA4IDEuOTg3IDMuNzc2IDMuNjgzLjI3Ny43MDIuNDE2IDEuNDQuNDQ1IDIuMTk0LjAwNS4zMzguMDEuNjc2LjAxMyAxLjAxNC42MzQuMDIgMS4yNy4wNDQgMS45MDMuMDcuMDc3LjAxLjE1LjAyLjIyMy4wNDYuMjQuMDgzLjQ0LjI2Ny41NDIuNS4wNDIuMDk1LjA2Mi4xOTIuMDc0LjI5NC4xOCA0LjMxLjAwNCA4LjYyNy4wMDQgMTIuOTQtLjAwNS4xMDMtLjAxNy4yMDItLjA1LjMtLjA4My4yNC0uMjY3LjQ0LS41LjU0Mi0uMDk1LjA0Mi0uMTkyLjA2Mi0uMjk0LjA3NS01LjUzNC4yMy0xMS4wNzguMDA0LTE2LjYxNy4wMDQtLjEwMy0uMDA0LS4yLS4wMTYtLjMtLjA1LS4yNC0uMDgzLS40NC0uMjY2LS41NDItLjUtLjA0Mi0uMDk1LS4wNjItLjE5LS4wNzQtLjI5My0uMTgtNC4zMS0uMDA0LTguNjI3LS4wMDQtMTIuOTQuMDA1LS4xMDMuMDE3LS4yLjA1LS4zLjA4My0uMjQuMjY3LS40NC41LS41NDIuMDk1LS4wNC4xOTItLjA2Mi4yOTQtLjA3NC42MzQtLjAyNiAxLjI3LS4wNSAxLjkwNC0uMDd6bTEzLjc5NCAxLjkwNUg4LjY0OHYxMS4wMjZoMTQuNzA0VjEzLjA0em0tOC4zMDMgNS4yNDdjLS41Ny0uMzQ3LS45Mi0uOTkyLS44ODYtMS42NjcuMDEtLjE4My4wNDYtLjM2NS4xMS0uNTM4LjA3LS4xOTUuMTc2LS4zNzguMzEtLjU0LjE1LS4xOC4zMzQtLjMzMi41NC0uNDQ0LjI0NC0uMTMyLjUwNy0uMi43ODItLjIyLjA5NS0uMDAyLjA5NC0uMDAyLjE4OCAwIC4yNzUuMDIuNTM4LjA4OC43OC4yMi4yMDguMTEyLjM5NC4yNjQuNTQ0LjQ0NS4xMzIuMTYuMjM3LjM0NC4zMS41NC4wNjIuMTcyLjA5OC4zNTQuMTA4LjUzNy4wMzQuNjgyLS4zMjQgMS4zMzMtLjkwMiAxLjY3Ny4wMjMgMS4wMy4wNDMgMi4wNi0uMDE4IDMuMDg1LS4wMTUuMTQ3LS4wNTcuMjg3LS4xMzYuNDEzLS4yMTguMzUtLjY1Ni41MTQtMS4wNS4zOTItLjEwNS0uMDMyLS4yMDQtLjA4My0uMjktLjE1LS4wOTctLjA3NC0uMTgtLjE2OC0uMjQtLjI3NC0uMDY2LS4xMTgtLjEwMy0uMjQ2LS4xMTYtLjM4LS4wNi0xLjAzLS4wNzMtMi4wNjUtLjAzNS0zLjA5NnptNS41NC03LjIwNGMuMDAzLS4zMDUuMDA3LS42MS4wMDMtLjkxNy0uMDIyLS41NzUtLjEzNC0xLjEzOC0uMzYtMS42Ny0uNTIyLTEuMjM0LTEuNTg2LTIuMi0yLjg2Ny0yLjYtLjUxNy0uMTYtMS4wNjItLjIyNy0xLjYwMy0uMi0uNDk2LjAyNi0uOTg2LjEzLTEuNDQ4LjMxMy0uNTE2LjIwMi0uOTk0LjUtMS40MDQuODczLS40MzYuMzk3LS43OTYuODc4LTEuMDUyIDEuNDEtLjI4My41ODgtLjQyNiAxLjIyMy0uNDUgMS44NzMtLjAwNS4zMDYgMCAuNjEyLjAwMi45MTcgMy4wNi0uMDcgNi4xMi0uMDcgOS4xOCAwelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA1NCAzMlwiIHdpZHRoPVwiNTRcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0zMi4yMDcgMjUuOTQ2TDIxLjcyIDMybC0xMS4yMzQtNi40ODZMMCAxOS40NlY2LjQ4NUwxMS4yMzUgMCAyMS43MiA2LjA1NCAzMi4yMDcgMCA0My40NCA2LjQ4NmwxMC40ODcgNi4wNTV2MTIuOTc0TDQyLjY5MyAzMmwtMTAuNDg2LTYuMDU0em0uNjYtMS4zNDNWMTQuMjdsOS4wNTQgNS4xOS4wMDMgMTAuMzc4LTkuMDU1LTUuMjM1em0tMjAuODg0LjA0NlYxNC4yN2w5LjA4NSA1LjIxOC4wMDIgMTAuNDQtOS4wODYtNS4yOHpNMS40OTggMTguNTk0VjguMjE1bDguOTg4IDUuMTl2MTAuMzhsLTguOTg4LTUuMTl6TTIxLjcyIDcuNzg1bDguOTkgNS4xODgtOC45OSA1LjE5LTguOTg4LTUuMTkgOC45OS01LjE5em0yMC45NzMgMGw4Ljk4OCA1LjE4OC04Ljk4NyA1LjE5LTguOTktNS4xOSA4Ljk5LTUuMTl6TTExLjIzNSAxLjcyOGw4Ljk4OCA1LjE5LTguOTg4IDUuMTg4LTguOTktNS4xOSA4Ljk5LTUuMTg4em0yMC45NyAwbDguOTkgNS4xOS04Ljk5IDUuMTg4LTguOTg3LTUuMTkgOC45ODgtNS4xODh6XCIvPjxwYXRoIGQ9XCJNMS40MzcgMTguNjQzTDEuNDQyIDguMTFsMTkuNjUyIDExLjM1LjAxIDEwLjU0NUwxLjQzNiAxOC42NDN6bTMxLjM3IDZsLjAzLTEwLjQ2NCA5LjE0NyA1LjI0My0uMDEgMTAuNTgyLTkuMTY4LTUuMzYzelwiIGZpbGwtb3BhY2l0eT1cIi4zNDVcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1tZXNzYWdlLWNpcmNsZVwiIGRhdGEtbmFtZT1cIm1lc3NhZ2UtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNy4zNDIgMjMuNTgybC0zLjUzIDMuNTMtLjA2Ni4wNmMtLjEyLjA4OC0uMjQ1LjE1NS0uMzkyLjE4NS0uMzguMDc2LS43NzgtLjExMi0uOTYtLjQ1NS0uMDcyLS4xMzMtLjEtLjI3Mi0uMTA3LS40MnYtMi45Yy0uMDg3IDAtLjE3NC0uMDAyLS4yNi0uMDAzbC0uNDEtLjAyMmMtLjMzMy0uMDMtLjY2NS0uMDcyLS45OTQtLjE0LS42NC0uMTMyLTEuMjY2LS4zNDQtMS44NTYtLjYzLTEuMzMtLjY0My0yLjQ3My0xLjY1OC0zLjI3My0yLjktLjQ1Ny0uNzEzLS44LTEuNDk2LTEuMDEyLTIuMzE0LS4yMDMtLjc4My0uMjg0LTEuNTk3LS4yNDMtMi40MDUuMDQzLS44NjQuMjI4LTEuNzE4LjU0Ni0yLjUyLjM1Ny0uOS44NzctMS43MyAxLjUyNy0yLjQ0Ni42OTItLjc2IDEuNTMtMS4zODggMi40NTUtMS44MzYuNzEtLjM0MyAxLjQ3LS41OCAyLjI0OC0uNy4zMzUtLjA1LjY3Mi0uMDc3IDEuMDEtLjA5IDIuNjY1LS4wMzQgNS4zMy0uMDM0IDcuOTk2IDAgLjMzOC4wMTMuNjc0LjA0IDEuMDEuMDkuNzc4LjEyIDEuNTQuMzU3IDIuMjQ4LjcuOTI2LjQ0OCAxLjc2MyAxLjA3NSAyLjQ1NCAxLjgzNi42NS43MTUgMS4xNyAxLjU0NyAxLjUyNyAyLjQ0NS4zMi44MDIuNTA1IDEuNjU2LjU1IDIuNTIuMDQuODA3LS4wNCAxLjYyLS4yNDQgMi40MDQtLjIxMi44MTgtLjU1NiAxLjYtMS4wMTMgMi4zMTMtLjg3IDEuMzUzLTIuMTQ2IDIuNDM0LTMuNjI3IDMuMDYzLS42NjguMjgzLTEuMzc0LjQ3NS0yLjA5NC41NjctLjMzNi4wNDMtLjY3Mi4wNi0xLjAxLjA2NWgtMi40OHptLjEyMy01LjgyNmMuMTI4LjAxLjI1LjA0LjM2NC4xLjA5Ny4wNS4xODYuMTIuMjYuMjAzLjI2Ny4zMDUuMjkuNzY3LjA1OCAxLjEtLjA1NS4wNzgtLjEyMi4xNDYtLjE5OC4yMDMtLjE0My4xMDYtLjMxLjE2LS40ODUuMTc1LTIuMjA1LjA2LTQuNDEyLjA2LTYuNjE3IDAtLjE3Ni0uMDE0LS4zNDItLjA3LS40ODUtLjE3NS0uMzI2LS4yNDItLjQ0OC0uNjktLjI5LTEuMDYzLjAzNy0uMDg4LjA4OC0uMTcuMTUtLjI0LjA3NC0uMDg0LjE2My0uMTU0LjI2LS4yMDUuMTE1LS4wNi4yMzctLjA5LjM2NS0uMSAyLjIwNS0uMDU4IDQuNDEyLS4wNTggNi42MTcgMHptMy43NDctMi44NDdjLjE4LjAxNy4zNS4wNzUuNDkzLjE5LjM3My4yOTMuNDQ3Ljg0Ni4xNjYgMS4yMjgtLjA3LjA5Ni0uMTYuMTc4LS4yNjMuMjQtLjEyMi4wNy0uMjU1LjEwNy0uMzk1LjEyLTMuNDU3LjExNy02LjkyLjExNy0xMC4zNzYgMC0uMTgtLjAxNy0uMzUtLjA3NS0uNDk0LS4xOS0uMzcyLS4yOTMtLjQ0Ny0uODQ2LS4xNjUtMS4yMjguMDctLjA5Ni4xNi0uMTc4LjI2NC0uMjQuMTIzLS4wNy4yNTUtLjEwNy4zOTYtLjEyIDMuNDU3LS4xMTcgNi45Mi0uMTE3IDEwLjM3NiAwem0wLTIuODVjLjE0LjAxNS4yNzMuMDUuMzk1LjEyMy4xMDMuMDYuMTkzLjE0My4yNjQuMjQuMjgyLjM4LjIwOC45MzQtLjE2NSAxLjIyOC0uMTQ0LjExNS0uMzEyLjE3My0uNDkzLjE5Mi0zLjQ1Ny4xMTUtNi45Mi4xMTUtMTAuMzc2IDAtLjE4LS4wMi0uMzUtLjA3Ny0uNDk0LS4xOS0uMzcyLS4yOTUtLjQ0Ny0uODQ4LS4xNjUtMS4yMy4wNy0uMDk2LjE2LS4xNzguMjY0LS4yNC4xMjMtLjA3LjI1NS0uMTA3LjM5Ni0uMTIgMy40NTctLjExNyA2LjkyLS4xMTcgMTAuMzc2IDB6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbm8tY2lyY2xlXCIgZGF0YS1uYW1lPVwibm8tY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNi4yODggMy45M2MuNDguMDE4Ljk1OC4wNTIgMS40MzQuMTIgMS4yLjE3NCAyLjM3LjUzIDMuNDYzIDEuMDUzIDIuMTM1IDEuMDIgMy45NSAyLjY5IDUuMTUzIDQuNzI3LjU5NiAxLjAxIDEuMDQyIDIuMTA0IDEuMzIgMy4yNDIuMjcyIDEuMTIuMzg0IDIuMjguMzMgMy40My0uMDYgMS4yNTQtLjMxOCAyLjQ5NS0uNzYgMy42Ny0xLjE3IDMuMDk4LTMuNjQ0IDUuNjMzLTYuNzEzIDYuODc3LTEuNDMuNTgtMi45Ny44NzgtNC41MTUuODc4LTEuNTQ0IDAtMy4wODQtLjMtNC41MTUtLjg4LTIuMjg0LS45MjUtNC4yNTYtMi41Ny01LjU5LTQuNjQyLS41NTUtLjg2Ni0xLTEuODA1LTEuMzE1LTIuNzg1LS4zNTUtMS4xLS41NS0yLjI1LS41NzctMy40MDQtLjAyOC0xLjE1NC4xMS0yLjMxLjQxMi0zLjQyNS4zMTgtMS4xOC44Mi0yLjMxIDEuNDgtMy4zNCAxLjItMS44NjYgMi45Mi0zLjM5IDQuOTItNC4zNDcgMS4wOTItLjUyNCAyLjI2NC0uODggMy40NjMtMS4wNTIuNDc2LS4wNjguOTU0LS4xMDIgMS40MzQtLjEyLjI5LS4wMDMuMjg4LS4wMDMuNTc2IDB6TTIzLjY3IDkuOEw5Ljg3NCAyMy41OTdjLjczNi41OSAxLjU1NiAxLjA3NCAyLjQzMiAxLjQzIDEuMTcuNDc0IDIuNDMyLjcxOCAzLjY5NS43MThzMi41MjQtLjI0NCAzLjY5NS0uNzJjMi41MS0xLjAxNyA0LjUzNi0zLjA5IDUuNDktNS42MjUuMzYzLS45Ni41NzMtMS45NzYuNjIyLTMgLjA1LTEuMDIzLS4wNjItMi4wNTMtLjMzLTMuMDQtLjI2LS45NjYtLjY3LTEuODktMS4yMS0yLjczLS4xODMtLjI4OC0uMzgzLS41NjUtLjU5Ni0uODN6TTIyLjEzIDguMjU2Yy0uNTgtLjQ2NS0xLjIxMy0uODY1LTEuODg1LTEuMTg2LS44OTQtLjQyNy0xLjg1Mi0uNzE4LTIuODMzLS44Ni0uMzktLjA1Ni0uNzgtLjA4My0xLjE3NS0uMDk4LS4yMzUtLjAwMy0uMjM0LS4wMDMtLjQ3IDAtLjM5NC4wMTUtLjc4NS4wNDItMS4xNzUuMS0uOTguMTQtMS45NC40My0yLjgzMy44Ni0xLjYzNy43ODMtMy4wNDQgMi4wMy00LjAyNSAzLjU1Ny0uNTQuODQtLjk1IDEuNzY0LTEuMjEgMi43My0uMjQ2LjkxMi0uMzYgMS44Ni0uMzM4IDIuODAzLjAyMy45NDYuMTgyIDEuODg4LjQ3MiAyLjc4OC4yNi44MDIuNjIgMS41NyAxLjA3NiAyLjI3Ni4xODQuMjg3LjM4NC41NjQuNTk3LjgzbDEzLjc5OC0xMy44elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBlbmNpbC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJwZW5jaWwtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjkyNSAxOC4xNjVjMy44NTctNC4xOTMgOC4wNTctOC4wNTggMTIuMDg2LTEyLjA4Ny4xMjMtLjExMi4yNTYtLjE5OC40MTctLjI0LjA3LS4wMi4wODgtLjAyLjE2LS4wMy4wOC0uMDAyLjA4LS4wMDIuMTYyIDAgLjA3LjAxLjA4OC4wMS4xNTguMDMuMTM0LjAzNS4yNDguMS4zNTcuMTg1IDEuNjM0IDEuNDk3IDMuMTM3IDMuMTMyIDQuNzA0IDQuNy4wNTUuMDYuMTA2LjEyLjE0Ny4xOTIuMTM2LjIzNi4xNi41MjYuMDY4Ljc4Mi0uMDM3LjEwNC0uMDk0LjE5Mi0uMTYuMjgtMy44NjUgNC4yMTYtOC4wODcgOC4wOS0xMi4xMzIgMTIuMTM1bC0uMDIyLjAyYy0uMDcuMDY2LS4xNS4xMi0uMjM3LjE2LS4wMjIuMDEyLS4wNDQuMDIyLS4wNjcuMDMyLTIuMTY0LjcxOC00LjM4NCAxLjI1Ni02LjU3NyAxLjg4Mi0uMTM3LjAzMy0uMjcuMDQ3LS40MS4wMjQtLjM1Ny0uMDYtLjY1NC0uMzMyLS43NDYtLjY4NC0uMDM1LS4xMzYtLjAzMy0uMjctLjAxMy0uNDA4LjUzLTIuMjIgMS4yNTItNC4zOSAxLjg3OC02LjU4Mi4wMDYtLjAyLjAxMy0uMDM3LjAyLS4wNTUuMDM0LS4wOTUuMDg0LS4xODYuMTQ4LS4yNjdsLjAxNi0uMDIuMDE3LS4wMmMuMDA4LS4wMS4wMTYtLjAyLjAyNS0uMDI4em0uMTYgNS43OTZsMy4zMzUtLjk1MmMtLjgxLS43Ny0xLjYxNi0xLjU0Ni0yLjM5LTIuMzVsLS45NDQgMy4zMDN6bTUuMTg1LTEuODUybDcuMDEzLTcuMDEzLTMuMzMtMy4zMy03LjAzMiA3LjAzYzEuMTQgMS4wODIgMi4yOCAyLjE2NCAzLjM1IDMuMzEzem00Ljk5Ni0xMS42NThsMy4zMyAzLjMzTDI0IDExLjM4bC0zLjMzMi0zLjMzMi0yLjQwMiAyLjQwMnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wbHVzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInBsdXMtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy4yNCAxNy4zNzZoLTUuNzkydjUuNzkyYzAgLjgtLjY1IDEuNDQ4LTEuNDQ4IDEuNDQ4LS44IDAtMS40NDgtLjY0OC0xLjQ0OC0xLjQ0OHYtNS43OTJIOC43NmMtLjggMC0xLjQ0OC0uNjUtMS40NDgtMS40NDggMC0uOC42NS0xLjQ0OCAxLjQ0OC0xLjQ0OGg1Ljc5MlY4LjY4OGMwLS44LjY1LTEuNDQ4IDEuNDQ4LTEuNDQ4LjggMCAxLjQ0OC42NSAxLjQ0OCAxLjQ0OHY1Ljc5Mmg1Ljc5MmMuOCAwIDEuNDQ4LjY1IDEuNDQ4IDEuNDQ4IDAgLjgtLjY1IDEuNDQ4LTEuNDQ4IDEuNDQ4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXByb2dyZXNzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInByb2dyZXNzLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIxLjI4OGMtLjU4IDAtMS4wNDguNDctMS4wNDggMS4wNDh2My41MmMwIC41OC40NyAxLjA1IDEuMDQ4IDEuMDUuNTc4IDAgMS4wNDgtLjQ3IDEuMDQ4LTEuMDV2LTMuNTJjMC0uNTgtLjQ3LTEuMDQ4LTEuMDQ4LTEuMDQ4XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI1Ljk1NSAxNC45bC0zLjQ1OC0uMDA4Yy0uNTk3LjAxMy0xLjA1LjQ2Ny0xLjA1IDEuMDQ2LS4wMDIuNTguNDY3IDEuMDUgMS4wNDYgMS4wNWwzLjQ1OC4wMDdoLjAwM2MuNTc3IDAgMS4wNDYtLjQ2OCAxLjA0OC0xLjA0NiAwLS41OC0uNDY3LTEuMDUtMS4wNDUtMS4wNVwiIGZpbGwtb3BhY2l0eT1cIi4yNTFcIi8+PHBhdGggZD1cIk0xNi4wMjUgMi44MzJoLS4wMDNjLS41NzcgMC0xLjA0NS40NjgtMS4wNDcgMS4wNDZsLS4wMSA1LjQ2Yy0uMDAyLjU4LjQ2NiAxLjA1IDEuMDQ0IDEuMDVoLjAwMmMuNTc4IDAgMS4wNDYtLjQ2NyAxLjA0Ny0xLjA0NWwuMDEtNS40NmMuMDAyLS41OC0uNDY2LTEuMDUtMS4wNDUtMS4wNVwiLz48cGF0aCBkPVwiTTEzLjc1IDIwLjgxYy0uNTM2LS4yMjMtMS4xNDguMDMtMS4zNy41NjVsLTEuMzc1IDMuMjk4Yy0uMjIzLjUzNC4wMyAxLjE0Ny41NjMgMS4zNy4xMzMuMDU0LjI3LjA4Mi40MDMuMDgyLjQxMiAwIC44LS4yNDMuOTctLjY0N2wxLjM3My0zLjI5N2MuMjI0LS41MzMtLjAyOC0xLjE0Ny0uNTYyLTEuMzdcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTE5LjYwNCAyMS4zOTNjLS4yMi0uNTM3LS44MzMtLjc5LTEuMzY3LS41NzItLjUzNS4yMi0uNzkuODMzLS41NyAxLjM3bDEuMzU0IDMuMjk4Yy4xNjguNDA2LjU2LjY1Ljk3LjY1LjEzMyAwIC4yNy0uMDI0LjM5OC0uMDc4LjUzNi0uMjIuNzktLjgzMy41NzItMS4zNjdsLTEuMzU2LTMuM3pcIiBmaWxsLW9wYWNpdHk9XCIuNFwiLz48cGF0aCBkPVwiTTkuNSAxNi45NjRoLjAwMmMuNTc4IDAgMS4wNDYtLjQ2OCAxLjA0OC0xLjA0NiAwLS41OC0uNDY3LTEuMDUtMS4wNDYtMS4wNUw2LjA1IDE0Ljg2aC0uMDAzQzUuNDcgMTQuODYgNSAxNS4zMyA1IDE1LjkwOGMtLjAwMy41NzguNDY1IDEuMDUgMS4wNDUgMS4wNWwzLjQ1NS4wMDd6XCIgZmlsbC1vcGFjaXR5PVwiLjkwMlwiLz48cGF0aCBkPVwiTTIxLjA3NSAxMy44M2MuMTY2LjQwNS41NTcuNjUuOTcuNjUuMTMyIDAgLjI2Ny0uMDI2LjM5OC0uMDhsMy4xNTgtMS4yOTZjLjUzNS0uMjIuNzktLjgzMy41Ny0xLjM2Ni0uMjItLjUzNS0uODMtLjc5My0xLjM2Ny0uNTdsLTMuMTU4IDEuMjk0Yy0uNTM2LjIyLS43OS44MzMtLjU3IDEuMzY3XCIgZmlsbC1vcGFjaXR5PVwiLjJcIi8+PHBhdGggZD1cIk0xMC45OTIgMTcuOTljLS4yMi0uNTM2LS44My0uNzk0LTEuMzY3LS41N2wtMy4yMjggMS4zMzJjLS41MzUuMjItLjc5LjgzMy0uNTcgMS4zNjYuMTY3LjQwNS41NTguNjUuOTcuNjUuMTMgMCAxLjU1Ny0uNTU4IDEuNjg4LS42MTNsMS45MzgtLjc5OGMuNTM1LS4yMi43OS0uODMzLjU3LTEuMzY3XCIgZmlsbC1vcGFjaXR5PVwiLjhcIi8+PHBhdGggZD1cIk0yMS4yOCAxOS43NWMtLjQwNy0uNDA4LTEuMDctLjQxLTEuNDgtLjAwMi0uNDEuNDEtLjQxMiAxLjA3Mi0uMDAyIDEuNDgybDIuNDgyIDIuNDljLjIwNS4yMDQuNDc1LjMwOC43NDMuMzA4cy41MzUtLjEwMy43NC0uMzA2Yy40MS0uNDEuNDEtMS4wNy4wMDMtMS40ODJsLTIuNDg1LTIuNDl6XCIgZmlsbC1vcGFjaXR5PVwiLjM0OVwiLz48cGF0aCBkPVwiTTE5LjkwMiAxMi4wNGMuMjA1LjIwNS40NzQuMzA4Ljc0My4zMDguMjY4IDAgLjUzNi0uMTAyLjc0LS4zMDVsMi40MDUtMi4zOTdjLjQxLS40MS40MTItMS4wNzIuMDAyLTEuNDgyLS40MDgtLjQxLTEuMDctLjQxLTEuNDgtLjAwM2wtMi40MDUgMi4zOThjLS40MTIuNDEtLjQxMiAxLjA3LS4wMDUgMS40ODJcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguMTMgMTAuODEzYy4xMzIuMDU0LjI3LjA4LjQwMy4wOC40MSAwIC44LS4yNDIuOTY4LS42NDVsMS4yOTItMy4xMDdjLjIyMy0uNTMyLS4wMy0xLjE0NS0uNTY0LTEuMzY4LS41MzUtLjIyMi0xLjE1LjAzMi0xLjM3LjU2NWwtMS4yOTIgMy4xMDZjLS4yMjIuNTM0LjAzIDEuMTQ3LjU2NCAxLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjEwMlwiLz48cGF0aCBkPVwiTTEzLjE3NiA2LjMyNmMtLjIyLS41MzUtLjgzNC0uNzkzLTEuMzY4LS41Ny0uNTM0LjIyMi0uNzkuODM0LS41NyAxLjM3bDEuMjg3IDMuMTE1Yy4xNjYuNDA2LjU1Ni42NS45Ny42NS4xMyAwIC4yNjctLjAyNS4zOTctLjA4LjUzNi0uMjIuNzktLjgzMy41Ny0xLjM2N2wtMS4yODYtMy4xMTd6TTEwLjYyNiAxMi4wMTVjLjIwNC4yMDUuNDczLjMwOC43NDIuMzA4LjI2NyAwIC41MzUtLjEwMi43NC0uMzA1LjQxLS40MS40MS0xLjA3My4wMDItMS40ODJsLTIuMzkzLTIuNGMtLjQxLS40MS0xLjA3Mi0uNDEtMS40OC0uMDAyLS40MTIuNDEtLjQxMyAxLjA3LS4wMDUgMS40ODJsMi4zOTQgMi40elwiLz48cGF0aCBkPVwiTTEyLjE4NiAxOS43M2MtLjQxLS40MTItMS4wNzItLjQxMy0xLjQ4Mi0uMDA0TDguMjA4IDIyLjIxYy0uNDEuNDEtLjQxIDEuMDcyLS4wMDIgMS40ODIuMjA0LjIwNi40NzIuMzA4Ljc0My4zMDguMjY1IDAgLjUzMy0uMS43MzctLjMwNWwyLjQ5NS0yLjQ4NWMuNDEtLjQwOC40MS0xLjA3LjAwNC0xLjQ4XCIgZmlsbC1vcGFjaXR5PVwiLjcwMlwiLz48cGF0aCBkPVwiTTI1LjU5IDE4Ljc4N2wtMy4yMTQtMS4zMzhjLS41MzQtLjIyMy0xLjE0OC4wMy0xLjM3LjU2My0uMjIyLjUzNS4wMyAxLjE0OC41NjUgMS4zN2wzLjIxNCAxLjM0Yy4xMy4wNTQuMjY4LjA4LjQwMy4wOC40MSAwIC44LS4yNDMuOTY3LS42NDQuMjIzLS41MzctLjAzLTEuMTUtLjU2NC0xLjM3M1wiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk02LjQwNyAxMy4wN2wzLjE2IDEuMzE0Yy4xMy4wNTQuMjY3LjA4LjQuMDguNDEgMCAuOC0uMjQzLjk2OC0uNjQ2LjIyMy0uNTMzLS4wMy0xLjE0Ni0uNTY0LTEuMzdsLTMuMTU2LTEuMzE0Yy0uNTM1LS4yMjItMS4xNS4wMy0xLjM3LjU2NC0uMjIzLjUzNS4wMyAxLjE0OC41NjMgMS4zN1wiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wcm9ncmVzc1wiIGRhdGEtbmFtZT1cInByb2dyZXNzXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGw9XCJub25lXCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIyLjkxNWMtLjc1OCAwLTEuMzcuNjEzLTEuMzcgMS4zN3Y0LjYwNWMwIC43NTYuNjEyIDEuMzcgMS4zNyAxLjM3Ljc1NiAwIDEuMzctLjYxNCAxLjM3LTEuMzd2LTQuNjA1YzAtLjc1Ny0uNjE0LTEuMzctMS4zNy0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI5LjAxOCAxNC41NmwtNC41MjItLjAwOGMtLjc4LjAxNi0xLjM3My42MS0xLjM3MyAxLjM2Ny0uMDAyLjc1Ni42MSAxLjM3IDEuMzY4IDEuMzcybDQuNTIyLjAxaC4wMDNjLjc1NSAwIDEuMzY3LS42MTIgMS4zNy0xLjM3IDAtLjc1NS0uNjEtMS4zNy0xLjM2Ny0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjI1MVwiLz48cGF0aCBkPVwiTTE2LjAzMy4yNDJoLS4wMDJjLS43NTQgMC0xLjM2Ny42MS0xLjM3IDEuMzY3bC0uMDE1IDUuNjhjMCAuNzU1LjYxIDEuMzcgMS4zNjcgMS4zNzJoLjAwM2MuNzU2IDAgMS4zNy0uNjEgMS4zNy0xLjM2OGwuMDE2LTUuNjhjLjAwMy0uNzU3LS42MS0xLjM3LTEuMzY3LTEuMzcyXCIvPjxwYXRoIGQ9XCJNMTMuMDYgMjIuMjljLS43MDMtLjI5Mi0xLjUwMy4wNC0xLjc5NS43MzhMOS40NjggMjcuMzRjLS4yOS43LjA0IDEuNS43MzYgMS43OS4xNzQuMDc0LjM1Mi4xMS41MjguMTEuNTM3IDAgMS4wNDUtLjMxOCAxLjI2Ni0uODQ2bDEuNzk2LTQuMzFjLjI5Mi0uNy0uMDM3LTEuNTAzLS43MzUtMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTIwLjcxMyAyMy4wNTJjLS4yODctLjcwMi0xLjA5LTEuMDM1LTEuNzg4LS43NDgtLjcuMjg3LTEuMDM1IDEuMDktLjc0NyAxLjc5bDEuNzczIDQuMzEzYy4yMi41My43My44NSAxLjI3Ljg1LjE3MiAwIC4zNS0uMDMyLjUyLS4xLjctLjI5IDEuMDMzLTEuMDkuNzQ3LTEuNzlsLTEuNzc0LTQuMzE1elwiIGZpbGwtb3BhY2l0eT1cIi40XCIvPjxwYXRoIGQ9XCJNNy41IDE3LjI2aC4wMDNjLjc1NSAwIDEuMzY4LS42MSAxLjM3LTEuMzY3IDAtLjc1OC0uNjEtMS4zNzItMS4zNjctMS4zNzNsLTQuNTE4LS4wMWgtLjAwM2MtLjc1NiAwLTEuMzcuNjEyLTEuMzcgMS4zNjgtLjAwMy43NTcuNjEgMS4zNzIgMS4zNjcgMS4zNzNsNC41Mi4wMXpcIiBmaWxsLW9wYWNpdHk9XCIuOTAyXCIvPjxwYXRoIGQ9XCJNMjIuNjM2IDEzLjE2MmMuMjE4LjUzLjczLjg1IDEuMjY3Ljg1LjE3NCAwIC4zNS0uMDM0LjUyMi0uMTA1bDQuMTMtMS42OTRjLjY5OC0uMjg3IDEuMDMzLTEuMDkuNzQ0LTEuNzg2LS4yOS0uNy0xLjA4OC0xLjAzNy0xLjc5LS43NDVsLTQuMTMgMS42OTJjLS43LjI4Ny0xLjAzMiAxLjA5LS43NDQgMS43ODhcIiBmaWxsLW9wYWNpdHk9XCIuMlwiLz48cGF0aCBkPVwiTTkuNDUgMTguNjAyYy0uMjg3LS43LTEuMDg1LTEuMDQtMS43ODctLjc0NWwtNC4yMiAxLjc0Yy0uNy4yOS0xLjAzMyAxLjA5LS43NDUgMS43ODguMjE3LjUzLjcyOC44NSAxLjI2Ny44NS4xNzIgMCAyLjAzNi0uNzMgMi4yMDgtLjhsMi41MzQtMS4wNDVjLjctLjI4OCAxLjAzMy0xLjA5Ljc0NC0xLjc4OFwiIGZpbGwtb3BhY2l0eT1cIi44XCIvPjxwYXRoIGQ9XCJNMjIuOTA2IDIwLjkwNGMtLjUzMy0uNTM0LTEuNC0uNTM3LTEuOTM3LS4wMDItLjUzNy41MzQtLjU0IDEuNC0uMDA0IDEuOTM3bDMuMjQ2IDMuMjU1Yy4yNy4yNjcuNjIuNDAyLjk3LjQwMi4zNTIgMCAuNy0uMTM0Ljk3LS40LjUzNi0uNTM0LjUzNy0xLjQuMDAzLTEuOTM3bC0zLjI1LTMuMjU2elwiIGZpbGwtb3BhY2l0eT1cIi4zNDlcIi8+PHBhdGggZD1cIk0yMS4xMDMgMTAuODIyYy4yNjcuMjY4LjYyLjQwMi45Ny40MDIuMzUyIDAgLjctLjEzMy45Ny0uMzk4bDMuMTQ0LTMuMTM1Yy41MzYtLjUzNC41MzgtMS40LjAwMy0xLjkzNy0uNTM1LS41MzUtMS40LS41MzctMS45MzgtLjAwNEwyMS4xMSA4Ljg4M2MtLjU0LjUzNS0uNTQgMS40LS4wMDcgMS45MzhcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguNzg2IDkuMjE3Yy4xNzMuMDcuMzUuMTA2LjUyNi4xMDYuNTM2IDAgMS4wNDctLjMxOCAxLjI2Ni0uODQ0bDEuNjktNC4wNjRjLjI5LS42OTctLjA0LTEuNS0uNzQtMS43OS0uNy0uMjktMS41LjA0LTEuNzkyLjczOGwtMS42OSA0LjA2Yy0uMjkuNy4wNCAxLjUuNzQgMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuMTAyXCIvPjxwYXRoIGQ9XCJNMTIuMzA3IDMuMzVjLS4yOS0uNy0xLjA5LTEuMDM3LTEuNzktLjc0NC0uNjk4LjI4OC0xLjAzMiAxLjA5LS43NDMgMS43OWwxLjY4MiA0LjA3NGMuMjE2LjUyOC43MjcuODQ4IDEuMjY3Ljg0OC4xNzMgMCAuMzUtLjAzMy41Mi0uMTA1LjctLjI4NyAxLjAzNC0xLjA5Ljc0Ni0xLjc4N0wxMi4zMDYgMy4zNXpNOC45NzMgMTAuNzljLjI2Ny4yNjcuNjE4LjQuOTcuNC4zNSAwIC43LS4xMzIuOTY3LS4zOTcuNTM2LS41MzUuNTQtMS40MDMuMDAzLTEuOTM4bC0zLjEzLTMuMTM3Yy0uNTMzLS41MzctMS40LS41MzgtMS45MzYtLjAwNC0uNTM3LjUzNS0uNTQgMS40LS4wMDQgMS45MzhsMy4xMyAzLjEzN3pcIi8+PHBhdGggZD1cIk0xMS4wMTIgMjAuODc2Yy0uNTM2LS41MzctMS40MDItLjUzOC0xLjkzNy0uMDA0bC0zLjI2NSAzLjI1Yy0uNTM1LjUzMy0uNTM3IDEuNC0uMDAyIDEuOTM2LjI2Ny4yNy42MTguNDAzLjk3LjQwMy4zNSAwIC43LS4xMy45NjctLjM5OGwzLjI2My0zLjI1Yy41MzYtLjUzMy41MzctMS40LjAwNC0xLjkzNlwiIGZpbGwtb3BhY2l0eT1cIi43MDJcIi8+PHBhdGggZD1cIk0yOC41NCAxOS42NDVsLTQuMjAzLTEuNzVjLS42OTctLjI5LTEuNS4wNC0xLjc5LjczOC0uMjkuNjk4LjA0IDEuNS43MzggMS43OTJsNC4yMDIgMS43NWMuMTcuMDcuMzUuMTA2LjUyNi4xMDYuNTM3IDAgMS4wNDUtLjMxNyAxLjI2NC0uODQyLjI5Mi0uNy0uMDM4LTEuNTAyLS43MzctMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuMzAyXCIvPjxwYXRoIGQ9XCJNMy40NTYgMTIuMTY3bDQuMTMgMS43MmMuMTcyLjA3LjM1LjEwNS41MjYuMTA1LjUzNyAwIDEuMDQ3LS4zMTggMS4yNjQtLjg0Ni4yOTItLjY5Ny0uMDM4LTEuNDk4LS43MzctMS43OWwtNC4xMy0xLjcyYy0uNjk4LS4yOS0xLjUuMDQtMS43OS43NC0uMjkyLjY5OC4wMzggMS41LjczNiAxLjc5XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXF1ZXN0aW9uLWNpcmNsZVwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTcuNDYgMTcuMjkydjMuMDUzYzAgLjgwNy0uNjUzIDEuNDYtMS40NiAxLjQ2LS44MDcgMC0xLjQ2LS42NTMtMS40Ni0xLjQ2di00LjMzYzAtLjgwNC42NTMtMS40NiAxLjQ2LTEuNDYgMS41ODQgMCAyLjg3LTEuMjg0IDIuODctMi44NjggMC0xLjU4NC0xLjI4Ni0yLjg3LTIuODctMi44N3MtMi44NyAxLjI4Ni0yLjg3IDIuODdjMCAuODA2LS42NTQgMS40Ni0xLjQ2IDEuNDYtLjgxIDAtMS40NjItLjY1NC0xLjQ2Mi0xLjQ2IDAtMy4xOTQgMi41OTgtNS43OTIgNS43OTItNS43OTJzNS43OTIgMi41OTggNS43OTIgNS43OTJjMCAyLjY5LTEuODQgNC45NTYtNC4zMyA1LjYwNU0xNiAyNS4zOThjLS43OTggMC0xLjQ0NC0uNjQzLTEuNDQ0LTEuNDQ0IDAtLjc5NS42NDYtMS40MzggMS40NDQtMS40MzguNzk4IDAgMS40NDQuNjQzIDEuNDQ0IDEuNDM4IDAgLjgtLjY0NiAxLjQ0NC0xLjQ0NCAxLjQ0NFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZWZyZXNoLWNpcmNsZVwiIGRhdGEtbmFtZT1cInJlZnJlc2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNS42MjggMTAuMTA3bC0xLjA0OCA0LjEyYy0uMDEyLjA0Ni0uMDQ0LjA4Ni0uMDY0LjEzNS0uMTcyLjQ2LS42MzguNzk0LTEuMTMuNzk0LS4wMzMgMC0uMDY1LS4wMS0uMS0uMDEyLS4wMzItLjAwMy0uMDYtLjAwOC0uMDktLjAxMy0uMDM4LS4wMDYtLjA3Ny0uMDA0LS4xMTQtLjAxM2wtNC4xMTctMS4wNWMtLjY2LS4xNjgtMS4wNi0uODM2LS44OTMtMS40OTcuMTctLjY2My44MzYtMS4wNjIgMS41MDItLjg5bDEuNDYyLjM3Yy0uNTA2LS42MTQtMS4xMjItMS4xMzctMS44NDItMS41My0xLjQ3LS44MS0zLjE3LS45OS00Ljc3NS0uNTI2LTEuNjEzLjQ3LTIuOTQ1IDEuNTM4LTMuNzUgMy4wMS0uODEgMS40Ny0xIDMuMTY4LS41MjYgNC43NzcuOTY3IDMuMzI3IDQuNDYgNS4yNDcgNy43ODUgNC4yNzYuNjU1LS4xODUgMS4zMzguMTg1IDEuNTI1LjgzOC4xOTMuNjU0LS4xODIgMS4zMzYtLjgzOCAxLjUzLS44MTMuMjM1LTEuNjMyLjM1LTIuNDQuMzUtMy43OSAwLTcuMjktMi40ODYtOC40MDItNi4zMDItLjY1My0yLjI0Ni0uMzkyLTQuNjA4LjczMi02LjY1NiAxLjEyNS0yLjA0NiAyLjk4LTMuNTMzIDUuMjI0LTQuMTkgMi4yNDItLjY1IDQuNjA0LS4zOTMgNi42NS43MyAxLjAxNS41NiAxLjg5MyAxLjI5OCAyLjU5OCAyLjE3M2wuMjYtMS4wM2MuMTctLjY2Mi44NDItMS4wNjQgMS41LS44OS42NTguMTY2IDEuMDU4LjgzNy44OSAxLjQ5N1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZXN0b3JlXCIgZGF0YS1uYW1lPVwicmVzdG9yZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTI0LjM0IDcuMjE2Yy0yLjM4NC0yLjIyMy01LjQ5LTMuMzg4LTguNzUtMy4yNzMtMy4zOTYuMTItNi42NCAxLjcwMy04LjkgNC4zNDgtMS40NTYgMS43MDctMi4zOTcgMy43MjMtMi43NzcgNS44ODhsLTEuNDU2LTIuMTkzYy0uMzU2LS41MzUtMS4wNzYtLjY4LTEuNjEyLS4zMjUtLjUzNS4zNTQtLjY4MiAxLjA3Ni0uMzI1IDEuNjFsMy40NzggNS4yNGMuNDE1LjY1OCAxLjQyLjY5NSAxLjkuMDU3bDQuMDItNC41NzVjLjQyMy0uNDgzLjM3NS0xLjIxNy0uMTA3LTEuNjQyLS40ODItLjQyMi0xLjIxNi0uMzc0LTEuNjQuMTA3bC0xLjk4MiAyLjI1NmMuMjk1LTEuODEgMS4wNi0zLjQ5NiAyLjI3LTQuOTEgMS44MzgtMi4xNTIgNC40NjctMy40NCA3LjIxMi0zLjUzNiAyLjYzOC0uMDk2IDUuMTU0Ljg1IDcuMDg1IDIuNjUgMS45MyAxLjggMy4wNDQgNC4yNDQgMy4xMzYgNi44ODMuMDk0IDIuNjM4LS44NDYgNS4xNTMtMi42NDcgNy4wODUtMS44IDEuOTMtNC4yNDYgMy4wNDQtNi44ODQgMy4xMzYtLjY0My4wMjMtMS4xNDUuNTYtMS4xMjMgMS4yMDMuMDIzLjYyOC41MzggMS4xMjIgMS4xNjMgMS4xMjJoLjA0YzMuMjYtLjExNCA2LjI4LTEuNDkgOC41MDMtMy44NzQgMi4yMjUtMi4zODUgMy4zODctNS40OTQgMy4yNzItOC43NS0uMTE0LTMuMjYtMS40OS02LjI4LTMuODc0LTguNTA0XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlYXJjaC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzZWFyY2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjcxNiAxMy43N2MwLTMuMzYyIDIuNzM4LTYuMTAyIDYuMTA1LTYuMTAyIDMuMzYzIDAgNi4xIDIuNzQgNi4xIDYuMTAzIDAgMy4zNjUtMi43MzcgNi4xMDUtNi4xIDYuMTA1LTMuMzY2IDAtNi4xMDQtMi43NC02LjEwNC02LjEwNG0xOC4xOSAxMC43ODVsLTUuODgtNS44ODJjMS4wNzMtMS4zNTMgMS43NC0zLjA0MiAxLjc0LTQuOTAyIDAtNC4zOC0zLjU2NC03Ljk0OC03Ljk0NS03Ljk0OC00LjM4MyAwLTcuOTUgMy41NjctNy45NSA3Ljk1IDAgNC4zODIgMy41NjcgNy45NSA3Ljk1IDcuOTUgMS44NTcgMCAzLjU0OC0uNjcgNC45LTEuNzQ0bDUuODgzIDUuODgyYy4xOC4xOC40MTUuMjcuNjUyLjI3LjIzNiAwIC40NzItLjA5LjY1LS4yNy4zNjMtLjM1OC4zNjMtLjk0MyAwLTEuMzA1XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXItY2lyY2xlXCIgZGF0YS1uYW1lPVwic3Rhci1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE2LjA4IDUuMTU1Yy4yOC4wMjUuNTM1LjE0Mi43MS4zNjcuMDUzLjA2Ny4wOS4xMzcuMTI2LjIxM2wyLjYwNyA2LjEwNmg2LjA2bC4wODIuMDA1Yy4xNy4wMjIuMzI1LjA3LjQ2Ni4xNy4zNzYuMjYzLjUxMi43NzMuMzE3IDEuMTg4LS4wNi4xMy0uMTUuMjMzLS4yNTQuMzI4bC01LjIxMyA0LjM0MiAyLjYzIDcuMDE0LjAyNS4wOGMuMDQuMTY3LjA0OC4zMy4wMDQuNS0uMTE4LjQ0NS0uNTU0Ljc1LTEuMDE0LjcwOC0uMTcyLS4wMTYtLjMyMy0uMDgtLjQ2Ny0uMTc0bC02LjEzNi00LjM4TDkuODkgMjZsLS4wNzIuMDQ2Yy0uMTUuMDgtLjMwNy4xMy0uNDguMTMyLS40NjIuMDAyLS44Ny0uMzQtLjk0Ny0uNzk2LS4wMjgtLjE3LS4wMDQtLjMzMy4wNS0uNDk2bDIuNjI4LTcuMDE0LTUuMjEzLTQuMzQtLjA2Mi0uMDU3Yy0uMDk2LS4xMDQtLjE3NS0uMjE1LS4yMjQtLjM1LS4xNi0uNDMuMDItLjkyNi40MTgtMS4xNTYuMTUtLjA4Ny4zMDgtLjEyMi40NzgtLjEzaDYuMDYybDIuNjMyLTYuMTA4LjAzNi0uMDc0Yy4wNDItLjA3Mi4wODYtLjE0LjE0NC0uMi4xNTUtLjE2Ny4zNTQtLjI1OC41NzYtLjI5Ni4wODItLjAwNy4wODItLjAwNy4xNjQtLjAwN3ptLTIuMDQ1IDguMDJjLS4wMzUuMDcyLS4wNzIuMTQtLjEyLjIwNS0uMTMuMTY4LS4zMTYuMjktLjUyMi4zNDMtLjA4LjAyLS4xNTYuMDI2LS4yMzYuMDNoLTQuMDVsMy43MDYgMy4wODQuMDYyLjA1N2MuMDU4LjA2My4xMS4xMjUuMTU0LjIuMDk3LjE3LjE0LjM3LjEyMy41NjctLjAxLjA4Ny0uMDMuMTY2LS4wNTcuMjQ3bC0xLjc2OCA0LjcxNyA0LjE0LTIuOTU1LjA3Mi0uMDQ3Yy4wNzYtLjA0LjE1LS4wNzYuMjMzLS4wOTguMTktLjA1Mi4zOTctLjA0My41ODMuMDI1LjA4LjAzLjE1LjA3Mi4yMjMuMTJsNC4xNCAyLjk1NC0xLjc2OC00LjcxNy0uMDI2LS4wOGMtLjAyLS4wODMtLjAzNC0uMTY0LS4wMzUtLjI1IDAtLjE5Ny4wNi0uMzkzLjE3NS0uNTU0LjA1LS4wNy4xMDctLjEyOC4xNy0uMTg2bDMuNzA1LTMuMDg0aC00LjA1bC0uMDc4LS4wMDRjLS4wOC0uMDEtLjE1Ny0uMDI0LS4yMzQtLjA1LS4yNi0uMDktLjQ1LS4yODMtLjU2Ni0uNTI4bC0xLjk4LTQuNjM3Yy0uNjY1IDEuNTQ3LTEuMzMgMy4wOTMtMS45OTcgNC42NHpcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3RhdHVzLWZhaWxlZFwiIGRhdGEtbmFtZT1cInN0YXR1cy1mYWlsZWRcIiB2aWV3Qm94PVwiMCAwIDMzIDMyXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2LjIxNyAyNi42N2MtLjc1NCAwLTEuMzYyLS42MS0xLjM2Mi0xLjM2IDAtLjc1Mi42MDgtMS4zNiAxLjM2Mi0xLjM2Ljc1IDAgMS4zNi42MDggMS4zNiAxLjM2IDAgLjc1LS42MSAxLjM2LTEuMzYgMS4zNk0xNC45NyAxMy4wNmMwLS42ODguNTU4LTEuMjQ3IDEuMjQ3LTEuMjQ3LjY4OCAwIDEuMjQ3LjU2IDEuMjQ3IDEuMjQ3djguMTYzYzAgLjY5LS41NiAxLjI0OC0xLjI0NyAxLjI0OC0uNjkgMC0xLjI0OC0uNTU3LTEuMjQ4LTEuMjQ4di04LjE2M3ptMTcuNDIzIDE3LjMyTDE3LjY1Ljg5Yy0uMDI2LS4wNS0uMDYtLjA4LS4wODYtLjEyNi0uMTkyLS4zMTItLjQ3Ny0uNTQtLjgxNi0uNjYgMCAwIC4wMDMtLjAwNC4wMDUtLjAwNEMxNi41OC4wNCAxNi40MDMgMCAxNi4yMTcgMGMtLjU2NyAwLTEuMDYzLjI5NC0xLjM0OC43Ni0uMDI1LjA0My0uMDU4LjA3Ni0uMDguMTE4TC4xMzMgMzAuMTk0Yy0uMTk1LjM4Ni0uMTc1Ljg0Ni4wNTIgMS4yMTIuMjMuMzcuNjMuNTk0IDEuMDYzLjU5NEgzMS4yMWMuNjkgMCAxLjI0Ny0uNTYgMS4yNDctMS4yNDcgMC0uMTMtLjAyNy0uMjUyLS4wNjQtLjM3MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtcGFydGlhbFwiIGRhdGEtbmFtZT1cInN0YXR1cy1wYXJ0aWFsXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDB6bS4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFjMS43NjQtLjAxNCAzLjUyLS4zNzUgNS4xNDctMS4wNjQgMS41NTUtLjY1OCAyLjk4Mi0xLjYxIDQuMTktMi43OSAxLjE2OC0xLjE0MiAyLjEzLTIuNDkyIDIuODItMy45Ny41NjYtMS4yMS45NS0yLjUgMS4xMzUtMy44Mi4yMDctMS40NzguMTctMi45OS0uMTEtNC40NTQtLjI0LTEuMjUtLjY2LTIuNDYzLTEuMjQtMy41OTQtMS4zMi0yLjU3LTMuNDYtNC42OS02LjA1LTUuOTc3LTEuMTktLjU5NC0yLjQ2OC0xLjAwNy0zLjc4LTEuMjI2LS41NjUtLjA5NS0xLjEzMy0uMTQ3LTEuNzAzLS4xNzMtLjE3LS4wMDQtLjM0LS4wMTUtLjUxLjAwMnpcIi8+PHBhdGggZD1cIk0xNi4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFjMS43NjQtLjAxNCAzLjUyLS4zNzUgNS4xNDctMS4wNjQgMS41NTUtLjY1OCAyLjk4Mi0xLjYxIDQuMTktMi43OSAxLjE2OC0xLjE0MiAyLjEzLTIuNDkyIDIuODItMy45Ny41NjYtMS4yMS45NS0yLjUgMS4xMzUtMy44Mi4yMDctMS40NzguMTctMi45OS0uMTEtNC40NTQtLjI0LTEuMjUtLjY2LTIuNDYzLTEuMjQtMy41OTQtMS4zMi0yLjU3LTMuNDYtNC42OS02LjA1LTUuOTc3LTEuMTktLjU5NC0yLjQ2OC0xLjAwNy0zLjc4LTEuMjI2LS41NjUtLjA5NS0xLjEzMy0uMTQ3LTEuNzAzLS4xNzMtLjE3LS4wMDQtLjM0LS4wMTUtLjUxLjAwMnpcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3RhdHVzLXBlbmRpbmdcIiBkYXRhLW5hbWU9XCJzdGF0dXMtcGVuZGluZ1wiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjAgMTguNjY2aC02LjY2NlY4YzAtLjczNi41OTYtMS4zMzIgMS4zMzItMS4zMzJDMTUuNDA0IDYuNjY4IDE2IDcuMjY0IDE2IDh2OGg0Yy43MzggMCAxLjMzNC41OTYgMS4zMzQgMS4zMzQgMCAuNzQtLjU5NiAxLjMzMi0xLjMzNCAxLjMzMk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3luYy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzeW5jLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjUuNzU0IDE5LjI2N2MtMS4zODQgMy45MTItNS4xMDIgNi41MzgtOS4yNTQgNi41MzgtMi43NzYgMC01LjQ1LTEuMTY4LTcuMzYtMy4wMTR2LjgzM2MwIC42OC0uNTQ3IDEuMjI3LTEuMjI3IDEuMjI3LS42NzcgMC0xLjIyNy0uNTQ3LTEuMjI3LTEuMjI3di00Ljc3YzAtLjY3OC41NS0xLjIyOCAxLjIyNy0xLjIyOGg0Ljc3Yy42OCAwIDEuMjI4LjU1IDEuMjI4IDEuMjI3IDAgLjY3OC0uNTQ3IDEuMjI3LTEuMjI2IDEuMjI3aC0yLjY2OGMxLjQxIDEuOTU4IDMuODggMy4yNyA2LjQ4NCAzLjI3IDMuMTE0IDAgNS45MDUtMS45NyA2Ljk0My00LjkwMy4yMjMtLjYzOC45MjItLjk3NCAxLjU2NS0uNzQ4LjYzOC4yMjUuOTcyLjkzLjc0NiAxLjU2N002LjI5NCAxMi43OGMxLjM4My0zLjkxIDUuMS02LjUzNyA5LjI1NC02LjUzNyAyLjc3NSAwIDUuNDUzIDEuMTcgNy4zNiAzLjAxOHYtLjgzNWMwLS42NzUuNTQ3LTEuMjI3IDEuMjI3LTEuMjI3LjY3NyAwIDEuMjI3LjU1MiAxLjIyNyAxLjIyN3Y0Ljc3YzAgLjY4LS41NSAxLjIyNy0xLjIyNyAxLjIyN2gtNC43N2MtLjY3OCAwLTEuMjI4LS41NDctMS4yMjgtMS4yMjcgMC0uNjc3LjU1LTEuMjI3IDEuMjI3LTEuMjI3aDIuNjY3Yy0xLjQwNy0xLjk1Ni0zLjg4LTMuMjctNi40ODItMy4yNy0zLjExNSAwLTUuOTA1IDEuOTctNi45NCA0LjkwMi0uMTguNTAzLS42NTMuODE4LTEuMTU3LjgxOC0uMTM2IDAtLjI3My0uMDItLjQwOC0uMDctLjY0LS4yMjctLjk3NS0uOTI3LS43NS0xLjU2N1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aHVtYnMtdXAtY2lyY2xlXCIgZGF0YS1uYW1lPVwidGh1bWJzLXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjMuMDcgMTguNmMuNzggMCAxLjQxMy42MzQgMS40MTMgMS40MTUgMCAuNzgtLjYzMiAxLjQxNC0xLjQxMyAxLjQxNGgtLjk0M2MuNzggMCAxLjQxNC42MzIgMS40MTQgMS40MTMgMCAuNzgtLjYzMiAxLjQxNC0xLjQxMyAxLjQxNEgxNmMtMy43NyAwLTIuODI4LTEuODg2LTEwLjM3LTEuODg2VjEzLjg5aDIuODNjMy4yOTggMCA3LjA3LTMuMDM3IDcuMDctNy41NCAwLTEuNDkgMi44MjctMS42OCAyLjgyNyAxLjE0OCAwIDEuODg1LS45NDMgNS40NS0uOTQzIDUuNDVoNy41NGMuNzgyIDAgMS40MTUuNjMzIDEuNDE1IDEuNDEzcy0uNjM0IDEuNDEzLTEuNDE1IDEuNDEzaC0uOTQzYy43ODIgMCAxLjQxNC42MzQgMS40MTQgMS40MTQgMCAuNzgyLS42MzIgMS40MTQtMS40MTQgMS40MTRoLS45NDJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctd2FybmluZy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJ3YXJuaW5nLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTYuODk4IDE3Ljk4NWMwIC40OTMtLjQuODkyLS44OTIuODkycy0uODktLjQtLjg5LS44OTJWMTMuMTJjMC0uNDkuMzk4LS44OS44OS0uODlzLjg5Mi40Ljg5Mi44OXY0Ljg2NXptLS44OTIgMy4yNDJjLS40NDYgMC0uODEtLjM2NC0uODEtLjgxIDAtLjQ1LjM2NC0uODEuODEtLjgxLjQ0OCAwIC44MS4zNi44MS44MSAwIC40NDYtLjM2Mi44MS0uODEuODFtOS42MTQgMS44MzdMMTYuODAzIDUuNDNjLS4zMDMtLjYwNS0xLjI5LS42MDUtMS41OTQgMEw2LjI5MyAyMy4yNmMtLjE0LjI3Ni0uMTI1LjYwNC4wNC44NjYuMTYuMjY0LjQ0OC40MjUuNzU3LjQyNWgxNy44NjdjLjQ5MiAwIC44OTItLjQuODkyLS44OSAwLS4yMy0uMDg3LS40NC0uMjMtLjU5NlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy14LWNpcmNsZVwiIGRhdGEtbmFtZT1cIngtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy40ODQgMjEuNjhjLjQ3OC40NzcuNDc4IDEuMjU0IDAgMS43MzItLjI0LjI0LS41NTQuMzYtLjg2OC4zNi0uMzEgMC0uNjI1LS4xMi0uODY1LS4zNkwxNiAxNy42NjJsLTUuNzUgNS43NWMtLjI0LjI0LS41NTUuMzYtLjg2Ni4zNi0uMzE0IDAtLjYyOC0uMTItLjg2OC0uMzYtLjQ3OC0uNDc4LS40NzgtMS4yNTUgMC0xLjczM2w1Ljc1Mi01Ljc1Mi01Ljc1Mi01Ljc1Yy0uNDc4LS40NzctLjQ3OC0xLjI1MyAwLTEuNzMuNDc4LS40OCAxLjI1NS0uNDggMS43MzUgMEwxNiAxNC4xOTVsNS43NS01Ljc1Yy40OC0uNDggMS4yNTYtLjQ4IDEuNzM0IDBzLjQ3OCAxLjI1NSAwIDEuNzMzbC01Ljc1MiA1Ljc0OCA1Ljc1MiA1Ljc1elwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1idXR0b25zXCIgZGF0YS1uYW1lPVwiYnV0dG9uc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2MzY2RkYlwiIGQ9XCJNMzI2LjkgNDFjMS42IDAgMyAxLjQgMyAzdjI5LjhjMCAxLjYtMS40IDMtMyAzSDE0MC44Yy0xLjYgMC0zLTEuNC0zLTNWNDRjMC0xLjYgMS40LTMgMy0zaDE4Ni4xbTAtNUgxNDAuOGMtNC40IDAtOCAzLjYtOCA4djI5LjhjMCA0LjQgMy42IDggOCA4aDE4Ni4xYzQuNCAwIDgtMy42IDgtOFY0NGMwLTQuNC0zLjYtOC04LTh6XCIvPjxwYXRoIGZpbGw9XCIjOGM5YmE1XCIgZD1cIk0xOTguNyA1NC4xaDcwLjJ2OS42aC03MC4yelwiLz48cGF0aCBmaWxsPVwiI2RkMmY0MVwiIGQ9XCJNMzI3LjQgOTQuMUgxNDAuNmMtNC4yIDAtNy43IDMuNS03LjcgNy43djMwLjRjMCA0LjIgMy41IDcuNyA3LjcgNy43aDE4Ni43YzQuMiAwIDcuNy0zLjUgNy43LTcuN3YtMzAuNGMuMS00LjItMy40LTcuNy03LjYtNy43em0tNTguNiAyNy43aC03MC4ydi05LjZoNzAuMnY5LjZ6XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0zMjcuMSAxNTIuMkgxNDAuOWMtNC40IDAtNy45IDMuNi03LjkgNy45VjE5MGMwIDQuNCAzLjYgNy45IDcuOSA3LjloMTg2LjJjNC40IDAgNy45LTMuNiA3LjktNy45di0yOS45Yy4xLTQuMy0zLjUtNy45LTcuOS03Ljl6bS01OC4zIDI3LjZoLTcwLjJ2LTkuNmg3MC4ydjkuNnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jYXJkc1wiIGRhdGEtbmFtZT1cImNhcmRzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk00MDUuOSAzNkgyNTguNWMtNC41IDAtOC4xIDMuNi04LjEgOC4xdjE0NS44YzAgNC41IDMuNiA4LjEgOC4xIDguMWgxNDcuNGM0LjUgMCA4LjEtMy42IDguMS04LjFWNDQuMWMwLTQuNS0zLjYtOC4xLTguMS04LjF6bS0xNTAuNCA4LjFjMC0xLjYgMS40LTMgMy0zaDE0Ny40YzEuNiAwIDMgMS40IDMgM1YxNTZIMjU1LjVWNDQuMXpNMjA5LjYgNDAuN2MxLjYgMCAzIDEuNCAzIDN2MTQ2LjFjMCAxLjYtMS40IDMtMyAzSDYxLjljLTEuNiAwLTMtMS40LTMtM3YtMTQ2YzAtMS42IDEuNC0zIDMtM2gxNDcuN20wLTUuMUg2MS45Yy00LjUgMC04LjEgMy43LTguMSA4LjF2MTQ2LjFjMCA0LjUgMy43IDguMSA4LjEgOC4xaDE0Ny43YzQuNSAwIDguMS0zLjcgOC4xLTguMVY0My44Yy4xLTQuNS0zLjYtOC4xLTguMS04LjF6XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk00MDEuNSAxODcuMWgtNTMuNmMtMS45IDAtMy41LTEuNi0zLjUtMy41di0xMi43YzAtMS45IDEuNi0zLjUgMy41LTMuNWg1My42YzEuOSAwIDMuNSAxLjYgMy41IDMuNXYxMi43YzAgMS45LTEuNiAzLjUtMy41IDMuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jb2xvci13aGVlbFwiIGRhdGEtbmFtZT1cImNvbG9yLXdoZWVsXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjMmFjODRmXCIgZD1cIk0zMDYuOCA4MS44Yy03LjktMTYuMS0yMC45LTI5LjEtMzctMzctLjguOC0xLjQgMS44LTEuOSAyLjhsLTExLjMgMjYuMi0xMS4yIDI2LjJjLTIuMSA0LjggMS40IDguMiA2LjIgNi4ybDI2LjItMTEuM0wzMDQgODMuNmMxLS40IDItMS4xIDIuOC0xLjh6XCIvPjxwYXRoIGZpbGw9XCIjNTlhNzAyXCIgZD1cIk0zMTAuNiA5MS4xYy0xLjEgMC0yLjIuMy0zLjMuN2wtMjYuNSAxMC42LTI2LjUgMTAuNmMtNC45IDEuOS00LjkgNi44IDAgOC43bDI2LjUgMTAuNiAyNi41IDEwLjZjMS4xLjQgMi4yLjYgMy4zLjcgMi44LTguMiA0LjMtMTcgNC4zLTI2LjJzLTEuNS0xOC4xLTQuMy0yNi4zelwiLz48cGF0aCBmaWxsPVwiI2VmYzEwMlwiIGQ9XCJNMzA2LjggMTUyLjdjLS44LS44LTEuOC0xLjQtMi44LTEuOWwtMjYuMi0xMS4zLTI2LjItMTEuM2MtNC44LTIuMS04LjIgMS40LTYuMiA2LjJsMTEuMyAyNi4yIDExLjMgMjYuMmMuNSAxLjEgMS4xIDIgMS45IDIuOCAxNS45LTcuOCAyOS0yMC44IDM2LjktMzYuOXpcIi8+PHBhdGggZmlsbD1cIiNmNjk1MjRcIiBkPVwiTTIzNC4zIDE5Ny45YzkuMiAwIDE4LTEuNSAyNi4yLTQuMyAwLTEuMS0uMy0yLjItLjctMy4zbC0xMC42LTI2LjUtMTAuNi0yNi41Yy0xLjktNC45LTYuOC00LjktOC43IDBsLTEwLjYgMjYuNS0xMC42IDI2LjVjLS40IDEuMS0uNiAyLjItLjcgMy4zIDguMyAyLjggMTcuMSA0LjMgMjYuMyA0LjN6XCIvPjxwYXRoIGZpbGw9XCIjZjk2NjIzXCIgZD1cIk0yMTcuMSAxMjguM2wtMjYuMiAxMS4zLTI2LjIgMTEuM2MtMS4xLjUtMiAxLjEtMi44IDEuOSA3LjkgMTYuMSAyMC45IDI5LjEgMzcgMzcgLjgtLjggMS40LTEuOCAxLjktMi44bDExLjMtMjYuMiAxMS4zLTI2LjJjMS45LTQuOS0xLjUtOC4zLTYuMy02LjN6XCIvPjxwYXRoIGZpbGw9XCIjYTgxZDI3XCIgZD1cIk0yMTQuMyAxMTIuOWwtMjYuNS0xMC42LTI2LjUtMTAuNmMtMS4xLS40LTIuMi0uNi0zLjMtLjctMi44IDguMi00LjMgMTctNC4zIDI2LjJzMS41IDE4IDQuMyAyNi4yYzEuMSAwIDIuMi0uMyAzLjMtLjdsMjYuNS0xMC42IDI2LjUtMTAuNmM0LjgtMS44IDQuOC02LjcgMC04LjZ6XCIvPjxwYXRoIGZpbGw9XCIjYTM0NmNlXCIgZD1cIk0xNjEuOCA4MS44Yy44LjggMS44IDEuNCAyLjggMS45TDE5MC44IDk1bDI2LjIgMTEuM2M0LjggMi4xIDguMi0xLjQgNi4yLTYuMkwyMTIgNzMuOGwtMTEuMy0yNi4yYy0uNS0xLjEtMS4xLTItMS45LTIuOC0xNiA3LjgtMjkuMSAyMC45LTM3IDM3elwiLz48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMjM0LjMgMzYuNmMtOS4yIDAtMTggMS41LTI2LjIgNC4zIDAgMS4xLjMgMi4yLjcgMy4zbDEwLjYgMjYuNUwyMzAgOTcuMmMxLjkgNC45IDYuOCA0LjkgOC43IDBsMTAuNi0yNi41IDEwLjYtMjYuNWMuNC0xLjEuNi0yLjIuNy0zLjMtOC4zLTIuOC0xNy4xLTQuMy0yNi4zLTQuM3pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1kaWFsb2dcIiBkYXRhLW5hbWU9XCJkaWFsb2dcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTM0OS4xIDE5Ny4zSDExOC45Yy0xLjggMC0zLjMtMS41LTMuMy0zLjNWMzkuNGMwLTEuOCAxLjUtMy4zIDMuMy0zLjNoMjMwLjJjMS44IDAgMy4zIDEuNSAzLjMgMy4zVjE5NGMwIDEuOC0xLjUgMy4zLTMuMyAzLjN6XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNzcuOCAxNzAuOGMtMyAwLTUuNS0yLjUtNS41LTUuNVY2My43YzAtMyAyLjUtNS41IDUuNS01LjVoMTEyLjRjMyAwIDUuNSAyLjUgNS41IDUuNXYxMDEuNmMwIDMtMi41IDUuNS01LjUgNS41SDE3Ny44elwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMjkwLjIgNjAuN2MxLjYgMCAzIDEuNCAzIDN2MTAxLjZjMCAxLjYtMS40IDMtMyAzSDE3Ny44Yy0xLjYgMC0zLTEuNC0zLTNWNjMuN2MwLTEuNiAxLjQtMyAzLTNoMTEyLjRtMC01SDE3Ny44Yy00LjQgMC04IDMuNi04IDh2MTAxLjZjMCA0LjQgMy42IDggOCA4aDExMi40YzQuNCAwIDgtMy42IDgtOFY2My43YzAtNC40LTMuNi04LTgtOHpcIi8+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTI2MC40IDE1OC4yaC01Mi45Yy0xLjkgMC0zLjUtMS42LTMuNS0zLjV2LTEyLjVjMC0xLjkgMS42LTMuNSAzLjUtMy41aDUyLjljMS45IDAgMy41IDEuNiAzLjUgMy41djEyLjVjMCAxLjktMS41IDMuNS0zLjUgMy41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWZlZWRiYWNrXCIgZGF0YS1uYW1lPVwiZmVlZGJhY2tcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGcgZmlsbD1cIiNmOTY2MjNcIj48cGF0aCBmaWxsLW9wYWNpdHk9XCIuNDhcIiBkPVwiTTMxNS4yOTQgMTQ0LjE1bC00LjA5OCAxMC4xTDI1MC42OSAxMjkuN2w0LjA5Ny0xMC4xelwiLz48cGF0aCBkPVwiTTIxNy4yNjQgMTA0LjM2OGwtNC4xIDEwLjEtNjAuNTA2LTI0LjU1MyA0LjEtMTAuMXpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjI0XCIgZD1cIk0yMDYuOTA2IDE5OC4yM2wtMTAuMS00LjA5OCAyNC41NTMtNjAuNTA3IDEwLjEgNC4wOTh6XCIvPjxwYXRoIGZpbGwtb3BhY2l0eT1cIi43MlwiIGQ9XCJNMjQ2LjcwNiAxMDAuMjcybC0xMC4xLTQuMDk4IDI0LjU1My02MC41MDcgMTAuMDk4IDQuMDk4elwiLz48cGF0aCBmaWxsLW9wYWNpdHk9XCIuMzZcIiBkPVwiTTI3Mi4zMjggMTkzLjU4OGwtMTAuMDQgNC4yNDUtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjg0XCIgZD1cIk0yMzEuMDg2IDk2LjIyM2wtMTAuMDQgNC4yNDQtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NXpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjEyXCIgZD1cIk0xNTcuMzkgMTU1LjI0NmwtNC4yNDYtMTAuMDQgNjAuMTQ4LTI1LjQyOCA0LjI0NCAxMC4wNHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjZcIiBkPVwiTTI1NC43NjIgMTE0LjA3NmwtNC4yNDUtMTAuMDQgNjAuMTQ4LTI1LjQyOCA0LjI0NCAxMC4wNHpcIi8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctaWNvbnNcIiBkYXRhLW5hbWU9XCJpY29uc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2YwZjNmNlwiIGQ9XCJNMzM0LjggMTE5cy01MC41IDYyLjQtMTEyLjggNjIuNFMxMDkuMyAxMTkgMTA5LjMgMTE5czUwLjUtNjIuNCAxMTIuOC02Mi40UzMzNC44IDExOSAzMzQuOCAxMTl6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0yMjIuMSAxODMuOWMtMTguMSAwLTQ3LTUuNS04MS4zLTMxLjctMjAuNC0xNS42LTMyLjktMzEtMzMuNS0zMS42TDEwNiAxMTlsMS4zLTEuNmMuNS0uNiAxMy0xNiAzMy41LTMxLjYgMzQuMy0yNi4yIDYzLjEtMzEuNyA4MS4zLTMxLjcgMTguMSAwIDQ3IDUuNSA4MS4zIDMxLjcgMjAuNCAxNS42IDMyLjkgMzEgMzMuNSAzMS42bDEuMyAxLjYtMS4zIDEuNmMtLjUuNi0xMyAxNi0zMy41IDMxLjYtMzQuNCAyNi4yLTYzLjIgMzEuNy04MS4zIDMxLjd6TTExMi42IDExOWM4LjMgOS42IDU0LjYgNTkuOSAxMDkuNSA1OS45czEwMS4yLTUwLjMgMTA5LjUtNTkuOWMtOC4zLTkuNi01NC42LTU5LjktMTA5LjUtNTkuOVMxMjAuOSAxMDkuNCAxMTIuNiAxMTl6XCIvPjxwYXRoIGZpbGw9XCIjNTlhNzAyXCIgZD1cIk0yMjIuMSA2OS40Yy0yNyAwLTQ5IDIxLjktNDkgNDlzMjEuOSA0OSA0OSA0OWMyNyAwIDQ5LTIxLjkgNDktNDlzLTIyLTQ5LTQ5LTQ5em0xMS41IDQwLjljLTYuNCAwLTExLjUtNS4yLTExLjUtMTEuNXM1LjItMTEuNSAxMS41LTExLjVjNi40IDAgMTEuNSA1LjIgMTEuNSAxMS41cy01LjIgMTEuNS0xMS41IDExLjV6XCIvPjxwYXRoIGZpbGw9XCIjNTQ5MTAzXCIgZD1cIk0yMzMuNiAxMTAuM2MtNi40IDAtMTEuNS01LjItMTEuNS0xMS41IDAtLjYuMS0xLjMuMi0xLjloLS4yYy0xMS45IDAtMjEuNSA5LjYtMjEuNSAyMS41czkuNiAyMS41IDIxLjUgMjEuNSAyMS41LTkuNiAyMS41LTIxLjVjMC0zLjgtMS03LjQtMi44LTEwLjYtMiAxLjYtNC41IDIuNS03LjIgMi41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWlucHV0c1wiIGRhdGEtbmFtZT1cImlucHV0c1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMjc4LjkgNjQuMmgtODkuOGMtMjkuMSAwLTUyLjggMjMuOC01Mi44IDUyLjggMCAyOS4xIDIzLjggNTIuOCA1Mi44IDUyLjhoODkuOGMyOS4xIDAgNTIuOC0yMy44IDUyLjgtNTIuOCAwLTI5LjEtMjMuNy01Mi44LTUyLjgtNTIuOHptLS44IDk1LjhjLTIzLjMgMC00Mi4yLTE4LjktNDIuMi00Mi4yIDAtMjMuMyAxOC45LTQyLjIgNDIuMi00Mi4yIDIzLjMgMCA0Mi4yIDE4LjkgNDIuMiA0Mi4yIDAgMjMuMy0xOC45IDQyLjItNDIuMiA0Mi4yelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLW1lc3NhZ2VzXCIgZGF0YS1uYW1lPVwibWVzc2FnZXNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBjbGFzcz1cInN0MFwiIGQ9XCJNMzQ5LjEgMTk3LjNIMTE4LjljLTEuOCAwLTMuMy0xLjUtMy4zLTMuM1YzOS40YzAtMS44IDEuNS0zLjMgMy4zLTMuM2gyMzAuMmMxLjggMCAzLjMgMS41IDMuMyAzLjNWMTk0YzAgMS44LTEuNSAzLjMtMy4zIDMuM3pcIi8+PHBhdGggZmlsbD1cIiM1OWE3MDJcIiBkPVwiTTMyNy4xIDgwLjNIMTQwLjZjLTIuMSAwLTMuOC0xLjctMy44LTMuOFYzNmgxOTQuMXY0MC41YzAgMi4xLTEuNyAzLjgtMy44IDMuOHpcIi8+PHBhdGggZmlsbD1cIiM1NDkxMDNcIiBkPVwiTTE0MC42IDgwLjNoNDAuNVYzNmgtNDQuM3Y0MC41YzAgMi4xIDEuNyAzLjggMy44IDMuOHpcIi8+PGNpcmNsZSBmaWxsPVwiIzdiYzExN1wiIGN4PVwiMzA3LjdcIiBjeT1cIjU4LjFcIiByPVwiMTEuOFwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBhbmVsXCIgZGF0YS1uYW1lPVwicGFuZWxcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTM3MS40IDQxYzEuNiAwIDMgMS40IDMgM3Y1NmMwIDEuNi0xLjQgMy0zIDNIOTYuNmMtMS42IDAtMy0xLjQtMy0zVjQ0YzAtMS42IDEuNC0zIDMtM2gyNzQuOG0wLTVIOTYuNmMtNC40IDAtOCAzLjYtOCA4djU2YzAgNC40IDMuNiA4IDggOGgyNzQuOGM0LjQgMCA4LTMuNiA4LThWNDRjMC00LjQtMy42LTgtOC04ek0zNzEuNCAxOThIOTYuNmMtNC40IDAtOC0zLjYtOC04di01NmMwLTQuNCAzLjYtOCA4LThoMjc0LjhjNC40IDAgOCAzLjYgOCA4djU2YzAgNC40LTMuNiA4LTggOHpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wcm9ncmVzcy1iYXJzXCIgZGF0YS1uYW1lPVwicHJvZ3Jlc3MtYmFyc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2RmZTNlNlwiIGQ9XCJNNDAxLjYgMTI5LjVINjYuNGMtNi45IDAtMTIuNS01LjYtMTIuNS0xMi41czUuNi0xMi41IDEyLjUtMTIuNWgzMzUuM2M2LjkgMCAxMi41IDUuNiAxMi41IDEyLjUtLjEgNi45LTUuNyAxMi41LTEyLjYgMTIuNXpcIi8+PHBhdGggZmlsbD1cIiNlZmMxMDJcIiBkPVwiTTMzMy40IDEyOS41aC0yNjdjLTYuOSAwLTEyLjUtNS42LTEyLjUtMTIuNXM1LjYtMTIuNSAxMi41LTEyLjVoMjY3YzYuOSAwIDEyLjUgNS42IDEyLjUgMTIuNS0uMSA2LjktNS43IDEyLjUtMTIuNSAxMi41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlY3Rpb25cIiBkYXRhLW5hbWU9XCJzZWN0aW9uXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZjY5NTI0XCIgZD1cIk0yMjguOSAxMTIuM2gtNzYuMVY1NS45YzAtMTAuOSA4LjgtMTkuNyAxOS43LTE5LjdoNTYuNHY3Ni4xelwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMjI4LjkgMTk3LjhoLTU2LjZjLTEwLjggMC0xOS41LTguNy0xOS41LTE5LjV2LTU2LjZoNzYuMXY3Ni4xek0zMTUuMiAxMTIuM2gtNzYuMVYzNi4ySDI5NmMxMC42IDAgMTkuMiA4LjYgMTkuMiAxOS4ydjU2Ljl6TTI5NS43IDE5Ny44aC01Ni42di03Ni4xaDc2LjF2NTYuNmMwIDEwLjctOC43IDE5LjUtMTkuNSAxOS41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNsaWRlcnNcIiBkYXRhLW5hbWU9XCJzbGlkZXJzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgZmlsbD1cIiMyOTdhZGZcIiBjeD1cIjE2NC42XCIgY3k9XCIxMTdcIiByPVwiNi42XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0xNDUuNyAxMTdjMC0xLjcuMy0zLjQuNy01SDgwLjJjLTItNS02LjgtOC41LTEyLjUtOC41LTcuNSAwLTEzLjUgNi0xMy41IDEzLjVzNiAxMy41IDEzLjUgMTMuNWM1LjcgMCAxMC41LTMuNSAxMi41LTguNWg2Ni4yYy0uNS0xLjYtLjctMy4zLS43LTV6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk00MDAuMyAxMDMuNWMtNS43IDAtMTAuNSAzLjUtMTIuNSA4LjVIMjQ2LjVjLTItNS02LjgtOC41LTEyLjUtOC41cy0xMC41IDMuNS0xMi41IDguNWgtMzguNmMtMi4yLTgtOS41LTEzLjktMTguMi0xMy45LTEwLjQgMC0xOC45IDguNS0xOC45IDE4LjkgMCAxMC40IDguNSAxOC45IDE4LjkgMTguOSA4LjcgMCAxNi01LjkgMTguMi0xMy45aDM4LjZjMiA1IDYuOCA4LjUgMTIuNSA4LjVzMTAuNS0zLjUgMTIuNS04LjVoMTQxLjNjMiA1IDYuOCA4LjUgMTIuNSA4LjUgNy41IDAgMTMuNS02IDEzLjUtMTMuNXMtNi0xMy41LTEzLjUtMTMuNXptLTIzNS43IDI3LjRjLTcuNyAwLTEzLjktNi4yLTEzLjktMTMuOXM2LjItMTMuOSAxMy45LTEzLjkgMTMuOSA2LjIgMTMuOSAxMy45LTYuMiAxMy45LTEzLjkgMTMuOXptMTguOS0xMi4zYzAtLjUuMS0xLjEuMS0xLjZzMC0xLjEtLjEtMS42YzAgLjUuMSAxLjEuMSAxLjZzLS4xIDEuMS0uMSAxLjZ6bS0uMiAxLjRjMC0uMi4xLS41LjEtLjcgMCAuMy0uMS41LS4xLjd6bTAtNmMwIC4yLjEuNS4xLjcgMC0uMy0uMS0uNS0uMS0uN3pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10YWJsZXNcIiBkYXRhLW5hbWU9XCJ0YWJsZXNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNjM2NkZGJcIiBkPVwiTTM2Ni42IDE5Ny45YzQuNCAwIDguMS0zLjYgOC4xLTguMVY0NC4yYzAtNC40LTMuNi04LjEtOC4xLTguMUgxMDEuNGMtNC40IDAtOC4xIDMuNi04LjEgOC4xVjE4OS44YzAgNC40IDMuNiA4LjEgOC4xIDguMWgyNjUuMnptMy0xNTMuN3Y0My42aC04Ni4yVjQxLjJoODMuMmMxLjYgMCAzIDEuNCAzIDN6bS0xODAgNDMuNlY0MS4yaDg4Ljd2NDYuNmgtODguN3ptODguOCA1LjFWMTQyaC04OC43VjkyLjloODguN3ptLTE4MC00OC43YzAtMS42IDEuNC0zIDMtM2g4My4ydjQ2LjZIOTguNFY0NC4yem0wIDQ4LjdoODYuMlYxNDJIOTguNFY5Mi45em0zIDk5LjljLTEuNiAwLTMtMS40LTMtM1YxNDdoODYuMnY0NS44aC04My4yem04OC4yIDBWMTQ3aDg4Ljd2NDUuOGgtODguN3ptMTgwLTNjMCAxLjYtMS40IDMtMyAzaC04My4yVjE0N2g4Ni4ydjQyLjh6bTAtNDcuOGgtODYuMlY5Mi45aDg2LjJWMTQyelwiLz48cGF0aCBmaWxsPVwiI2EzNDZjZVwiIGQ9XCJNMzY5LjYgNDQuMnY0My42aC04Ni4yVjQxLjJoODMuMmMxLjYgMCAzIDEuNCAzIDN6TTE4OS42IDQxLjJoODguN3Y0Ni42aC04OC43ek05OC40IDQ0LjJjMC0xLjYgMS40LTMgMy0zaDgzLjJ2NDYuNkg5OC40VjQ0LjJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdGV4dFwiIGRhdGEtbmFtZT1cInRleHRcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTIyOCAxNzIuN2wtOC4zLTIxLjhoLTUyLjFsLTguMyAyMS44aC0yMi42bDQ0LjYtMTEzLjVoMjQuOWw0NC42IDExMy41SDIyOHptLTM0LjMtOTMuNGwtMjAuNCA1NC4xaDQwLjlsLTIwLjUtNTQuMXpNMzEzLjUgMTcyLjd2LTguOWMtNi4xIDctMTUuNyAxMC45LTI2LjYgMTAuOS0xMy40IDAtMjguNi05LTI4LjYtMjcuMiAwLTE4LjkgMTUuMS0yNi43IDI4LjYtMjYuNyAxMS4xIDAgMjAuNiAzLjYgMjYuNiAxMC42di0xMi4zYzAtOS41LTcuOC0xNS4zLTE5LjItMTUuMy05LjIgMC0xNy4yIDMuNC0yNC4zIDEwLjRsLTcuMy0xMi40YzkuNS05IDIxLjQtMTMuMyAzNC42LTEzLjMgMTguMiAwIDM0LjIgNy43IDM0LjIgMjkuOHY1NC41aC0xOHptMC0xOC43di0xMi40Yy00LjEtNS42LTExLjctOC41LTE5LjYtOC41LTEwIDAtMTcuNSA1LjgtMTcuNSAxNC44IDAgOC45IDcuNSAxNC42IDE3LjUgMTQuNiA3LjggMCAxNS41LTIuOSAxOS42LTguNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aW1lXCIgZGF0YS1uYW1lPVwidGltZVwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGZpbGw9XCIjYzNjZGRiXCIgY3g9XCIyMzRcIiBjeT1cIjExN1wiIHI9XCI4MC44XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0yNjEuMSAxNDguMWMtMSAwLTItLjQtMi44LTEuMmwtMjcuMS0yNy4xYy0uOC0uOC0xLjItMS44LTEuMi0yLjhWNTYuMmMwLTIuMiAxLjgtNCA0LTRzNCAxLjggNCA0djU5LjJsMjUuOSAyNS45YzEuNiAxLjYgMS42IDQuMSAwIDUuNy0uOC43LTEuOCAxLjEtMi44IDEuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy12YWxpZGF0aW9uXCIgZGF0YS1uYW1lPVwidmFsaWRhdGlvblwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2RkMmY0MVwiIGQ9XCJNMzMyIDY5LjdIMTM2Yy00LjQgMC04IDMuNi04IDh2ODMuMmMwIDEuOSAxLjUgMy40IDMuNCAzLjRoMjA1LjJjMS45IDAgMy40LTEuNSAzLjQtMy40Vjc3LjdjMC00LjQtMy42LTgtOC04em0tMTQxLjcgNzUuNWgtNTIuMXYtOS4zaDUyLjF2OS4zek0zMzUgMTExLjhIMTMzVjc3LjdjMC0xLjYgMS40LTMgMy0zaDE5NmMxLjYgMCAzIDEuNCAzIDN2MzQuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtY29tcGxldGVkXCIgZGF0YS1uYW1lPVwic3RhdHVzLWNvbXBsZXRlZFwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjQuOTY1IDEyLjgwMmwtMTAuMjY3IDExLjI1LTcuNjI2LTcuNjJjLS40OC0uNDg2LS40OC0xLjI2MiAwLTEuNzQyLjQ4Mi0uNDg0IDEuMjYtLjQ4NCAxLjc0IDBsNS44MDUgNS44MDIgOC41My05LjM1Yy40Ni0uNTAzIDEuMjQtLjUzOCAxLjc0LS4wOHMuNTM4IDEuMjM4LjA3OCAxLjc0TTE2IDBDNy4xNzggMCAwIDcuMTc4IDAgMTZzNy4xNzggMTYgMTYgMTYgMTYtNy4xNzggMTYtMTZTMjQuODIyIDAgMTYgMFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PC9zdmc+JylcbiAgICB9XG4gIH1cblxuICAvLyBJZiBET00gaXMgYWxyZWFkeSByZWFkeSwgZW1iZWQgU1ZHc1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7IGVtYmVkKCkgfVxuXG4gIC8vIEhhbmRsZSBUdXJib2xpbmtzIHBhZ2UgY2hhbmdlIGV2ZW50c1xuICBpZiAoIHdpbmRvdy5UdXJib2xpbmtzICkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1iZWQoKSB9KVxuICB9XG5cbiAgLy8gSGFuZGxlIHN0YW5kYXJkIERPTSByZWFkeSBldmVudHNcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1iZWQoKSB9KVxufSkoKSIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxudmFyIG5vdGlmeSA9IHJlcXVpcmUoJy4uL21vZHVsZXMvbm90aWZ5JylcblxuLy8gSWYgYSBwYWdlIGhhcyBhbiBlbGVtZW50IC5mb3JtLWZsYXNoLCB0cmlnZ2VyIGEgbm90aWZpY2F0aW9uXG4vL1xuRXZlbnQuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gIHZhciBmbGFzaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mbGFzaC1tZXNzYWdlOm5vdCguZmlyZWQpJylcbiAgaWYgKGZsYXNoKSB7XG4gICAgZmxhc2guY2xhc3NMaXN0LmFkZCgnaGlkZGVuJywnZmlyZWQnKVxuICAgIG5vdGlmeShmbGFzaC5kYXRhc2V0LnR5cGUsIGZsYXNoLmlubmVySFRNTC50cmltKCkpXG4gIH1cbn0pXG5cbiIsInZhciB0b29sYm94ICAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIEV2ZW50ICAgICAgICAgPSB0b29sYm94LmV2ZW50XG52YXIgbm90aWZ5ICAgICAgICA9IHJlcXVpcmUoICcuLi9tb2R1bGVzL25vdGlmeScgKVxuXG5cbi8vIEhhbmRsZSBzdWJtaXQgYmVoYXZpb3JzOlxuLy8gIC0gZGlzYWJsZSBidXR0b24gb24gc3VibWl0XG4vLyAgLSBzdWJtaXQgbWVzc2FnZXNcbi8vXG5FdmVudC5vbiggZG9jdW1lbnQsICdzdWJtaXQnLCBmdW5jdGlvbihldmVudCkge1xuXG4gIC8vIFNlbmQgZm9ybSBtZXNzYWdlc1xuICAvLyBMb29rIGZvciBhbiBlbGVtZW50IHdpdGggdGhlIGRhdGEtc3VibWl0LW1lc3NhZ2Ugb3IgdXNlIHRoZSBmb3JtIGl0c2VsZlxuICB2YXIgbWVzc2FnZSA9ICggZXZlbnQudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN1Ym1pdC1tZXNzYWdlXScpIHx8IGV2ZW50LnRhcmdldCApLmRhdGFzZXQuc3VibWl0TWVzc2FnZVxuICBpZiAoIG1lc3NhZ2UgKSBub3RpZnkoICdmb3JtLWFjdGlvbicsIG1lc3NhZ2UgKVxuXG4gIHZhciBidXR0b24gPSBldmVudC50YXJnZXQucXVlcnlTZWxlY3RvcignW3R5cGU9c3VibWl0XScpXG4gIGlmICggYnV0dG9uLmRhdGFzZXQuZGlzYWJsZU9uU3VibWl0ID09ICdmYWxzZScgKSByZXR1cm5cblxuICBpZiAoIWJ1dHRvbi5kYXRhc2V0LmRpc2FibGVXaXRoKSBidXR0b24uZGF0YXNldC5kaXNhYmxlT25TdWJtaXQgPSB0cnVlXG4gIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWVcblxuICAvLyBMb29rIGZvciBlbGVtZW50cyB3aXRoIGRpc2FibGUtd2l0aCB0ZXh0IGFuZCByZXBsYWNlIHRoZSB0ZXh0XG4gIHZhciBlbGVtZW50cyA9IGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kaXNhYmxlLXdpdGhdJylcblxuICB0b29sYm94LmVhY2goIGVsZW1lbnRzLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgdmFyIGJ1dHRvblRleHQgPSBlbC5xdWVyeVNlbGVjdG9yKCcuYnV0dG9uLXRleHQnKSB8fCBlbFxuXG4gICAgZWwuZGF0YXNldC5lbmFibGVkVGV4dCA9IGJ1dHRvblRleHQuaW5uZXJIVE1MXG4gICAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBlbC5kYXRhc2V0LmRpc2FibGVXaXRoXG4gIH0pXG5cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHN1Ym1pdCBmdW5jdGlvbnMgdG8gb2NjdXJcbiAgdG9vbGJveC5ldmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbCcpXG4gIH0pXG5cbiAgaWYgKCBkb2N1bWVudC5ib2R5LmRhdGFzZXQuZmFrZVN1Ym1pdCApIHtcbiAgICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoJ2Zha2Utc3VibWl0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pXG4gICAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2ICkgXG4gIH0gZWxzZSB7XG4gICAgZXZlbnQudGFyZ2V0LnN1Ym1pdCgpXG4gIH1cblxufSlcblxuLy8gV2hlbiBhIGJhY2sgYnV0dG9uIGlzIHVzZWQ6XG4vLyAgLSBEaXNhYmxlZCBidXR0b25zIHJlbWFpbiBkaXNhYmxlZFxuLy8gIC0gUHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyByZW1haW4gYWN0aXZlXG4vL1xuLy8gVGhpcyByZW5hYmxlcyBidXR0b25zIGFuZCBoaWRlcyBub3RpZmljYXRpb25zLlxud2luZG93Lm9ucGFnZXNob3cgPSBmdW5jdGlvbihldmVudCkge1xuXG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwnKVxuICBcbiAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc2FibGUtd2l0aF1bZGlzYWJsZWRdLFtkYXRhLWRpc2FibGUtb24tc3VibWl0XVtkaXNhYmxlZF0nKVxuICBpZiAoIGJ1dHRvbiApIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlXG5cbiAgaWYgKCBidXR0b24gJiYgYnV0dG9uLmRhdGFzZXQuZW5hYmxlZFRleHQgKSB7XG4gICAgdmFyIGJ1dHRvblRleHQgPSBidXR0b24ucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykgfHwgYnV0dG9uXG4gICAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBidXR0b24uZGF0YXNldC5lbmFibGVkVGV4dFxuICB9XG5cbiAgLy8gRGlzbWlzcyBsZWZ0b3ZlciBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gIGlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5ub3RpZmljYXRpb24uZm9ybS1hY3Rpb24nICkgKSB7XG4gICAgbm90aWZ5LnJlbW92ZSgpXG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG5mdW5jdGlvbiBudW1iZXJJbnB1dE9ubHkoZXZlbnQpIHtcbiAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsXG4gICAgICBudW1iZXJLZXlzID0gKCA0NyA8IGtleSAmJiBrZXkgPCA1OCApLFxuICAgICAgbnVtUGFkS2V5cyA9ICggOTUgPCBrZXkgJiYga2V5IDwgMTA2ICksXG4gICAgICBkZWNpbWFscyAgID0gKCBrZXkgPT0gMTEwIHx8IGtleSA9PSAxOTAgKSxcbiAgICAgIG1vZGlmaWVycyAgPSAoIEV2ZW50LmtleS5hbHQgfHwgRXZlbnQua2V5LnNoaWZ0ICksXG4gICAgICBpbnB1dEtleSAgID0gISgoIGtleSA8IDQ2ICYmIGtleSAhPSAzMiApIHx8IEV2ZW50LmtleS5jb21tYW5kICksXG4gICAgICBudW1JbnB1dCAgID0gKCggbnVtYmVyS2V5cyB8fCBudW1QYWRLZXlzIHx8IGRlY2ltYWxzICkgJiYgISggbW9kaWZpZXJzICYmIDQ3IDwga2V5ICkgKVxuXG4gIGlmICggIW51bUlucHV0ICYmIGlucHV0S2V5ICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICB9XG59XG5cbi8vIFByZXZlbnQgbm9uIG51bWVyaWMgaW5wdXQgb24gaW5wdXQgdHlwZSBvZiBudW1iZXJcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ2tleWRvd24nLCAnaW5wdXRbdHlwZT1udW1iZXJdJywgbnVtYmVySW5wdXRPbmx5IClcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSgnY29tcG9zZS10b29sYm94JyksXG4gICAgRXZlbnQgPSB0b29sYm94LmV2ZW50LFxuICAgIGNvbnZlcnQgPSByZXF1aXJlKCcuLi9tb2R1bGVzL3VuaXQtY29udmVydGVyJyksXG4gICAgZm9ybVVwID0gcmVxdWlyZSggJ2NvbXBvc2UtZm9ybS11cCcgKVxuXG5mdW5jdGlvbiBzZXR1cChlbCkge1xuICBlbC5kYXRhc2V0LnVuaXRLZXkgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3BsaXQoJy4nKVsxXVxuXG4gIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJlbmQnLCBzZXR1cElucHV0KGVsKSApXG4gIGVsLmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyZW5kJywgc2V0dXBTZWxlY3QoZWwpIClcblxuICB2YXIgc2VsZWN0ID0gZWwubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgc2V0VmFsdWUoZWwpXG4gIC8vIEFkZCBzb21lIHBhZGRpbmcgYmV0d2VlbiBpbnB1dCBlbnRyeSBhbmQgc2VsZWN0LCBiYXNlZCBvbiB3aWR0aCBvZiBzZWxlY3RcbiAgZWwuc3R5bGUucGFkZGluZ1JpZ2h0ID0gKGVsLm9mZnNldFdpZHRoIC0gc2VsZWN0Lm9mZnNldExlZnQgKyAxMCkgKyAncHgnXG59XG5cbmZ1bmN0aW9uIHJhbmRJRCAoKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMylcbn1cblxuZnVuY3Rpb24gc2V0dXBTZWxlY3QoZWwpIHtcbiAgdmFyIHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ10sXG4gICAgICBzZWxlY3RJZCA9IGB1bml0LXNlbGVjdC0ke3JhbmRJRCgpfWAsXG4gICAgICBzZWxlY3QgPSBgPHNwYW4gY2xhc3M9J3VuaXQtc2VsZWN0Jz48c2VsZWN0IGlkPScke3NlbGVjdElkfScgdGFiaW5kZXg9Jy0xJyBhcmlhLWxhYmVsPSd1bml0cycgZGF0YS1kZWZhdWx0PScke2VsLmRhdGFzZXQudW5pdH0nIGRhdGEtaW5pdGlhbC12YWx1ZT0nJHtlbC5kYXRhc2V0LnVuaXR9JyBkYXRhLXVuaXQtc2VsZWN0PScke2VsLmRhdGFzZXQudW5pdEtleX0nPmAsXG4gICAgICBzZWxlY3RlZCA9IGVsLmRhdGFzZXQudW5pdCxcbiAgICAgIHdyYXBwZXIgPSB0b29sYm94LmdldENsb3Nlc3QoIGVsLCAnbGFiZWwnICksXG4gICAgICBjaGVja2VkXG5cbiAgdW5pdHMuZm9yRWFjaChmdW5jdGlvbih1bml0KSB7XG4gICAgY2hlY2tlZCA9ICggKHNlbGVjdGVkID09IHVuaXQpID8gJyBzZWxlY3RlZCcgOiAnJyApXG4gICAgc2VsZWN0ICs9IGA8b3B0aW9uJHtjaGVja2VkfT4ke3VuaXR9PC9vcHRpb24+YFxuICB9KVxuXG4gIGlmICggd3JhcHBlciApIHtcbiAgICB2YXIgZGVmYXVsdElucHV0ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZXN0b3JlLWRlZmF1bHRdJylcbiAgICBpZiAoIGRlZmF1bHRJbnB1dCApIGRlZmF1bHRJbnB1dC5kYXRhc2V0LnJlc3RvcmVEZWZhdWx0ICs9IGAsICMke3NlbGVjdElkfWBcbiAgfVxuXG4gIHNlbGVjdCA9IHNlbGVjdCArIFwiPC9zZWxlY3Q+PC9zcGFuPlwiXG5cbiAgcmV0dXJuIHNlbGVjdFxufVxuXG5mdW5jdGlvbiBzZXR1cElucHV0KGVsKSB7XG4gIG5hbWUgPSBlbC5uYW1lXG4gIGVsLm5hbWUgPSBuYW1lICsgJ192YWx1ZSdcbiAgcmV0dXJuICc8aW5wdXQgZGF0YS11bml0LWlucHV0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJytuYW1lKydcIj4nXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlKGVsKSB7XG4gIGVsID0gZWwudGFyZ2V0IHx8IGVsXG4gIHZhciBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQtaW5wdXQ9XCInK2VsLmRhdGFzZXQudW5pdEtleSsnXCJdJylcbiAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQtc2VsZWN0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiXScpXG4gIGlucHV0LnZhbHVlID0gY29udmVydChlbC52YWx1ZSwgc2VsZWN0LnZhbHVlLCBlbC5kYXRhc2V0LnVuaXQpLnZhbHVlXG59XG5cbmZ1bmN0aW9uIHVuaXRDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHVuaXRLZXkgPSBldmVudC50YXJnZXQuZGF0YXNldC51bml0U2VsZWN0XG4gIHZhciBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXVuaXQta2V5PVwiJyt1bml0S2V5KydcIl0nKVxuICBzZXRWYWx1ZShlbClcbn1cblxuRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdW5pdF0nICksIHNldHVwIClcbn0pXG5cbkV2ZW50Lm9uKGRvY3VtZW50LCAnaW5wdXQnLCAnW2RhdGEtdW5pdF0nLCBzZXRWYWx1ZSlcbkV2ZW50Lm9uKGRvY3VtZW50LCAnaW5wdXQnLCAnW2RhdGEtdW5pdC1zZWxlY3RdJywgdW5pdENoYW5nZSlcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG5FdmVudC5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tYXRjaC11cmxdJyksIGZ1bmN0aW9uKG5vZGUpe1xuICAgIHZhciBtYXRjaGVyID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWF0Y2gtdXJsJylcbiAgICBpZiAobWF0Y2hlciAmJiBuZXcgUmVnRXhwKG5vZGUuZGF0YXNldC5tYXRjaFVybCwgXCJpXCIpLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ2hlcmUnKVxuICAgIH1cbiAgfSlcbn0pXG5cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApXG5cbmZ1bmN0aW9uIGF1dG9TaXplVGV4dGFyZWEoIHRleHRhcmVhICkge1xuICB2YXIgcGFyZW50ID0gdGV4dGFyZWEucGFyZW50RWxlbWVudFxuXG4gIGlmICggdGV4dGFyZWEudmFsdWUgPT0gJycgKSByZXR1cm5cbiAgaWYgKCBwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnB1dC13cmFwcGVyJykgKSB7XG5cbiAgICBwYXJlbnQuc3R5bGUuaGVpZ2h0ID0gdGV4dGFyZWEuc3R5bGUuaGVpZ2h0XG4gICAgdmFyIG9mZnNldCA9IHRleHRhcmVhLm9mZnNldEhlaWdodCAtIHRleHRhcmVhLmNsaWVudEhlaWdodFxuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xuICAgIHZhciBuZXdIZWlnaHQgPSAoIHRleHRhcmVhLnNjcm9sbEhlaWdodCArIG9mZnNldCApXG4gICAgdmFyIG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAqIC45NVxuXG4gICAgaWYgKCBuZXdIZWlnaHQgPCBtYXhIZWlnaHQgKVxuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4J1xuICAgIGVsc2VcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IG1heEhlaWdodCArICdweCdcblxuICAgIHBhcmVudC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcbiAgfVxufVxuXG5FdmVudC5jaGFuZ2UoZnVuY3Rpb24oKXtcbiAgdmFyIHRleHRhcmVhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RleHRhcmVhJylcbiAgRXZlbnQuZGVsYXkoIGZ1bmN0aW9uKCl7IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGV4dGFyZWFzLCBhdXRvU2l6ZVRleHRhcmVhKSB9IClcbn0pXG5cbkV2ZW50Lm9uKGRvY3VtZW50LCAna2V5dXAgdG9nZ2xlcjpzaG93JywgJ3RleHRhcmVhJywgZnVuY3Rpb24oZXZlbnQpe1xuICBhdXRvU2l6ZVRleHRhcmVhKGV2ZW50LmN1cnJlbnRUYXJnZXQpXG59KVxuXG5cbiIsInZhciBldmVudCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICkuZXZlbnRcblxuLy8gUHVibGljIEFQSSBmdW5jdGlvblxudmFyIGNsaXBib2FyZCA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIExpc3RlbiBmb3IgY2xpY2sgZXZlbnRzXG4gIGV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1tkYXRhLWNvcHktdGFyZ2V0XScsIGNvcHkgKVxuXG4gIC8vIENvcHkgdG8gY2xpcGJvYXJkIGhhbmRsZXJcbiAgZnVuY3Rpb24gY29weSggZXZlbnQgKSB7XG5cbiAgICAvLyBBc3NpZ25tZW50XG4gICAgdmFyIGNvcHlUcmlnZ2VyID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgY29weUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBjb3B5VHJpZ2dlci5kYXRhc2V0LmNvcHlUYXJnZXQgKVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gSXMgdGhlIGVsZW1lbnQgc2VsZWN0YWJsZT9cbiAgICBpZiAoIGNvcHlFbGVtZW50ICYmIGNvcHlFbGVtZW50LnNlbGVjdCApIHtcblxuICAgICAgLy8gU2VsZWN0IHRleHRcbiAgICAgIGNvcHlFbGVtZW50LnNlbGVjdCgpO1xuXG4gICAgICAvLyBHaXZlIGl0IGEgdHJ5XG4gICAgICB0cnkge1xuXG4gICAgICAgIC8vIENvcHkgdGV4dFxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCggJ2NvcHknIClcblxuICAgICAgICAvLyBCbHVyIHRoZSBlbGVtZW50XG4gICAgICAgIGNvcHlFbGVtZW50LmJsdXIoKVxuXG4gICAgICAgIC8vIFRyaWdnZXIgY29waWVkIHN0YXRlXG4gICAgICAgIGNvcHlUcmlnZ2VyLmNsYXNzTGlzdC5hZGQoICdjb3BpZWQnIClcblxuICAgICAgICAvLyBSZW1vdmUgY29waWVkIHN0YXRlIGFmdGVyIGEgY291cGxlIHNlY29uZHNcbiAgICAgICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29weVRyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSggJ2NvcGllZCcgKVxuICAgICAgICB9LCAyMDAwIClcblxuICAgICAgLy8gSWYgaXQgYm9ya3NcbiAgICAgIH0gY2F0Y2ggKCBlcnIgKSB7XG5cbiAgICAgICAgLy8gR28gbnVjbGVhclxuICAgICAgICBhbGVydCggJ3BsZWFzZSBwcmVzcyBDdHJsL0NtZCtDIHRvIGNvcHknIClcblxuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGlwYm9hcmRcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGVzdmcgID0gcmVxdWlyZSggJy4uL19lc3ZnJyApLFxuXG4gICAgZGVmYXVsdHNCeVR5cGUgPSB7XG4gICAgICBzdWNjZXNzOiB7IGRpc21pc3NBZnRlcjogMzUwMCB9LFxuICAgIH0sXG5cbiAgICBpY29uc0J5VHlwZSA9IHtcbiAgICAgIG1lc3NhZ2U6ICAgICAgICBcIm1lc3NhZ2UtY2lyY2xlXCIsXG4gICAgICBlcnJvcjogICAgICAgICAgXCJuby1jaXJjbGVcIixcbiAgICAgIHByb2dyZXNzOiAgICAgICBcInByb2dyZXNzLWNpcmNsZVwiLFxuICAgICAgJ2Zvcm0tYWN0aW9uJzogIFwicHJvZ3Jlc3MtY2lyY2xlXCIsXG4gICAgICBzdWNjZXNzOiAgICAgICAgXCJ0aHVtYnMtdXAtY2lyY2xlXCIsXG4gICAgfSxcblxuICAgIGF1dG9EaXNtaXNzVGltZW91dCxcbiAgICBtZXNzYWdlRWwsXG5cbiAgICB0ZW1wbGF0ZSA9ICdcXFxuPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvblwiPlxcXG4gIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tY29udGVudFwiPlxcXG4gICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1tZXNzYWdlXCIgcm9sZT1cImFsZXJ0XCI+PC9kaXY+XFxcbiAgICA8YnV0dG9uIGNsYXNzPVwibm90aWZpY2F0aW9uLWNsb3NlXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cImNsb3NlIG1lc3NhZ2VcIj5cXFxuICAgIDwvYnV0dG9uPlxcXG4gIDwvZGl2PlxcXG48L2Rpdj5cXFxuJ1xuXG5mdW5jdGlvbiBub3RpZnkgKHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMpIHtcblxuICBpZiAoICFvcHRpb25zICYmIHR5cGVvZiBtZXNzYWdlID09ICdvYmplY3QnICkge1xuICAgIG9wdGlvbnMgPSBtZXNzYWdlXG4gICAgbWVzc2FnZSA9IHR5cGVcbiAgICB0eXBlID0gJ21lc3NhZ2UnXG4gIH1cblxuICBpZiAoICFtZXNzYWdlICkge1xuICAgIG1lc3NhZ2UgPSB0eXBlXG4gICAgdHlwZSA9ICdtZXNzYWdlJ1xuICB9XG5cbiAgcmV0dXJuIHNob3coIHR5cGUsIG1lc3NhZ2UsIHRvb2xib3gubWVyZ2UoIGRlZmF1bHRzQnlUeXBlW3R5cGVdLCBvcHRpb25zIHx8IHt9ICkgKVxufVxuXG5mdW5jdGlvbiBzaG93ICggdHlwZSwgbWVzc2FnZSwgb3B0aW9ucyApIHtcblxuICBjbGVhclRpbWVvdXQoIGF1dG9EaXNtaXNzVGltZW91dCApXG4gIGlmICggbWVzc2FnZUVsICkgcmV0dXJuIGRpc21pc3MoIGZ1bmN0aW9uKCl7IHNob3coIHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMgKSB9KVxuXG4gIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYmVmb3JlZW5kJywgdGVtcGxhdGUgKVxuICBtZXNzYWdlRWwgICAgID0gZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGRcbiAgdmFyIHR5cGVJY29uICA9IGVzdmcudXNlKCBpY29uc0J5VHlwZVt0eXBlXSB8fCB0eXBlIClcbiAgdmFyIGNsb3NlSWNvbiA9IGVzdmcudXNlKCAneC1jaXJjbGUnLCB7ICdzY2FsZSc6IHRydWUsICdjbGFzcyc6ICdjbG9zZS1pY29uJyB9IClcblxuICB2YXIgbXNnID0gbWVzc2FnZUVsLnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLW1lc3NhZ2UnIClcbiAgbXNnLmlubmVySFRNTCA9IG1lc3NhZ2VcblxuICBpZiAoIHR5cGVJY29uICkgbXNnLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWJlZ2luJywgXCI8c3BhbiBjbGFzcz0nbm90aWZpY2F0aW9uLXR5cGUtaWNvbic+XCIgKyB0eXBlSWNvbi5vdXRlckhUTUwgKyBcIjwvc3Bhbj5cIiApXG4gIGlmICggY2xvc2VJY29uICkgbWVzc2FnZUVsLnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLWNsb3NlJyApLmlubmVySFRNTCA9IGNsb3NlSWNvbi5vdXRlckhUTUxcblxuICBpZiAoIHR5cGUgKSB7XG5cbiAgICBtZXNzYWdlRWwuY2xhc3NMaXN0LmFkZCggdHlwZSApXG5cbiAgICBpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNtaXNzQWZ0ZXIgKXtcbiAgICAgIGF1dG9EaXNtaXNzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBkaXNtaXNzLCBvcHRpb25zLmRpc21pc3NBZnRlciApXG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZUVsID0gZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGRcblxuICBFdmVudC5rZXlPbmUoICdlc2MnLCBkaXNtaXNzIClcbiAgRXZlbnQub25lKCBtZXNzYWdlRWwsICdjbGljaycsICcubm90aWZpY2F0aW9uLWNsb3NlJywgZGlzbWlzcyApXG5cbiAgcmV0dXJuIHtcbiAgICBkaXNtaXNzOiBkaXNtaXNzXG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzbWlzcyAoIGNhbGxiYWNrICkge1xuXG4gIGlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5vdGlmaWNhdGlvbicpID09IG51bGwgKSB7IHJldHVybiB9XG5cbiAgY2xlYXJUaW1lb3V0KCBhdXRvRGlzbWlzc1RpbWVvdXQgKVxuXG4gIHZhciBjYlxuXG4gIGlmICggdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgKSB7XG4gICAgY2IgPSBmdW5jdGlvbigpIHsgcmVtb3ZlKCk7IGNhbGxiYWNrKCkgfVxuICB9IGVsc2Uge1xuICAgIGNiID0gcmVtb3ZlO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggY2IsIDUwMCApXG5cbiAgRXZlbnQub25lKCBtZXNzYWdlRWwsICdhbmltYXRpb25zdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgIGNsZWFyVGltZW91dCggdGltZW91dCApXG5cbiAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggbWVzc2FnZUVsLCBjYiApXG4gIH0pXG5cbiAgbWVzc2FnZUVsLmNsYXNzTGlzdC5hZGQoICdkaXNtaXNzJyApXG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAoKSB7XG4gIG1lc3NhZ2VFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHkgPiAubm90aWZpY2F0aW9uJylcblxuICBpZiAobWVzc2FnZUVsKSB7XG4gICAgbWVzc2FnZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG1lc3NhZ2VFbCApXG4gIH1cbiAgbWVzc2FnZUVsID0gbnVsbFxufVxuXG5ub3RpZnkuZGlzbWlzcyA9IGRpc21pc3Ncbm5vdGlmeS5yZW1vdmUgPSByZW1vdmVcblxubW9kdWxlLmV4cG9ydHMgPSBub3RpZnlcbiIsImNvbnN0IHVuaXRzVGFibGUgPSB7XG4gIGJpdDogMSxcbiAgYnl0ZTogOCxcbiAga2lsb2J5dGU6IDEwMDAgKiA4LFxuICBtZWdhYnl0ZTogMTAwMCAqIDEwMDAgKiA4LFxuICBnaWdhYnl0ZTogMTAwMCAqIDEwMDAgKiAxMDAwICogOCxcbiAgdGVyYWJ5dGU6IDEwMDAgKiAxMDAwICogMTAwMCAqIDEwMDAgKiA4ICBcbn1cbmNvbnN0IGFsaWFzZXMgPSB7XG4gIGI6ICdiaXQnLFxuICBCOiAnYnl0ZScsXG4gIEtCOiAna2lsb2J5dGUnLFxuICBNQjogJ21lZ2FieXRlJyxcbiAgR0I6ICdnaWdhYnl0ZScsXG4gIFRCOiAndGVyYWJ5dGUnXG59XG5cbmZ1bmN0aW9uIHNob3J0VW5pdCh1bml0KSB7XG4gIGZvciAobGV0IGtleSBpbiBhbGlhc2VzKSB7XG4gICAgaWYgKGFsaWFzZXNba2V5XSA9PSB1bml0KSB1bml0ID0ga2V5XG4gIH1cblxuICByZXR1cm4gdW5pdFxufVxuZnVuY3Rpb24gbG9uZ1VuaXQoc2l6ZSwgdW5pdCkge1xuICByZXR1cm4gcGx1cmFsaXplKHNpemUsIHVuaXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB1bml0LnNsaWNlKDEpKVxufVxuXG5mdW5jdGlvbiBhbGlhcyh1bml0KSB7XG4gIHJldHVybiBhbGlhc2VzW3VuaXRdIHx8IHVuaXQudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBwbHVyYWxpemUodmFsLCB1bml0KSB7XG4gIGlmICggdmFsICE9IDEgKSB1bml0ICs9ICdzJ1xuICByZXR1cm4gdW5pdFxufVxuXG5mdW5jdGlvbiBjb252ZXJ0KG51bSwgYXMsIHRvKSB7XG4gIHZhciB0byAgICAgPSBhbGlhcyh0byksXG4gICAgICBiYXNlICAgPSB1bml0c1RhYmxlW2FsaWFzKGFzKV0sXG4gICAgICB0YXJnZXQgPSB1bml0c1RhYmxlW3RvXVxuICB2YXIgbnVtICAgID0gKG51bSAqIGJhc2UgLyB0YXJnZXQpXG4gIFxuICBcbiAgdmFyIGNvbnZlcnNpb24gPSB7IFxuICAgIHZhbHVlOiBudW0sXG4gICAgdW5pdDogIHNob3J0VW5pdCh0byksXG4gICAgbG9uZzogIGxvbmdVbml0KG51bSwgdG8pXG4gIH1cbiAgcmV0dXJuIGNvbnZlcnNpb25cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0XG4iLCIvLyBJY29ucyBtdXN0IGNvbWUgYmVmb3JlIGV2ZW50IHJlZ2lzdHJhdGlvbnNcbnJlcXVpcmUoICcuL19pY29ucycgKSAvLyBJbXBvcnQgc3ZnIGljb25zIChmcm9tIEVzdmcpXG52YXIgZXN2ZyA9IHJlcXVpcmUoICcuL19lc3ZnJyApXG5cbnZhciB0b29sYm94ICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIHRpbWVUb2dnbGUgPSByZXF1aXJlKCAnY29tcG9zZS10aW1lLXRvZ2dsZScgKSAvLyBTd2l0Y2ggdGltZSBlbGVtZW50cyBiZXR3ZWVuIGxvY2FsIGFuZCBVVENcbnZhciB0b2dnbGVyICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9nZ2xlcicgKVxudmFyIGZvcm1VcCAgICAgPSByZXF1aXJlKCAnY29tcG9zZS1mb3JtLXVwJyApXG52YXIgZGlhbG9nICAgICA9IHJlcXVpcmUoICdjb21wb3NlLWRpYWxvZycgKVxudmFyIGFqYXggICAgICAgPSByZXF1aXJlKCAnc3VwZXJhZ2VudCcgKVxudmFyIGNsaXBib2FyZCAgPSByZXF1aXJlKCAnLi9tb2R1bGVzL2NsaXBib2FyZCcgKVxudmFyIG5vdGlmeSAgICAgPSByZXF1aXJlKCAnLi9tb2R1bGVzL25vdGlmeScgKVxudmFyIGV2ZW50ICAgICAgPSB0b29sYm94LmV2ZW50XG5cbmV2ZW50LnNjcm9sbC5kaXNhYmxlUG9pbnRlcigpICAgICAgICAvLyBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzIG9uIHNjcm9sbCBmb3IgcGVyZm9ybWFuY2UgKHRvIGF2b2lkIGV4dHJhIHJlcGFpbnRzKVxuY2xpcGJvYXJkKCk7XG5cbnJlcXVpcmUoICdjb21wb3NlLXNsaWRlcicgKSAgICAgICAgICAvLyBPdXIgc2xpZGVyIChyYW5nZSBpbnB1dCkgY29tcG9uZW50XG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvZmxhc2gtbWVzc2FnZXMnIClcbnJlcXVpcmUoICcuL2VuaGFuY2VtZW50cy9mb3JtLXN1Ym1pdC1oZWxwZXJzJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvaW5wdXQtbnVtYmVyLW9ubHknIClcbnJlcXVpcmUoICcuL2VuaGFuY2VtZW50cy9pbnB1dC11bml0JyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvbGluay1oZXJlJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvdGV4dGFyZWEtZXhwYW5kJyApXG5cbmV2ZW50LmNoYW5nZSggdGltZVRvZ2dsZS50aW1lYWdvLnNldHVwIClcbmZvcm1VcC5kaWZmLndhdGNoKClcblxuLy8gUHVibGljIEFQSSBvYmplY3RcbndpbmRvdy5UdW5nc3RlbiA9IG1vZHVsZS5leHBvcnRzID0gdG9vbGJveC5tZXJnZSgge1xuICBhamF4ICAgICAgICA6IGFqYXgsXG4gIGZvcm0gICAgICAgIDogZm9ybVVwLFxuICB0b2dnbGVyICAgICA6IHRvZ2dsZXIsXG4gIGNsaXBib2FyZCAgIDogY2xpcGJvYXJkLFxuICBub3RpZnkgICAgICA6IG5vdGlmeSxcbiAgZXN2ZyAgICAgICAgOiBlc3ZnLFxuICB0aW1lVG9nZ2xlICA6IHRpbWVUb2dnbGUsXG4gIGRpYWxvZyAgICAgIDogZGlhbG9nXG59LCB0b29sYm94IClcbiIsIi8qIVxuICAqIEJlYW4gLSBjb3B5cmlnaHQgKGMpIEphY29iIFRob3JudG9uIDIwMTEtMjAxMlxuICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXQvYmVhblxuICAqIE1JVCBsaWNlbnNlXG4gICovXG4oZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQsIGRlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpXG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoZGVmaW5pdGlvbilcbiAgZWxzZSBjb250ZXh0W25hbWVdID0gZGVmaW5pdGlvbigpXG59KSgnYmVhbicsIHRoaXMsIGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0KSB7XG4gIG5hbWUgICAgPSBuYW1lICAgIHx8ICdiZWFuJ1xuICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzXG5cbiAgdmFyIHdpbiAgICAgICAgICAgID0gd2luZG93XG4gICAgLCBvbGQgICAgICAgICAgICA9IGNvbnRleHRbbmFtZV1cbiAgICAsIG5hbWVzcGFjZVJlZ2V4ID0gL1teXFwuXSooPz1cXC4uKilcXC58LiovXG4gICAgLCBuYW1lUmVnZXggICAgICA9IC9cXC4uKi9cbiAgICAsIGFkZEV2ZW50ICAgICAgID0gJ2FkZEV2ZW50TGlzdGVuZXInXG4gICAgLCByZW1vdmVFdmVudCAgICA9ICdyZW1vdmVFdmVudExpc3RlbmVyJ1xuICAgICwgZG9jICAgICAgICAgICAgPSBkb2N1bWVudCB8fCB7fVxuICAgICwgcm9vdCAgICAgICAgICAgPSBkb2MuZG9jdW1lbnRFbGVtZW50IHx8IHt9XG4gICAgLCBXM0NfTU9ERUwgICAgICA9IHJvb3RbYWRkRXZlbnRdXG4gICAgLCBldmVudFN1cHBvcnQgICA9IFczQ19NT0RFTCA/IGFkZEV2ZW50IDogJ2F0dGFjaEV2ZW50J1xuICAgICwgT05FICAgICAgICAgICAgPSB7fSAvLyBzaW5nbGV0b24gZm9yIHF1aWNrIG1hdGNoaW5nIG1ha2luZyBhZGQoKSBkbyBvbmUoKVxuXG4gICAgLCBzbGljZSAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICwgc3RyMmFyciAgICAgICAgPSBmdW5jdGlvbiAocywgZCkgeyByZXR1cm4gcy5zcGxpdChkIHx8ICcgJykgfVxuICAgICwgaXNTdHJpbmcgICAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ3N0cmluZycgfVxuICAgICwgaXNGdW5jdGlvbiAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ2Z1bmN0aW9uJyB9XG4gICAgLCBpc09iamVjdCAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnb2JqZWN0JyB9XG5cbiAgICAvLyBUcnkgdG8gYnVpbGQgYW4gb3B0aW9ucyBvYmplY3QuIElmIGFueSBrZXkgaW4gYG1heWJlT3B0aW9uc2BcbiAgICAvLyBtYXRjaGVzIGEga2V5IGluIGBkZWZhdWx0c2AsIGl0IHdpbGwgYmUgY29waWVkIGludG8gYSBjbG9uZVxuICAgIC8vIG9mIGBkZWZhdWx0c2AsIHRodXMgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdC5cbiAgICAsIGJ1aWxkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcmlnaW5hbERlZmF1bHRzLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge31cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3JpZ2luYWxEZWZhdWx0cykge1xuICAgICAgICAgIGlmIChvcmlnaW5hbERlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBvcmlnaW5hbERlZmF1bHRzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc09iamVjdChtYXliZU9wdGlvbnMpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBtYXliZU9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG1heWJlT3B0aW9uc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzXG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZW50cyB0aGF0IHdlIGNvbnNpZGVyIHRvIGJlICduYXRpdmUnLCBhbnl0aGluZyBub3QgaW4gdGhpcyBsaXN0IHdpbGxcbiAgICAgIC8vIGJlIHRyZWF0ZWQgYXMgYSBjdXN0b20gZXZlbnRcbiAgICAsIHN0YW5kYXJkTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ2NsaWNrIGRibGNsaWNrIG1vdXNldXAgbW91c2Vkb3duIGNvbnRleHRtZW51ICcgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ21vdXNld2hlZWwgbW91c2VtdWx0aXdoZWVsIERPTU1vdXNlU2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIHdoZWVsXG4gICAgICAgICdtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIHNlbGVjdHN0YXJ0IHNlbGVjdGVuZCAnICAgICAgICAgICAgKyAvLyBtb3VzZSBtb3ZlbWVudFxuICAgICAgICAna2V5ZG93biBrZXlwcmVzcyBrZXl1cCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8ga2V5Ym9hcmRcbiAgICAgICAgJ29yaWVudGF0aW9uY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vYmlsZVxuICAgICAgICAnZm9jdXMgYmx1ciBjaGFuZ2UgcmVzZXQgc2VsZWN0IHN1Ym1pdCAnICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAnbG9hZCB1bmxvYWQgYmVmb3JldW5sb2FkIHJlc2l6ZSBtb3ZlIERPTUNvbnRlbnRMb2FkZWQgJyAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdyZWFkeXN0YXRlY2hhbmdlIG1lc3NhZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2Vycm9yIGFib3J0IHNjcm9sbCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc2NcbiAgICAgIC8vIGVsZW1lbnQuZmlyZUV2ZW50KCdvblhZWicuLi4gaXMgbm90IGZvcmdpdmluZyBpZiB3ZSB0cnkgdG8gZmlyZSBhbiBldmVudFxuICAgICAgLy8gdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCBzbyBtYWtlIHN1cmUgd2Ugb25seSBkbyB0aGVzZSBvbiBuZXdlciBicm93c2Vyc1xuICAgICwgdzNjTmF0aXZlRXZlbnRzID1cbiAgICAgICAgJ3Nob3cgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1vdXNlIGJ1dHRvbnNcbiAgICAgICAgJ2lucHV0IGludmFsaWQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGZvcm0gZWxlbWVudHNcbiAgICAgICAgJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsICcgICAgICAgICAgICAgICAgICAgICArIC8vIHRvdWNoXG4gICAgICAgICdnZXN0dXJlc3RhcnQgZ2VzdHVyZWNoYW5nZSBnZXN0dXJlZW5kICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBnZXN0dXJlXG4gICAgICAgICd0ZXh0aW5wdXQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBUZXh0RXZlbnRcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgcGFnZXNob3cgcGFnZWhpZGUgcG9wc3RhdGUgJyAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnaGFzaGNoYW5nZSBvZmZsaW5lIG9ubGluZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdhZnRlcnByaW50IGJlZm9yZXByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBwcmludGluZ1xuICAgICAgICAnZHJhZ3N0YXJ0IGRyYWdlbnRlciBkcmFnb3ZlciBkcmFnbGVhdmUgZHJhZyBkcm9wIGRyYWdlbmQgJyAgICAgICsgLy8gZG5kXG4gICAgICAgICdsb2Fkc3RhcnQgcHJvZ3Jlc3Mgc3VzcGVuZCBlbXB0aWVkIHN0YWxsZWQgbG9hZG1ldGFkYXRhICcgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnbG9hZGVkZGF0YSBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIHBsYXlpbmcgd2FpdGluZyBzZWVraW5nICcgICAgICsgLy8gbWVkaWFcbiAgICAgICAgJ3NlZWtlZCBlbmRlZCBkdXJhdGlvbmNoYW5nZSB0aW1ldXBkYXRlIHBsYXkgcGF1c2UgcmF0ZWNoYW5nZSAnICArIC8vIG1lZGlhXG4gICAgICAgICd2b2x1bWVjaGFuZ2UgY3VlY2hhbmdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnY2hlY2tpbmcgbm91cGRhdGUgZG93bmxvYWRpbmcgY2FjaGVkIHVwZGF0ZXJlYWR5IG9ic29sZXRlICcgICAgICAgLy8gYXBwY2FjaGVcblxuICAgICAgLy8gY29udmVydCB0byBhIGhhc2ggZm9yIHF1aWNrIGxvb2t1cHNcbiAgICAsIG5hdGl2ZUV2ZW50cyA9IChmdW5jdGlvbiAoaGFzaCwgZXZlbnRzLCBpKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIGV2ZW50c1tpXSAmJiAoaGFzaFtldmVudHNbaV1dID0gMSlcbiAgICAgICAgcmV0dXJuIGhhc2hcbiAgICAgIH0oe30sIHN0cjJhcnIoc3RhbmRhcmROYXRpdmVFdmVudHMgKyAoVzNDX01PREVMID8gdzNjTmF0aXZlRXZlbnRzIDogJycpKSkpXG5cbiAgICAgIC8vIGN1c3RvbSBldmVudHMgYXJlIGV2ZW50cyB0aGF0IHdlICpmYWtlKiwgdGhleSBhcmUgbm90IHByb3ZpZGVkIG5hdGl2ZWx5IGJ1dFxuICAgICAgLy8gd2UgY2FuIHVzZSBuYXRpdmUgZXZlbnRzIHRvIGdlbmVyYXRlIHRoZW1cbiAgICAsIGN1c3RvbUV2ZW50cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc0FuY2VzdG9yID0gJ2NvbXBhcmVEb2N1bWVudFBvc2l0aW9uJyBpbiByb290XG4gICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiAoY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQpICYgMTYpID09PSAxNlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiAnY29udGFpbnMnIGluIHJvb3RcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLm5vZGVUeXBlID09PSA5IHx8IGNvbnRhaW5lciA9PT0gd2luZG93ID8gcm9vdCA6IGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyICE9PSBlbGVtZW50ICYmIGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgaWYgKGVsZW1lbnQgPT09IGNvbnRhaW5lcikgcmV0dXJuIDFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGNoZWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICByZXR1cm4gIXJlbGF0ZWRcbiAgICAgICAgICAgICAgICA/IHJlbGF0ZWQgPT0gbnVsbFxuICAgICAgICAgICAgICAgIDogKHJlbGF0ZWQgIT09IHRoaXMgJiYgcmVsYXRlZC5wcmVmaXggIT09ICd4dWwnICYmICEvZG9jdW1lbnQvLnRlc3QodGhpcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAmJiAhaXNBbmNlc3RvcihyZWxhdGVkLCB0aGlzKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW91c2VlbnRlcjogeyBiYXNlOiAnbW91c2VvdmVyJywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZWxlYXZlOiB7IGJhc2U6ICdtb3VzZW91dCcsIGNvbmRpdGlvbjogY2hlY2sgfVxuICAgICAgICAgICwgbW91c2V3aGVlbDogeyBiYXNlOiAvRmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcgfVxuICAgICAgICB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIHByb3ZpZGUgYSBjb25zaXN0ZW50IEV2ZW50IG9iamVjdCBhY3Jvc3MgYnJvd3NlcnMgYnkgdGFraW5nIHRoZSBhY3R1YWwgRE9NXG4gICAgICAvLyBldmVudCBvYmplY3QgYW5kIGdlbmVyYXRpbmcgYSBuZXcgb25lIGZyb20gaXRzIHByb3BlcnRpZXMuXG4gICAgLCBFdmVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBhIHdoaXRlbGlzdCBvZiBwcm9wZXJ0aWVzIChmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzKSB0ZWxscyB1cyB3aGF0IHRvIGNoZWNrIGZvciBhbmQgY29weVxuICAgICAgICB2YXIgY29tbW9uUHJvcHMgID0gc3RyMmFycignYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCAnICtcbiAgICAgICAgICAgICAgJ2RldGFpbCBldmVudFBoYXNlIGdldE1vZGlmaWVyU3RhdGUgaXNUcnVzdGVkIG1ldGFLZXkgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzaGlmdEtleSAnICArXG4gICAgICAgICAgICAgICdzcmNFbGVtZW50IHRhcmdldCB0aW1lU3RhbXAgdHlwZSB2aWV3IHdoaWNoIHByb3BlcnR5TmFtZSBwYXRoJylcbiAgICAgICAgICAsIG1vdXNlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZGF0YVRyYW5zZmVyICcgICAgICArXG4gICAgICAgICAgICAgICdmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCBtb3ZlbWVudFggbW92ZW1lbnRZIHJlZ2lvbicpKVxuICAgICAgICAgICwgbW91c2VXaGVlbFByb3BzID0gbW91c2VQcm9wcy5jb25jYXQoc3RyMmFycignd2hlZWxEZWx0YSB3aGVlbERlbHRhWCB3aGVlbERlbHRhWSB3aGVlbERlbHRhWiAnICtcbiAgICAgICAgICAgICAgJ2F4aXMnKSkgLy8gJ2F4aXMnIGlzIEZGIHNwZWNpZmljXG4gICAgICAgICAgLCBrZXlQcm9wcyAgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSBrZXlJZGVudGlmaWVyICcgICAgICAgICAgK1xuICAgICAgICAgICAgICAna2V5TG9jYXRpb24gbG9jYXRpb24gaXNDb21wb3NpbmcgY29kZScpKVxuICAgICAgICAgICwgdGV4dFByb3BzICAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEnKSlcbiAgICAgICAgICAsIHRvdWNoUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCd0b3VjaGVzIHRhcmdldFRvdWNoZXMgY2hhbmdlZFRvdWNoZXMgc2NhbGUgcm90YXRpb24nKSlcbiAgICAgICAgICAsIG1lc3NhZ2VQcm9wcyA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdkYXRhIG9yaWdpbiBzb3VyY2UnKSlcbiAgICAgICAgICAsIHN0YXRlUHJvcHMgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdzdGF0ZScpKVxuICAgICAgICAgICwgb3Zlck91dFJlZ2V4ID0gL292ZXJ8b3V0L1xuICAgICAgICAgICAgLy8gc29tZSBldmVudCB0eXBlcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgYW5kIHNvbWUgbmVlZCBzcGVjaWFsIHByb3BlcnRpZXMsIGRvIHRoYXQgYWxsIGhlcmVcbiAgICAgICAgICAsIHR5cGVGaXhlcnMgICA9IFtcbiAgICAgICAgICAgICAgICB7IC8vIGtleSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAva2V5L2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQua2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIG1vdXNlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9jbGlja3xtb3VzZSg/ISguKndoZWVsfHNjcm9sbCkpfG1lbnV8ZHJhZ3xkcm9wL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoZXZlbnQsIG5ld0V2ZW50LCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucmlnaHRDbGljayA9IGV2ZW50LndoaWNoID09PSAzIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnBvcyA9IHsgeDogMCwgeTogMCB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnBhZ2VYIHx8IGV2ZW50LnBhZ2VZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQucGFnZVhcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5wYWdlWVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY2xpZW50WCB8fCBldmVudC5jbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRYID0gZXZlbnQuY2xpZW50WCArIGRvYy5ib2R5LnNjcm9sbExlZnQgKyByb290LnNjcm9sbExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFkgPSBldmVudC5jbGllbnRZICsgZG9jLmJvZHkuc2Nyb2xsVG9wICsgcm9vdC5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJPdXRSZWdleC50ZXN0KHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFsodHlwZSA9PSAnbW91c2VvdmVyJyA/ICdmcm9tJyA6ICd0bycpICsgJ0VsZW1lbnQnXVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW91c2VQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2Ugd2hlZWwgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL21vdXNlLiood2hlZWx8c2Nyb2xsKS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW91c2VXaGVlbFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBUZXh0RXZlbnRcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRleHQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gdG91Y2ggYW5kIGdlc3R1cmUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL150b3VjaHxeZ2VzdHVyZS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdG91Y2hQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbWVzc2FnZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXm1lc3NhZ2UkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIHBvcHN0YXRlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ecG9wc3RhdGUkL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdGF0ZVByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvLiovXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tbW9uUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICAsIHR5cGVGaXhlck1hcCA9IHt9IC8vIHVzZWQgdG8gbWFwIGV2ZW50IHR5cGVzIHRvIGZpeGVyIGZ1bmN0aW9ucyAoYWJvdmUpLCBhIGJhc2ljIGNhY2hlIG1lY2hhbmlzbVxuXG4gICAgICAgICAgLCBFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudCwgaXNOYXRpdmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm5cbiAgICAgICAgICAgICAgZXZlbnQgPSBldmVudCB8fCAoKGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQpLnBhcmVudFdpbmRvdyB8fCB3aW4pLmV2ZW50XG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICAgPSBpc05hdGl2ZVxuICAgICAgICAgICAgICB0aGlzLmlzQmVhbiAgICAgICAgID0gdHJ1ZVxuXG4gICAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVyblxuXG4gICAgICAgICAgICAgIHZhciB0eXBlICAgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgLCB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudFxuICAgICAgICAgICAgICAgICwgaSwgbCwgcCwgcHJvcHMsIGZpeGVyXG5cbiAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXRcblxuICAgICAgICAgICAgICBpZiAoaXNOYXRpdmUpIHsgLy8gd2Ugb25seSBuZWVkIGJhc2ljIGF1Z21lbnRhdGlvbiBvbiBjdXN0b20gZXZlbnRzLCB0aGUgcmVzdCBleHBlbnNpdmUgJiBwb2ludGxlc3NcbiAgICAgICAgICAgICAgICBmaXhlciA9IHR5cGVGaXhlck1hcFt0eXBlXVxuICAgICAgICAgICAgICAgIGlmICghZml4ZXIpIHsgLy8gaGF2ZW4ndCBlbmNvdW50ZXJlZCB0aGlzIGV2ZW50IHR5cGUgYmVmb3JlLCBtYXAgYSBmaXhlciBmdW5jdGlvbiBmb3IgaXRcbiAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0eXBlRml4ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUZpeGVyc1tpXS5yZWcudGVzdCh0eXBlKSkgeyAvLyBndWFyYW50ZWVkIHRvIG1hdGNoIGF0IGxlYXN0IG9uZSwgbGFzdCBpcyAuKlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVGaXhlck1hcFt0eXBlXSA9IGZpeGVyID0gdHlwZUZpeGVyc1tpXS5maXhcbiAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvcHMgPSBmaXhlcihldmVudCwgdGhpcywgdHlwZSlcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBwcm9wcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghKChwID0gcHJvcHNbaV0pIGluIHRoaXMpICYmIHAgaW4gZXZlbnQpIHRoaXNbcF0gPSBldmVudFtwXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnREZWZhdWx0KCkgYW5kIHN0b3BQcm9wYWdhdGlvbigpIGFyZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHRvIHRob3NlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBvbiB0aGUgRE9NLCBzdG9wKCkgaXMgYW4gYWxpYXMgZm9yIGJvdGggb2YgdGhlbSB0b2dldGhlclxuICAgICAgICBFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCkgdGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgZWxzZSB0aGlzLm9yaWdpbmFsRXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIHRvIGJlIGhhbmRsZWQgaW50ZXJuYWxseSBiZWNhdXNlIHdlIG1hbmFnZSB0aGUgZXZlbnQgbGlzdCBmb3JcbiAgICAgICAgLy8gZWFjaCBlbGVtZW50XG4gICAgICAgIC8vIG5vdGUgdGhhdCBvcmlnaW5hbEVsZW1lbnQgbWF5IGJlIGEgQmVhbiNFdmVudCBvYmplY3QgaW4gc29tZSBzaXR1YXRpb25zXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlIH1cbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCAmJiB0aGlzLm9yaWdpbmFsRXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgLy9UT0RPOiB0aGlzIGlzIHJpcGUgZm9yIG9wdGltaXNhdGlvbiwgbmV3IGV2ZW50cyBhcmUgKmV4cGVuc2l2ZSpcbiAgICAgICAgICAvLyBpbXByb3ZpbmcgdGhpcyB3aWxsIHNwZWVkIHVwIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICB2YXIgbmUgPSBuZXcgRXZlbnQodGhpcywgdGhpcy5lbGVtZW50LCB0aGlzLmlzTmF0aXZlKVxuICAgICAgICAgIG5lLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgcmV0dXJuIG5lXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRcbiAgICAgIH0oKSlcblxuICAgICAgLy8gaWYgd2UncmUgaW4gb2xkIElFIHdlIGNhbid0IGRvIG9ucHJvcGVydHljaGFuZ2Ugb24gZG9jIG9yIHdpbiBzbyB3ZSB1c2UgZG9jLmRvY3VtZW50RWxlbWVudCBmb3IgYm90aFxuICAgICwgdGFyZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICByZXR1cm4gIVczQ19NT0RFTCAmJiAhaXNOYXRpdmUgJiYgKGVsZW1lbnQgPT09IGRvYyB8fCBlbGVtZW50ID09PSB3aW4pID8gcm9vdCA6IGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogQmVhbiBtYWludGFpbnMgYW4gaW50ZXJuYWwgcmVnaXN0cnkgZm9yIGV2ZW50IGxpc3RlbmVycy4gV2UgZG9uJ3QgdG91Y2ggZWxlbWVudHMsIG9iamVjdHNcbiAgICAgICAgKiBvciBmdW5jdGlvbnMgdG8gaWRlbnRpZnkgdGhlbSwgaW5zdGVhZCB3ZSBzdG9yZSBldmVyeXRoaW5nIGluIHRoZSByZWdpc3RyeS5cbiAgICAgICAgKiBFYWNoIGV2ZW50IGxpc3RlbmVyIGhhcyBhIFJlZ0VudHJ5IG9iamVjdCwgd2UgaGF2ZSBvbmUgJ3JlZ2lzdHJ5JyBmb3IgdGhlIHdob2xlIGluc3RhbmNlLlxuICAgICAgICAqL1xuICAgICwgUmVnRW50cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlYWNoIGhhbmRsZXIgaXMgd3JhcHBlZCBzbyB3ZSBjYW4gaGFuZGxlIGRlbGVnYXRpb24gYW5kIGN1c3RvbSBldmVudHNcbiAgICAgICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZuLCBjb25kaXRpb24sIGFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBjYWxsID0gZnVuY3Rpb24gKGV2ZW50LCBlYXJncykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIGFyZ3MgPyBzbGljZS5jYWxsKGVhcmdzLCBldmVudCA/IDAgOiAxKS5jb25jYXQoYXJncykgOiBlYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgZmluZFRhcmdldCA9IGZ1bmN0aW9uIChldmVudCwgZXZlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uX19iZWFuRGVsID8gZm4uX19iZWFuRGVsLmZ0KGV2ZW50LnRhcmdldCwgZWxlbWVudCkgOiBldmVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgaGFuZGxlciA9IGNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZmluZFRhcmdldChldmVudCwgdGhpcykgLy8gZGVsZWF0ZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50KSBldmVudC5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZm4uX19iZWFuRGVsKSBldmVudCA9IGV2ZW50LmNsb25lKGZpbmRUYXJnZXQoZXZlbnQpKSAvLyBkZWxlZ2F0ZWQgZXZlbnQsIGZpeCB0aGUgZml4XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlci5fX2JlYW5EZWwgPSBmbi5fX2JlYW5EZWxcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICAgICAgfVxuXG4gICAgICAgICwgUmVnRW50cnkgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwsIG5hbWVzcGFjZXMsIGFyZ3MsIHJvb3QpIHtcbiAgICAgICAgICAgIHZhciBjdXN0b21UeXBlICAgICA9IGN1c3RvbUV2ZW50c1t0eXBlXVxuICAgICAgICAgICAgICAsIGlzTmF0aXZlXG5cbiAgICAgICAgICAgIGlmICh0eXBlID09ICd1bmxvYWQnKSB7XG4gICAgICAgICAgICAgIC8vIHNlbGYgY2xlYW4tdXBcbiAgICAgICAgICAgICAgaGFuZGxlciA9IG9uY2UocmVtb3ZlTGlzdGVuZXIsIGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9yaWdpbmFsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tVHlwZSkge1xuICAgICAgICAgICAgICBpZiAoY3VzdG9tVHlwZS5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY3VzdG9tVHlwZS5jb25kaXRpb24sIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHlwZSA9IGN1c3RvbVR5cGUuYmFzZSB8fCB0eXBlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNOYXRpdmUgICAgICA9IGlzTmF0aXZlID0gbmF0aXZlRXZlbnRzW3R5cGVdICYmICEhZWxlbWVudFtldmVudFN1cHBvcnRdXG4gICAgICAgICAgICB0aGlzLmN1c3RvbVR5cGUgICAgPSAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiB0eXBlXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgICAgICAgPSBlbGVtZW50XG4gICAgICAgICAgICB0aGlzLnR5cGUgICAgICAgICAgPSB0eXBlXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsICAgICAgPSBvcmlnaW5hbFxuICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzICAgID0gbmFtZXNwYWNlc1xuICAgICAgICAgICAgdGhpcy5ldmVudFR5cGUgICAgID0gVzNDX01PREVMIHx8IGlzTmF0aXZlID8gdHlwZSA6ICdwcm9wZXJ0eWNoYW5nZSdcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ICAgICAgICA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgICAgICB0aGlzW2V2ZW50U3VwcG9ydF0gPSAhIXRoaXMudGFyZ2V0W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMucm9vdCAgICAgICAgICA9IHJvb3RcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlciAgICAgICA9IHdyYXBwZWRIYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgIC8vIGdpdmVuIGEgbGlzdCBvZiBuYW1lc3BhY2VzLCBpcyBvdXIgZW50cnkgaW4gYW55IG9mIHRoZW0/XG4gICAgICAgIFJlZ0VudHJ5LnByb3RvdHlwZS5pbk5hbWVzcGFjZXMgPSBmdW5jdGlvbiAoY2hlY2tOYW1lc3BhY2VzKSB7XG4gICAgICAgICAgdmFyIGksIGosIGMgPSAwXG4gICAgICAgICAgaWYgKCFjaGVja05hbWVzcGFjZXMpIHJldHVybiB0cnVlXG4gICAgICAgICAgaWYgKCF0aGlzLm5hbWVzcGFjZXMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGZvciAoaSA9IGNoZWNrTmFtZXNwYWNlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IHRoaXMubmFtZXNwYWNlcy5sZW5ndGg7IGotLTspIHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrTmFtZXNwYWNlc1tpXSA9PSB0aGlzLm5hbWVzcGFjZXNbal0pIGMrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aCA9PT0gY1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF0Y2ggYnkgZWxlbWVudCwgb3JpZ2luYWwgZm4gKG9wdCksIGhhbmRsZXIgZm4gKG9wdClcbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLm1hdGNoZXMgPSBmdW5jdGlvbiAoY2hlY2tFbGVtZW50LCBjaGVja09yaWdpbmFsLCBjaGVja0hhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ID09PSBjaGVja0VsZW1lbnQgJiZcbiAgICAgICAgICAgICghY2hlY2tPcmlnaW5hbCB8fCB0aGlzLm9yaWdpbmFsID09PSBjaGVja09yaWdpbmFsKSAmJlxuICAgICAgICAgICAgKCFjaGVja0hhbmRsZXIgfHwgdGhpcy5oYW5kbGVyID09PSBjaGVja0hhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVnRW50cnlcbiAgICAgIH0oKSlcblxuICAgICwgcmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBvdXIgbWFwIHN0b3JlcyBhcnJheXMgYnkgZXZlbnQgdHlwZSwganVzdCBiZWNhdXNlIGl0J3MgYmV0dGVyIHRoYW4gc3RvcmluZ1xuICAgICAgICAvLyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIGFycmF5LlxuICAgICAgICAvLyB1c2VzICckJyBhcyBhIHByZWZpeCBmb3IgdGhlIGtleXMgZm9yIHNhZmV0eSBhbmQgJ3InIGFzIGEgc3BlY2lhbCBwcmVmaXggZm9yXG4gICAgICAgIC8vIHJvb3RMaXN0ZW5lcnMgc28gd2UgY2FuIGxvb2sgdGhlbSB1cCBmYXN0XG4gICAgICAgIHZhciBtYXAgPSB7fVxuXG4gICAgICAgICAgLy8gZ2VuZXJpYyBmdW5jdGlvbmFsIHNlYXJjaCBvZiBvdXIgcmVnaXN0cnkgZm9yIG1hdGNoaW5nIGxpc3RlbmVycyxcbiAgICAgICAgICAvLyBgZm5gIHJldHVybnMgZmFsc2UgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wXG4gICAgICAgICAgLCBmb3JBbGwgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKSB7XG4gICAgICAgICAgICAgIHZhciBwZnggPSByb290ID8gJ3InIDogJyQnXG4gICAgICAgICAgICAgIGlmICghdHlwZSB8fCB0eXBlID09ICcqJykge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCB0aGUgd2hvbGUgcmVnaXN0cnlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHQuY2hhckF0KDApID09IHBmeCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdC5zdWJzdHIoMSksIG9yaWdpbmFsLCBoYW5kbGVyLCByb290LCBmbilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwLCBsLCBsaXN0ID0gbWFwW3BmeCArIHR5cGVdLCBhbGwgPSBlbGVtZW50ID09ICcqJ1xuICAgICAgICAgICAgICAgIGlmICghbGlzdCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgZm9yIChsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIGlmICgoYWxsIHx8IGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgaGFuZGxlcikpICYmICFmbihsaXN0W2ldLCBsaXN0LCBpLCB0eXBlKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIGhhcyA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgcm9vdCkge1xuICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgdXNpbmcgZm9yQWxsIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQncyBhIGJpdCBzbG93ZXIgYW5kIHRoaXNcbiAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgZmFzdFxuICAgICAgICAgICAgICB2YXIgaSwgbGlzdCA9IG1hcFsocm9vdCA/ICdyJyA6ICckJykgKyB0eXBlXVxuICAgICAgICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWxpc3RbaV0ucm9vdCAmJiBsaXN0W2ldLm1hdGNoZXMoZWxlbWVudCwgb3JpZ2luYWwsIG51bGwpKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yQWxsKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCBudWxsLCByb290LCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBwdXQgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgdmFyIGhhcyA9ICFlbnRyeS5yb290ICYmICF0aGlzLmhhcyhlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAsIGtleSA9IChlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVcbiAgICAgICAgICAgICAgOyhtYXBba2V5XSB8fCAobWFwW2tleV0gPSBbXSkpLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIHJldHVybiBoYXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgZGVsID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIGZvckFsbChlbnRyeS5lbGVtZW50LCBlbnRyeS50eXBlLCBudWxsLCBlbnRyeS5oYW5kbGVyLCBlbnRyeS5yb290LCBmdW5jdGlvbiAoZW50cnksIGxpc3QsIGkpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSBkZWxldGUgbWFwWyhlbnRyeS5yb290ID8gJ3InIDogJyQnKSArIGVudHJ5LnR5cGVdXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGR1bXAgYWxsIGVudHJpZXMsIHVzZWQgZm9yIG9udW5sb2FkXG4gICAgICAgICAgLCBlbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgdCwgZW50cmllcyA9IFtdXG4gICAgICAgICAgICAgIGZvciAodCBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gJyQnKSBlbnRyaWVzID0gZW50cmllcy5jb25jYXQobWFwW3RdKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgaGFzOiBoYXMsIGdldDogZ2V0LCBwdXQ6IHB1dCwgZGVsOiBkZWwsIGVudHJpZXM6IGVudHJpZXMgfVxuICAgICAgfSgpKVxuXG4gICAgICAvLyB3ZSBuZWVkIGEgc2VsZWN0b3IgZW5naW5lIGZvciBkZWxlZ2F0ZWQgZXZlbnRzLCB1c2UgcXVlcnlTZWxlY3RvckFsbCBpZiBpdCBleGlzdHNcbiAgICAgIC8vIGJ1dCBmb3Igb2xkZXIgYnJvd3NlcnMgd2UgbmVlZCBRd2VyeSwgU2l6emxlIG9yIHNpbWlsYXJcbiAgICAsIHNlbGVjdG9yRW5naW5lXG4gICAgLCBzZXRTZWxlY3RvckVuZ2luZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKHMsIHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5xdWVyeVNlbGVjdG9yQWxsKHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmVhbjogTm8gc2VsZWN0b3IgZW5naW5lIGluc3RhbGxlZCcpIC8vIGVlZWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdG9yRW5naW5lID0gZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGF0dGFjaCB0aGlzIGxpc3RlbmVyIHRvIGVhY2ggRE9NIGV2ZW50IHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8sIG9ubHkgb25jZVxuICAgICAgLy8gcGVyIGV2ZW50IHR5cGUgcGVyIERPTSBlbGVtZW50XG4gICAgLCByb290TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIHR5cGUpIHtcbiAgICAgICAgaWYgKCFXM0NfTU9ERUwgJiYgdHlwZSAmJiBldmVudCAmJiBldmVudC5wcm9wZXJ0eU5hbWUgIT0gJ19vbicgKyB0eXBlKSByZXR1cm5cblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gcmVnaXN0cnkuZ2V0KHRoaXMsIHR5cGUgfHwgZXZlbnQudHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcblxuICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgdGhpcywgdHJ1ZSlcbiAgICAgICAgaWYgKHR5cGUpIGV2ZW50LnR5cGUgPSB0eXBlXG5cbiAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIGNhbGxpbmcgdGhlbSB1bmxlc3MgdGhleSBoYXZlXG4gICAgICAgIC8vIGJlZW4gcmVtb3ZlZCBieSBhIHByZXZpb3VzIGhhbmRsZXIgb3Igc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgIGZvciAoOyBpIDwgbCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbaV0ucmVtb3ZlZCkgbGlzdGVuZXJzW2ldLmhhbmRsZXIuY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYW5kIHJlbW92ZSBsaXN0ZW5lcnMgdG8gRE9NIGVsZW1lbnRzXG4gICAgLCBsaXN0ZW5lciA9IFczQ19NT0RFTFxuICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhZGQsIGN1c3RvbSwgdXNlQ2FwdHVyZSkge1xuICAgICAgICAgICAgLy8gbmV3IGJyb3dzZXJzXG4gICAgICAgICAgICBlbGVtZW50W2FkZCA/IGFkZEV2ZW50IDogcmVtb3ZlRXZlbnRdKHR5cGUsIHJvb3RMaXN0ZW5lciwgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tIC8qLCB1c2VDYXB0dXJlICovKSB7XG4gICAgICAgICAgICAvLyBJRTggYW5kIGJlbG93LCB1c2UgYXR0YWNoRXZlbnQvZGV0YWNoRXZlbnQgYW5kIHdlIGhhdmUgdG8gcGlnZ3ktYmFjayBwcm9wZXJ0eWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgIC8vIHRvIHNpbXVsYXRlIGV2ZW50IGJ1YmJsaW5nIGV0Yy5cbiAgICAgICAgICAgIHZhciBlbnRyeVxuICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICByZWdpc3RyeS5wdXQoZW50cnkgPSBuZXcgUmVnRW50cnkoXG4gICAgICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAgICAgLCBjdXN0b20gfHwgdHlwZVxuICAgICAgICAgICAgICAgICwgZnVuY3Rpb24gKGV2ZW50KSB7IC8vIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgcm9vdExpc3RlbmVyLmNhbGwoZWxlbWVudCwgZXZlbnQsIGN1c3RvbSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAsIHJvb3RMaXN0ZW5lclxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgbnVsbFxuICAgICAgICAgICAgICAgICwgdHJ1ZSAvLyBpcyByb290XG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIGlmIChjdXN0b20gJiYgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPT0gbnVsbCkgZWxlbWVudFsnX29uJyArIGN1c3RvbV0gPSAwXG4gICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5hdHRhY2hFdmVudCgnb24nICsgZW50cnkuZXZlbnRUeXBlLCBlbnRyeS5oYW5kbGVyKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cnkgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgY3VzdG9tIHx8IHR5cGUsIHJvb3RMaXN0ZW5lciwgdHJ1ZSlbMF1cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGVudHJ5KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgLCBvbmNlID0gZnVuY3Rpb24gKHJtLCBlbGVtZW50LCB0eXBlLCBmbiwgb3JpZ2luYWxGbikge1xuICAgICAgICAvLyB3cmFwIHRoZSBoYW5kbGVyIGluIGEgaGFuZGxlciB0aGF0IGRvZXMgYSByZW1vdmUgYXMgd2VsbFxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICBybShlbGVtZW50LCB0eXBlLCBvcmlnaW5hbEZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAsIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9yZ1R5cGUsIGhhbmRsZXIsIG5hbWVzcGFjZXMsIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgdmFyIHR5cGUgICAgID0gb3JnVHlwZSAmJiBvcmdUeXBlLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICAsIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGVsZW1lbnQsIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgcmVtb3ZlZCAgPSB7fVxuICAgICAgICAgICwgaSwgbFxuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoKCFoYW5kbGVyIHx8IGhhbmRsZXJzW2ldLm9yaWdpbmFsID09PSBoYW5kbGVyKSAmJiBoYW5kbGVyc1tpXS5pbk5hbWVzcGFjZXMobmFtZXNwYWNlcykpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmxlbWF0aWMsIHdlIGhhdmUgYSByZWdpc3RyeS5nZXQoKSBhbmQgcmVnaXN0cnkuZGVsKCkgdGhhdFxuICAgICAgICAgICAgLy8gYm90aCBkbyByZWdpc3RyeSBzZWFyY2hlcyBzbyB3ZSB3YXN0ZSBjeWNsZXMgZG9pbmcgdGhpcy4gTmVlZHMgdG8gYmUgcm9sbGVkIGludG9cbiAgICAgICAgICAgIC8vIGEgc2luZ2xlIHJlZ2lzdHJ5LmZvckFsbChmbikgdGhhdCByZW1vdmVzIHdoaWxlIGZpbmRpbmcsIGJ1dCB0aGUgY2F0Y2ggaXMgdGhhdFxuICAgICAgICAgICAgLy8gd2UnbGwgYmUgc3BsaWNpbmcgdGhlIGFycmF5cyB0aGF0IHdlJ3JlIGl0ZXJhdGluZyBvdmVyLiBOZWVkcyBleHRyYSB0ZXN0cyB0b1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IHNjcmV3IGl0IHVwLiBAcnZhZ2dcbiAgICAgICAgICAgIHJlZ2lzdHJ5LmRlbChoYW5kbGVyc1tpXSlcbiAgICAgICAgICAgIGlmICghcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdICYmIGhhbmRsZXJzW2ldW2V2ZW50U3VwcG9ydF0pXG4gICAgICAgICAgICAgIHJlbW92ZWRbaGFuZGxlcnNbaV0uZXZlbnRUeXBlXSA9IHsgdDogaGFuZGxlcnNbaV0uZXZlbnRUeXBlLCBjOiBoYW5kbGVyc1tpXS50eXBlIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgZWFjaCB0eXBlL2VsZW1lbnQgZm9yIHJlbW92ZWQgbGlzdGVuZXJzIGFuZCByZW1vdmUgdGhlIHJvb3RMaXN0ZW5lciB3aGVyZSBpdCdzIG5vIGxvbmdlciBuZWVkZWRcbiAgICAgICAgZm9yIChpIGluIHJlbW92ZWQpIHtcbiAgICAgICAgICBpZiAoIXJlZ2lzdHJ5LmhhcyhlbGVtZW50LCByZW1vdmVkW2ldLnQsIG51bGwsIGZhbHNlKSkge1xuICAgICAgICAgICAgLy8gbGFzdCBsaXN0ZW5lciBvZiB0aGlzIHR5cGUsIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCByZW1vdmVkW2ldLnQsIGZhbHNlLCByZW1vdmVkW2ldLmMsIHVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB1cCBhIGRlbGVnYXRlIGhlbHBlciB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IsIHdyYXAgdGhlIGhhbmRsZXIgZnVuY3Rpb25cbiAgICAsIGRlbGVnYXRlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBmbikge1xuICAgICAgICAvL1RPRE86IGZpbmRUYXJnZXQgKHRoZXJlZm9yZSAkKSBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIG1hdGNoIGFuZCBvbmNlIGZvclxuICAgICAgICAvLyBzZXR0aW5nIGUuY3VycmVudFRhcmdldCwgZml4IHRoaXMgc28gaXQncyBvbmx5IG5lZWRlZCBvbmNlXG4gICAgICAgIHZhciBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgcm9vdCkge1xuICAgICAgICAgICAgICB2YXIgaSwgYXJyYXkgPSBpc1N0cmluZyhzZWxlY3RvcikgPyBzZWxlY3RvckVuZ2luZShzZWxlY3Rvciwgcm9vdCkgOiBzZWxlY3RvclxuICAgICAgICAgICAgICBmb3IgKDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gcm9vdDsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gdGFyZ2V0KSByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLCBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFRhcmdldChlLnRhcmdldCwgdGhpcylcbiAgICAgICAgICAgICAgaWYgKG1hdGNoKSBmbi5hcHBseShtYXRjaCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIF9fYmVhbkRlbCBpc24ndCBwbGVhc2FudCBidXQgaXQncyBhIHByaXZhdGUgZnVuY3Rpb24sIG5vdCBleHBvc2VkIG91dHNpZGUgb2YgQmVhblxuICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IHtcbiAgICAgICAgICAgIGZ0ICAgICAgIDogZmluZFRhcmdldCAvLyBhdHRhY2ggaXQgaGVyZSBmb3IgY3VzdG9tRXZlbnRzIHRvIHVzZSB0b29cbiAgICAgICAgICAsIHNlbGVjdG9yIDogc2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgICAgfVxuXG4gICAgLCBmaXJlTGlzdGVuZXIgPSBXM0NfTU9ERUwgPyBmdW5jdGlvbiAoaXNOYXRpdmUsIHR5cGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy8gbW9kZXJuIGJyb3dzZXJzLCBkbyBhIHByb3BlciBkaXNwYXRjaEV2ZW50KClcbiAgICAgICAgdmFyIGV2dCA9IGRvYy5jcmVhdGVFdmVudChpc05hdGl2ZSA/ICdIVE1MRXZlbnRzJyA6ICdVSUV2ZW50cycpXG4gICAgICAgIGV2dFtpc05hdGl2ZSA/ICdpbml0RXZlbnQnIDogJ2luaXRVSUV2ZW50J10odHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luLCAxKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgICAgfSA6IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBvbGQgYnJvd3NlciB1c2Ugb25wcm9wZXJ0eWNoYW5nZSwganVzdCBpbmNyZW1lbnQgYSBjdXN0b20gcHJvcGVydHkgdG8gdHJpZ2dlciB0aGUgZXZlbnRcbiAgICAgICAgZWxlbWVudCA9IHRhcmdldEVsZW1lbnQoZWxlbWVudCwgaXNOYXRpdmUpXG4gICAgICAgIGlzTmF0aXZlID8gZWxlbWVudC5maXJlRXZlbnQoJ29uJyArIHR5cGUsIGRvYy5jcmVhdGVFdmVudE9iamVjdCgpKSA6IGVsZW1lbnRbJ19vbicgKyB0eXBlXSsrXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIFB1YmxpYyBBUEk6IG9mZigpLCBvbigpLCBhZGQoKSwgKHJlbW92ZSgpKSwgb25lKCksIGZpcmUoKSwgY2xvbmUoKVxuICAgICAgICAqL1xuXG4gICAgICAvKipcbiAgICAgICAgKiBvZmYoZWxlbWVudFssIGV2ZW50VHlwZShzKVssIGhhbmRsZXIgXSwgb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvZmYgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZVNwZWMsIGZuKSB7XG4gICAgICAgIHZhciBpc1R5cGVTdHIgPSBpc1N0cmluZyh0eXBlU3BlYyksXG4gICAgICAgICAgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICAsIG9wdHMgPSBidWlsZE9wdGlvbnMoZGVmYXVsdE9wdHMsIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgLCBrLCB0eXBlLCBuYW1lc3BhY2VzLCBpXG5cbiAgICAgICAgaWYgKGlzVHlwZVN0ciAmJiB0eXBlU3BlYy5pbmRleE9mKCcgJykgPiAwKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCAndDEgdDIgdDMnLCBmbikgb3Igb2ZmKGVsLCAndDEgdDIgdDMnKVxuICAgICAgICAgIHR5cGVTcGVjID0gc3RyMmFycih0eXBlU3BlYylcbiAgICAgICAgICBmb3IgKGkgPSB0eXBlU3BlYy5sZW5ndGg7IGktLTspXG4gICAgICAgICAgICBvZmYoZWxlbWVudCwgdHlwZVNwZWNbaV0sIGZuKVxuICAgICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICB0eXBlID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgaWYgKHR5cGUgJiYgY3VzdG9tRXZlbnRzW3R5cGVdKSB0eXBlID0gY3VzdG9tRXZlbnRzW3R5cGVdLmJhc2VcblxuICAgICAgICBpZiAoIXR5cGVTcGVjIHx8IGlzVHlwZVN0cikge1xuICAgICAgICAgIC8vIG9mZihlbCkgb3Igb2ZmKGVsLCB0MS5ucykgb3Igb2ZmKGVsLCAubnMpIG9yIG9mZihlbCwgLm5zMS5uczIubnMzKVxuICAgICAgICAgIGlmIChuYW1lc3BhY2VzID0gaXNUeXBlU3RyICYmIHR5cGVTcGVjLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSkgbmFtZXNwYWNlcyA9IHN0cjJhcnIobmFtZXNwYWNlcywgJy4nKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGZuLCBuYW1lc3BhY2VzLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0eXBlU3BlYykpIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIGZuKVxuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIG51bGwsIHR5cGVTcGVjLCBudWxsLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCB7IHQxOiBmbjEsIHQyLCBmbjIgfSlcbiAgICAgICAgICBmb3IgKGsgaW4gdHlwZVNwZWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlU3BlYy5oYXNPd25Qcm9wZXJ0eShrKSkgb2ZmKGVsZW1lbnQsIGssIHR5cGVTcGVjW2tdKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uKGVsZW1lbnQsIGV2ZW50VHlwZShzKVssIHNlbGVjdG9yXSwgaGFuZGxlclssIGFyZ3MgXSwgW29wdGlvbnNdKVxuICAgICAgICAqL1xuICAgICwgb24gPSBmdW5jdGlvbihlbGVtZW50LCBldmVudHMsIHNlbGVjdG9yLCBmbikge1xuICAgICAgICB2YXIgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgICAgICB1c2VDYXB0dXJlOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWxGbiwgdHlwZSwgdHlwZXMsIGksIGFyZ3MsIGVudHJ5LCBmaXJzdCwgb3B0c1xuXG4gICAgICAgIC8vVE9ETzogdGhlIHVuZGVmaW5lZCBjaGVjayBtZWFucyB5b3UgY2FuJ3QgcGFzcyBhbiAnYXJncycgYXJndW1lbnQsIGZpeCB0aGlzIHBlcmhhcHM/XG4gICAgICAgIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBldmVudHMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgY2FuJ3QgaGFuZGxlIGRlbGVnYXRlZCBldmVudHNcbiAgICAgICAgICBmb3IgKHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgICAgICAgIG9uLmNhbGwodGhpcywgZWxlbWVudCwgdHlwZSwgZXZlbnRzW3R5cGVdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgICAgICAvLyBkZWxlZ2F0ZWQgZXZlbnRcbiAgICAgICAgICBvcmlnaW5hbEZuID0gZm5cbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDQpXG4gICAgICAgICAgZm4gICAgICAgICA9IGRlbGVnYXRlKHNlbGVjdG9yLCBvcmlnaW5hbEZuLCBzZWxlY3RvckVuZ2luZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzICAgICAgID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpXG4gICAgICAgICAgZm4gICAgICAgICA9IG9yaWdpbmFsRm4gPSBzZWxlY3RvclxuICAgICAgICB9XG5cbiAgICAgICAgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJnc1thcmdzLmxlbmd0aCAtIDFdKVxuICAgICAgICB0eXBlcyA9IHN0cjJhcnIoZXZlbnRzKVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igb25lKCksIHdyYXAgaW4gYSBzZWxmLXJlbW92aW5nIGhhbmRsZXJcbiAgICAgICAgaWYgKHRoaXMgPT09IE9ORSkge1xuICAgICAgICAgIGZuID0gb25jZShvZmYsIGVsZW1lbnQsIGV2ZW50cywgZm4sIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSB0eXBlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAvLyBhZGQgbmV3IGhhbmRsZXIgdG8gdGhlIHJlZ2lzdHJ5IGFuZCBjaGVjayBpZiBpdCdzIHRoZSBmaXJzdCBmb3IgdGhpcyBlbGVtZW50L3R5cGVcbiAgICAgICAgICBmaXJzdCA9IHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgLCB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpIC8vIGV2ZW50IHR5cGVcbiAgICAgICAgICAgICwgZm5cbiAgICAgICAgICAgICwgb3JpZ2luYWxGblxuICAgICAgICAgICAgLCBzdHIyYXJyKHR5cGVzW2ldLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSwgJy4nKSAvLyBuYW1lc3BhY2VzXG4gICAgICAgICAgICAsIGFyZ3NcbiAgICAgICAgICAgICwgZmFsc2UgLy8gbm90IHJvb3RcbiAgICAgICAgICApKVxuICAgICAgICAgIGlmIChlbnRyeVtldmVudFN1cHBvcnRdICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBldmVudCBvZiB0aGlzIHR5cGUgb24gdGhpcyBlbGVtZW50LCBhZGQgcm9vdCBsaXN0ZW5lclxuICAgICAgICAgICAgbGlzdGVuZXIoZWxlbWVudCwgZW50cnkuZXZlbnRUeXBlLCB0cnVlLCBlbnRyeS5jdXN0b21UeXBlLCBvcHRzLnVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogYWRkKGVsZW1lbnRbLCBzZWxlY3Rvcl0sIGV2ZW50VHlwZShzKSwgaGFuZGxlclssIGFyZ3MgXSlcbiAgICAgICAgKlxuICAgICAgICAqIERlcHJlY2F0ZWQ6IGtlcHQgKGZvciBub3cpIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5XG4gICAgICAgICovXG4gICAgLCBhZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnRzLCBmbiwgZGVsZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG9uLmFwcGx5KFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICwgIWlzU3RyaW5nKGZuKVxuICAgICAgICAgICAgICA/IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICAgICAgICA6IFsgZWxlbWVudCwgZm4sIGV2ZW50cywgZGVsZm4gXS5jb25jYXQoYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgNCkgOiBbXSlcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBvbmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqL1xuICAgICwgb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoT05FLCBhcmd1bWVudHMpXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIGZpcmUoZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogVGhlIG9wdGlvbmFsICdhcmdzJyBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LCBpZiBubyAnYXJncycgYXJndW1lbnQgaXMgcHJvdmlkZWRcbiAgICAgICAgKiB0aGVuIHdlIGNhbiB1c2UgdGhlIGJyb3dzZXIncyBET00gZXZlbnQgc3lzdGVtLCBvdGhlcndpc2Ugd2UgdHJpZ2dlciBoYW5kbGVycyBtYW51YWxseVxuICAgICAgICAqL1xuICAgICwgZmlyZSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhcmdzKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IHN0cjJhcnIodHlwZSlcbiAgICAgICAgICAsIGksIGosIGwsIG5hbWVzLCBoYW5kbGVyc1xuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIHR5cGUgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVSZWdleCwgJycpXG4gICAgICAgICAgaWYgKG5hbWVzID0gdHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lcyA9IHN0cjJhcnIobmFtZXMsICcuJylcbiAgICAgICAgICBpZiAoIW5hbWVzICYmICFhcmdzICYmIGVsZW1lbnRbZXZlbnRTdXBwb3J0XSkge1xuICAgICAgICAgICAgZmlyZUxpc3RlbmVyKG5hdGl2ZUV2ZW50c1t0eXBlXSwgdHlwZSwgZWxlbWVudClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9uLW5hdGl2ZSBldmVudCwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBuYW1lc3BhY2UsIGFyZ3VtZW50cyBvciBhIG5vbiBET00gZWxlbWVudFxuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBsaXN0ZW5lcnMgYW5kIG1hbnVhbGx5ICdmaXJlJ1xuICAgICAgICAgICAgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICBhcmdzID0gW2ZhbHNlXS5jb25jYXQoYXJncylcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGogPCBsOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzW2pdLmluTmFtZXNwYWNlcyhuYW1lcykpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5oYW5kbGVyLmFwcGx5KGVsZW1lbnQsIGFyZ3MpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogY2xvbmUoZHN0RWxlbWVudCwgc3JjRWxlbWVudFssIGV2ZW50VHlwZSBdKVxuICAgICAgICAqXG4gICAgICAgICogVE9ETzogcGVyaGFwcyBmb3IgY29uc2lzdGVuY3kgd2Ugc2hvdWxkIGFsbG93IHRoZSBzYW1lIGZsZXhpYmlsaXR5IGluIHR5cGUgc3BlY2lmaWVycz9cbiAgICAgICAgKi9cbiAgICAsIGNsb25lID0gZnVuY3Rpb24gKGVsZW1lbnQsIGZyb20sIHR5cGUpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGZyb20sIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgbCA9IGhhbmRsZXJzLmxlbmd0aFxuICAgICAgICAgICwgaSA9IDBcbiAgICAgICAgICAsIGFyZ3MsIGJlYW5EZWxcblxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmIChoYW5kbGVyc1tpXS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgYXJncyA9IFsgZWxlbWVudCwgaGFuZGxlcnNbaV0udHlwZSBdXG4gICAgICAgICAgICBpZiAoYmVhbkRlbCA9IGhhbmRsZXJzW2ldLmhhbmRsZXIuX19iZWFuRGVsKSBhcmdzLnB1c2goYmVhbkRlbC5zZWxlY3RvcilcbiAgICAgICAgICAgIGFyZ3MucHVzaChoYW5kbGVyc1tpXS5vcmlnaW5hbClcbiAgICAgICAgICAgIG9uLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAsIGJlYW4gPSB7XG4gICAgICAgICAgJ29uJyAgICAgICAgICAgICAgICA6IG9uXG4gICAgICAgICwgJ2FkZCcgICAgICAgICAgICAgICA6IGFkZFxuICAgICAgICAsICdvbmUnICAgICAgICAgICAgICAgOiBvbmVcbiAgICAgICAgLCAnb2ZmJyAgICAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ3JlbW92ZScgICAgICAgICAgICA6IG9mZlxuICAgICAgICAsICdjbG9uZScgICAgICAgICAgICAgOiBjbG9uZVxuICAgICAgICAsICdmaXJlJyAgICAgICAgICAgICAgOiBmaXJlXG4gICAgICAgICwgJ0V2ZW50JyAgICAgICAgICAgICA6IEV2ZW50XG4gICAgICAgICwgJ3NldFNlbGVjdG9yRW5naW5lJyA6IHNldFNlbGVjdG9yRW5naW5lXG4gICAgICAgICwgJ25vQ29uZmxpY3QnICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnRleHRbbmFtZV0gPSBvbGRcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gIC8vIGZvciBJRSwgY2xlYW4gdXAgb24gdW5sb2FkIHRvIGF2b2lkIGxlYWtzXG4gIGlmICh3aW4uYXR0YWNoRXZlbnQpIHtcbiAgICB2YXIgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpLCBlbnRyaWVzID0gcmVnaXN0cnkuZW50cmllcygpXG4gICAgICBmb3IgKGkgaW4gZW50cmllcykge1xuICAgICAgICBpZiAoZW50cmllc1tpXS50eXBlICYmIGVudHJpZXNbaV0udHlwZSAhPT0gJ3VubG9hZCcpIG9mZihlbnRyaWVzW2ldLmVsZW1lbnQsIGVudHJpZXNbaV0udHlwZSlcbiAgICAgIH1cbiAgICAgIHdpbi5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICAgICAgd2luLkNvbGxlY3RHYXJiYWdlICYmIHdpbi5Db2xsZWN0R2FyYmFnZSgpXG4gICAgfVxuICAgIHdpbi5hdHRhY2hFdmVudCgnb251bmxvYWQnLCBjbGVhbnVwKVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSBzZWxlY3RvciBlbmdpbmUgdG8gaW50ZXJuYWwgZGVmYXVsdCAocVNBIG9yIHRocm93IEVycm9yKVxuICBzZXRTZWxlY3RvckVuZ2luZSgpXG5cbiAgcmV0dXJuIGJlYW5cbn0pO1xuIiwiXHJcbi8qKlxyXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxyXG4gKi9cclxuXHJcbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xyXG4gIG1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxyXG4gKlxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XHJcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XHJcbn07XHJcblxyXG4vKipcclxuICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9ialxyXG4gKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAqIEBhcGkgcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1peGluKG9iaikge1xyXG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xyXG4gICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldO1xyXG4gIH1cclxuICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG4vKipcclxuICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub24gPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxyXG4gICAgLnB1c2goZm4pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxyXG4gKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICBmdW5jdGlvbiBvbigpIHtcclxuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XHJcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gIH1cclxuXHJcbiAgb24uZm4gPSBmbjtcclxuICB0aGlzLm9uKGV2ZW50LCBvbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcclxuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG5cclxuICAvLyBhbGxcclxuICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gc3BlY2lmaWMgZXZlbnRcclxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XHJcblxyXG4gIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnNcclxuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcclxuICB2YXIgY2I7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGNiID0gY2FsbGJhY2tzW2ldO1xyXG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcclxuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtNaXhlZH0gLi4uXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcclxuICAgICwgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuXHJcbiAgaWYgKGNhbGxiYWNrcykge1xyXG4gICAgY2FsbGJhY2tzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xyXG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmhhc0xpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcclxufTtcclxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCdjb21wb3NlLXRvb2xib3gnKSxcbiAgICBFdmVudCAgID0gdG9vbGJveC5ldmVudCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIGRpYWxvZ0VsLFxuICAgIGZvY3VzZWRFbCxcbiAgICBkZWZhdWx0cyA9IHtcbiAgICAgIG9uU2hvdzogZnVuY3Rpb24oKXt9LFxuICAgICAgb25DbG9zZTogZnVuY3Rpb24oKXt9LFxuICAgICAgYnV0dG9uVGVtcGxhdGU6ICc8YnV0dG9uIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvblwiPjwvYnV0dG9uPicsXG4gICAgICBkaWFsb2dUZW1wbGF0ZTogJzxkaXYgcm9sZT1cImRpYWxvZ1wiIGNsYXNzPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZGlhbG9nLXRpdGxlXCIgYXJpYS1kZXNjcmliZWRieT1cImRpYWxvZy1kZXNjcmlwdGlvblwiPlxcXG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctY2FyZFwiPlxcXG4gICAgPGhlYWRlciBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cXFxuICAgICAgPGgyIGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgaWQ9XCJkaWFsb2ctdGl0bGVcIj48L2gyPlxcXG4gICAgPC9oZWFkZXI+XFxcbiAgICA8cCBjbGFzcz1cImRpYWxvZy1kZXNjcmlwdGlvblwiIGlkPVwiZGlhbG9nLWRlc2NyaXB0aW9uXCI+PC9wPlxcXG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1yZXNwb25zZVwiPlxcXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWFjdGlvbnNcIj48L2Rpdj5cXFxuICAgIDwvZGl2PlxcXG4gIDwvZGl2PlxcXG48L2Rpdj4nfVxuXG5mdW5jdGlvbiBzaG93KCBvcHRzICkge1xuICBpZiAoIHR5cGVvZiBvcHRzICE9ICdvYmplY3QnICkgeyByZXR1cm4gY29uc29sZS5lcnJvcignSW52YWxpZCBvcHRpb25zIHBhc3NlZCBmb3IgRGlhbG9nJywgb3B0cykgfVxuXG4gIGlmICggIW9wdHMudGl0bGUgKSB7IHJldHVybiBjb25zb2xlLmVycm9yKCdEaWFsb2cgbXVzdCBoYXZlIGEgdGl0bGUnLCBvcHRzKSB9XG5cbiAgZm9jdXNlZEVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICBvcHRpb25zID0gb3B0c1xuICBkaWFsb2dFbCA9IHRlbXBsYXRlKCBkZWZhdWx0cy5kaWFsb2dUZW1wbGF0ZSApXG5cbiAgYWRkVGV4dCgpXG4gIGFkZEJ1dHRvbnMoKVxuXG4gIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCAnYWZ0ZXJiZWdpbicsIGRpYWxvZ0VsIClcblxuICBsaXN0ZW4oKVxuXG4gIGRlZmF1bHRzLm9uU2hvdygpXG59XG5cbmZ1bmN0aW9uIGxpc3RlbigpIHtcblxuICBFdmVudC5vbiggZGlhbG9nRWwsICdjbGljaycsICcuZGlhbG9nLWNvbnRpbnVlJywgY29udGludWVBY3Rpb24gKVxuICBFdmVudC5vbiggZGlhbG9nRWwsICdjbGljaycsICcuZGlhbG9nLWNhbmNlbCcsIGNhbmNlbEFjdGlvbiApXG4gIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBkaWFsb2dFbCwgdGFiLCB0cnVlIClcblxuICBFdmVudC5rZXlPbiggICd0YWInLCAgICdkaWFsb2cnLCB0YWIgKVxuICBFdmVudC5rZXlPbmUoICdlbnRlcicsICdkaWFsb2cnLCBjb250aW51ZUFjdGlvbiApXG4gIEV2ZW50LmtleU9uZSggJ2VzYycsICAgJ2RpYWxvZycsIGNhbmNlbEFjdGlvbiApXG5cbiAgRXZlbnQua2V5LnNldFNjb3BlKCAnZGlhbG9nJyApXG59XG5cbi8vIEFkZCB0aXRsZSBhbmQgZGVzY3JpcHRpb24gZnJvbSBvcHRpb25zXG5mdW5jdGlvbiBhZGRUZXh0KCkge1xuXG4gIC8vIEFkZCB0aXRsZVxuICBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCAnI2RpYWxvZy10aXRsZScgKS5pbm5lckhUTUwgPSBvcHRpb25zLnRpdGxlXG5cbiAgLy8gQWRkIG9wdGlvbmFsIGRlc2NyaXB0aW9uXG4gIHZhciBkZXNjcmlwdGlvbkVsID0gZGlhbG9nRWwucXVlcnlTZWxlY3RvciggJyNkaWFsb2ctZGVzY3JpcHRpb24nIClcblxuICBpZiAoIG9wdGlvbnMuZGVzY3JpcHRpb24gKSB7XG4gICAgZGVzY3JpcHRpb25FbC5pbm5lckhUTUwgPSBvcHRpb25zLmRlc2NyaXB0aW9uXG4gIH0gZWxzZSB7XG4gICAgZGVzY3JpcHRpb25FbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBkZXNjcmlwdGlvbkVsIClcbiAgICBkaWFsb2dFbC5yZW1vdmVBdHRyaWJ1dGUoICdhcmlhLWxhYmVsbGVkYnknIClcbiAgfVxuXG59XG5cbi8vIEFkZCBDYW5jZWwgYW5kIENvbnRpbnVlIGJ1dHRvbnMgKGlmIG5lY2Vzc2FyeSlcbmZ1bmN0aW9uIGFkZEJ1dHRvbnMoKSB7XG5cbiAgaWYgKCBvcHRpb25zLmNvbnRpbnVlIHx8IG9wdGlvbnMuZm9sbG93IHx8IG9wdGlvbnMuc3VibWl0ICkge1xuXG4gICAgdmFyIGNvbnRpbnVlQnV0dG9uID0gdGVtcGxhdGUoIGRlZmF1bHRzLmJ1dHRvblRlbXBsYXRlIClcbiAgICBjb250aW51ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGlhbG9nLWNvbnRpbnVlJyApXG4gICAgaWYgKCBvcHRpb25zLmRlc3RydWN0aXZlICkgeyBjb250aW51ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGVzdHJ1Y3RpdmUnICkgfVxuICAgIGNvbnRpbnVlQnV0dG9uLmlubmVySFRNTCA9IG9wdGlvbnMuY29udGludWUgfHwgJ0NvbnRpbnVlJ1xuXG4gICAgZGlhbG9nRWwucXVlcnlTZWxlY3RvcignLmRpYWxvZy1hY3Rpb25zJykuYXBwZW5kQ2hpbGQoIGNvbnRpbnVlQnV0dG9uIClcblxuICAgIG9wdGlvbnMuY2FuY2VsID0gb3B0aW9ucy5jYW5jZWwgfHwgJ0NhbmNlbCdcbiAgfVxuXG4gIHZhciBjYW5jZWxCdXR0b24gPSB0ZW1wbGF0ZSggZGVmYXVsdHMuYnV0dG9uVGVtcGxhdGUgKVxuXG4gIGNhbmNlbEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnZGlhbG9nLWNhbmNlbCcgKVxuICBjYW5jZWxCdXR0b24uaW5uZXJIVE1MID0gb3B0aW9ucy5jYW5jZWwgfHwgKCBvcHRpb25zLmNvbnRpbnVlID8gJ0NhbmNlbCcgOiAnT0snIClcblxuICBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCcuZGlhbG9nLWFjdGlvbnMnKS5hcHBlbmRDaGlsZCggY2FuY2VsQnV0dG9uIClcblxufVxuXG4vLyBJbiBhIG1vZGFsIHdpbmRvdywgYHRhYmAgbXVzdCBjeWNsZSBiZXR3ZWVuIGVsZW1lbnRzIGluIHRoZSBtb2RhbC5cbmZ1bmN0aW9uIHRhYiggZXZlbnQgKSB7XG5cbiAgLy8gRmluZCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzIGluIHRoZSBkaWFsb2cgY2FyZFxuICB2YXIgZm9jdXNhYmxlICAgPSBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksIHRleHRhcmVhLCBzZWxlY3QsIGJ1dHRvbicpLFxuICAgICAgbGFzdCAgICAgICAgPSBmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdLFxuICAgICAgZm9jdXNlZCAgICAgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgLy8gSWYgZm9jdXNlZCBvbiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCwgdGFiIHRvIHRoZSBmaXJzdCBlbGVtZW50LlxuICBpZiAoIGZvY3VzZWQgPT0gbGFzdCApIHtcbiAgICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuICAgIGZvY3VzYWJsZVswXS5mb2N1cygpXG4gIH1cblxuICAvLyBGb2N1cyBvbiB0aGUgbGFzdCBlbGVtZW50IGlmIHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIGRpYWxvZ1xuICBpZiAoICFmb2N1c2VkIHx8ICF0b29sYm94LmNoaWxkT2YoIGZvY3VzZWQsIGRpYWxvZ0VsICkgKSB7XG4gICAgbGFzdC5mb2N1cygpXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckJ1dHRvbiggc2VsZWN0b3IgKSB7XG4gIHZhciBidXR0b24gPSBkaWFsb2dFbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApXG5cbiAgYnV0dG9uLmZvY3VzKClcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnIClcbn1cblxuZnVuY3Rpb24gY2FuY2VsQWN0aW9uIChldmVudCkge1xuICBpZiAoZXZlbnQpeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cblxuICB0cmlnZ2VyQnV0dG9uKCAnLmRpYWxvZy1jYW5jZWwnIClcblxuICBjbG9zZSggb3B0aW9ucy5vbkRpc21pc3MgKVxufVxuXG5mdW5jdGlvbiBjb250aW51ZUFjdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuXG4gIHRyaWdnZXJCdXR0b24oICcuZGlhbG9nLWNvbnRpbnVlJyApXG5cbiAgY2xvc2UoIGZ1bmN0aW9uKCkge1xuICAgIGlmICggb3B0aW9ucy5zdWJtaXQgKSB7XG5cbiAgICAgIC8vIElzIGl0IGFuIGVsZW1lbnQgb3IgYSBzdHJpbmdcbiAgICAgIHZhciBmb3JtID0gKCBvcHRpb25zLnN1Ym1pdC5ub2RlVHlwZSA/IG9wdGlvbnMuc3VibWl0IDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25zLnN1Ym1pdCkgKVxuXG4gICAgICBFdmVudC5zdWJtaXQoIGZvcm0gKVxuXG4gICAgfSBlbHNlIGlmICggb3B0aW9ucy5mb2xsb3cgKSB7XG4gICAgICBpZiggb3B0aW9ucy5mb2xsb3cubWF0Y2goL15odHRwcz86XFwvXFwvLykgKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBvcHRpb25zLmZvbGxvd1xuICAgICAgZWxzZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG9wdGlvbnMuZm9sbG93XG4gICAgfVxuXG4gICAgaWYgKCBvcHRpb25zLm9uQ29uZmlybSApIG9wdGlvbnMub25Db25maXJtKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gY2xvc2UoIGNhbGxiYWNrICl7XG4gIGRpYWxvZ0VsLmNsYXNzTGlzdC5hZGQoICdkaXNtaXNzJyApXG5cbiAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGRpYWxvZ0VsLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgaWYgKCBjYWxsYmFjayApIHsgY2FsbGJhY2soKSB9XG4gICAgcmVtb3ZlKClcbiAgfSwgdHJ1ZSlcbn1cblxuXG5mdW5jdGlvbiByZW1vdmUoKXtcblxuICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICBFdmVudC5rZXkuZGVsZXRlU2NvcGUoICdkaWFsb2cnIClcbiAgRXZlbnQub2ZmKCBkaWFsb2dFbCwgJ2NsaWNrJyApXG5cbiAgLy8gUmVtb3ZlIHRoZSBlbGVtZW50XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpYWxvZ0VsIClcblxuICAvLyBGaXJlIG9uIGNsb3NlIGNhbGxiYWNrXG4gIGRlZmF1bHRzLm9uQ2xvc2UoKVxuXG4gIC8vIFJldHVybiBmb2N1cyB0byB0aGUgZm9jdXNlZCBlbGVtZW50IGJlZm9yZSB0aGUgZGlhbG9nIHdhcyBzaG93blxuICBmb2N1c2VkRWwuZm9jdXMoKVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZSggaHRtbCApIHtcbiAgd3JhcC5pbm5lckhUTUwgPSBodG1sXG4gIHZhciBlbCA9IHdyYXAuZmlyc3RDaGlsZFxuICB3cmFwLnJlbW92ZUNoaWxkKCBlbCApXG4gIHJldHVybiBlbFxufVxuXG4vLyBHZXQgYWxsIG9wdGlvbnMgZnJvbSBkYXRhLWRpYWxvZy0qXG5mdW5jdGlvbiBleHRyYWN0T3B0aW9ucyggZWwgKSB7XG4gIHZhciBvcHRzID0ge1xuICAgIGlmOiAgICAgICAgICAgZWwuZGF0YXNldC5kaWFsb2dJZixcbiAgICBmb2xsb3c6ICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nRm9sbG93LFxuICAgIHRpdGxlOiAgICAgICAgZWwuZGF0YXNldC5kaWFsb2dUaXRsZSxcbiAgICBkZXNjcmlwdGlvbjogIGVsLmRhdGFzZXQuZGlhbG9nRGVzY3JpcHRpb24sXG4gICAgc3VibWl0OiAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ1N1Ym1pdCxcbiAgICBjb250aW51ZTogICAgIGVsLmRhdGFzZXQuZGlhbG9nQ29udGludWUsXG4gICAgY2FuY2VsOiAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ0NhbmNlbCxcbiAgICBjb25maXJtOiAgICAgIGVsLmRhdGFzZXQuZGlhbG9nQ29uZmlybSxcbiAgICBkZXN0cnVjdGl2ZTogIGVsLmRhdGFzZXQuZGlhbG9nRGVzdHJ1Y3RpdmVcbiAgfVxuXG4gIGlmICggb3B0cy5jb25maXJtICkge1xuICAgIG9wdHMuY29udGludWUgPSBvcHRzLmNvbnRpbnVlIHx8IGVsLmlubmVySFRNTFxuICAgIG9wdHMuc3VibWl0ICAgPSBvcHRzLnN1Ym1pdCAgIHx8IHRvb2xib3guZ2V0Q2xvc2VzdCggZWwsICdmb3JtJyApXG4gIH1cblxuICByZXR1cm4gb3B0c1xufVxuXG5FdmVudC5yZWFkeShmdW5jdGlvbigpIHtcblxuICAvLyBUcmlnZ2VyIGlzIGNhbGxlZCB3aGVuIGEgRE9NIGVsZW1lbnQgd2l0aCBkYXRhLXRyaWdnZXI9ZGlhbG9nIGlzIGNsaWNrZWRcbiAgLy8gVGhlIGRhdGEgYXR0cmlidXRlcyBhcmUgdXNlZCBhcyBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIGRpYWxvZ1xuICAvL1xuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1kaWFsb2ctdGl0bGVdJywgZnVuY3Rpb24oZXZlbnQpe1xuICAgIHZhciBvcHRzID0gZXh0cmFjdE9wdGlvbnMoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKVxuICAgIGlmICggIW9wdHMuaWYgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRzLmlmKSApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICBzaG93KCBvcHRzIClcbiAgICB9XG4gIH0pXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2hvdzogc2hvdyxcbiAgY2FuY2VsOiBjYW5jZWxBY3Rpb24sXG4gIGNvbnRpbnVlOiBjb250aW51ZUFjdGlvbixcbiAgZGVmYXVsdHM6IGRlZmF1bHRzXG59XG4iLCIvLyBTaGltc1xucmVxdWlyZSggJy4vbGliL3NoaW1zL19jbGFzc2xpc3QnIClcbnZhciBtZXJnZSAgICA9IHJlcXVpcmUoICcuL2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbicgKSxcbiAgICBldmVudCAgICA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIGx1eG9uICAgID0gcmVxdWlyZSggJ2x1eG9uJyApLFxuICAgIHRpbWUgICAgID0gbWVyZ2UocmVxdWlyZSggJy4vbGliL3RpbWUnICksIGx1eG9uKSxcbiAgICBzY3JvbGxUbyA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGx0bycgKSxcbiAgICBmcm9tVG9wICA9IHJlcXVpcmUoICcuL2xpYi9mcm9tdG9wJyApLFxuICAgIGVhc2UgICAgID0gcmVxdWlyZSggJy4vbGliL2Vhc2UnIClcblxudmFyIHRvb2xib3ggPSB7XG5cbiAgZXZlbnQ6IGV2ZW50LFxuICBzY3JvbGxUbzogc2Nyb2xsVG8sXG4gIGZyb21Ub3A6IGZyb21Ub3AsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZWFzZTogZWFzZSxcbiAgdGltZTogdGltZSxcblxuICAvLyBHZXQgY2xvc2VzdCBET00gZWxlbWVudCB1cCB0aGUgdHJlZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXRDbG9zZXN0OiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIGVsLCBzZWxlY3RvciApICkgcmV0dXJuIGVsXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIGNoaWxkT2Y6IGZ1bmN0aW9uICggZWwsIHBhcmVudCApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbCA9PSBwYXJlbnQgKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgLy8gR2V0IG5leHQgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0TmV4dDogZnVuY3Rpb24oIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApICkgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvLyBNYXRjaGVzIHNlbGVjdG9yIGZ1bmN0aW9uXG4gIC8vIEByZWZlcmVuY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICBtYXRjaGVzOiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gKCBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm9NYXRjaGVzU2VsZWN0b3IgKS5jYWxsKCBlbCwgc2VsZWN0b3IgKTtcbiAgfSxcblxuICB3b3JkQ291bnQ6IGZ1bmN0aW9uKCBzdHIgKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goIC9cXFMrL2cgKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbiAgfSxcblxuICAvLyBFYXN5IGFjY2VzcyB0byBzbGljZSBmb3IgY29udmVydGluZyBvYmplY3RzIGludG8gYXJyYXlzIG9mIHZhbHVlcy5cbiAgc2xpY2U6IGZ1bmN0aW9uKCBvYmosIGNvdW50ICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggb2JqLCBjb3VudCApXG4gIH0sXG5cbiAgZWFjaDogZnVuY3Rpb24oIGNvbGxlY3Rpb24sIGNhbGxiYWNrICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApXG4gIH0sXG5cbiAgZm9ybURhdGE6IGZ1bmN0aW9uKCByb290RWwgKSB7XG4gICAgdmFyIGZvcm1EYXRhICA9IG5ldyBGb3JtRGF0YSgpLFxuICAgICAgICBmaWVsZHMgPSByb290RWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W25hbWVdJyApXG5cbiAgICAvLyBMb29wIG92ZXIgZmllbGRzXG4gICAgdG9vbGJveC5lYWNoKCBmaWVsZHMsIGZ1bmN0aW9uKCBmaWVsZCApIHtcbiAgICAgIC8vIEFwcGVuZCBjdXJyZW50IGZpZWxk4oCZcyBuYW1lL3ZhbHVlIHRvIG5ldyBmb3JtRGF0YSBvYmplY3RcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCggZmllbGQubmFtZSwgZmllbGQudmFsdWUgKTtcbiAgICB9KVxuXG4gICAgLy8gVGhlbiByZXR1cm4gc2FpZCBmb3JtRGF0YSBvYmplY3RcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbGJveFxuIiwiLy8gZWFzaW5nIGZ1bmN0aW9ucyBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbnZhciBlYXNlID0ge1xuXG4gIGluT3V0UXVhZDogZnVuY3Rpb24gKHQsIGIsIGMsIGQpIHtcbiAgICB0IC89IGQvMlxuICAgIGlmICh0IDwgMSkgeyByZXR1cm4gYy8yKnQqdCArIGIgfVxuICAgIHQtLVxuICAgIHJldHVybiAtYy8yICogKHQqKHQtMikgLSAxKSArIGJcbiAgfSxcblxuICBpbk91dEN1YmljOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuXHR0IC89IGQvMjtcblx0aWYgKHQgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjtcblx0dCAtPSAyO1xuXHRyZXR1cm4gYy8yKih0KnQqdCArIDIpICsgYjtcbiAgfSxcblxuICBpbk91dFF1aW50OiBmdW5jdGlvbih0LCBiLCBjLCBkKSB7XG4gICAgdmFyIHRzID0gKHQvPWQpKnQsXG4gICAgdGMgPSB0cyp0O1xuICAgIHJldHVybiBiK2MqKDYqdGMqdHMgKyAtMTUqdHMqdHMgKyAxMCp0Yyk7XG4gIH0sXG5cbiAgaW5PdXRDaXJjOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yO1xuICAgIGlmICh0IDwgMSkgcmV0dXJuIC1jLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpIC0gMSkgKyBiO1xuICAgIHQgLT0gMjtcbiAgICByZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSArIDEpICsgYjtcbiAgfVxuXG59XG5cbmVhc2UuZGVmYXVsdCA9IGVhc2UuaW5PdXRRdWFkXG5cbm1vZHVsZS5leHBvcnRzID0gZWFzZVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggZWwgKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKCBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQgKTtcbn1cbiIsInZhciBlYXNlICAgID0gcmVxdWlyZSggJy4vZWFzZScgKVxudmFyIGZyb21Ub3AgPSByZXF1aXJlKCAnLi9mcm9tdG9wJyApXG5cbmZ1bmN0aW9uIG1vdmUoYW1vdW50KSB7XG5cbiAgLy8gU2Nyb2xsIGFsbCBiZWNhdXNlIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgaXMgc3RpbGwgZXhwaXJlbWVudGFsXG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSBhbW91bnQ7XG4gIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gYW1vdW50O1xuXG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxUbyh0bywgY2FsbGJhY2ssIGR1cmF0aW9uKSB7XG5cbiAgLy8gTWFraW5nIGFyZ3MgZmxleGlibGVcbiAgLy9cbiAgLy8gQWxsb3cgZm9yIGVsZW1lbnQgb3IgeS1jb29yZGluYXRlc1xuICBpZiggdHlwZW9mKCB0byApID09PSAnb2JqZWN0JyApIHsgdG8gPSBmcm9tVG9wKCB0byApIH1cblxuICAvLyBBY2NlcHQgZHVyYXRpb24gYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICBpZiggdHlwZW9mKCBjYWxsYmFjayApID09PSAnbnVtYmVyJyApIHsgZHVyYXRpb24gPSBjYWxsYmFjazsgY2FsbGJhY2sgPSBudWxsIH1cblxuICAvLyBEZWZhdWx0IGR1cmF0aW9uID0gNTAwXG4gIGR1cmF0aW9uID0gKCB0eXBlb2YoIGR1cmF0aW9uICkgPT09ICd1bmRlZmluZWQnICkgPyA1MDAgOiBkdXJhdGlvblxuXG4gIHZhciBzdGFydCA9IHBvc2l0aW9uKCksXG4gICAgY2hhbmdlID0gdG8gLSBzdGFydCxcbiAgICBjdXJyZW50VGltZSA9IDAsXG4gICAgaW5jcmVtZW50ID0gMjA7XG5cblxuICB2YXIgYW5pbWF0ZVNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gaW5jcmVtZW50IHRoZSB0aW1lXG4gICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50XG5cbiAgICAvLyBmaW5kIHRoZSB2YWx1ZSB3aXRoIHRoZSBxdWFkcmF0aWMgaW4tb3V0IGVhc2luZyBmdW5jdGlvblxuICAgIHZhciB2YWwgPSBlYXNlLmRlZmF1bHQoY3VycmVudFRpbWUsIHN0YXJ0LCBjaGFuZ2UsIGR1cmF0aW9uKVxuXG4gICAgLy8gbW92ZSB0aGUgZG9jdW1lbnQuYm9keVxuICAgIG1vdmUodmFsKTtcblxuICAgIC8vIGRvIHRoZSBhbmltYXRpb24gdW5sZXNzIGl0cyBvdmVyXG4gICAgaWYgKCBjdXJyZW50VGltZSA8IGR1cmF0aW9uICkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRlU2Nyb2xsIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBjYWxsYmFjayAmJiB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVTY3JvbGwoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjcm9sbFRvXG4iLCIvKipcbiAqIENsYXNzTGlzdCBwb2x5ZmlsbFxuICogQ3Jvc3MtYnJvd3NlciBmdWxsIGVsZW1lbnQuY2xhc3NMaXN0IGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9jbGFzc0xpc3QuanMvYmxvYi9tYXN0ZXIvY2xhc3NMaXN0LmpzXG4gKiBAYXV0aG9yIEVsaSBHcmV5IC0gaHR0cDovL2VsaWdyZXkuY29tXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCAnZG9jdW1lbnQnIGluIHNlbGYgKSB7XG5cbiAgLy8gRnVsbCBwb2x5ZmlsbCBmb3IgYnJvd3NlcnMgd2l0aCBubyBjbGFzc0xpc3Qgc3VwcG9ydFxuICBpZiAoICEoICdjbGFzc0xpc3QnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApICkgKSB7XG5cbiAgICAoIGZ1bmN0aW9uKCB2aWV3ICkge1xuXG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgaWYgKCAhKCAnRWxlbWVudCcgaW4gdmlldyApICkgcmV0dXJuO1xuXG4gICAgdmFyXG4gICAgICBjbGFzc0xpc3RQcm9wID0gJ2NsYXNzTGlzdCcsXG4gICAgICBwcm90b1Byb3AgICAgID0gJ3Byb3RvdHlwZScsXG4gICAgICBlbGVtQ3RyUHJvdG8gID0gdmlldy5FbGVtZW50WyBwcm90b1Byb3AgXSxcbiAgICAgIG9iakN0ciAgICAgICAgPSBPYmplY3QsXG5cbiAgICAgIHN0clRyaW0gPSBTdHJpbmdbIHByb3RvUHJvcCBdLnRyaW0gfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoIC9eXFxzK3xcXHMrJC9nLCAnJyApO1xuICAgICAgfSxcblxuICAgICAgYXJySW5kZXhPZiA9IEFycmF5WyBwcm90b1Byb3AgXS5pbmRleE9mIHx8IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgIGlmICggaSBpbiB0aGlzICYmIHRoaXNbIGkgXSA9PT0gaXRlbSApIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9LFxuXG4gICAgICBET01FeCA9IGZ1bmN0aW9uKCB0eXBlLCBtZXNzYWdlICkge1xuICAgICAgICB0aGlzLm5hbWUgICAgPSB0eXBlO1xuICAgICAgICB0aGlzLmNvZGUgICAgPSBET01FeGNlcHRpb25bIHR5cGUgXTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0sXG5cbiAgICAgIGNoZWNrVG9rZW5BbmRHZXRJbmRleCA9IGZ1bmN0aW9uKCBjbGFzc0xpc3QsIHRva2VuICkge1xuICAgICAgICBpZiAoIHRva2VuID09PSAnJyApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXG4gICAgICAgICAgICAnU1lOVEFYX0VSUicsXG4gICAgICAgICAgICAnQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAvXFxzLy50ZXN0KCB0b2tlbiApICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdJTlZBTElEX0NIQVJBQ1RFUl9FUlInLFxuICAgICAgICAgICAgJ1N0cmluZyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoIGNsYXNzTGlzdCwgdG9rZW4gKTtcbiAgICAgIH0sXG5cbiAgICAgIENsYXNzTGlzdCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgICB2YXIgdHJpbW1lZENsYXNzZXMgPSBzdHJUcmltLmNhbGwoIGVsZW0uZ2V0QXR0cmlidXRlKCAnY2xhc3MnICkgfHwgJycgKSxcbiAgICAgICAgICAgIGNsYXNzZXMgPSB0cmltbWVkQ2xhc3NlcyA/IHRyaW1tZWRDbGFzc2VzLnNwbGl0KCAvXFxzKy8gKSA6IFtdO1xuXG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCAnY2xhc3MnLCB0aGlzLnRvU3RyaW5nKCkgKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGNsYXNzTGlzdFByb3RvID0gQ2xhc3NMaXN0WyBwcm90b1Byb3AgXSA9IFtdLFxuXG4gICAgICBjbGFzc0xpc3RHZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0xpc3QoIHRoaXMgKTtcbiAgICAgIH07XG5cbiAgICBET01FeFsgcHJvdG9Qcm9wIF0gPSBFcnJvclsgcHJvdG9Qcm9wIF07XG5cbiAgICBjbGFzc0xpc3RQcm90by5pdGVtID0gZnVuY3Rpb24oIGkgKSB7XG4gICAgICByZXR1cm4gdGhpc1sgaSBdIHx8IG51bGw7XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLmNvbnRhaW5zID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG4gICAgICByZXR1cm4gY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApICE9PSAtMTtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXJcbiAgICAgICAgdG9rZW5zICA9IGFyZ3VtZW50cyxcbiAgICAgICAgaXRlciAgICA9IDAsXG4gICAgICAgIGxlbiAgICAgPSB0b2tlbnMubGVuZ3RoLFxuICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG4gICAgICAgIHRva2VuO1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaWYgKCBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgPT09IC0xICkge1xuICAgICAgICAgIHRoaXMucHVzaCggdG9rZW4gKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGluZGV4O1xuXG4gICAgICBkbyB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zWyBpdGVyIF0gKyAnJztcbiAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG5cbiAgICAgICAgd2hpbGUgKCBpbmRleCAhPT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5zcGxpY2UoIGluZGV4LCAxICk7XG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCArK2l0ZXIgPCBsZW4gKTtcblxuICAgICAgaWYgKCB1cGRhdGVkICkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8udG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgIHRva2VuICs9ICcnO1xuXG4gICAgICB2YXJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jb250YWlucyggdG9rZW4gKSxcbiAgICAgICAgbWV0aG9kID0gcmVzdWx0ID8gZm9yY2UgIT09IHRydWUgJiYgJ3JlbW92ZScgOiBmb3JjZSAhPT0gZmFsc2UgJiYgJ2FkZCc7XG5cbiAgICAgIGlmICggbWV0aG9kICkge1xuICAgICAgICB0aGlzWyBtZXRob2QgXSggdG9rZW4gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBmb3JjZSA9PT0gdHJ1ZSB8fCBmb3JjZSA9PT0gZmFsc2UgKSB7XG4gICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuam9pbiggJyAnICk7XG4gICAgfTtcblxuICAgIGlmICggb2JqQ3RyLmRlZmluZVByb3BlcnR5ICkge1xuICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuICAgICAgICAgIGdldCAgICAgICAgICA6IGNsYXNzTGlzdEdldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlICAgOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZSA6IHRydWVcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgfVxuXG4gICAgICBjYXRjaCAoIGV4ICkge1xuICAgICAgICBpZiAoIGV4Lm51bWJlciA9PT0gLTB4N0ZGNUVDNTQgKSB7XG4gICAgICAgICAgY2xhc3NMaXN0UHJvcERlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSggZWxlbUN0clByb3RvLCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RQcm9wRGVzYyApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCBvYmpDdHJbIHByb3RvUHJvcCBdLl9fZGVmaW5lR2V0dGVyX18gKSB7XG4gICAgICBlbGVtQ3RyUHJvdG8uX19kZWZpbmVHZXR0ZXJfXyggY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyICk7XG4gICAgfVxuXG4gICAgfSggc2VsZiApKTtcblxuICB9IGVsc2Uge1xuXG4gICAgKCBmdW5jdGlvbigpIHtcblxuICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnXycgKTtcblxuICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCggJ2MxJywgJ2MyJyApO1xuXG4gICAgICBpZiAoICF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoICdjMicgKSApIHtcbiAgICAgICAgdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uKCBtZXRob2QgKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZVsgbWV0aG9kIF07XG5cbiAgICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB0b2tlbiApIHtcbiAgICAgICAgICAgIHZhciBpLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3VtZW50c1sgaSBdO1xuICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKCB0aGlzLCB0b2tlbiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNyZWF0ZU1ldGhvZCggJ2FkZCcgKTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAncmVtb3ZlJyApO1xuICAgICAgfVxuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCAnYzMnLCBmYWxzZSApO1xuXG4gICAgICBpZiAoIHRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MzJyApICkge1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO1xuXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oIHRva2VuLCBmb3JjZSApIHtcbiAgICAgICAgICBpZiAoIDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKCB0b2tlbiApID09PSAhZm9yY2UgKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblxuICAgIH0oKSk7XG5cbiAgfVxufVxuIiwiLyoqXG4gKiBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgT2JqZWN0LmFzc2lnbiBpbXBsZW1lbnRhdGlvblxuICogQHNvdXJjZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduI1BvbHlmaWxsXG4gKiBAbGljZW5zZSBNSVRcbiAqKi9cblxuaWYgKCB0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPSAnZnVuY3Rpb24nICkge1xuICAoIGZ1bmN0aW9uKCkge1xuICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiggdGFyZ2V0ICkge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuICAgICAgZm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrICkge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuICAgICAgICBpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7XG4gICAgICAgICAgICBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG4gICAgICAgICAgICAgIG91dHB1dFsgbmV4dEtleSBdID0gc291cmNlWyBuZXh0S2V5IF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG4gIH0pKCk7XG59XG5cbi8vIE1ha2UgaXQgZWFzeSB0byBtZXJnZSBvYmplY3RzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlIG9yaWdpbmFsIG9iamVjdHNcbnZhciBtZXJnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXJncyA9IFt7fV0uY29uY2F0KCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseSggdGhpcywgYXJncyApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2VcbiIsInZhciBEYXRlVGltZSA9IHJlcXVpcmUoICdsdXhvbicgKS5EYXRlVGltZVxuXG5mdW5jdGlvbiBpc0JlZm9yZSggZGF0ZSwgZW5kICkge1xuICBlbmQgPSBwYXJzZSggZW5kIClcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgcmV0dXJuIGRhdGUgPT0gRGF0ZVRpbWUubWluKCBlbmQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0FmdGVyKCBkYXRlLCBzdGFydCApIHtcbiAgc3RhcnQgPSBwYXJzZSggc3RhcnQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlIClcbn1cblxuZnVuY3Rpb24gaXNCZXR3ZWVuKCBkYXRlLCBkYXRlMSwgZGF0ZTIgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIGRhdGUxID0gcGFyc2UoIGRhdGUxIClcbiAgZGF0ZTIgPSBwYXJzZSggZGF0ZTIgKVxuXG4gIGlmICggZGF0ZS5pc1ZhbGlkICYmIGRhdGUxLmlzVmFsaWQgJiYgZGF0ZTIuaXNWYWxpZCApIHtcbiAgICAvLyBEZXRlcm1pbmUgc3RhcnQgYW5kIGVuZCBkYXRlcyAodG8gYWxsb3cgYW55IG9yZGVyIGluIGFyZ3MpXG4gICAgdmFyIHN0YXJ0ID0gRGF0ZVRpbWUubWluKCBkYXRlMSwgZGF0ZTIgKVxuICAgIHZhciBlbmQgPSBEYXRlVGltZS5tYXgoIGRhdGUxLCBkYXRlMiApXG5cbiAgICByZXR1cm4gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApID09IERhdGVUaW1lLm1pbiggZGF0ZSwgZW5kIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZSggZGF0ZSwgb3B0aW9ucyApIHtcbiAgdmFyIGZvcm1hdHMgPSBbIFwiSVNPXCIsIFwiU1FMXCIsIFwiSFRUUFwiLCBcIlJGQzI4MjJcIiBdLFxuICAgICAgcGFyc2VkRGF0ZVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKCBvcHRpb25zLm1pbGxpcyAmJiAhaXNOYU4oIGRhdGUgKSApIHtcbiAgICBkYXRlID0gTnVtYmVyKCBkYXRlIClcbiAgICBmb3JtYXRzLnVuc2hpZnQoJ01pbGxpcycpXG4gIH1cblxuICBpZiAoIHR5cGVvZiBkYXRlID09ICdvYmplY3QnICkge1xuICAgIFxuICAgIC8vIElzIGFscmVhZHkgYSBEYXRlVGltZSBvYmplY3RcbiAgICBpZiAoIGRhdGUudG9JU08gKSByZXR1cm4gZGF0ZVxuICAgIGVsc2UgZm9ybWF0cy51bnNoaWZ0KCAnT2JqZWN0JyApXG5cbiAgLy8gUGFyc2Ugc3RyaW5nIGZvcm1hdHNcbiAgfVxuXG4gIGZvcm1hdHMuZm9yRWFjaCggZnVuY3Rpb24oIGZvcm1hdCApIHtcbiAgICBpZiAoKCAhcGFyc2VkRGF0ZSB8fCAhcGFyc2VkRGF0ZS5pc1ZhbGlkICkgJiYgRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0gKSB7XG4gICAgICBwYXJzZWREYXRlID0gRGF0ZVRpbWVbJ2Zyb20nK2Zvcm1hdF0oIGRhdGUsIG9wdGlvbnMgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcGFyc2VkRGF0ZS5pc1ZhbGlkID8gcGFyc2VkRGF0ZSA6IGZhbHNlXG59XG5cbi8vIFJlbW92ZSBpbnNpZ25pZmljYW50IGRpZ2l0c1xuZnVuY3Rpb24gcHJldHR5UHJpbnQoIGRhdGUsIG9wdGlvbnMgKSB7XG4gIGRhdGUgPSBwYXJzZSggZGF0ZSwgb3B0aW9ucyApXG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy56b25lKSBkYXRlID0gZGF0ZS5zZXRab25lKG9wdGlvbnMuem9uZSlcblxuICBpZiAoIGRhdGUgKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU08oKS5yZXBsYWNlKCdUJywgJyAnKS5yZXBsYWNlKCcuMDAwJywnICcpLnJlcGxhY2UoJzowMCAnLCcgJylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJVbnBhcnNlYWJsZSBkYXRlIHN0cmluZ1wiIFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0JlZm9yZTogaXNCZWZvcmUsXG4gIGlzQWZ0ZXI6IGlzQWZ0ZXIsXG4gIGlzQmV0d2VlbjogaXNCZXR3ZWVuLFxuICBwYXJzZTogcGFyc2UsXG4gIHByZXR0eVByaW50OiBwcmV0dHlQcmludFxufVxuIiwicmVxdWlyZSggJy4vbGliL3NoaW1zL2N1c3RvbS1ldmVudCcgKVxuXG52YXIgYmVhbiA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIga2V5ICA9IHJlcXVpcmUoICdrZXltYXN0ZXInICkgXG52YXIgYW5pbWF0aW9uRXZlbnQgICAgPSByZXF1aXJlKCAnLi9saWIvYW5pbWF0aW9uLWV2ZW50cycgKVxudmFyIHBhZ2UgICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3BhZ2UnIClcbnZhciB0YXAgICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90YXAtZXZlbnRzJyApXG52YXIgZGVib3VuY2UgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvZGVib3VuY2UnIClcbnZhciB0aHJvdHRsZSAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90aHJvdHRsZScgKVxudmFyIGRlbGF5ICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlbGF5JyApXG52YXIgcmVwZWF0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcmVwZWF0JyApXG52YXIgYnViYmxlRm9ybUV2ZW50cyAgPSByZXF1aXJlKCAnLi9saWIvYnViYmxlLWZvcm0tZXZlbnRzJyApXG52YXIgc3VibWl0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc3VibWl0JyApXG52YXIgc2Nyb2xsICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsJyApXG52YXIgcmVzaXplICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcmVzaXplJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyICAgPSByZXF1aXJlKCAnLi9saWIvY2FsbGJhY2stbWFuYWdlcicgKVxudmFyIG1lZGlhICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL21lZGlhJyApXG5cbnZhciBzbGljZSAgICAgICAgICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxudmFyIGZvcm1CdWJibGluZyAgICAgID0gZmFsc2VcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLy8gRE9NIGV2ZW50c1xuICBvbjogb24sXG4gIG9mZjogb2ZmLFxuICBvbmU6IG9uZSxcbiAgZmlyZTogZmlyZSxcbiAgY2xvbmU6IGJlYW4uY2xvbmUsXG4gIHJlYWR5OiBwYWdlLnJlYWR5LFxuICBjaGFuZ2U6IHBhZ2UuY2hhbmdlLFxuICBhZnRlckFuaW1hdGlvbjogYWZ0ZXJBbmltYXRpb24sXG5cbiAgLy8gTWVkaWEgcXVlcnkgZXZlbnRzXG4gIG1lZGlhOiBtZWRpYSxcblxuICAvLyBLZXlib2FyZCBldmVudHNcbiAga2V5OiBrZXksXG4gIGtleU9uOiBrZXksXG4gIGtleU9mZjoga2V5LnVuYmluZCxcbiAga2V5T25lOiBrZXlPbmUsXG5cbiAgLy8gVGltaW5nIHV0aWxpdGllc1xuICBkZWJvdW5jZTogZGVib3VuY2UsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgZGVsYXk6ICAgIGRlbGF5LFxuICByZXBlYXQ6ICAgcmVwZWF0LFxuXG4gIC8vIE9wdGltaXplZCBFdmVudCBNYW5hZ2Vyc1xuICBzY3JvbGw6ICAgICAgc2Nyb2xsLFxuICByZXNpemU6ICAgICAgcmVzaXplLFxuXG4gIGNhbGxiYWNrTWFuYWdlcjogY2FsbGJhY2tNYW5hZ2VyLFxuICBjYWxsYmFjazogY2FsbGJhY2tNYW5hZ2VyLmNhbGxiYWNrLFxuXG4gIC8vIEJ1YmJsaW5nIGZpeFxuICBidWJibGVGb3JtRXZlbnRzOiBidWJibGVGb3JtRXZlbnRzLFxuXG4gIHN1Ym1pdDogc3VibWl0XG59XG5cbi8vIEJlYW4gZG9lc24ndCBhY2NvdW50IGZvciBjcm9zcy1icm93c2VyIHN1cHBvcnQgb24gYW5pbWF0aW9uIGV2ZW50c1xuLy8gU28gcmF0aGVyIHRoYW4gcGFzcyB0aHJvdWdoIGV2ZW50cyB0byBiZWFuLCB3ZSBwcm9jZXNzIHRoZW0gdG8gYWRkXG4vLyB2ZW5kb3IgcHJlZml4ZXMgb3IgcmVtb3ZlIGV2ZW50cyBpZiBicm93c2VycyBkbyBub3Qgc3VwcG9yIHRoZW1cbi8vXG5mdW5jdGlvbiBvbiAoKSB7XG4gIHNldEV2ZW50KCAnb24nLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9mZiAoKSB7XG4gIHNldEV2ZW50KCAnb2ZmJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBvbmUgKCkge1xuICBzZXRFdmVudCggJ29uZScsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gZmlyZSAoKSB7XG5cbiAgYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApXG4gIHZhciBlbCA9IGFyZ3NbMF1cbiAgdmFyIGV2ZW50cyA9IFtdXG5cbiAgYXJnc1sxXS5zcGxpdCgnICcpLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudCApIHtcblxuICAgIHZhciBldmVudCA9IGFuaW1hdGlvbkV2ZW50LnRyYW5zZm9ybSggZXZlbnQgKVxuICAgIGlmICggIWlzRW1wdHkoIGV2ZW50ICkgKSBldmVudHMucHVzaCggZXZlbnQgKVxuXG4gIH0pXG5cbiAgaWYgKCAhaXNFbXB0eSggZXZlbnRzICkgKSB7XG5cbiAgICBhcmdzWzFdID0gZXZlbnRzLmpvaW4oICcgJyApXG4gICAgYmVhbi5maXJlLmFwcGx5KCB0aGlzLCBhcmdzIClcblxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEV2ZW50KCByZWdpc3RlclR5cGUsIGFyZ3MgKSB7XG5cbiAgdHJhbnNmb3JtQXJncyggYXJncyApLmZvckVhY2goIGZ1bmN0aW9uKCBhcmcgKSB7XG4gICAgYmVhblsgcmVnaXN0ZXJUeXBlIF0uYXBwbHkoIG51bGwsIGFyZyApXG4gIH0pXG5cbn1cblxuLy8gQWRkIHN1cHBvcnQgZm9yIHVuYmluZGluZyBhIGtleSBldmVudCBhZnRlciBpdCBpcyBjYWxsZWRcbi8vXG5mdW5jdGlvbiBrZXlPbmUgKCBrZXlzLCBzY29wZSwgZm4gKSB7XG5cbiAgaWYgKCB0eXBlb2Ygc2NvcGUgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBmbiA9IHNjb3BlXG4gICAgc2NvcGUgPSAnYWxsJ1xuICB9XG5cbiAga2V5KCBrZXlzLCBzY29wZSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGtleS51bmJpbmQoIGtleXMsIHNjb3BlIClcbiAgICBmbiggZXZlbnQgKVxuICB9KVxufVxuXG5mdW5jdGlvbiBhZnRlckFuaW1hdGlvbiggZWwsIGNhbGxiYWNrLCBjaGVja1N0YXJ0ICkge1xuICB2YXIgaGFzQW5pbWF0aW9uID0gISF3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWwgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnYW5pbWF0aW9uLWR1cmF0aW9uJyApXG5cbiAgaWYgKCBoYXNBbmltYXRpb24gKSB7XG4gICAgXG4gICAgLy8gSWYgZWxlbWVudCBpcyBub3QgYW5pbWF0aW5nIGFmdGVyIGRlbGF5LCBmaXJlIGNhbGxiYWNrXG4gICAgaWYgKCBjaGVja1N0YXJ0ICkge1xuXG4gICAgICB2YXIgdGltZSA9ICgodHlwZW9mIGNoZWNrU3RhcnQgPT0gXCJudW1iZXJcIikgPyBjaGVja1N0YXJ0IDogMjApLFxuICAgICAgICAgIGRlbGF5ZWRFdmVudCA9IGRlbGF5KCBjYWxsYmFjaywgdGltZSApXG5cbiAgICAgIC8vIERlbGF5IHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGZpcmUgY2FsbGJhY2sgb25seSBhZnRlciBcbiAgICAgIC8vIGF0IGxlYXN0IG9uZSBhbmltYXRpb24gZnJhbWUgaGFzIHBhc3NlZFxuXG4gICAgICBvbmUoIGVsLCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAvLyBjYW5jZWwgZGVsYXllZCBmaXJlXG4gICAgICAgIGRlbGF5ZWRFdmVudC5zdG9wKClcblxuICAgICAgICAvLyB3YXRjaCBmb3IgYW5pbWF0aW9uIHRvIGZpbmlzaFxuICAgICAgICBvbmUoIGVsLCAnYW5pbWF0aW9uZW5kJywgY2FsbGJhY2sgKVxuICAgICAgfSlcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG4vLyBUcmFuc2Zvcm0gZXZlbnQgYXJndW1lbnRzIHRvIGhhbmRsZSB0YXAgZXZlbnQgYW5kIGNyb3NzLWJyb3dzZXIgYW5pbWF0aW9uIGV2ZW50c1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBldmVudHMgdG8gYmUgcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHlcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BcmdzKCBhcmdzICkge1xuXG4gIHZhciB0cmFuc2Zvcm1lZEFyZ3MgPSBbXVxuICB2YXIgbmV3RXZlbnRzID0ge31cbiAgdmFyIGVsZW1lbnQgPSBhcmdzLnNoaWZ0KCkgLy8gcmV0cmlldmUgZWxlbWVudFxuICB2YXIgZXZlbnRzID0gYXJncy5zaGlmdCgpXG5cbiAgLy8gZGV0ZWN0IGV2ZW50IGRlbGVnYXRlIHNlbGVjdG9yXG4gIGlmICggdHlwZW9mIGFyZ3NbMF0gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgICB2YXIgZGVsZWdhdGUgPSBhcmdzLnNoaWZ0KClcbiAgfVxuXG4gIC8vIGNvbnZlcnQgZXZlbnQgc3RyaW5ncyB0byBvYmplY3QgYmFzZWQgZXZlbnRzIGZvciBjb2RlIHNpbXBsaWZpY2F0aW9uXG4gIC8vIGV4YW1wbGU6IGFyZ3VtZW50cyAoJ2hvdmVyIGZvY3VzJywgZnVuY3Rpb24pIHdvdWxkIGJlY29tZSAoeyAnaG92ZXIgZm9jdXMnOiBmdW5jdGlvbiB9KVxuICBpZiAoIHR5cGVvZiBldmVudHMgPT0gJ3N0cmluZycgKSB7XG4gICAgdmFyIG9iakV2ZW50cyA9IHt9XG4gICAgb2JqRXZlbnRzW2V2ZW50c10gPSBhcmdzLnNoaWZ0KClcbiAgICBldmVudHMgPSBvYmpFdmVudHNcbiAgfVxuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGtleSBpbiB0aGUgZXZlbnRzIG9iamVjdCBhbmQgYWRkIHZlbmRvciBwcmVmaXhlcyB0byAnYW5pbWF0aW9uJyBldmVudHNcbiAgLy8gYW5kIHdyYXAgY2FsbGJhY2sgaW4gdGhlIHRhcCBmdW5jdGlvbiBmb3IgYWxsICd0YXAnIGV2ZW50cy5cbiAgLy9cbiAgZm9yICggZXZlbnQgaW4gZXZlbnRzICkge1xuXG4gICAgaWYgKCBldmVudHMuaGFzT3duUHJvcGVydHkoIGV2ZW50ICkgKSB7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBldmVudHNbZXZlbnRdXG5cbiAgICAgIC8vIEV2ZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBzcGFjZSBzZXBhcmF0ZWQgZ3JvdXBzIGxpa2UgXCJob3ZlciBmb2N1c1wiXG4gICAgICAvLyBUaGlzIGhhbmRsZXMgZWFjaCBldmVudCBpbmRlcGVuZGFudGx5XG4gICAgICAvL1xuICAgICAgZXZlbnQuc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZSApe1xuXG4gICAgICAgIC8vIElmIGl0IGlzIGFuIGFuaW1hdGlvbiBldmVudCwgdmVuZG9yIHByZWZpeCBpdCwgb3IgZmlyZSB0aGUgY2FsbGJhY2sgYWNjb3JkaW5nIHRvIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICBlID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBlIClcblxuICAgICAgICBpZiAoIGlzRW1wdHkoIGUgKSApIHtcbiAgICAgICAgICAvLyBJZiBpdCdzIGVtcHR5LCBpdCBoYXMgYmVlbiByZW1vdmVkIHNpbmNlIGFuaW1hdGlvbiBldmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0cmlnZ2VyIHRoZSBldmVudCBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKClcblxuICAgICAgICB9IGVsc2UgaWYgKCBlLm1hdGNoKCAvdGFwLyApICkge1xuXG4gICAgICAgICAgLy8gSWYgaXQncyBhIHRhcCBldmVudCwgd3JhcCB0aGUgY2FsbGJhY2sgYW5kIHNldCB0aGUgZXZlbnQgdG8gJ3RvdWNoc3RhcnQnXG4gICAgICAgICAgLy8gVGFwIGlzbid0IGEgcmVhbCBuYXRpdmUgZXZlbnQsIGJ1dCB0aGlzIHdyYXBwZXIgbGV0cyB1cyBzaW11bGF0ZSB3aGF0IGFcbiAgICAgICAgICAvLyBuYXRpdmUgdGFwIGV2ZW50IHdvdWxkIGJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3RXZlbnRzLnRvdWNoc3RhcnQgPSB0YXAoIGNhbGxiYWNrIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdFdmVudHNbIGUgXSA9IGNhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yICggZXZlbnQgaW4gbmV3RXZlbnRzICkge1xuICAgIHZhciBhID0gW11cbiAgICBhLnB1c2goIGVsZW1lbnQsIGV2ZW50IClcblxuICAgIGlmICggZGVsZWdhdGUgKSBhLnB1c2goIGRlbGVnYXRlIClcblxuICAgIGEucHVzaCggbmV3RXZlbnRzWyBldmVudCBdIClcbiAgICB0cmFuc2Zvcm1lZEFyZ3MucHVzaCggYS5jb25jYXQoIGFyZ3MgKSApXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtZWRBcmdzXG59XG5cblxuZnVuY3Rpb24gaXNFbXB0eSggb2JqICkge1xuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuICBpZiAoIG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT09IDAgKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICggMCA8IG9iai5sZW5ndGggKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCBoYXNPd25Qcm9wZXJ0eS5jYWxsKCBvYmosIGtleSApICkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBjc3NBbmltRXZlbnRUeXBlcyA9IGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKVxudmFyIHN1cHBvcnRlZCA9IGNzc0FuaW1FdmVudFR5cGVzLmFuaW1hdGlvbnN0YXJ0ICE9PSB1bmRlZmluZWRcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtQW5pbWF0aW9uRXZlbnRzXG59XG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnQW5pbWF0aW9uU3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ0FuaW1hdGlvbkVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnQW5pbWF0aW9uSXRlcmF0aW9uJ1xuICB9O1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFdmVudFR5cGVzKHByZWZpeCkge1xuICBwcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBhbmltYXRpb25zdGFydDogcHJlZml4ICsgJ2FuaW1hdGlvbnN0YXJ0JyxcbiAgICBhbmltYXRpb25lbmQ6IHByZWZpeCArICdhbmltYXRpb25lbmQnLFxuICAgIGFuaW1hdGlvbml0ZXJhdGlvbjogcHJlZml4ICsgJ2FuaW1hdGlvbml0ZXJhdGlvbidcbiAgfTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuaW1hdGlvbiBldmVudCB0eXBlcyB7YW5pbWF0aW9uc3RhcnQsIGFuaW1hdGlvbmVuZCwgYW5pbWF0aW9uaXRlcmF0aW9ufVxuICovXG5cbmZ1bmN0aW9uIGdldEFuaW1hdGlvbkV2ZW50VHlwZXMoKSB7XG4gIHZhciBwcmVmaXhlcyA9IFsnd2Via2l0JywgJ01veicsICdPJywgJyddO1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbiAgLy8gYnJvd3NlciBjb21wbGlhbnRcbiAgaWYgKHVuZGVmaW5lZCAhPT0gc3R5bGUuYW5pbWF0aW9uTmFtZSkge1xuICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKCk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcHJlZml4ZXMubGVuZ3RoLCBwcmVmaXg7IGkgPCBsZW47IGkrKykge1xuICAgIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuXG4gICAgaWYgKHVuZGVmaW5lZCAhPT0gc3R5bGVbcHJlZml4ICsgJ0FuaW1hdGlvbk5hbWUnXSkge1xuICAgICAgLy8gV2Via2l0XG4gICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICByZXR1cm4gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBlbHNlIGlmICgxID09PSBpKSB7XG4gICAgICAgIHJldHVybiBsb3dlckNhc2VFdmVudFR5cGVzKCk7XG4gICAgICB9XG4gICAgICAvLyBPcGVyYVxuICAgICAgZWxzZSBpZiAoMiA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcyhwcmVmaXgudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5cbi8vIEFkZHMgbmVjZXNzYXJ5IGFkZCB2ZW5kb3IgcHJlZml4ZXMgb3IgY2FtZWxDYXNlZCBldmVudCBuYW1lc1xuLy9cbmZ1bmN0aW9uIHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50cyAoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5tYXRjaCgvYW5pbWF0aW9uL2kpKSB7XG4gICAgcmV0dXJuIGV2ZW50XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNzc0FuaW1FdmVudFR5cGVzW2V2ZW50XSkge1xuICAgICAgcmV0dXJuIGNzc0FuaW1FdmVudFR5cGVzW2V2ZW50XVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih3aW5kb3cuZW52ICE9ICd0ZXN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdcIicgKyBldmVudCArICdcIiBpcyBub3QgYSBzdXBwb3J0ZWQgYW5pbWF0aW9uIGV2ZW50JylcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxufVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAgcGFnZSAgPSByZXF1aXJlKCAnLi9wYWdlJyApLFxuICAgIGZvcm1FbHM7XG5cbnZhciBmb3JtQnViYmxpbmcgPSBmYWxzZVxuXG52YXIgZmlyZUJ1YmJsZSA9IGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQuZGV0YWlsICYmIGV2ZW50LmRldGFpbC50cmlnZ2VyZWQgKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCBldmVudC50eXBlLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcblxuICAvLyBTdG9wIG9ubHkgJ3N1Ym1pdCcgZXZlbnRzLiBTdG9wcGluZyBibHVyIG9yIGZvdWNzIGV2ZW50cyBzZWVtcyB0byBicmVhayBGaXJlRm94IGlucHV0IGludGVyYWN0aW9ucy5cbiAgaWYgKCBldmVudC50eXBlID09ICdzdWJtaXQnICkgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcblxuICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudCggZXYgKVxuXG4gIC8vIFByZXZlbnQgZGVmYXVsdCBvbiBvcmlnaW5hbCBldmVudCBpZiBjdXN0b20gZXZlbnQgaXMgcHJldmVudGVkXG4gIGlmICggZXYuZGVmYXVsdFByZXZlbnRlZCApIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgXG59XG5cbi8vIFNpbXBsaWZ5IHNldHRpbmcgdGhlIGV2ZW50IHR5cGUgYmFzZWQgb24gdGhlIGVsZW1lbnRcbnZhciBldmVudFR5cGUgPSBmdW5jdGlvbiAoIGVsICkge1xuICByZXR1cm4gKCBlbC50YWdOYW1lID09ICdGT1JNJyApID8gJ3N1Ym1pdCcgOiAnZm9jdXMgYmx1cidcbn1cblxuLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9uID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgRXZlbnQub24oIGVsLCBldmVudFR5cGUoIGVsICksIGZpcmVCdWJibGUgKVxufVxuXG4vLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlT2ZmID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgRXZlbnQub2ZmKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gQWRkL1JlbW92ZSBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVGb3JtRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIGZvcm1CdWJibGluZyApIHsgcmV0dXJuIH0gXG4gIHBhZ2UuY2hhbmdlKCBmdW5jdGlvbigpIHtcblxuICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBwcmV2aW91cyBwYWdlXG4gICAgaWYgKCBmb3JtRWxzICkgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggZm9ybUVscywgYnViYmxlT2ZmIClcblxuICAgIC8vIEFkZCBuZXcgbGlzdGVuZXJzIHRvIHRoaXMgcGFnZVxuICAgIGZvcm1FbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnZm9ybSwgaW5wdXQnIClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9uIClcbiAgfSlcblxuICB2YXIgZm9ybUJ1YmJsaW5nID0gdHJ1ZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1YmJsZUZvcm1FdmVudHNcbiIsInZhciBNYW5hZ2VyID0ge1xuICBuZXc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtYW5hZ2VyID0ge1xuXG4gICAgICBjYWxsYmFja3M6IFtdLFxuXG4gICAgICBhZGQ6IGZ1bmN0aW9uKCBmbiApIHtcblxuICAgICAgICB2YXIgY2IgPSBNYW5hZ2VyLmNhbGxiYWNrLm5ldyggZm4gKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5wdXNoKCBjYiApXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gY2JcblxuICAgICAgfSxcblxuICAgICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYiApIHsgY2Iuc3RvcCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0YXJ0KCkgfSApXG4gICAgICB9LFxuXG4gICAgICB0b2dnbGU6IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnRvZ2dsZSggYm9vbCApIH0gKVxuICAgICAgfSxcblxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MgPSBbXVxuICAgICAgfSxcblxuICAgICAgZmlyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApXG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBmbiApIHsgZm4uYXBwbHkoIHRoaXMsIGFyZ3MgKSB9IClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFuYWdlclxuICB9LFxuXG4gIGNhbGxiYWNrOiB7XG4gICAgbmV3OiBmdW5jdGlvbiggZm4gKSB7XG4gICAgICB2YXIgY2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCBjYi5lbmFibGVkICkgeyBmbi5hcHBseSggZm4sIGFyZ3VtZW50cyApIH1cbiAgICAgIH1cblxuICAgICAgY2Iuc3RvcCAgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSBmYWxzZSB9XG4gICAgICBjYi5zdGFydCAgPSBmdW5jdGlvbigpIHsgY2IuZW5hYmxlZCA9IHRydWUgfVxuICAgICAgY2IudG9nZ2xlID0gZnVuY3Rpb24oIGJvb2wgKSB7XG4gICAgICAgIGNiLmVuYWJsZWQgPSAoIDAgaW4gYXJndW1lbnRzICkgPyBib29sIDogIWNiLmVuYWJsZWRcbiAgICAgIH1cbiAgICAgIGNiLmVuYWJsZWQgPSB0cnVlXG5cbiAgICAgIHJldHVybiBjYlxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hbmFnZXJcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIHBpY2tGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZm91bmRcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggYXJndW1lbnRzLCBmdW5jdGlvbiggY2FuZGlkYXRlICkge1xuICAgIGlmICggdHlwZW9mKCBjYW5kaWRhdGUgKSA9PSAnZnVuY3Rpb24nICYmICFmb3VuZCApIHsgZm91bmQgPSBjYW5kaWRhdGUgfVxuICB9KVxuXG4gIHJldHVybiBmb3VuZFxufVxuXG52YXIgZGVib3VuY2UgPSBmdW5jdGlvbiggZm4sIHdhaXQsIG9wdGlvbnMgKSB7XG5cbiAgLy8gQWxsb3cgb3B0aW9ucyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50XG4gIGlmICggdHlwZW9mKCBmbiApID09ICdvYmplY3QnICkgeyBvcHRpb25zID0gZm4gfSBcblxuICAvLyBPcHRpb25zIHdvbid0IGJlIG51bGxcbiAgZWxzZSB7IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9IH1cblxuICB3YWl0ID0gb3B0aW9ucy53YWl0IHx8IHdhaXQgfHwgMFxuXG4gIHZhciBtYXggICAgICAgICAgICA9IG9wdGlvbnMubWF4IHx8IGZhbHNlLFxuICAgICAgbGVhZGluZyAgICAgICAgPSAoICggJ2xlYWRpbmcnICBpbiBvcHRpb25zICkgPyBvcHRpb25zLmxlYWRpbmcgIDogZmFsc2UgKSxcbiAgICAgIHRyYWlsaW5nICAgICAgID0gKCAoICd0cmFpbGluZycgaW4gb3B0aW9ucyApID8gb3B0aW9ucy50cmFpbGluZyA6IHRydWUgKSxcbiAgICAgIFxuICAgICAgLy8gR3JhYiBmdW5jdGlvbnMgZnJvbSBvcHRpb25zIG9yIGRlZmF1bHQgdG8gZmlyc3QgYXJndW1lbnRcbiAgICAgIGxlYWRpbmdGbiAgICAgID0gcGlja0Z1bmN0aW9uKCBvcHRpb25zLmxlYWRpbmcsIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMuY2FsbGJhY2ssIGZuICksXG4gICAgICB0cmFpbGluZ0ZuICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy50cmFpbGluZywgb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuXG4gICAgICAvLyBTdGF0ZSB0cmFja2luZyB2YXJzXG4gICAgICBhcmdzLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgYXJndW1lbnRzIHBhc3NlZCB0byBkZWJvdW5jZWQgY2FsbGJhY2tcbiAgICAgIHF1ZXVlZCAgICAgICAgID0gZmFsc2UsICAvLyBIYXMgYSBjYWxsYmFjayBiZWVuIGFkZGVkIHRvIHRoZSBhbmltYXRpb24gbG9vcD9cbiAgICAgIGhhbmRsZSAgICAgICAgID0ge30sICAgICAvLyBPYmplY3QgZm9yIHRyYWNraW5nIGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDAsICAgICAgLy8gS2VlcCBhIHRpbWVyIGZvciBkZWJvdW5jaW5nXG4gICAgICBsYXN0SW52b2tlZCAgICA9IDAsICAgICAgLy8gS2VlcCBhIHRpbWVyIGZvciBtYXhcbiAgICAgIGxlYWRpbmdCbG9ja2VkID0gZmFsc2U7ICAvLyBUcmFjayBsZWFkaW5nLCB0aHJvdHRsaW5nIHN1YnNlcXVlbnQgbGVhZGluZyBjYWxsc1xuXG4gIC8vIFF1ZXVlIHRoZSBmdW5jdGlvbiB3aXRoIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICB2YXIgaW52b2tlID0gZnVuY3Rpb24oIGNhbGxUeXBlICkge1xuXG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgbGFzdEludm9rZWQgPSBub3coKVxuICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgbGVhZGluZ0Jsb2NrZWQgPSB0cnVlXG5cbiAgICBpZiAoIGNhbGxUeXBlID09PSAnbGVhZGluZycgKSB7XG4gICAgICBsZWFkaW5nRm4uYXBwbHkoIGxlYWRpbmdGbiwgYXJncyApIH1cbiAgICBlbHNlIHtcbiAgICAgIHRyYWlsaW5nRm4uYXBwbHkoIHRyYWlsaW5nRm4sIGFyZ3MgKSB9XG5cbiAgfVxuXG4gIC8vIExvYWQgdGhlIGxvb3AgaW50byB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gIHZhciBhZGRUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKCAhcXVldWVkICkge1xuICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgaGFuZGxlLnZhbHVlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBsb29wICkgIC8vIEFkZCB0byBicm93c2VyJ3MgYW5pbWF0aW9uIHF1ZXVlXG4gICAgfVxuXG4gIH1cblxuICAvLyBSZW1vdmUgZnJvbSBhbmltYXRpb24gcXVldWUgYW5kIHJlc2V0IGRlYm91bmNlIFxuICB2YXIgcmVtb3ZlRnJvbVF1ZXVlID0gZnVuY3Rpb24oKSB7XG5cbiAgICBpZiAoIFwidmFsdWVcIiBpbiBoYW5kbGUgKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggaGFuZGxlLnZhbHVlIClcbiAgICAgIHF1ZXVlZCAgICAgICAgID0gZmFsc2VcbiAgICAgIGxhc3RDYWxsZWQgICAgID0gMFxuICAgICAgbGFzdEludm9rZWQgICAgPSAwXG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlXG4gICAgfVxuICAgIFxuICB9XG5cbiAgLy8gcHJldmVudCBpbmZpbml0ZSBkZWJvdW5jaW5nICggaWYgb3B0aW9ucy5tYXggaXMgc2V0IClcbiAgdmFyIG1heFBhc3NlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoIG1heCAmJiBub3coKSAtIGxhc3RJbnZva2VkID49IG1heCApXG4gIH1cblxuICB2YXIgd2FpdFJlYWNoZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBub3coKSAtIGxhc3RDYWxsZWQgKSA+PSB3YWl0XG4gIH1cblxuICAvLyBUaGlzIGdldHMgbG9hZGVkIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZSBhbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGl2b2tlIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gIFxuICAgIC8vIExvb3Agd2FzIGV4ZWN1dGVkIHNvIGl0J3Mgbm8gbG9uZ2VyIGluIHRoZSBhbmltYXRpb24gcXVldWVcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIFxuICAgIGlmICggbGVhZGluZyAmJiAhbGVhZGluZ0Jsb2NrZWQgKSB7XG4gICAgICBpbnZva2UoICdsZWFkaW5nJyApXG4gICAgfVxuXG4gICAgLy8gSWYgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkIHRvIGZyZXF1ZW50bHkgdG8gZXhlY3V0ZVxuICAgIGVsc2UgaWYgKCBtYXhQYXNzZWQoKSApIHtcblxuICAgICAgaWYgKCBsZWFkaW5nICkgeyBpbnZva2UoICdsZWFkaW5nJyApICB9XG4gICAgICBlbHNlICAgICAgICAgICB7IGludm9rZSggJ3RyYWlsaW5nJyApIH1cblxuICAgIH0gXG4gICAgXG4gICAgLy8gSWYgZnVuY3Rpb24gaGFzbid0IGJlZW4gY2FsbGVkIHNpbmNlIGxhc3Qgd2FpdFxuICAgIGVsc2UgaWYgKCB3YWl0UmVhY2hlZCgpICkge1xuXG4gICAgICAvLyBJZiB0cmFpbGluZyBpdCdzIHNhZmUgdG8gaW52b2tlXG4gICAgICBpZiAoIHRyYWlsaW5nICkgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICAgIC8vIElmIGxlYWRpbmcsIGl0J3Mgc2FmZSB0byByZW1vdmUgYmxvY2tcbiAgICAgIGlmICggbGVhZGluZyApICB7IGxlYWRpbmdCbG9ja2VkID0gZmFsc2UgfVxuICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkVG9RdWV1ZSgpXG4gICAgfVxuXG4gIH1cblxuICAvLyBBIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHF1ZXVlaW5nIHVwIGZ1bmN0aW9uIGNhbGxzXG4gIC8vXG4gIHZhciBkZWJvdW5jZWQgPSBmdW5jdGlvbigpIHtcbiAgICBsYXN0Q2FsbGVkID0gbm93KClcbiAgICBhcmdzID0gYXJndW1lbnRzXG4gICAgYWRkVG9RdWV1ZSgpXG4gIH1cblxuICBkZWJvdW5jZWQuc3RvcCA9IHJlbW92ZUZyb21RdWV1ZVxuXG4gIHJldHVybiBkZWJvdW5jZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZVxuIiwidmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gRGF0ZS5ub3coKVxufVxuXG52YXIgZGVsYXkgPSBmdW5jdGlvbiAoIGZuLCB3YWl0ICkge1xuXG4gIHZhciBhcmdzU3RhcnQgPSAoIHdhaXQgIT0gbnVsbCApID8gMiA6IDE7XG4gIHZhciBoYW5kbGUgPSB7fVxuXG4gIGhhbmRsZS5hcmdzICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS53YWl0ICA9IHdhaXQgfHwgMFxuICBoYW5kbGUuc3RhcnQgPSBub3coKVxuXG4gIGhhbmRsZS5zdG9wICA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIFwidmFsdWVcIiBpbiBoYW5kbGUgKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggaGFuZGxlLnZhbHVlICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlLmxvb3AgID0gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gSWYgd2FpdCBsaW1pdCBoYXMgYmVlbiByZWFjaGVkXG4gICAgaWYgKCBub3coKSAtIGhhbmRsZS5zdGFydCA+PSBoYW5kbGUud2FpdCApIHtcbiAgICAgIGZuLmFwcGx5KCBmbiwgaGFuZGxlLmFyZ3MgKVxuXG4gICAgICAvLyBJZiByZXBlYXQgaXMgc2V0IGFuZCBpcyBub3QgMFxuICAgICAgaWYgKCAhIWhhbmRsZS5yZXBlYXQgKSB7XG4gICAgICAgIGhhbmRsZS5yZXBlYXQgPSBoYW5kbGUucmVwZWF0IC0gMVxuICAgICAgICBoYW5kbGUuc3RhcnQgPSBub3coKVxuICAgICAgICBxdWV1ZURlbGF5KCBoYW5kbGUgKVxuICAgICAgfSBlbHNlIGlmICggaGFuZGxlLnJlcGVhdCA9PT0gMCAmJiBoYW5kbGUuY29tcGxldGUgKSB7XG4gICAgICAgIGhhbmRsZS5jb21wbGV0ZSgpXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICB9XG5cbiAgfVxuXG5cbiAgcmV0dXJuIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG59XG5cbnZhciBxdWV1ZURlbGF5ID0gZnVuY3Rpb24gKCBoYW5kbGUgKSB7XG4gIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggaGFuZGxlLmxvb3AgKVxuICByZXR1cm4gaGFuZGxlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVsYXlcbiIsIi8vIFRoaXMgc2ltcGxpZmllcyBjb21tb24gdXNlcyBmb3Igd2luZG93Lm1hdGNoTWVkaWEgXG4vLyBuYW1lbHksIGFkZGluZyBsaXN0ZW5lcnMgZm9yIHdpZHRoIGFuZCBoZWlnaHQgcXVlcmllc1xuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KCBxdWVyeSwgZGltZW5zaW9uICkge1xuICB2YXIgcmVzdWx0ID0ge31cblxuICBpZiAoIHR5cGVvZiggcXVlcnkgKSA9PT0gJ3N0cmluZycgKSB7IHJldHVybiBxdWVyeSB9XG5cbiAgcmVzdWx0Lm1pbiA9IHNpemUoIHF1ZXJ5Lm1pbiwgJ21pbi0nICsgZGltZW5zaW9uIClcbiAgcmVzdWx0Lm1heCA9IHNpemUoIHF1ZXJ5Lm1heCwgJ21heC0nICsgZGltZW5zaW9uIClcblxuICBpZiAoIHJlc3VsdC5taW4gJiYgcmVzdWx0Lm1heCApXG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVzdWx0Lm1pbiArICcgYW5kICcgKyByZXN1bHQubWF4XG5cbiAgcmV0dXJuIHJlc3VsdC5xdWVyeSB8fCByZXN1bHQubWluIHx8IHJlc3VsdC5tYXhcbn1cblxuZnVuY3Rpb24gc2l6ZSggbnVtLCBsaW1pdCApIHtcbiAgcmV0dXJuICggbnVtICkgPyAnKCcrbGltaXQrJzogJyArIHRvUHgoIG51bSApICsgJyknIDogbnVsbFxufVxuXG5mdW5jdGlvbiB0b1B4KCB3aWR0aCApIHtcbiAgaWYgKCB0eXBlb2YoIHdpZHRoICkgPT09ICdudW1iZXInICkgeyByZXR1cm4gd2lkdGggKyAncHgnfVxuICByZXR1cm4gd2lkdGhcbn1cblxudmFyIG1lZGlhID0ge1xuXG4gIHdpZHRoOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHJldHVybiBtZWRpYS5saXN0ZW4oIHBhcnNlUXVlcnkoIHF1ZXJ5LCAnd2lkdGgnICksIGZuIClcbiAgfSxcblxuICBtaW5XaWR0aDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEud2lkdGgoIHsgbWluOiBzaXplIH0sIGZuICkgfSxcbiAgbWF4V2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHJldHVybiBtZWRpYS5saXN0ZW4oIHBhcnNlUXVlcnkoIHF1ZXJ5LCAnaGVpZ2h0JyApLCBmbiApXG4gIH0sXG5cbiAgbWluSGVpZ2h0OiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS5oZWlnaHQoIHsgbWluOiBzaXplIH0sIGZuICkgfSxcbiAgbWF4SGVpZ2h0OiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS5oZWlnaHQoIHsgbWF4OiBzaXplIH0sIGZuICkgfSxcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCBxdWVyeSwgZm4gKSB7XG4gICAgdmFyIG1hdGNoID0gd2luZG93Lm1hdGNoTWVkaWEoIHF1ZXJ5IClcblxuICAgIGlmICggZm4gKSB7XG4gICAgICBmbiggbWF0Y2ggKVxuICAgICAgbWF0Y2guYWRkTGlzdGVuZXIoIGZuIClcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtZWRpYVxuIiwidmFyIEV2ZW50ICAgICAgICAgICA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyID0gcmVxdWlyZSggJy4vY2FsbGJhY2stbWFuYWdlcicgKVxudmFyIHRocm90dGxlICAgICAgICA9IHJlcXVpcmUoICcuL3Rocm90dGxlJyApXG52YXIgZGVib3VuY2UgICAgICAgID0gcmVxdWlyZSggJy4vZGVib3VuY2UnIClcblxudmFyIG9wdGltaXplZEV2ZW50TWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbiggbmFtZSApIHtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjYWxsYmFjayBtYW5hZ2VyXG4gICAgdmFyIG1hbmFnZXIgPSB7XG4gICAgICBydW46IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgICAgIHN0YXJ0OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdG9wOiBjYWxsYmFja01hbmFnZXIubmV3KClcbiAgICB9XG5cbiAgICAvLyBydW4gY2FsbGJhY2tzIHdoZW4gZXZlbnQgaGFwcGVucyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBydW5uaW5nID0gdGhyb3R0bGUoIG1hbmFnZXIucnVuLmZpcmUgKVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RhcnRlZCA9IGRlYm91bmNlKHtcbiAgICAgIGxlYWRpbmc6IG1hbmFnZXIuc3RhcnQuZmlyZSxcbiAgICAgIHRyYWlsaW5nOiBmYWxzZSxcbiAgICAgIHdhaXQ6IDE1MFxuICAgIH0pXG5cbiAgICAvLyBmaXJlIGNhbGxiYWNrcyB3aGVuIGV2ZW50IHN0YXJ0cyAoYXQgcGFpbnQtcmVhZHkgZnJhbWVzKVxuICAgIHZhciBzdG9wcGVkID0gZGVib3VuY2UoIG1hbmFnZXIuc3RvcC5maXJlLCAxNTAgKVxuXG4gICAgRXZlbnQub24oIHdpbmRvdywgbmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICBydW5uaW5nKClcbiAgICAgIHN0YXJ0ZWQoKVxuICAgICAgc3RvcHBlZCgpXG4gICAgfSlcblxuICAgIC8vIFB1YmxpYyBBUElcbiAgICB2YXIgcnVuICAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5ydW4uYWRkKCBmbiApIH1cbiAgICBydW4uc3RhcnQgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdGFydC5hZGQoIGZuICkgfVxuICAgIHJ1bi5zdG9wICA9IGZ1bmN0aW9uICggZm4gKSB7IHJldHVybiBtYW5hZ2VyLnN0b3AuYWRkKCBmbiApIH1cblxuICAgIC8vIEFkZCBjdXN0b20gZXZlbnRzIGZvciB0byBydW4gb3B0aW1pemVkIGxpc3RlbmVycy4gKCBuYW1lIC0+IE5hbWUgKVxuICAgIHJ1biggZnVuY3Rpb24oKSB7IEV2ZW50LmZpcmUoIHdpbmRvdywgJ29wdGltaXplZCcgKyAgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSkgKSB9IClcbiAgICBydW4uc3RhcnQoIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csIG5hbWUgKyAnU3RhcnQnICkgfSApXG4gICAgcnVuLnN0b3AoIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csIG5hbWUgKyAnU3RvcCcgKSB9IClcblxuICAgIHJldHVybiBydW5cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGltaXplZEV2ZW50TWFuYWdlclxuIiwidmFyIEV2ZW50ICAgICAgICAgICA9IHJlcXVpcmUoICdiZWFuJyApXG52YXIgY2FsbGJhY2tNYW5hZ2VyID0gcmVxdWlyZSggJy4vY2FsbGJhY2stbWFuYWdlcicgKVxuXG4vLyBDcmVhdGUgYSBuZXcgcGFnZSBldmVudCBtYW5hZ2VyXG52YXIgbWFuYWdlciA9IHtcbiAgcmVhZHk6IGNhbGxiYWNrTWFuYWdlci5uZXcoKSxcbiAgY2hhbmdlOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIHJlYWR5QWxyZWFkeTogZmFsc2UsXG4gIGNoYW5nZWQ6IGZhbHNlLFxufVxuXG5tYW5hZ2VyLnJlYWR5LmFkZCggZnVuY3Rpb24oKXtcbiAgbWFuYWdlci5yZWFkeUFscmVhZHkgPSB0cnVlIFxufSlcblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7IFxuICBpZiAoICF3aW5kb3cuVHVyYm9saW5rcyAmJiAhbWFuYWdlci5jaGFuZ2VkICkgeyBcbiAgICBtYW5hZ2VyLmNoYW5nZWQgPSB0cnVlIFxuICAgIG1hbmFnZXIuY2hhbmdlLmZpcmUoKVxuICB9XG59KVxuXG52YXIgcmVhZHkgPSBmdW5jdGlvbiAoIGZuICkge1xuICBpZiAoIG1hbmFnZXIucmVhZHlBbHJlYWR5ICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIucmVhZHkuYWRkKCBmbiApIH1cblxudmFyIGNoYW5nZSA9IGZ1bmN0aW9uKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLmNoYW5nZWQgKSB7IGZuKCkgfVxuICByZXR1cm4gbWFuYWdlci5jaGFuZ2UuYWRkKCBmbiApIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgcmVhZHkgY2FsbGJhY2tzXG5yZWFkeS5maXJlID0gZnVuY3Rpb24gKCkge1xuICBtYW5hZ2VyLnJlYWR5LmZpcmUoKVxuICAvLyBCZSBzdXJlIHJlYWR5IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2VcbiAgbWFuYWdlci5yZWFkeS5zdG9wKCkgfVxuXG4vLyBNYWtlIGl0IGVhc3kgdG8gdHJpZ2dlciBjaGFuZ2UgY2FsbGJhY2tzXG5jaGFuZ2UuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5jaGFuZ2UuZmlyZSgpIH1cblxuRXZlbnQub24oIGRvY3VtZW50LCAnRE9NQ29udGVudExvYWRlZCcsIHJlYWR5LmZpcmUgKVxuRXZlbnQub24oIGRvY3VtZW50LCAncGFnZTpjaGFuZ2UgdHVyYm9saW5rczpsb2FkJywgY2hhbmdlLmZpcmUgKSAvLyBTdXBwb3J0IGN1c3RvbSBhbmQgcmFpbHMgdHVyYm9saW5rcyBwYWdlIGxvYWQgZXZlbnRzXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZWFkeTogcmVhZHksXG4gIGNoYW5nZTogY2hhbmdlXG59XG4iLCJ2YXIgZGVsYXkgPSByZXF1aXJlKCAnLi9kZWxheScgKVxuXG52YXIgcmVwZWF0ID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBsaW1pdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gMSxcbiAgICAgIGhhbmRsZSA9IGRlbGF5ICggZm4sIHdhaXQgKTtcblxuICBpZiAgICAgICggbGltaXQgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMyB9XG4gIGVsc2UgaWYgKCB3YWl0ICAhPSBudWxsICkgeyBhcmdzU3RhcnQgPSAyIH1cblxuICAvLyBFbmFibGUgcmVwZWF0ICggLTEgd2lsbCByZXBlYXQgZm9yZXZlciApXG4gIGhhbmRsZS5yZXBlYXQgPSBsaW1pdCB8fCAtMVxuICBoYW5kbGUuYXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgYXJnc1N0YXJ0IClcbiAgaGFuZGxlLnN0b3AgICA9IGhhbmRsZS5jYW5jZWxcblxuICByZXR1cm4gaGFuZGxlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0XG4iLCJ2YXIgbWFuYWdlciA9IHJlcXVpcmUoICcuL29wdGltaXplZC1ldmVudC1tYW5hZ2VyJyApXG52YXIgcmVzaXplICA9IG1hbmFnZXIubmV3KCAncmVzaXplJyApXG5cbi8vIFBhdXNlIGFuaW1hdGlvbnMgZHVyaW5nIHJlc2l6aW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbnJlc2l6ZS5kaXNhYmxlQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZSA9ICc8c3R5bGUgaWQ9XCJmdWxsc3RvcFwiPi5uby1hbmltYXRpb24gKiwgLm5vLWFuaW1hdGlvbiAqOmFmdGVyLCAubm8tYW5pbWF0aW9uICo6YmVmb3JlIHtcXFxuICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnRcXFxuICB9PC9zdHlsZT4nXG5cbiAgLy8gSW5qZWN0IHN0eWxlIGZvciBlYXN5IGNsYXNzbmFtZSBtYW5pcHVsYXRpb25cbiAgaWYgKCAhZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3R5bGUjZnVsbHN0b3AnKSApIHsgXG4gICAgZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHN0eWxlKVxuICB9XG5cbiAgcmVzaXplLnN0YXJ0KCBmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxuICByZXNpemUuc3RvcCggZnVuY3Rpb24oKSB7ICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoICduby1hbmltYXRpb24nICkgfSApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzaXplXG4iLCJ2YXIgbWFuYWdlciA9IHJlcXVpcmUoICcuL29wdGltaXplZC1ldmVudC1tYW5hZ2VyJyApXG52YXIgc2Nyb2xsICA9IG1hbmFnZXIubmV3KCAnc2Nyb2xsJyApXG5cbnNjcm9sbC5kaXNhYmxlUG9pbnRlciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIERpc2FibGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICBzY3JvbGwuc3RhcnQoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gIH0pXG5cbiAgLy8gRW5hYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0b3AoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJydcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzY3JvbGxcbiIsIi8vIEN1c3RvbSBFdmVudCBQb2x5ZmlsbFxuKGZ1bmN0aW9uICgpIHtcblxuICBpZiAoIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIiApIHJldHVybiBmYWxzZTtcblxuICBmdW5jdGlvbiBDdXN0b21FdmVudCAoIGV2ZW50LCBwYXJhbXMgKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlLCBkZXRhaWw6IHVuZGVmaW5lZCB9O1xuICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCggJ0N1c3RvbUV2ZW50JyApO1xuICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoIGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwgKTtcbiAgICByZXR1cm4gZXZ0O1xuICAgfVxuXG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG5cbiAgd2luZG93LkN1c3RvbUV2ZW50ID0gQ3VzdG9tRXZlbnQ7XG59KSgpXG4iLCIvLyBNYW51YWxseSB0cmlnZ2VyIGEgY2FuY2VsYWJsZSBmb3JtIHN1Ym1pdCBldmVudC5cbmZ1bmN0aW9uIHN1Ym1pdCggZm9ybSApIHtcbiAgaWYgKCAhZm9ybS50YWdOYW1lIHx8IGZvcm0udGFnTmFtZSAhPSAnRk9STScgKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoICdUcmlnZ2VyIHRoaXMgZXZlbnQgb24gYSBmb3JtIGVsZW1lbnQnIClcbiAgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggJ3N1Ym1pdCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IHRyaWdnZXJlZDogdHJ1ZSB9IH0gKVxuICBmb3JtLmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBTdWJtaXQgZm9ybSB1bmxlc3MgZXZlbnQgZGVmYXVsdCBpcyBwcmV2ZW50ZWRcbiAgaWYgKCAhZXYuZGVmYXVsdFByZXZlbnRlZCApIGZvcm0uc3VibWl0KClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJtaXRcbiIsInZhciBlbmRFdmVudHMgPSBbXG4gICd0b3VjaGVuZCdcbl1cblxubW9kdWxlLmV4cG9ydHMgPSBUYXBcblxuLy8gZGVmYXVsdCB0YXAgdGltZW91dCBpbiBtc1xuVGFwLnRpbWVvdXQgPSAyMDBcblxuZnVuY3Rpb24gVGFwKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIC8vIGlmIHRoZSB1c2VyIGhvbGRzIGhpcy9oZXIgZmluZ2VyIGRvd24gZm9yIG1vcmUgdGhhbiAyMDBtcyxcbiAgLy8gdGhlbiBpdCdzIG5vdCByZWFsbHkgY29uc2lkZXJlZCBhIHRhcC5cbiAgLy8gaG93ZXZlciwgeW91IGNhbiBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICB2YXIgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCB8fCBUYXAudGltZW91dFxuXG4gIC8vIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIGxpc3RlbmVyXG4gIGxpc3RlbmVyLmhhbmRsZXIgPSBjYWxsYmFja1xuXG4gIHJldHVybiBsaXN0ZW5lclxuXG4gIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcilcbiAgZnVuY3Rpb24gbGlzdGVuZXIoZTEpIHtcbiAgICAvLyB0YXAgc2hvdWxkIG9ubHkgaGFwcGVuIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgaWYgKCFlMS50b3VjaGVzIHx8IGUxLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuXG5cbiAgICB2YXIgZWwgPSBlMS50YXJnZXRcbiAgICB2YXIgY29udGV4dCA9IHRoaXNcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHZhciB0aW1lb3V0X2lkID0gc2V0VGltZW91dChjbGVhbnVwLCB0aW1lb3V0KVxuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgY2xlYW51cClcblxuICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZG9uZSlcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gZG9uZShlMikge1xuICAgICAgLy8gc2luY2UgdG91Y2hzdGFydCBpcyBhZGRlZCBvbiB0aGUgc2FtZSB0aWNrXG4gICAgICAvLyBhbmQgYmVjYXVzZSBvZiBidWJibGluZyxcbiAgICAgIC8vIGl0J2xsIGV4ZWN1dGUgdGhpcyBvbiB0aGUgc2FtZSB0b3VjaHN0YXJ0LlxuICAgICAgLy8gdGhpcyBmaWx0ZXJzIG91dCB0aGUgc2FtZSB0b3VjaHN0YXJ0IGV2ZW50LlxuICAgICAgaWYgKGUxID09PSBlMikgcmV0dXJuXG5cbiAgICAgIGNsZWFudXAoKVxuXG4gICAgICAvLyBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIGlmIChlMi5kZWZhdWx0UHJldmVudGVkKSByZXR1cm5cblxuICAgICAgLy8gb3ZlcndyaXRlIHRoZXNlIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgYWxsIHRvIGJvdGggc3RhcnQgYW5kIGV2ZW50cy5cbiAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGUxLnByZXZlbnREZWZhdWx0XG4gICAgICB2YXIgc3RvcFByb3BhZ2F0aW9uID0gZTEuc3RvcFByb3BhZ2F0aW9uXG5cbiAgICAgIGUxLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uLmNhbGwoZTEpXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUyKVxuICAgICAgfVxuXG4gICAgICBlMS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJldmVudERlZmF1bHQuY2FsbChlMSlcbiAgICAgICAgcHJldmVudERlZmF1bHQuY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgLy8gY2FsbHMgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYGVuZGAgZXZlbnQsXG4gICAgICAvLyBidXQgaSBkb24ndCB0aGluayBpdCBtYXR0ZXJzLlxuICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncylcbiAgICB9XG5cbiAgICAvLyBjbGVhbnVwIGVuZCBldmVudHNcbiAgICAvLyB0byBjYW5jZWwgdGhlIHRhcCwganVzdCBydW4gdGhpcyBlYXJseVxuICAgIGZ1bmN0aW9uIGNsZWFudXAoZTIpIHtcbiAgICAgIC8vIGlmIGl0J3MgdGhlIHNhbWUgZXZlbnQgYXMgdGhlIG9yaWdpbixcbiAgICAgIC8vIHRoZW4gZG9uJ3QgYWN0dWFsbHkgY2xlYW51cC5cbiAgICAgIC8vIGhpdCBpc3N1ZXMgd2l0aCB0aGlzIC0gZG9uJ3QgcmVtZW1iZXJcbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dF9pZClcblxuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgY2xlYW51cClcblxuICAgICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwidmFyIGRlYm91bmNlID0gcmVxdWlyZSggJy4vZGVib3VuY2UnIClcblxudmFyIHRocm90dGxlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIGlmICggdHlwZW9mKCBmbiApID09ICdvYmplY3QnICkgeyBvcHRpb25zID0gZm47IGZuID0gdW5kZWZpbmVkIH0gXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgb3B0aW9ucy53YWl0ID0gb3B0aW9ucy53YWl0IHx8IHdhaXQgfHwgMFxuICBvcHRpb25zLm1heCAgPSBvcHRpb25zLm1heCB8fCBvcHRpb25zLndhaXRcbiAgb3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZm5cbiAgb3B0aW9ucy5sZWFkaW5nICA9IHRydWVcbiAgb3B0aW9ucy50cmFpbGluZyA9IHRydWVcblxuICByZXR1cm4gZGVib3VuY2Uob3B0aW9ucylcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlXG4iLCJ2YXIgdmFsaWRhdGlvbiA9IHJlcXVpcmUoICcuL2xpYi92YWxpZGF0aW9uJyApXG52YXIgcHJvZ3Jlc3NpdmUgPSByZXF1aXJlKCAnLi9saWIvcHJvZ3Jlc3NpdmUnIClcbnZhciBnZXRMYWJlbCA9IHJlcXVpcmUoICcuL2xpYi9nZXQtbGFiZWwnIClcbnZhciBkaWZmID0gcmVxdWlyZSggJy4vbGliL2RpZmYnIClcbnZhciBpbnB1dENoYW5nZSA9IHJlcXVpcmUoICcuL2xpYi9pbnB1dC1jaGFuZ2UnIClcbnJlcXVpcmUoICcuL2xpYi9yZXNldCcgKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICB2YWxpZGF0ZTogdmFsaWRhdGlvbi52YWxpZGF0ZSxcbiAgaW52YWxpZGF0ZUZpZWxkOiB2YWxpZGF0aW9uLmludmFsaWRhdGVGaWVsZCxcbiAgbmV4dDogcHJvZ3Jlc3NpdmUubmV4dCxcbiAgZ2V0TGFiZWw6IGdldExhYmVsLFxuICBkaWZmOiBkaWZmLFxuICBpbnB1dENoYW5nZTogaW5wdXRDaGFuZ2VcblxufVxuIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ID0gdG9vbGJveC5ldmVudCxcbiAgICBnZXRMYWJlbCA9IHJlcXVpcmUoICcuL2dldC1sYWJlbCcpLFxuICAgIGlucHV0Q2hhbmdlID0gcmVxdWlyZSggJy4vaW5wdXQtY2hhbmdlJyApLFxuICAgIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcblxuZnVuY3Rpb24gZGlmZkZvcm0oIGV2ZW50ICkge1xuICB2YXIgZm9ybSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICB2YXIgZGlmZnMgPSBbXSxcbiAgICAgIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcblxuICBpZiAoIGRpZmZFbCA9PSBudWxsICkgeyByZXR1cm4gfVxuXG4gIGluaXREaWZmSWRzKCBmb3JtIClcblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJy5jaGFuZ2VkLXZhbHVlJyApLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgdmFyIGRpZmYgPSBkaWZmSW5wdXQoIGVsIClcblxuICAgIC8vIE9ubHkgc2hvdyBvbmUgaW5wdXQgZGlmZiBwZXIgbGFiZWxcbiAgICAvLyBJZiBkaWZmcyBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgbGFiZWwsIGRvIG5vdCBhZGQgaXQuXG4gICAgaWYgKCAhZGlmZnMuZmluZCggZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbCA9PSBkaWZmLmxhYmVsIH0gKSApIGRpZmZzLnB1c2goIGRpZmYgKVxuICB9KVxuXG4gIGlmICggZGlmZnMubGVuZ3RoID09IDAgKSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gJydcbiAgZWxzZSBcbiAgICBkaWZmRWwuaW5uZXJIVE1MID0gYDx0YWJsZSBjbGFzcz0naW5wdXQtZGlmZnMnPiR7IGRpZmZzLm1hcCggZGlmZlJvdyApLmpvaW4oJycpIH08L3RhYmxlPmBcblxuICB0b2dnbGVEaWZmRWxzKCBmb3JtIClcbn1cblxuZnVuY3Rpb24gdG9nZ2xlRGlmZkVscyggZm9ybSApIHtcbiAgdmFyIGRpZmZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGZvcm0uZGF0YXNldC5kaWZmVGFyZ2V0IClcbiAgaWYgKCBkaWZmRWwgKSB7XG5cbiAgICB2YXIgZWxlbWVudHNUb1RvZ2dsZSA9IHRvb2xib3guc2xpY2UoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGRpZmZFbC5kYXRhc2V0LmhpZGVXaGVuRW1wdHkgKSlcbiAgICBlbGVtZW50c1RvVG9nZ2xlLnB1c2goIGRpZmZFbCApXG5cbiAgICB0b29sYm94LmVhY2goIGVsZW1lbnRzVG9Ub2dnbGUsIGZ1bmN0aW9uKCBlbCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2Zvcm0tZGlmZi1oaWRkZW4nLCBkaWZmRWwuY2hpbGRyZW4ubGVuZ3RoID09IDAgKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gQ3JlYXRlIGEgZGlmZiB0YWJsZSByb3dcbmZ1bmN0aW9uIGRpZmZSb3cgKCBkaWZmICkge1xuXG4gIHZhciByb3cgPSBgPHRyIGNsYXNzPSdpbnB1dC1kaWZmICR7ZGlmZlsnY2xhc3MnXSB8fCAnJ30nIGRhdGEtZGlmZi1uYW1lPScke2RpZmYubmFtZX0nPmBcblxuICAgIC8vIEFkZCBsYWJlbCBhbmQgZGlmZiBub3RlXG4gICAgcm93ICs9IGA8dGQgY2xhc3M9J2lucHV0LWRpZmYtbGFiZWwnPjxzcGFuPiR7ZGlmZi5sYWJlbH08L3NwYW4+YFxuICAgIGlmIChkaWZmLm5vdGUpIHJvdyArPSBgIDxzcGFuIGNsYXNzPSdkaWZmLW5vdGUnPiR7ZGlmZi5ub3RlfTwvc3Bhbj5gXG4gICAgcm93ICs9IFwiPC90ZD5cIlxuXG4gICAgLy8gQWRkIGluaXRpYWwgdmFsdWUgY29kZSBjZWxsXG4gICAgcm93ICs9IGRpZmZDZWxsKCBkaWZmLmluaXRpYWwsICdpbml0aWFsJyApXG5cbiAgICAvLyBBZGQgYXJyb3cgbWFya2VyXG4gICAgcm93ICs9IFwiPHRkIGNsYXNzPSdpbnB1dC1kaWZmLW1hcmtlcic+PHNwYW4+4oaSPC9zcGFuPjwvdGQ+XCJcblxuICAgIC8vIEFkZCBjdXJyZW50IHZhbHVlIGNvZGUgY2VsbFxuICAgIHJvdyArPSBkaWZmQ2VsbCggZGlmZi52YWx1ZSwgJ3ZhbHVlJyApXG4gICAgcm93ICs9IGA8dGQgY2xhc3M9J2lucHV0LWRpZmYtdW5kbyc+PHNwYW4+PGJ1dHRvbiBjbGFzcz0nZm9ybS1kaWZmLWJ1dHRvbicgdHlwZT0nYnV0dG9uJyBhcmlhLWxhYmVsPSdSZXNldCBpbnB1dCcgZGF0YS1yZXNldC1pbnB1dD0nJHtkaWZmLnNlbGVjdG9yfSc+4pyVPC9idXR0b24+PC9zcGFuPjwvdGQ+YFxuXG4gIHJldHVybiByb3cgKyBcIjwvdHI+XCJcbn1cblxuZnVuY3Rpb24gZGlmZkNlbGwgKHZhbHVlLCBuYW1lKSB7XG4gIHZhciB0ZENsYXNzID0gYGlucHV0LWRpZmYtJHtuYW1lfWBcbiAgaWYgKCAhdmFsdWUgfHwgdmFsdWUgPT0gJ25vIHNlbGVjdGlvbicgKSB0ZENsYXNzICs9ICcgbnVsbC12YWx1ZSdcblxuICByZXR1cm4gYDx0ZCBjbGFzcz0nJHt0ZENsYXNzfSc+PGNvZGU+JHsoIHZhbHVlIHx8ICdudWxsJyApfTwvY29kZT48L3RkPmBcbn1cblxuLy8gQWRkIHVuaXF1ZSBpZHMgZm9yIGVhY2ggaW5wdXQgaW4gYSBmb3JtXG5mdW5jdGlvbiBpbml0RGlmZklkcyggZm9ybSApIHtcbiAgaWYgKCBmb3JtLmRhdGFzZXQuZGlmZklkcyApIHJldHVyblxuXG4gIHRvb2xib3guZWFjaCggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCBTZWxlY3RvciApLCBmdW5jdGlvbiAoIGVsLCBpbmRleCApIHtcbiAgICBlbC5kYXRhc2V0LmZvcm1EaWZmSWQgPSBgZm9ybS1kaWZmLSR7cmFuZElEKCl9LSR7aW5kZXh9YFxuICB9KVxuXG4gIGZvcm0uZGF0YXNldC5kaWZmSWRzID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiByYW5kSUQgKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpXG59XG5cbi8vIFJldHVybnM6IHsgaW5wdXQ6IGlucHV0IGVsZW1lbnQsIGluaXRpYWw6ICdvbGQgdmFsdWUnLCB2YWx1ZTogJ25ldyB2YWx1ZScgfVxuZnVuY3Rpb24gZGlmZklucHV0KCBpbnB1dCApIHtcbiAgdmFyIGRpZmYgPSB7XG4gICAgaW5pdGlhbDogW10sXG4gICAgdmFsdWU6IFtdLFxuICAgIG5hbWU6IFtdLFxuICAgIHNlbGVjdG9yOiBbXVxuICB9LFxuICAgIGlucHV0c1xuXG4gIHZhciBsYWJlbCA9IHRvb2xib3guZ2V0Q2xvc2VzdCggaW5wdXQsICdsYWJlbCcgKVxuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggaW5wdXQsICdmb3JtJyApXG5cbiAgaWYgKCBsYWJlbCApIHtcbiAgICAvLyBHZXQgdGV4dCBsYWJlbCBmcm9tIHRoZSBmaXJzdCBpbnB1dCBpbiBhIGxhYmVsXG4gICAgZGlmZi5sYWJlbCA9IGdldExhYmVsLnRleHQoIGxhYmVsLnF1ZXJ5U2VsZWN0b3IoIFNlbGVjdG9yICkgKVxuXG4gICAgLy8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgaW5wdXRzIHVuZGVyIGEgc2luZ2xlIGxhYmVsXG4gICAgLy8gR3JvdXAgdGhvc2UgaW5wdXQgdmFsdWVzIGluIHRoZSBmb3JtIGRpZmYgYW5kIHRyZWF0XG4gICAgLy8gdGhlbSBhcyBhIHNpbmdsZSB2YWx1ZVxuICAgIHZhciBsYWJlbElucHV0cyA9IHRvb2xib3guc2xpY2UoIGxhYmVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFNlbGVjdG9yICkgKVxuXG4gICAgLy8gSWYgbXVsdGlwbGUgaW5wdXRzIGFyZSB1bmRlciBhIHNpbmdsZSBsYWJlbCwgdXNlIHRob3NlXG4gICAgLy8gb3RoZXJ3aXNlIHVzZSBpbnB1dCBhcyBhbiBhcnJheSAodG8gc2ltcGxpZnkgdGhpcylcbiAgICBpbnB1dHMgPSAoIGxhYmVsSW5wdXRzLmxlbmd0aCA+IDAgKSA/IGxhYmVsSW5wdXRzIDogWyBpbnB1dCBdXG4gIH0gZWxzZSB7XG4gICAgaW5wdXRzID0gWyBpbnB1dCBdXG4gIH1cblxuICBkaWZmLmxhYmVsID0gZGlmZi5sYWJlbCB8fCBnZXRMYWJlbC50ZXh0KCBpbnB1dCApIHx8IGlucHV0LmdldEF0dHJpYnV0ZSggJ25hbWUnIClcblxuICB0b29sYm94LmVhY2goIGlucHV0cywgZnVuY3Rpb24gKCBpbnB1dCApIHtcblxuICAgIGlmICggaW5wdXQudHlwZSA9PSAncmFuZ2UnICYmIGlucHV0LmRhdGFzZXQudmFsdWVzICkge1xuICAgICAgZGlmZi5pbml0aWFsLnB1c2goIGlucHV0LmRhdGFzZXQudmFsdWVzLnNwbGl0KCcsJylbaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWVdIClcbiAgICAgIGRpZmYudmFsdWUucHVzaCggaW5wdXQuZGF0YXNldC52YWx1ZXMuc3BsaXQoJywnKVtpbnB1dC52YWx1ZV0gKVxuXG4gICAgLy8gR2V0IHNlbGVjdCBsYWJlbCBuYW1lcyAocmF0aGVyIHRoYW4gdmFsdWVzKSBpZiBwcmVzZW50XG4gICAgfSBlbHNlIGlmICggaW5wdXQudGFnTmFtZSA9PSAnU0VMRUNUJyApIHtcblxuICAgICAgLy8gU2hvdyBvcHRpb24gbGFiZWxzIGluc3RlYWQgb2YgdmFsdWVzIGlmIHByZXNlbnRcbiAgICAgIHZhciBvcHRpb25zID0ge31cbiAgICAgIHRvb2xib3guZWFjaChpbnB1dC5jaGlsZHJlbiwgZnVuY3Rpb24gKCBvICkge1xuICAgICAgICBvcHRpb25zW28udmFsdWVdID0gby52YWx1ZSA/IG8udGV4dCA6ICdubyBzZWxlY3Rpb24nXG4gICAgICB9KVxuXG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggb3B0aW9uc1sgaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgXSB8fCBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSApXG4gICAgICBkaWZmLnZhbHVlLnB1c2goIG9wdGlvbnNbIGlucHV0LnZhbHVlIF0gfHwgaW5wdXQudmFsdWUgKVxuXG4gICAgLy8gR2V0IHJhZGlvIGxhYmVsIG5hbWVzIChyYXRoZXIgdGhhbiB2YWx1ZXMpIGlmIHByZXNlbnRcbiAgICB9IGVsc2UgaWYgKCBpbnB1dC50eXBlID09ICdyYWRpbycgKSB7XG5cbiAgICAgIGRpZmYubGFiZWwgPSBnZXRMYWJlbC5sZWdlbmQoIGlucHV0ICkgfHwgZGlmZi5sYWJlbFxuXG4gICAgICB2YXIgcmFkaW9JbnB1dHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoIGBpbnB1dFtuYW1lPVwiJHtpbnB1dC5uYW1lfVwiXWAgKVxuICAgICAgdmFyIHJhZGlvSW5pdGlhbCwgcmFkaW9WYWx1ZVxuXG4gICAgICByYWRpb0lucHV0cy5mb3JFYWNoKCBmdW5jdGlvbiggcmFkaW8gKSB7XG4gICAgICAgIGlmICggcmFkaW8uZGF0YXNldC5pbml0aWFsVmFsdWUgPT0gJ3RydWUnICkgcmFkaW9Jbml0aWFsID0gZ2V0TGFiZWwudGV4dCggcmFkaW8gKVxuICAgICAgICBpZiAoIHJhZGlvLmNoZWNrZWQgKSBkaWZmLnZhbHVlLnB1c2goIGdldExhYmVsLnRleHQoIHJhZGlvICkgKVxuICAgICAgfSlcblxuICAgICAgZGlmZi5pbml0aWFsLnB1c2goIHJhZGlvSW5pdGlhbCB8fCAnbm8gc2VsZWN0aW9uJyApXG5cbiAgICAvLyBUcmFjayBjaGVja2VkIHN0YXRlIGZvciBjaGVja2JveGVzIChyYXRoZXIgdGhhbiB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKCBpbnB1dC50eXBlID09ICdjaGVja2JveCcgKSB7XG4gICAgICBkaWZmLmluaXRpYWwucHVzaCggaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBpbnB1dC5jaGVja2VkIClcbiAgICB9IGVsc2Uge1xuICAgICAgZGlmZi5pbml0aWFsLnB1c2goIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlIClcbiAgICAgIGRpZmYudmFsdWUucHVzaCggaW5wdXQudmFsdWUgKVxuICAgIH1cblxuICAgIGRpZmYubm90ZSA9IGlucHV0LmRhdGFzZXQuZGlmZk5vdGVcbiAgICBkaWZmWydjbGFzcyddID0gaW5wdXQuZGF0YXNldC5kaWZmQ2xhc3NcbiAgICBkaWZmLm5hbWUucHVzaCggaW5wdXQubmFtZSApXG4gICAgZGlmZi5zZWxlY3Rvci5wdXNoKCBpbnB1dC5kYXRhc2V0LmZvcm1EaWZmSWQgKVxuICB9KVxuXG4gIGRpZmYuaW5pdGlhbCA9IGRpZmYuaW5pdGlhbC5qb2luKCcgJylcbiAgZGlmZi52YWx1ZSA9IGRpZmYudmFsdWUuam9pbignICcpXG4gIGRpZmYubmFtZSA9IGRpZmYubmFtZS5qb2luKCcgJylcbiAgZGlmZi5zZWxlY3RvciA9IGRpZmYuc2VsZWN0b3IubWFwKCBmdW5jdGlvbiAoIHMgKSB7IHJldHVybiBgW2RhdGEtZm9ybS1kaWZmLWlkPVwiJHtzfVwiXWAgfSApLmpvaW4oJywgJylcblxuICByZXR1cm4gZGlmZlxufVxuXG5cbmZ1bmN0aW9uIHdhdGNoICgpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICBpbnB1dENoYW5nZS53YXRjaCgpXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2hhbmdlJywgJ2Zvcm0nLCBFdmVudC5kZWJvdW5jZSggZGlmZkZvcm0sIDEwMCApIClcblxuICAgIC8vIEhpZGUgZW1wdHkgZm9ybS1kaWZmc1xuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm1bZGF0YS1kaWZmLXRhcmdldF0nICksIHRvZ2dsZURpZmZFbHMgKVxuXG4gICAgaWYgKCAhZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyNmb3JtLWRpZmYtaGlkZGVuJyApIClcbiAgICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCAnPHN0eWxlIGlkPVwiZm9ybS1kaWZmLWhpZGRlblwiPi5mb3JtLWRpZmYtaGlkZGVueyBkaXNwbGF5OiBub25lIH08L3N0eWxlPicpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKVxudmFyIFNlbGVjdG9yID0gcmVxdWlyZSggJy4vc2VsZWN0b3InIClcblxuZnVuY3Rpb24gZ2V0SW5wdXQgKCBpbnB1dCApIHtcbiAgaWYgKCB0eXBlb2YgaW5wdXQgPT0gJ3N0cmluZycgKSBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGlucHV0IClcbiAgcmV0dXJuIGlucHV0XG59XG5cbmZ1bmN0aW9uIGdldExhYmVsICggaW5wdXQgKSB7XG5cbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKVxuICBpZiAoIWlucHV0KSByZXR1cm5cblxuICAvLyBMYWJlbCB3cmFwcyBpbnB1dFxuICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnICkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggYGxhYmVsW2Zvcj1cIiR7aW5wdXQuaWR9XCJdYCApXG5cbiAgcmV0dXJuIGxhYmVsXG59XG5cbmZ1bmN0aW9uIGdldEFyaWFMYWJlbCggaW5wdXQgKSB7XG4gIGlucHV0ID0gZ2V0SW5wdXQoIGlucHV0ICk7IGlmICghaW5wdXQpIHJldHVyblxuICB2YXIgbGFiZWwgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKVxuICB2YXIgbGFiZWxsZWRCeSA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWxsZWRieScgKVxuXG4gIGlmICggIWxhYmVsICYmIGxhYmVsbGVkQnkgKSB7XG5cbiAgICAvLyBhcmlhLWxhYmVsbGVkYnk9J3NvbWVJRCBhbm90aGVySUQnIG11c3QgcmVhZCBtdWx0aXBsZSBlbGVtZW50cyB0ZXh0IGNvbnRlbnQuXG4gICAgLy8gVGhpcyBjcmVhdGVzIGEgc2VsZWN0b3IgKHByZXBlbmRpbmcgdGhlICcjJyBiZWZvcmUgZWFjaCkgdG8gZmluZCB0aGUgbGFiZWxzLlxuICAgIC8vXG4gICAgdmFyIHNlbGVjdG9yID0gbGFiZWxsZWRCeS5zcGxpdCgnICcpLm1hcCggZnVuY3Rpb24gKCBuYW1lICkgeyByZXR1cm4gJyMnK25hbWUgfSApXG5cbiAgICB2YXIgbGFiZWxUZXh0ID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKCBzZWxlY3RvciwgZnVuY3Rpb24oIHMgKSB7IFxuICAgICAgdmFyIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggcyApXG4gICAgICBpZiAoIGVsICkgcmV0dXJuIGVsLnRleHRDb250ZW50XG4gICAgICBlbHNlIHJldHVybiBmYWxzZVxuICAgIH0pLmZpbHRlciggZnVuY3Rpb24gKCBlICkgeyByZXR1cm4gZSAhPSBmYWxzZSB9IClcblxuICAgIGlmICggbGFiZWxUZXh0ICkgbGFiZWwgPSBsYWJlbFRleHQuam9pbignICcpXG4gIH1cblxuICByZXR1cm4gbGFiZWxcbn1cblxuLy8gQXJlIGlucHV0cyBpbiBhIGZpZWxkc2V0IHdpdGggYSBsZWdlbmQ/XG4vLyBVc2UgdGhhdCBhcyB0aGUgbGFiZWwgdGV4dFxuZnVuY3Rpb24gZ2V0TGVnZW5kVGV4dCAoIGlucHV0ICkge1xuICBpbnB1dCA9IGdldElucHV0KCBpbnB1dCApOyBpZiAoIWlucHV0KSByZXR1cm5cbiAgdmFyIGxlZ2VuZFRleHRcblxuICB2YXIgZmllbGRzZXQgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZmllbGRzZXQnIClcblxuICBpZiAoIGZpZWxkc2V0ICkge1xuICAgIHZhciBsZWdlbmQgPSBmaWVsZHNldC5xdWVyeVNlbGVjdG9yKCAnbGVnZW5kJyApXG4gICAgaWYgKCBsZWdlbmQgKSBsZWdlbmRUZXh0ID0gbGVnZW5kLnRleHRDb250ZW50LnRyaW0oKVxuICB9XG5cbiAgcmV0dXJuIGxlZ2VuZFRleHRcbn1cblxuXG5mdW5jdGlvbiBnZXRMYWJlbFRleHQgKCBpbnB1dCApIHtcbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKTsgaWYgKCFpbnB1dCkgcmV0dXJuXG5cbiAgdmFyIGxhYmVsID0gZ2V0TGFiZWwoIGlucHV0IClcblxuICAvLyBHcmFiIHRleHQgZnJvbSBpbnB1dCBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnlcbiAgdmFyIGxhYmVsVGV4dCA9IGdldEFyaWFMYWJlbCggaW5wdXQgKVxuXG4gIC8vIFVzZSBvciBsYWJlbC50ZXh0Q29udGVudCwgb3IgaW5wdXQgcGxhY2Vob2xkZXI9XCJcIlxuICBpZiAoICFsYWJlbFRleHQgKSB7XG4gICAgaWYgKGxhYmVsKSBsYWJlbFRleHQgPSBsYWJlbC50ZXh0Q29udGVudFxuXG4gICAgZWxzZSBsYWJlbFRleHQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICdwbGFjZWhvbGRlcicgKVxuICB9XG5cbiAgaWYgKCBsYWJlbFRleHQgKSByZXR1cm4gbGFiZWxUZXh0LnRyaW0oKVxufVxuXG5nZXRMYWJlbC50ZXh0ID0gZ2V0TGFiZWxUZXh0XG5nZXRMYWJlbC5sZWdlbmQgPSBnZXRMZWdlbmRUZXh0XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TGFiZWxcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnICksXG4gICAgaW5wdXRTZWxlY3RvcnMgPSByZXF1aXJlKCAnLi9zZWxlY3RvcicgKSxcbiAgICB3YXRjaGluZyA9IGZhbHNlXG5cbmZ1bmN0aW9uIGlucHV0SW5pdCggaW5wdXQgKSB7XG4gIGlucHV0LmNsYXNzTGlzdC50b2dnbGUoICdlbXB0eScsICFpbnB1dC52YWx1ZS50cmltKCkubGVuZ3RoIClcbiAgaWYgKCBpbnB1dC50eXBlID09ICdyYWRpbycgfHwgaW5wdXQudHlwZSA9PSAnY2hlY2tib3gnICkge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQuY2hlY2tlZFxuICB9IGVsc2Uge1xuICAgIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlID0gaW5wdXQudmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnB1dENoYW5nZSggaW5wdXQgKSB7XG4gIC8vIEFsbG93IGNhbGxpbmcgZnJvbSBldmVudCBoYW5kbGVyXG4gIHZhciBpbnB1dCA9ICggaW5wdXQudGFyZ2V0IHx8IGlucHV0IClcblxuICAvLyBJZiBlbGVtZW50IGlzIGVtcHR5IChvciBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gIC8vIEFkZCBlbXB0eSBjbGFzc1xuICBpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCAnZW1wdHknLCAhaW5wdXQudmFsdWUudHJpbSgpLmxlbmd0aCApXG5cbiAgY2hhbmdlQ2xhc3NlcyggaW5wdXQgKVxuXG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2Zvcm0nIClcbiAgaWYgKCBmb3JtICkge1xuICAgIEV2ZW50LmZpcmUoIGZvcm0sICdjaGFuZ2UnIClcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGFuZ2VDbGFzc2VzKCBpbnB1dCwgcmVjdXJzaXZlICkge1xuICB2YXIgY2hhbmdlZFxuICB2YXIgZGVmYXVsdGVkXG5cbiAgaWYgKCBpbnB1dC50eXBlID09ICdyYWRpbycgJiYgIXJlY3Vyc2l2ZSApIHtcbiAgICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggaW5wdXQsICdmb3JtJyApXG4gICAgaWYgKCBmb3JtICkge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggYFtuYW1lPScke2lucHV0Lm5hbWV9J11gICksIGZ1bmN0aW9uICggZSApIHtcbiAgICAgICAgY2hhbmdlQ2xhc3NlcyggZSwgdHJ1ZSApXG4gICAgICB9KVxuICAgIH0gXG4gIH0gZWxzZSBpZiAoIGlucHV0LnR5cGUgPT0gJ2NoZWNrYm94JyB8fCBpbnB1dC50eXBlID09ICdyYWRpbycgKSB7XG4gICAgY2hhbmdlZCA9IFN0cmluZyggaW5wdXQuY2hlY2tlZCApICE9IGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlXG4gIH0gZWxzZSB7XG4gICAgY2hhbmdlZCA9IGlucHV0LnZhbHVlICE9IGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlXG4gIH1cblxuICBpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCAnY2hhbmdlZC12YWx1ZScsIGNoYW5nZWQgKVxuICBcbiAgLy8gUmVtb3ZlIGFsbCBkZWZhdWx0ZWQgdmFsdWUgY2xhc3NuYW1lcyBvbiBhbiBpbnB1dCBjaGFuZ2VcbiAgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSggJ2RlZmF1bHRlZC12YWx1ZScgKVxuXG4gIHZhciBsYWJlbCA9IGdldExhYmVsKCBpbnB1dCApXG5cbiAgaWYgKCBsYWJlbCApIHtcbiAgICB2YXIgaGFzQ2hhbmdlZElucHV0cyA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoICcuY2hhbmdlZC12YWx1ZScgKSB8fCBpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoICdjaGFuZ2VkLXZhbHVlJyApXG4gICAgbGFiZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2lucHV0LWNoYW5nZWQtdmFsdWUnLCBoYXNDaGFuZ2VkSW5wdXRzIClcblxuICAgIC8vIFJlbW92ZSBhbGwgZGVmYXVsdGVkIHZhbHVlIGNsYXNzbmFtZXMgb24gYW4gaW5wdXQgY2hhbmdlXG4gICAgdG9vbGJveC5lYWNoKCBsYWJlbC5xdWVyeVNlbGVjdG9yQWxsKCAnLmRlZmF1bHRlZC12YWx1ZScgKSwgZnVuY3Rpb24gKCBlbCApIHsgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2RlZmF1bHRlZC12YWx1ZScgKSB9IClcbiAgICBsYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCAnaW5wdXQtZGVmYXVsdGVkLXZhbHVlJyApXG4gIH1cbn1cblxuXG5mdW5jdGlvbiB3YXRjaCAoKSB7XG4gIGlmICggd2F0Y2hpbmcgKSB7IHJldHVybiB9XG4gIC8vIEluaXRpYWxpemUgaW5wdXQgc3RhdGVcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGlucHV0U2VsZWN0b3JzICksIGlucHV0SW5pdCApXG4gIH0pXG5cbiAgLy8gU2V0IGlucHV0IHN0YXRlIG9uIGlucHV0XG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgaW5wdXRTZWxlY3RvcnMsIGlucHV0Q2hhbmdlIClcblxuICAvLyBGb3JtLnJlc2V0KCkgZG9lc24ndCBmaXJlIGlucHV0IGV2ZW50cy4gVGhpcyBlbnN1cmVzIHRob3NlIGV2ZW50cyBhcmUgZmlyZWQuXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1t0eXBlPXJlc2V0XScsIHJlc2V0Rm9ybSApXG5cbiAgd2F0Y2hpbmcgPSB0cnVlXG59XG5cblxuZnVuY3Rpb24gcmVzZXRGb3JtKGV2ZW50KSB7XG4gIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KGV2ZW50LnRhcmdldCwgJ2Zvcm0nKVxuXG4gIEV2ZW50LmRlbGF5KCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dC5pbnB1dC1jaGFuZ2VkLCBzZWxlY3QuaW5wdXQtY2hhbmdlZCwgdGV4dGFyZWEuaW5wdXQtY2hhbmdlZCAnKSwgZnVuY3Rpb24oIGVsICkge1xuICAgICAgRXZlbnQuZmlyZSggZWwsICdpbnB1dCcgKVxuICAgIH0pXG4gIH0sIDEwMCApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3YXRjaDogd2F0Y2hcbn1cbiIsInZhciB0b29sYm94ICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIENhbGxiYWNrID0gdG9vbGJveC5ldmVudC5jYWxsYmFjayxcbiAgICBmb3JtU2VsZWN0b3IgPSAnZm9ybS5wcm9ncmVzc2l2ZScsXG4gICAgd2F0Y2hpbmcgPSBmYWxzZSxcbiAgICBmb3JtQ2FsbGJhY2tzLFxuICAgIHJlZ2lzdGVyZWRGb3Jtc1xuXG4vLyBSZW1vdmUgYW55IGV4aXN0aW5nIGNhbGxiYWNrcyBhbmQgcmVnaXN0ZXJlZCBmb3Jtc1xuZnVuY3Rpb24gcmVzZXQgKCkge1xuXG4gIGZvcm1DYWxsYmFja3MgPSB7IG5leHQ6IFtdIH1cbiAgcmVnaXN0ZXJlZEZvcm1zID0gW11cblxufVxuXG5mdW5jdGlvbiBuZXdGb3JtKCBmb3JtICkge1xuXG4gIGlmICggIWZvcm0gKSByZXR1cm5cblxuICB2YXIgc3RlcHMgICAgID0gdG9vbGJveC5zbGljZSggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnLmZvcm0tc3RlcCcgKSApLFxuICAgICAgc3RlcEluZGV4ID0gMCxcbiAgICAgIG5hdkl0ZW1zICA9ICcnXG5cbiAgaWYgKCBzdGVwcy5sZW5ndGggPT0gMCApIHJldHVyblxuXG5cbiAgc3RlcHMuZm9yRWFjaCggZnVuY3Rpb24oIHN0ZXAsIGluZGV4ICkgeyBcblxuICAgIC8vIGRpc2FibGUgYWxsIHN0ZXBzIGJ1dCB0aGUgY3VycmVudCBzdGVwXG4gICAgc3RlcC5kaXNhYmxlZCAgICAgPSBzdGVwICE9IGN1cnJlbnRTdGVwKClcbiAgICBzdGVwLmRhdGFzZXQuc3RlcCA9IGluZGV4XG5cbiAgfSlcblxuICBpZiAoIGZvcm0uZGF0YXNldC5uYXYgKSB7XG4gICAgdmFyIG5hdiA9ICc8bmF2IGNsYXNzPVwicHJvZ3Jlc3NpdmUtZm9ybS1uYXZcIj4nXG5cbiAgICBzdGVwcy5mb3JFYWNoKCBmdW5jdGlvbiggc3RlcCwgaW5kZXggKSB7XG4gICAgICBuYXYgKz0gJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwcm9ncmVzc2l2ZS1mb3JtLW5hdi1pdGVtXCIgZGF0YS1zdGVwPVwiJysoIGluZGV4ICsgMSApKydcIj4nXG4gICAgICBuYXYgKz0gc3RlcC5kYXRhc2V0Lm5hdiB8fCBcIlN0ZXAgXCIgKyAoIGluZGV4ICsgMSApXG4gICAgICBuYXYgKz0gJzwvYT4gJ1xuICAgIH0pXG5cbiAgICBuYXYgKz0gJzwvbmF2PidcblxuICAgIGZvcm0uaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJiZWdpbicsIG5hdiApXG4gIH1cblxuICBzaG93KClcblxuICBmdW5jdGlvbiBwcmV2aW91c1N0ZXAgKCkgIHsgcmV0dXJuIHN0ZXBzWyBzdGVwSW5kZXggLSAxXSB9XG4gIGZ1bmN0aW9uIGN1cnJlbnRTdGVwICgpICAgeyByZXR1cm4gc3RlcHNbIHN0ZXBJbmRleCBdIH1cbiAgZnVuY3Rpb24gbmV4dFN0ZXAgKCkgICAgICB7IHJldHVybiBzdGVwc1sgc3RlcEluZGV4ICsgMV0gfVxuICBmdW5jdGlvbiBhY3RpdmUgKCkgICAgICAgIHsgcmV0dXJuIGN1cnJlbnRTdGVwKCkgJiYgIWN1cnJlbnRTdGVwKCkuZGlzYWJsZWQgfVxuIFxuICAvLyBNb3ZlIHRvIG5leHQgZmllbGRzZXRcbiAgZnVuY3Rpb24gZm9yd2FyZCAoKSB7XG4gICAgc2hvd1N0ZXAoIHN0ZXBJbmRleCArIDEgKVxuICB9XG5cbiAgLy8gTW92ZSB0byBuZXh0IGZpZWxkc2V0XG4gIGZ1bmN0aW9uIGJhY2sgKCkge1xuICAgIHNob3dTdGVwKCBzdGVwSW5kZXggLSAxIClcbiAgfVxuXG4gIC8vIEFjY2VwdHMgYSBzdGVwIGluZGV4XG4gIGZ1bmN0aW9uIHNob3dTdGVwICggaW5kZXggKSB7XG5cbiAgICBpbmRleCA9IE51bWJlciggaW5kZXggKVxuXG4gICAgLy8gR2V0IHRoZSBzdGVwIGZyb20gdGhlIGluZGV4XG4gICAgdmFyIHN0ZXAgPSBzdGVwc1sgaW5kZXggXVxuXG4gICAgLy8gRG9uJ3QgZ28gdG8gYSBub24tZXhpc3RhbnQgc3RlcCwgb3IgdGhlIGN1cnJlbnQgc3RlcFxuICAgIGlmICggc3RlcCAmJiBzdGVwICE9IGN1cnJlbnRTdGVwKCkgKSB7XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSAoIHN0ZXBJbmRleCA8IGluZGV4ICkgPyAnZm9yd2FyZCcgOiAncmV2ZXJzZSdcblxuICAgICAgLy8gSWYgYSBzdGVwIGlzIGN1cnJlbnRseSBhY3RpdmVcbiAgICAgIC8vIGRpc21pc3MgaXQgYmVmb3JlIGdvaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RlcFxuICAgICAgaWYgKCBhY3RpdmUoKSApIHtcbiAgICAgICAgcmV0dXJuIGRpc21pc3MoIGZ1bmN0aW9uKCkgeyBzaG93U3RlcCggaW5kZXggKSB9LCBkaXJlY3Rpb24gKVxuICAgICAgfVxuXG4gICAgICBzdGVwSW5kZXggPSBpbmRleFxuXG4gICAgICBzaG93KCBkaXJlY3Rpb24gKVxuXG4gICAgfVxuICB9XG4gIFxuICAvLyBIaWRlIGEgY29tcGxldGVkIHN0ZXAgYW5kIG1vdmUgdG8gdGhlIG5leHRcbiAgZnVuY3Rpb24gZGlzbWlzcyAoIGNhbGxiYWNrLCBkaXJlY3Rpb24gKSB7XG4gICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8ICdmb3J3YXJkJ1xuXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlJywgJ2VudGVyJyApXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnZXhpdCcgKVxuICAgIGN1cnJlbnRTdGVwKCkuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBjdXJyZW50U3RlcCgpLCBmdW5jdGlvbigpIHtcbiAgICAgIGRpc2FibGUoKVxuXG4gICAgICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIGNhbGxiYWNrKClcblxuICAgIH0sIDIwKVxuXG4gIH1cblxuICBmdW5jdGlvbiByZXZpc2l0ICggY2FsbGJhY2ssIGRpcmVjdGlvbiApIHtcblxuICAgIGlmICggIWFjdGl2ZSgpICkge1xuICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8ICdyZXZlcnNlJ1xuXG4gICAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5yZW1vdmUoICdleGl0JywgJ2NvbXBsZXRlZCcgKVxuICAgICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlJywgJ2VudGVyJyApXG4gICAgICBjdXJyZW50U3RlcCgpLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgIGRpc2FibGVPdGhlckZpZWxkc2V0cygpXG5cbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBjdXJyZW50U3RlcCgpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgKSBjYWxsYmFjaygpXG4gICAgICB9LCAyMClcbiAgICB9XG4gIH1cblxuICAvLyBTaG93IHRoZSBmb3JtLXN0ZXBcbiAgZnVuY3Rpb24gc2hvdyAoIGRpcmVjdGlvbiApIHtcblxuICAgIGRpc2FibGVPdGhlckZpZWxkc2V0cygpXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnY29tcGxldGVkJyApXG4gICAgY3VycmVudFN0ZXAoKS5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LmFkZCggJ2FjdGl2ZScsICdlbnRlcicgKVxuXG4gICAgLy8gZm9jdXMgb24gdGhlIGZpcnN0IGlucHV0XG4gICAgdmFyIGZpcnN0SW5wdXQgPSBjdXJyZW50U3RlcCgpLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dDpub3QoW2hpZGRlbl0pLCB0ZXh0YXJlYSwgc2VsZWN0JyApXG4gICAgaWYgKCBmaXJzdElucHV0ICkgZmlyc3RJbnB1dC5mb2N1cygpXG5cbiAgICBzZXROYXYoKVxuXG4gIH1cblxuICAvLyBEaXNhYmxlIGEgZm9ybSBzdGVwIGFmdGVyIGl0IGhhcyBiZWVuIGhpZGRlblxuICBmdW5jdGlvbiBkaXNhYmxlICgpIHtcblxuICAgIGN1cnJlbnRTdGVwKCkuZGlzYWJsZWQgPSB0cnVlXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QuYWRkKCAnY29tcGxldGVkJyApXG4gICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInLCAnZXhpdCcgKVxuXG4gIH1cblxuICBmdW5jdGlvbiBzZXROYXYgKCkge1xuICAgIHRvb2xib3guZWFjaCggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnbmF2IFtkYXRhLXN0ZXBdJyApLCBmdW5jdGlvbiAoIG5hdiApIHtcblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwIDwgc3RlcEluZGV4ICsgMSApIHtcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5yZW1vdmUoICdoZXJlJywgJ25leHQnIClcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoICdwcmV2aW91cycsICdjb21wbGV0ZWQnIClcbiAgICAgIH1cblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwID09IHN0ZXBJbmRleCArIDEgKSB7XG4gICAgICAgIG5hdi5jbGFzc0xpc3QucmVtb3ZlKCAncHJldmlvdXMnLCAnbmV4dCcgKVxuICAgICAgICBuYXYuY2xhc3NMaXN0LmFkZCggJ2hlcmUnIClcbiAgICAgIH1cblxuICAgICAgaWYgKCBuYXYuZGF0YXNldC5zdGVwID4gc3RlcEluZGV4ICsgMSApIHtcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5yZW1vdmUoICdwcmV2aW91cycsICdoZXJlJyApXG4gICAgICAgIG5hdi5jbGFzc0xpc3QuYWRkKCAnbmV4dCcgKVxuICAgICAgfVxuXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuYWJsZUZpZWxkc2V0cyAoIGZvcm0gKSB7XG4gICAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICdmaWVsZHNldC5mb3JtLXN0ZXBbZGlzYWJsZWRdJyApLCBmdW5jdGlvbiggZmllbGRzZXQgKSB7XG4gICAgICBmaWVsZHNldC5kaXNhYmxlZCA9IGZhbHNlIFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBkaXNhYmxlT3RoZXJGaWVsZHNldHMgKCApIHtcbiAgICBzdGVwcy5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGRzZXQgKSB7XG4gICAgICBmaWVsZHNldC5kaXNhYmxlZCA9IGZpZWxkc2V0ICE9IGN1cnJlbnRTdGVwKCkgXG4gICAgfSlcbiAgfVxuXG4gIHJlZ2lzdGVyZWRGb3Jtcy5wdXNoKCBmdW5jdGlvbiggZXZlbnQsIHRyaWdnZXIgKSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICAgIGlmICggdHJpZ2dlciA9PT0gJ3Nob3ctc3RlcCcgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCB0YXJnZXQsICcucHJldmlvdXMsIC5jb21wbGV0ZWQsIC5jb21wbGV0ZWQgKyBhJyApIClcbiAgICAgICAgc2hvd1N0ZXAoIHRhcmdldC5kYXRhc2V0LnN0ZXAgLSAxIClcblxuICAgIH0gZWxzZSBpZiAoIHRyaWdnZXIgPT09ICduZXh0JyApIHtcblxuICAgICAgLy8gQ29udGludWUgaWYgc3VibWl0IHdhcyB0cmlnZ2VyZWQgb24gdGhpcyBmb3JtXG4gICAgICAvLyBhbmQgbm8gaW52YWxpZCBmaWVsZHMgYXJlIGZvdW5kXG5cbiAgICAgIHZhciBmb3JtRWwgPSAoIHRhcmdldC50YWdOYW1lID09IFwiRk9STVwiICkgPyB0YXJnZXQgOiB0b29sYm94LmdldENsb3Nlc3QoIHRhcmdldCwgJ2Zvcm0nKVxuXG4gICAgICBpZiAoIGZvcm0gPT0gZm9ybUVsICYmICFjdXJyZW50U3RlcCgpLnF1ZXJ5U2VsZWN0b3IoICc6aW52YWxpZCcgKSApIHtcblxuICAgICAgICAvLyBHZXQgdGhlIGZ1bmN0aW9uIHdoaWNoIHRyaWdnZXJzIGNhbGxiYWNrc1xuICAgICAgICB2YXIgZmlyZUNhbGxiYWNrcyA9IGdldENhbGxiYWNrcyggZm9ybSApXG5cbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBzdG9wLCBiZSBzdXJlIGFsbCBmaWVsZHNldHMgYXJlIGVuYWJsZWQhXG4gICAgICAgIGlmICggIW5leHRTdGVwKCkgKSBlbmFibGVGaWVsZHNldHMoIGZvcm0gKVxuICAgICAgICBlbHNlIGRpc2FibGVPdGhlckZpZWxkc2V0cyggZm9ybSApXG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGNhbGxiYWNrcywgbGV0IHRoZW0gaGFuZGxlIHRoaXMhXG4gICAgICAgIGlmICggZmlyZUNhbGxiYWNrcyApIHtcblxuICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBjYWxsYmFja3MsIHN0b3AgdGhlIHN1Ym1pc3Npb24gZXZlbnRcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgICBmaXJlQ2FsbGJhY2tzKCBldmVudCwge1xuICAgICAgICAgICAgZmllbGRzZXQ6IGN1cnJlbnRTdGVwKCksICAvLyBWYWxpZCBmaWVsZHNldCBlbGVtZW50XG4gICAgICAgICAgICBmb3JtOiAgICAgZm9ybSwgICAgICAgICAgIC8vIFBhcmVudCBmb3JtIGVsZW1lbnRcbiAgICAgICAgICAgIGZvcndhcmQ6ICBmb3J3YXJkLCAgICAgICAgLy8gQ2FsbCBmb3J3YXJkKCkgdG8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZHNldFxuICAgICAgICAgICAgZGlzbWlzczogIGRpc21pc3MsICAgICAgICAvLyBIaWRlIGFuZCBkaXNhYmxlIGN1cnJlbnQgc3RlcFxuICAgICAgICAgICAgcmV2aXNpdDogIHJldmlzaXQsICAgICAgICAvLyBSZXZpc2l0IGN1cnJlbnQgZGlzYWJsZWQgc3RlcFxuICAgICAgICAgICAgc2hvd1N0ZXA6IHNob3dTdGVwLCAgICAgICAvLyBTaG93IGEgc3BlY2lmaWMgc3RlcCBieSBpbmRleCAoMCBiYXNlZClcbiAgICAgICAgICAgIGNvbXBsZXRlOiAhbmV4dFN0ZXAoKSwgICAgLy8gaXMgdGhpcyBpcyB0aGUgZmluYWwgZm9ybSBzdGVwP1xuICAgICAgICAgICAgZm9ybURhdGE6IHRvb2xib3guZm9ybURhdGEoIGN1cnJlbnRTdGVwKCkgKSAvLyBwYXNzIEZvcm1EYXRhIGZvciBjdXJyZW50IGZpZWxkc2V0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNhbGxiYWNrcz8gSWYgdGhlcmUncyBhIG5leHQgc3RlcCwgc3RvcCBzdWJtaXNzaW9uIGFuZCBwcm9jZWVkXG4gICAgICAgIGVsc2UgaWYgKCBuZXh0U3RlcCgpICkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgXG4gICAgICAgICAgZm9yd2FyZCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpcmUgKCBldmVudCwgdHlwZSApIHtcbiAgcmVnaXN0ZXJlZEZvcm1zLmZvckVhY2goIGZ1bmN0aW9uKCBmbiApIHsgZm4oIGV2ZW50LCB0eXBlICkgfSlcbn1cblxuXG4vLyBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggdHJpZ2dlcnMgY2FsbGJhY2tzXG5mdW5jdGlvbiBnZXRDYWxsYmFja3MgKCBmb3JtLCB0eXBlICkge1xuXG4gIHR5cGUgPSB0eXBlIHx8ICduZXh0J1xuICB2YXIgY2FsbGJhY2tzID0gW10sIGNiO1xuXG4gIGZvcm1DYWxsYmFja3NbIHR5cGUgXS5mb3JFYWNoKCBmdW5jdGlvbiggdGVzdCApIHtcbiAgICAgaWYgKCBjYiA9IHRlc3QoIGZvcm0gKSApIHtcbiAgICAgICBjYWxsYmFja3MucHVzaCggY2IgKVxuICAgICB9XG4gIH0pXG5cbiAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggY2FuIHRyaWdnZXIgYWxsIGNhbGxiYWNrc1xuICAvLyBvciByZXR1cm5zIGZhbGxzZSBpZiBub25lIGFyZSBjYWxsZWRcblxuICBpZiAoIGNhbGxiYWNrcy5sZW5ndGggKVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBhcmdzID0gdG9vbGJveC5zbGljZSggYXJndW1lbnRzIClcblxuICAgICAgY2FsbGJhY2tzLmZvckVhY2goIGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoIGNhbGxiYWNrLCBhcmdzICkgfSkgfVxuXG4gIGVsc2UgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIG5leHQgKCBlbCwgY2FsbGJhY2sgKSB7XG4gIG9uKCBlbCwgJ25leHQnLCBjYWxsYmFjayApXG59XG5cbmZ1bmN0aW9uIG9uICggZWwsIGV2ZW50LCBjYWxsYmFjayApIHtcblxuICAvLyBBY2NlcHQgZXZlbnRzIGxpc3QgYXMgYW4gb2JqZWN0IGUuZy4geyBuZXh0OiBjYWxsYmFjayB9XG4gIGlmICggdHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyApIHtcbiAgICBmb3IgKCB0eXBlIGluIGV2ZW50ICkge1xuICAgICAgb24oIGVsLCB0eXBlLCBldmVudFsgdHlwZSBdIClcbiAgICB9XG4gIH1cblxuICBlbHNlIGlmICggZm9ybUNhbGxiYWNrc1sgZXZlbnQgXSApIHtcblxuICAgIC8vIE9ubHkgYWxsb3cgYWNjZXNzIHRvIGEgY2FsbGJhY2sgaWYgdGhlIGZvcm0gbWF0Y2hlc1xuICAgIHZhciBmaWx0ZXIgPSBmdW5jdGlvbiggZm9ybSApIHtcbiAgICAgIGlmICggZm9ybSA9PSBlbCApIHJldHVybiBjYWxsYmFja1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdGVzdCB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRoZSBjYWxsYmFjayBsaXN0XG4gICAgZm9ybUNhbGxiYWNrc1sgZXZlbnQgXS5wdXNoKCBmaWx0ZXIgKVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpe1xuICByZXNldCgpXG5cbiAgLy8gQWRkIGJ1YmJsaW5nIHNvIHdlIGNhbiBsaXN0ZW4gZm9yIHN1Ym1pc3Npb25cbiAgRXZlbnQuYnViYmxlRm9ybUV2ZW50cygpXG5cbiAgdmFyIG5leHRTZWxlY3RvciA9IGZvcm1TZWxlY3RvciArICcgW3R5cGU9c3VibWl0XSwgJyArIGZvcm1TZWxlY3RvciArICcgLm5leHQtc3RlcCdcbiAgdmFyIGJhY2tTZWxlY3RvciA9IGZvcm1TZWxlY3RvciArICcgLmJhY2stc3RlcCdcbiAgdmFyIG5hdlNlbGVjdG9yICA9ICcucHJvZ3Jlc3NpdmUtZm9ybS1uYXYtaXRlbVtkYXRhLXN0ZXBdJ1xuXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgbmV4dFNlbGVjdG9yICwgZmlyZSwgJ25leHQnIClcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCBiYWNrU2VsZWN0b3IgLCBmaXJlLCAnYmFjaycgKVxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsIG5hdlNlbGVjdG9yICAsIGZpcmUsICdzaG93LXN0ZXAnIClcbi8vIGluc2VydCBjb3JlIHN0eWxpbmcgZm9yIGhpZGluZyBkaXNhYmxlZCBhbmQgY29tcGxldGVkIGZvcm0tc3RlcHNcbiAgZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmVlbmQnLCBcIjxzdHlsZT5cXFxuLmZvcm0tc3RlcFtkaXNhYmxlZF0sIC5mb3JtLXN0ZXAuY29tcGxldGVkIHtcXFxuICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcXFxuICB0b3A6ICAgICAgLTk5OTlweCAgIWltcG9ydGFudDtcXFxuICBsZWZ0OiAgICAgLTk5OTlweCAgIWltcG9ydGFudDtcXFxuICBsZWZ0OiAgICAgMCAgICAgICAgIWltcG9ydGFudDtcXFxuICByaWdodDogICAgMCAgICAgICAgIWltcG9ydGFudDsgfVxcXG48L3N0eWxlPlwiIClcblxuICBFdmVudC5jaGFuZ2UoIGZ1bmN0aW9uKCkge1xuICAgIHJlc2V0KClcblxuICAgIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggZm9ybVNlbGVjdG9yICksIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgIG5ld0Zvcm0oIGVsIClcbiAgICB9KVxuICB9KVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG5leHQ6IG5leHQsXG4gIG5ldzogbmV3Rm9ybVxufVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSggJ2NvbXBvc2UtZXZlbnQnICksXG4gICAgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnIClcblxuZnVuY3Rpb24gcmVzZXRWYWx1ZSggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICB2YXIgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LnJlc2V0SW5wdXQgKVxuXG4gIHRvb2xib3guZWFjaCggaW5wdXRzLCBmdW5jdGlvbiAoIGkgKSB7XG4gICAgc2V0VmFsdWUoIGksIGkuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgLy8gVHJpZ2dlciBldmVudCB3YXRjaGVycyB0aGF0IHRoZSBpbnB1dCB3YXMgY2hhbmdlZC5cbiAgaWYgKCBpbnB1dC52YWx1ZSAhPSB2YWx1ZSApIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlXG4gICAgRXZlbnQuZmlyZSggaW5wdXQsICdpbnB1dCcgKVxuXG4gICAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICAgIEV2ZW50LmZpcmUoIGZvcm0sICdjaGFuZ2UnIClcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlRGVmYXVsdCggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICB2YXIgdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5yZXN0b3JlRGVmYXVsdCApXG5cbiAgdG9vbGJveC5lYWNoKCB0YXJnZXRzLCBmdW5jdGlvbiAoIGVsICkge1xuXG4gICAgLy8gUmVzdG9yZSB0byBkZWZhdWx0IGEgc2luZ2xlIGVsZW1lbnRcbiAgICBpZiAoIGVsLmRhdGFzZXQuZGVmYXVsdCApIHtcbiAgICAgIHNldERlZmF1bHQoIGVsIClcbiAgICB9IGVsc2UgaWYgKCBlbC5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG4gICAgICAvLyBSZXN0b3JlIGFsbCBpbnB1dHMgdG8gZGVmYXVsdCB3aGVuXG4gICAgICAvLyBkYXRhLXJlc3RvcmUtZGVmYXVsdCBwb2ludHMgdG8gYSBwYXJlbnQgZWxlbWVudFxuICAgICAgdG9vbGJveC5lYWNoKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtZGVmYXVsdF0nICksIHNldERlZmF1bHQgKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdCggZWwgKSB7XG4gIGlmICggZWwudHlwZSA9PSAncmFkaW8nIHx8IGVsLnR5cGUgPT0gJ2NoZWNrYm94JyApIHtcbiAgICBlbC5jaGVja2VkID0gdHJ1ZVxuICAgIEV2ZW50LmZpcmUoIGVsLCAnaW5wdXQnIClcbiAgfSBlbHNlIHtcbiAgICBzZXRWYWx1ZSggZWwsIGVsLmRhdGFzZXQuZGVmYXVsdCApXG4gIH1cblxuICBlbC5jbGFzc0xpc3QuYWRkKCAnZGVmYXVsdGVkLXZhbHVlJyApXG5cbiAgdmFyIGxhYmVsID0gZ2V0TGFiZWwoIGVsIClcbiAgaWYgKGxhYmVsKSBsYWJlbC5jbGFzc0xpc3QuYWRkKCAnaW5wdXQtZGVmYXVsdGVkLXZhbHVlJyApXG59XG5cbmZ1bmN0aW9uIHJlc2V0Rm9ybShldmVudCkge1xuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnZm9ybScgKVxuICBFdmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICcuY2hhbmdlZC12YWx1ZScgKSwgZnVuY3Rpb24oIGVsICkge1xuICAgICAgRXZlbnQuZmlyZSggZWwsICdpbnB1dCcgKVxuICAgIH0pXG4gIH0sIDEwMClcbn1cblxuRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtcmVzZXQtaW5wdXRdJywgcmVzZXRWYWx1ZSApXG5FdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1yZXN0b3JlLWRlZmF1bHRdJywgcmVzdG9yZURlZmF1bHQgKVxuRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW3R5cGU9cmVzZXRdJywgcmVzZXRGb3JtIClcbiIsIm1vZHVsZS5leHBvcnRzID0gJ2lucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwgc2VsZWN0LCB0ZXh0YXJlYSdcbiIsIi8vIERlcGVuZGVuY2llc1xudmFyIHRvb2xib3ggICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIHRUaW1lICAgICAgPSB0b29sYm94LnRpbWUsXG4gICAgZ2V0Q2xvc2VzdCA9IHRvb2xib3guZ2V0Q2xvc2VzdCxcbiAgICB3b3JkQ291bnQgID0gdG9vbGJveC53b3JkQ291bnQsXG4gICAgdGV4dFNlbGVjdG9ycyA9ICdbcmVxdWlyZWRdJztcblxuLy8gRG9lcyB0aGlzIGJyb3dzZXIgc3VwcG9ydCBIVE1MNSB2YWxpZGF0aW9uP1xuZnVuY3Rpb24gc3VwcG9ydGVkICgpIHtcblxuICByZXR1cm4gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdpbnB1dCcgKS5jaGVja1ZhbGlkaXR5ID09PSAnZnVuY3Rpb24nXG5cbn1cblxudmFyIGludmFsaWRIYW5kbGVyID0gRXZlbnQuY2FsbGJhY2submV3KCBmdW5jdGlvbiggZXZlbnQgKSB7IFxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKSBcbn0pXG5cbi8vIFdhdGNoIGZvciBldmVudHMgKCBpZiB2YWxpZGF0aW9uIGlzIHN1cG9ydGVkIClcbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpe1xuXG4gIGlmICggc3VwcG9ydGVkKCkgKSB7IFxuXG4gICAgRXZlbnQuYnViYmxlRm9ybUV2ZW50cygpXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnaW52YWxpZCcsIGludmFsaWRIYW5kbGVyLCB0cnVlIClcblxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudC5ib2R5LCAnY2xpY2snLCAnW3R5cGU9c3VibWl0XScsIHN1Ym1pdCApXG5cbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICd2YWxpZGF0ZScsICdmb3JtJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBcbiAgICAgIHZhbGlkYXRlRm9ybSggZXZlbnQudGFyZ2V0IClcbiAgICB9KVxuXG4gICAgLy8gRW5zdXJlIGFsbCByZXF1aXJlZCBpbnB1dHMgaGF2ZSBhcmlhLXJlcXVyaXJlZCBhdHRyaWJ1dGVzXG4gICAgdG9vbGJveC5zbGljZSggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tyZXF1aXJlZF0nICkgKS5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbWVudCApIHsgXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtcmVxdWlyZWQnLCB0cnVlIClcbiAgICB9KVxuXG4gICAgLy8gV2F0Y2ggaW5wdXQgZXZlbnRzXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnYmx1cicsICdbcmVxdWlyZWRdJywgY2hlY2tWYWxpZGF0aW9uIClcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywgJ1tyZXF1aXJlZF0nLCBFdmVudC5kZWJvdW5jZSggY2hlY2tWYWxpZGF0aW9uLCAyMDAgKSApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCAnc2VsZWN0W3JlcXVpcmVkXScsIEV2ZW50LmRlYm91bmNlKCBjaGVja1ZhbGlkYXRpb24sIDIwMCApIClcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjaGFuZ2UnLCAnW3R5cGU9Y2hlY2tib3hdW3JlcXVpcmVkXScsIGNoZWNrVmFsaWRhdGlvbiApXG5cbiAgfVxufSlcblxuZnVuY3Rpb24gdmFsaWRhdGVGb3JtICggZm9ybSApIHtcblxuICAvLyBTY29wZWQgdmFyaWFibGVzXG4gIHZhciBpbnB1dHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICdbcmVxdWlyZWRdJyApLFxuICAgICAgaW52YWxpZElucHV0O1xuXG4gIHRvb2xib3guc2xpY2UoIGlucHV0cyApLnNvbWUoIGZ1bmN0aW9uKCBpbnB1dCApIHtcblxuICAgIC8vIGlmIGludmFsaWRcbiAgICBpZiAoICFnZXRDbG9zZXN0KCBpbnB1dCwgJ1tkaXNhYmxlZF0nICkgJiYgIWNoZWNrSW5wdXQoIGlucHV0ICkgKSB7XG4gICAgICBpbnZhbGlkSW5wdXQgPSBpbnB1dFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0pXG5cbiAgaWYgKCBpbnZhbGlkSW5wdXQgKSB7IFxuXG4gICAgLy8gU2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICBmb2N1cyggaW52YWxpZElucHV0IClcbiAgICBzaG93TWVzc2FnZSggaW52YWxpZElucHV0IClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gVGhlIGZvcm0gaXMgdmFsaWQsIHNraXAgaXRcbiAgZWxzZSB7IFxuICAgIHJldHVybiB0cnVlIFxuICB9XG5cbn1cblxuLy8gSGFuZGxlciBmb3IgdmFsaWRhdGlvbiBldmVudHNcbnZhciBjaGVja1ZhbGlkYXRpb24gPSBFdmVudC5jYWxsYmFjay5uZXcoIGZ1bmN0aW9uKCBldmVudCApIHtcblxuICBpZiAoIGNoZWNrSW5wdXQoIGV2ZW50LnRhcmdldCwgZXZlbnQudHlwZSApICkge1xuXG4gICAgLy8gUmVtb3ZlIGFueSBwcmUtZXhpc3RpbmcgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgaGlkZU1lc3NhZ2UoIGV2ZW50LnRhcmdldCApXG4gIH1cblxufSlcblxuXG5mdW5jdGlvbiBjaGVja0lucHV0ICggaW5wdXQsIGV2ZW50ICkge1xuXG4gIHZhciBlbCAgICAgICA9IHN0YXR1c0VsKCBpbnB1dCApLFxuICAgICAgdmFsaWQgICAgPSBpc1ZhbGlkKCBpbnB1dCApLFxuICAgICAgbmV1dHJhbCAgPSBldmVudCA9PSAna2V5ZG93bicgJiYgIXZhbGlkO1xuXG4gIC8vIERvbid0IHRyaWdnZXIgaW52YWxpZCBzdHlsZSB3aGlsZSB0eXBpbmdcbiAgaWYgKCBuZXV0cmFsICYmIGlucHV0ID09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKSB7XG5cbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnaW52YWxpZCcsICd2YWxpZCcgKVxuICAgIGlucHV0LnNldEF0dHJpYnV0ZSggJ2FyaWEtaW52YWxpZCcsIGZhbHNlIClcblxuICB9IGVsc2Uge1xuXG4gICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSggJ2ludmFsaWQnLCAhdmFsaWQgKVxuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoICd2YWxpZCcsIHZhbGlkIClcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWludmFsaWQnLCB2YWxpZCApXG5cbiAgfVxuXG4gIHJldHVybiB2YWxpZFxuXG59XG5cbi8vIElzIGFuIGlucHV0IHZhbGlkP1xuZnVuY3Rpb24gaXNWYWxpZCAoIGlucHV0ICkge1xuXG4gIC8vIElmIGVsZW1lbnQgb25seSBjb250YWlucyB3aGl0ZXNwYWNlLCBzdHJpcCB2YWx1ZVxuICBpZiAoICFpbnB1dC52YWx1ZS5yZXBsYWNlKCAvXFxzL2csICcnICkubGVuZ3RoIClcbiAgICBpbnB1dC52YWx1ZSA9ICcnXG5cbiAgLy8gU2V0IGEgY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZSBmb3Igd29yZCBjb3VudFxuICB2YXIgbWVzc2FnZSA9IGNoZWNrVmFsdWUoIGlucHV0ICkgfHwgY2hlY2tMZW5ndGgoIGlucHV0ICkgfHwgY2hlY2tUaW1lKCBpbnB1dCApIHx8ICcnXG4gIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KCBtZXNzYWdlIClcblxuICB2YXIgdmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KClcblxuICByZXR1cm4gdmFsaWRcblxufVxuXG5cbmZ1bmN0aW9uIGNoZWNrVmFsdWUoIGlucHV0ICkge1xuICBpZiAoIGlucHV0LmRhdGFzZXQuaW52YWxpZFZhbHVlICkge1xuXG4gICAgLy8gRG9lcyBpbnB1dCB2YWx1ZSA9PSBpbnZhbGlkIHZhbHVlPyAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICB2YXIgcmVnZXhwID0gZXNjYXBlZFJlZ2V4KCBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZSwgJ2knIClcblxuICAgIGlmICggaW5wdXQudmFsdWUubWF0Y2goIHJlZ2V4cCApICkge1xuXG4gICAgICAvLyBSZW1vdmUgYW55IHN0YW5kYXJkIGN1c3RvbSBtZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2UgPSBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2VcbiAgICAgIGlucHV0LmRhdGFzZXQubWVzc2FnZSA9ICcnXG5cbiAgICAgIHJldHVybiBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZU1lc3NhZ2UgfHwgXCJWYWx1ZSAnXCIraW5wdXQudmFsdWUrXCInIGlzIG5vdCBwZXJtaXR0ZWRcIlxuXG4gICAgLy8gSWYgbm90IGludmFsaWQgdmFsdWUgcmVzZXQgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgfSBlbHNlIGlmICggaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlICkge1xuXG4gICAgICBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2UgPSBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2VcbiAgICAgIGlucHV0LmRhdGFzZXQuY2FjaGVkTWVzc2FnZSA9ICcnXG5cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlZFJlZ2V4KCBpbnB1dCwgb3B0aW9ucyApIHtcbiAgdmFyIHN0ciA9IGlucHV0LnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG4gIHJldHVybiBuZXcgUmVnRXhwKCBcIl5cIiArIHN0ciArICckJywgb3B0aW9ucyApXG59XG5cbmZ1bmN0aW9uIGNoZWNrTGVuZ3RoICggaW5wdXQgKSB7XG4gIHJldHVybiBjaGVja0NvdW50KCBpbnB1dCwgJ21pbicgKVxuICAgICAgfHwgY2hlY2tDb3VudCggaW5wdXQsICdtYXgnIClcbn1cblxuLy8gVGVzdCBjdXN0b20gdmFsaWRhdGlvbiBmb3IgbWF4aW11bSBvciBtaW5pbXVtIHdvcmRzIHByZXNlbnRcbmZ1bmN0aW9uIGNoZWNrQ291bnQgKCBpbnB1dCwgbGltaXQgKSB7XG5cbiAgdmFyIGdvYWwgPSBpbnB1dC5kYXRhc2V0WyBsaW1pdCArICdXb3JkcycgXVxuXG4gIGlmICggZ29hbCApIHtcbiAgICB2YXIgcGhyYXNpbmcgICA9ICggbGltaXQgPT0gJ21pbicgKSA/ICdhdCBsZWFzdCAnIDogJ25vIG1vcmUgdGhhbiAnLFxuICAgICAgICB2YWxpZCAgICAgID0gKCBsaW1pdCA9PSAnbWluJyApID8gKCBnb2FsIDw9IHdvcmRDb3VudChpbnB1dC52YWx1ZSkgKSA6ICggd29yZENvdW50KGlucHV0LnZhbHVlKSA8PSBnb2FsIClcblxuICAgIC8vIFJldHVybiBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAgaWYgKCBpbnB1dC52YWx1ZSAmJiAhdmFsaWQgKVxuICAgICAgcmV0dXJuICdQbGVhc2Ugd3JpdGUgJyArIHBocmFzaW5nICsgZ29hbCArICcgd29yZHMuJ1xuICB9XG5cblxufVxuXG4vLyBUZXN0IGN1c3RvbSB2YWxpZGF0aW9uIGZvciBtYXhpbXVtIGFuZCBtaW5pbXVtIHRpbWVcbmZ1bmN0aW9uIGNoZWNrVGltZSAoIGlucHV0ICkge1xuICB2YXIgYmVmb3JlID0gaW5wdXQuZGF0YXNldC5iZWZvcmVUaW1lLFxuICAgICAgYWZ0ZXIgPSBpbnB1dC5kYXRhc2V0LmFmdGVyVGltZVxuXG4gIGlmICggYmVmb3JlIHx8IGFmdGVyIHx8IGlucHV0LmRhdGFzZXQudmFsaWRhdGVUaW1lICkge1xuICAgIHZhciB6b25lID0gaW5wdXQuZGF0YXNldC56b25lIHx8ICd1dGMnLFxuICAgICAgICBvcHRpb25zID0geyB6b25lOiB6b25lIH0sXG4gICAgICAgIHRpbWVWYWx1ZSA9IHRUaW1lLnBhcnNlKCBpbnB1dC52YWx1ZSwgb3B0aW9ucyApLFxuICAgICAgICBlcnIgPSAnJyxcbiAgICAgICAgaXNBZnRlciwgYWZ0ZXJUaW1lLCBpc0JlZm9yZSwgYmVmb3JlVGltZVxuXG4gICAgLy8gRW51cmUgdGhhdCB0aGUgdGltZSB2YWx1ZSBpcyBhY3R1YWxseSBcbiAgICBpZiAoICF0aW1lVmFsdWUgKSByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlIHN0cmluZzogWVlZWS1NTS1ERCBISDpNTTpTU1wiXG5cbiAgICBpZiAoIGJlZm9yZSApIHtcbiAgICAgIGJlZm9yZVRpbWUgPSB0VGltZS5wYXJzZSggYmVmb3JlIClcblxuICAgICAgaWYgKCAhYmVmb3JlVGltZSApIHtcbiAgICAgICAgZXJyID0gYGRhdGEtYmVmb3JlLXRpbWU9JyR7YmVmb3JlfScgaXMgbm90IGEgdmFsaWQgZGF0ZSBzdHJpbmdgXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoIGVyciApXG4gICAgICAgIHJldHVybiBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGFmdGVyICkge1xuICAgICAgYWZ0ZXJUaW1lID0gdFRpbWUucGFyc2UoIGFmdGVyIClcblxuICAgICAgaWYgKCAhYWZ0ZXJUaW1lICkge1xuICAgICAgICBlcnIgPSBgZGF0YS1hZnRlci10aW1lPScke2FmdGVyfScgaXMgbm90IGEgdmFsaWQgZGF0ZSBzdHJpbmdgXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoIGVyciApXG4gICAgICAgIHJldHVybiBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGJlZm9yZVRpbWUgJiYgYWZ0ZXJUaW1lICkge1xuICAgICAgaWYgKCAhdFRpbWUuaXNCZXR3ZWVuKCB0aW1lVmFsdWUsIGFmdGVyVGltZSwgYmVmb3JlVGltZSApICkge1xuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGJldHdlZW4gXCIrZm9ybWF0RGF0ZSggYWZ0ZXJUaW1lLCBvcHRpb25zICkrXCIgYW5kIFwiK2Zvcm1hdERhdGUoIGJlZm9yZVRpbWUsIG9wdGlvbnMgKVxuICAgICAgfVxuICAgIH0gXG5cbiAgICBlbHNlIGlmICggYWZ0ZXJUaW1lICkge1xuICAgICAgaWYgKCAhdFRpbWUuaXNBZnRlciggdGltZVZhbHVlLCBhZnRlclRpbWUgKSApIHsgXG4gICAgICAgIHJldHVybiBcIlBsZWFzZSBlbnRlciBhIHRpbWUgYWZ0ZXIgXCIrZm9ybWF0RGF0ZSggYWZ0ZXJUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbHNlIGlmICggYmVmb3JlVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQmVmb3JlKCB0aW1lVmFsdWUsIGJlZm9yZVRpbWUgKSApIHsgXG4gICAgICAgIHJldHVybiBcIlBsZWFzZSBlbnRlciBhIHRpbWUgYmVmb3JlIFwiK2Zvcm1hdERhdGUoIGJlZm9yZVRpbWUsIG9wdGlvbnMgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKCBkYXRlLCBvcHRpb25zICkge1xuICByZXR1cm4gdFRpbWUucHJldHR5UHJpbnQoIGRhdGUsIG9wdGlvbnMgKS5yZXBsYWNlKCAnIFonLCAnJylcbn1cblxuXG4vLyBJZiBpbnB1dCBpcyBuZXN0ZWQgaW4gYSBsYWJlbCwgdHJlYXQgdGhlIGxhYmVsIGFzIHRoZVxuLy8gdGFyZ2V0IGZvciBhc3NpZ25pbmcgc3RhdHVzIChjbGFzcyBuYW1lcyBhbmQgbWVzc2FnZXMpLlxuZnVuY3Rpb24gc3RhdHVzRWwgKCBpbnB1dCApIHtcblxuICByZXR1cm4gZ2V0Q2xvc2VzdCggaW5wdXQsICdsYWJlbCcgKSB8fCBpbnB1dFxuXG59XG5cbi8vIEZvY3VzKCkgaWYgaW52YWxpZCBlbGVtZW50IGlzIG5vdCBoaWRkZW5cbi8vIG9yIEZvY3VzIGl0cyBpbW1lZGlhdGUgc2libGluZyAobW9zdGx5IHVzZWQgZm9yIHVwbG9hZCBidXR0b25zKVxuZnVuY3Rpb24gZm9jdXMgKCBlbCApIHtcblxuICBlbCA9ICggZWwuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICkgPyBlbCA6IGVsLm5leHRTaWJsaW5nXG4gIGVsLmZvY3VzKClcblxufVxuXG4vLyBTdWJtaXNzaW9uIHZhbGlkYXRpb24gaGFuZGxlciBmdW5jdGlvblxuZnVuY3Rpb24gc3VibWl0ICggZXZlbnQgKSB7XG5cbiAgdmFyIGZvcm0gPSAoIGV2ZW50LnRhcmdldC50YWdOYW1lID09IFwiRk9STVwiICkgPyBldmVudC50YXJnZXQgOiBnZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdmb3JtJylcblxuICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgbm8gaW52YWxpZCBpbnB1dHMgZm91bmRcbiAgaWYgKCAhdmFsaWRhdGVGb3JtKCBmb3JtICkgKSB7XG5cbiAgICAvLyBQYXVzZSBrZXlkb3duL2JsdXIgdHJpZ2dlcnMgZm9yIHRoZSBuZXh0IHNlY29uZCB0byBhdm9pZCBuZXV0cmFsIGVtcHR5IHN0eWxlXG4gICAgY2hlY2tWYWxpZGF0aW9uLnN0b3AoKVxuICAgIEV2ZW50LmRlbGF5KCBjaGVja1ZhbGlkYXRpb24uc3RhcnQsIDUwMCApXG5cbiAgICAvLyBTdG9wIHRoZSBzdWJtaXNzaW9uIGV2ZW50XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGludmFsaWRhdGVGaWVsZCAoIGVsLCBtZXNzYWdlICkge1xuICBpZiAoIGVsICYmIGVsLnZhbHVlICkge1xuICAgIGVsLmRhdGFzZXQuaW52YWxpZFZhbHVlID0gZWwudmFsdWVcbiAgICBpZiAoIG1lc3NhZ2UgKVxuICAgICAgZWwuZGF0YXNldC5pbnZhbGlkVmFsdWVNZXNzYWdlID0gbWVzc2FnZVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVNZXNzYWdlICggZWwgKSB7XG5cbiAgdmFyIGZvcm0gPSBnZXRDbG9zZXN0KCBlbCwgJ2Zvcm0nICksXG4gICAgICBtc2cgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlJyApXG5cbiAgaWYgKCBtc2cgKSBtc2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbXNnIClcblxufVxuXG5cbi8vIFZhbGlkYXRpb24gbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9uXG5mdW5jdGlvbiBzaG93TWVzc2FnZSAoIGVsICkge1xuXG4gIC8vaGlkZU1lc3NhZ2UoIGVsIClcblxuICB2YXIgbGFiZWwgPSBnZXRDbG9zZXN0KCBlbCwgJ2xhYmVsJyApLFxuICAgICAgbWVzc2FnZSA9IGVsLmRhdGFzZXQubWVzc2FnZSB8fCBlbC52YWxpZGF0aW9uTWVzc2FnZVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGV4aXN0aW5nTWVzc2FnZSA9IGxhYmVsLnF1ZXJ5U2VsZWN0b3IoICcudmFsaWRhdGlvbi1tZXNzYWdlLXRleHQnIClcblxuICAgIGlmICggIWV4aXN0aW5nTWVzc2FnZSApIHtcbiAgICAgIGxhYmVsLmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsICAnPHNwYW4gY2xhc3M9XCJ2YWxpZGF0aW9uLW1lc3NhZ2VcIj48c3BhbiBjbGFzcz1cInZhbGlkYXRpb24tbWVzc2FnZS10ZXh0XCIgcm9sZT1cImFsZXJ0XCI+JyArIG1lc3NhZ2UgKyAnPC9zcGFuPjwvc3Bhbj4nIClcblxuICAgIH0gZWxzZSBpZiAoIGV4aXN0aW5nTWVzc2FnZS50ZXh0Q29udGVudCAhPSBtZXNzYWdlICkge1xuICAgICAgZXhpc3RpbmdNZXNzYWdlLmlubmVySFRNTCA9IG1lc3NhZ2VcbiAgICB9XG4gIH1cblxufVxuXG4vLyBQdWJsaWMgQVBJXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGU6IHZhbGlkYXRlRm9ybSxcbiAgaW52YWxpZGF0ZUZpZWxkOiBpbnZhbGlkYXRlRmllbGRcbn1cbiIsInJlcXVpcmUgKCcuL2xpYi9vYmplY3QuYXNzaWduJylcblxudmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG4vLyBJbXByb3ZlcyB0aGUgdXRpbGl0eSBhbmQgdXNlciBpbnRlcmZhY2UgZm9yIHJhbmdlIGlucHV0c1xuXG52YXIgc2xpZGVycyA9IFtdXG52YXIgbGlzdGVuaW5nXG5cbnZhciBTbGlkZXIgPSB7XG4gIC8vIFdoZW4gYSBzbGlkZXIgaXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBhc3NvY2lhdGVkIGxhYmVsIGFuZCBpbnB1dC5cbiAgY2hhbmdlOiBmdW5jdGlvbihldmVudCkge1xuICAgIHNlbGYucmVmcmVzaChldmVudC5jdXJyZW50VGFyZ2V0KVxuICB9LFxuXG4gIC8vIFVwZGF0ZSBsYWJlbHMgYW5kIGlucHV0c1xuICByZWZyZXNoOiBmdW5jdGlvbiAoc2xpZGVyKSB7XG4gICAgc2VsZi5zZXRMYWJlbHMoc2xpZGVyKVxuICAgIHNlbGYuc2V0SW5wdXQoc2xpZGVyKVxuICAgIHNlbGYuc2V0RmlsbChzbGlkZXIpXG4gICAgc2VsZi5zZXRTdGF0ZShzbGlkZXIpXG4gIH0sXG4gIFxuICAvLyBTb21lIGJyb3dzZXJzIGRvbid0IGZvY3VzIHdoZW4gYSBzbGlkZXIgaW5wdXQgaXMgY2hhbmdlZCwgdGhpcyBsZXRzIHVzIGZvcmNlIGZvY3VzLlxuICBmb2N1czogZnVuY3Rpb24oZXZlbnQpe1xuICAgIGlmICggZXZlbnQuaXNUcnVzdGVkICkgeyAvLyBEbyBub3QgZm9jdXMgb24gXCJhcnRpZmljaWFsbHkgdHJpZ2dlcmVkXCIgZXZlbnRzXG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmZvY3VzKClcbiAgICB9XG4gIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgLy8gSW5qZWN0IHNsaWRlciB0ZW1wbGF0ZXMgaW50byB0aGUgRE9NXG4gIHNldHVwOiBmdW5jdGlvbigpe1xuXG4gICAgaWYgKCFsaXN0ZW5pbmcpIHtcbiAgICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImlucHV0IHRvZ2dsZXI6c2hvd1wiLCBcIlt0eXBlPXJhbmdlXVwiLCBzZWxmLmNoYW5nZSwgeyB1c2VDYXB0dXJlOiB0cnVlIH0pXG4gICAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGljayBjaGFuZ2UgaW5wdXRcIiwgXCJbdHlwZT1yYW5nZV1cIiwgc2VsZi5mb2N1cywgeyB1c2VDYXB0dXJlOiB0cnVlIH0pXG4gICAgICBsaXN0ZW5pbmcgPSB0cnVlXG4gICAgfVxuXG4gICAgdmFyIHJhbmdlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXTpub3QoLnNsaWRlci1pbnB1dCknKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyYW5nZXMsIGZ1bmN0aW9uKHNsaWRlcil7XG5cbiAgICAgIHZhciBkYXRhID0gc2VsZi5kYXRhKHNsaWRlcilcbiAgICAgIHNsaWRlcnMucHVzaChkYXRhKVxuXG4gICAgICBzbGlkZXIuZGF0YXNldC5pZCA9IGRhdGEuaWRcbiAgICAgIHNsaWRlci5kYXRhc2V0LmluaXRpYWxWYWx1ZSA9IHNsaWRlci52YWx1ZVxuXG4gICAgICAvLyBJbmplY3QgdGVtcGxhdGUgYW5kIHNldCBpbnB1dHNcbiAgICAgIHNsaWRlciA9IHNlbGYudGVtcGxhdGUoc2xpZGVyKVxuICAgICAgc2VsZi5yZWZyZXNoKHNsaWRlcilcblxuICAgIH0pXG4gIH0sXG5cbiAgZGF0YTogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIC8vIEFzc2lnbiBhbiBpbmNyZW1lbnRhbCBJRCB0byB0cmFjayB0aGlzIHNsaWRlciB3aXRoIGl0cyBkYXRhXG4gICAgICBpZDogc2xpZGVycy5sZW5ndGgsXG4gICAgICBtaW46IE51bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ21pbicpKSB8fCAwLFxuICAgICAgbWF4OiBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdtYXgnKSkgfHwgMTAwLFxuICAgICAgbGFiZWxzOiB7fSxcbiAgICAgIGV4dGVybmFsTGFiZWxzOiB7fVxuICAgIH1cblxuICAgIC8vIEdldHMgZGF0YXNldCBhcyBhIGhhc2hcbiAgICBPYmplY3QuYXNzaWduKGRhdGEsIHNlbGYuZXh0cmFjdERhdGEoZWwpKVxuXG4gICAgZGF0YSA9IHNlbGYuZXh0cmFjdFZhbHVlcyhkYXRhKVxuICAgIGRhdGEgPSBzZWxmLmdldExhYmVscyhkYXRhKVxuXG4gICAgaWYgKGRhdGEudmFsdWVzKVxuICAgICAgZGF0YS5tYXggPSAoZGF0YS5taW4gKyBkYXRhLnZhbHVlcy5sZW5ndGggLSAxKVxuXG4gICAgZGF0YS5zZWdtZW50cyA9IGRhdGEubWF4IC0gZGF0YS5taW4gKyAxXG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYoa2V5Lm1hdGNoKC8tLykpe1xuICAgICAgICBkYXRhW3RoaXMuY2FtZWxDYXNlKGtleSldID0gZGF0YVtrZXldXG4gICAgICAgIGRlbGV0ZSBkYXRhW2tleV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyBkYXRhLWlucHV0IG9yIG5hbWUgYXR0cmlidXRlIHRvIHNldCB2YWx1ZSBmb3IgaGlkZGVuIGlucHV0LlxuICAgIC8vXG4gICAgaWYgKCFkYXRhLmlucHV0ICYmIGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpKSB7XG4gICAgICBkYXRhLmlucHV0ID0gZWwuZ2V0QXR0cmlidXRlKCduYW1lJylcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpXG4gICAgfVxuXG4gICAgaWYgKGRhdGEuaW5wdXQpIHtcbiAgICAgIC8vIEdlbmVyYXRlIGEgY2xhc3MgbmFtZSBmb3IgcXVlcnlpbmcgbGF0ZXIgKGJlY2F1c2Ugc29tZSBuYW1lIGF0dHJpYnV0ZXMgY29udGFpbiBpbGxlZ2FsIGNoYXJhY3RlcnMgZm9yIHF1ZXJpZXMpXG4gICAgICBkYXRhLmlucHV0Q2xhc3MgPSBkYXRhLmlucHV0LnJlcGxhY2UoL1xcVy9nLCctJylcbiAgICAgIGRhdGEuaW5wdXRFeGlzdHMgPSBzZWxmLmlucHV0RXhpc3RzKGVsLCBkYXRhKVxuICAgIH1cblxuICAgIGRhdGEgPSBzZWxmLmdldExpbmVMYWJlbHMoZGF0YSlcblxuICAgIGlmIChkYXRhLm1hcmspIHsgXG4gICAgICBkYXRhLm1hcmsgPSBkYXRhLm1hcmsuc3BsaXQoJywnKS5tYXAoTnVtYmVyKVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gIH0sXG5cbiAgZ2V0RGF0YTogZnVuY3Rpb24oc2xpZGVyKSB7XG4gICAgaWYgKHR5cGVvZiBzbGlkZXIgIT0gJ3N0cmluZycgJiYgc2xpZGVyLmRhdGFzZXQpIHtcbiAgICAgIHNsaWRlciA9IHNsaWRlci5kYXRhc2V0LmlkXG4gICAgfVxuICAgIHJldHVybiBzbGlkZXJzW3NsaWRlcl1cbiAgfSxcblxuICBleHRyYWN0VmFsdWVzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgaWYgKGRhdGEudmFsdWVzKSB7IFxuICAgICAgZGF0YS52YWx1ZXMgPSBkYXRhLnZhbHVlcy5zcGxpdCgnLCcpLm1hcChzZWxmLnRyaW0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEudmFsdWVzID0gW11cbiAgICAgIGZvciAodmFyIGkgPSBkYXRhLm1pbjsgaSA8PSBkYXRhLm1heDsgaSsrICkge1xuICAgICAgICBkYXRhLnZhbHVlcy5wdXNoKGkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfSxcblxuICAvLyBDb252ZXJ0IGRhdGFzZXQgc3RyaW5ncyBpbnRvIGhhc2hlcyBvZiBhcnJheXNcbiAgLy8gZXhhbXBsZXM6XG4gIC8vICAtIGRhdGEtbGFiZWw9J29uZSx0d28sdGhyZWUnID0+IGRhdGEubGFiZWxzLmRlZmF1bHQgPSBbJ29uZScsJ3R3bycsJ3RocmVlJ11cbiAgLy8gIC0gZGF0YS5leHRlcm5hbC1sYWJlbC1hd2Vzb21lPSdvbmU7dHdvO3RocmVlJyA9PiBkYXRhLmV4dGVybmFsTGFiZWxzLmF3ZXNvbWUgPSBbJ29uZScsJ3R3bycsJ3RocmVlJ11cbiAgLy9cbiAgLy8gIElmIGxhYmVscyBoYXZlIG5vdCBiZWVuIGRpc2FibGVkIChkYXRhLWxhYmVsPSdmYWxzZScpIGFuZCB0aGVyZSBhcmUgbm8gZGF0YSBsYWJlbHMsXG4gIC8vICBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgc2V0IHRvIGRhdGEubGFiZWxzLmRlZmF1bHRcbiAgLy9cbiAgZ2V0TGFiZWxzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgaWYgKGRhdGEubGFiZWwgJiYgZGF0YS5sYWJlbC5tYXRjaCgvZmFsc2V8bm9uZS8pKVxuICAgICAgZGF0YS5sYWJlbCA9IGZhbHNlXG5cbiAgICAvLyBVbmxlc3MgbGFiZWxzIGhhdmUgYmVlbiBkaXNhYmVkIHdpdGggZGF0YS1sYWJlbD0nZmFsc2UnXG4gICAgZm9yICh2YXIgdmFsIGluIGRhdGEpIHtcbiAgICAgIC8vIElnbm9yZSBub24tbmF0aXZlIG1ldGhvZHMgaW5qZWN0ZWQgYnkgc29tZSB3YXl3YXJkIGxpYlxuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KHZhbCkpIHsgY29udGludWUgfVxuICAgICAgLy8gRG9uJ3QgYm90aGVyIHByb2Nlc3NpbmcgZGlzYWJsZWQgbGFiZWxzXG4gICAgICBpZiAoZGF0YVt2YWxdID09PSBmYWxzZSkgeyBjb250aW51ZSB9XG5cbiAgICAgIC8vIE1hdGNoIHByb3BlcnRpZXM6IGxhYmVsLCBsYWJlbC1pZCwgZXh0ZXJuYWwtbGFiZWwtaWRcbiAgICAgIHZhciBtYXRjaCA9IHZhbC5tYXRjaCgvXihleHRlcm5hbC0pP2xhYmVsLSguKyl8XmxhYmVsJC8pXG5cbiAgICAgIGlmKG1hdGNoKSB7XG4gICAgICAgIC8vIFNvbWUgbGFiZWxzIG1heSBpbmNsdWRlIGNvbW1hcywgYWxsb3cgc2VtaWNvbG9ucyBhcyBhbiBhbHRlcm5hdGUgc2VwYXJhdG9yXG4gICAgICAgIC8vXG4gICAgICAgIHZhciBkZWxpbWl0ZXIgPSBkYXRhW3ZhbF0ubWF0Y2goLzsvKSA/ICc7JyA6ICcsJ1xuICAgICAgICB2YXIgbGFiZWxzICAgID0gZGF0YVt2YWxdLnNwbGl0KGRlbGltaXRlcikubWFwKHNlbGYudHJpbSlcbiAgICAgICAgdmFyIGV4dGVybmFsICA9IG1hdGNoWzFdXG4gICAgICAgIHZhciBuYW1lICAgICAgPSBtYXRjaFsyXVxuXG4gICAgICAgIGlmKGV4dGVybmFsKXtcbiAgICAgICAgICBkYXRhLmV4dGVybmFsTGFiZWxzW25hbWVdID0gbGFiZWxzXG4gICAgICAgIH0gZWxzZSBpZiAodmFsID09ICdsYWJlbCcpIHtcbiAgICAgICAgICBkYXRhLmxhYmVscy5kZWZhdWx0ID0gbGFiZWxzXG4gICAgICAgICAgZGVsZXRlIGRhdGEubGFiZWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhLmxhYmVsc1tuYW1lXSA9IGxhYmVsc1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGRhdGFbdmFsXVxuICAgICAgfVxuXG4gICAgICB2YXIgbGFiZWxDb3VudCA9IHNlbGYub2JqZWN0U2l6ZShkYXRhLmxhYmVscylcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGxhYmVscywgdXNlIHZhbHVlcyBmb3IgYSBsYWJlbFxuICAgICAgaWYgKGxhYmVsQ291bnQgPT0gMClcbiAgICAgICAgZGF0YS5sYWJlbHMuZGVmYXVsdCA9IGRhdGEudmFsdWVzXG5cbiAgICAgIGlmIChsYWJlbENvdW50ID4gMSlcbiAgICAgICAgZGVsZXRlIGRhdGEubGFiZWxzLmRlZmF1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVxuICB9LFxuXG4gIGdldExpbmVMYWJlbHM6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHZhciBsaW5lTGFiZWxzID0ge31cblxuICAgIC8vIExpbmUgbGFiZWxzIG1heSBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6XG4gICAgLy8gLSAxOnN0YXJ0LDExOmVuZCAgICAgICAgICAgICAgLSBpbmRleCBzcGVjaWZpZWQsIGNvbW1hIHNlcGFyYXRlZFxuICAgIC8vIC0gZmlyc3Qsc2Vjb25kLHRoaXJkLDExOmxhc3QgIC0gZGVmYXVsdCB0byBpbmRleCBmb3Igc29tZSBsYWJlbHNcbiAgICAvLyAtIDEwLDAwMDsyMCwwMDA7MzAsMDAwICAgICAgICAtIHNlbWljb2xvbiBzZXBhcmF0ZWRcbiAgICAvL1xuICAgIGlmKGRhdGEubGluZUxhYmVscykge1xuICAgICAgdmFyIGRlbGltaXRlciA9IGRhdGEubGluZUxhYmVscy5tYXRjaCgvOy8pID8gJzsnIDogJywnXG4gICAgICBkYXRhLmxpbmVMYWJlbHMuc3BsaXQoZGVsaW1pdGVyKS5tYXAoZnVuY3Rpb24obGFiZWxzLCBpbmRleCl7XG4gICAgICAgIHZhciBsID0gbGFiZWxzLnNwbGl0KCc6JylcbiAgICAgICAgbGFiZWwgPSAoIWxbMV0gPyBsWzBdIDogbFsxXSlcbiAgICAgICAgaW5kZXggPSAoIWxbMV0gPyBpbmRleCArIDEgOiBsWzBdKVxuICAgICAgICBsaW5lTGFiZWxzW2luZGV4XSA9IGxhYmVsXG4gICAgICB9KVxuICAgICAgZGF0YS5saW5lTGFiZWxzID0gbGluZUxhYmVsc1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gIH0sXG5cbiAgLy8gXG4gIHRlbXBsYXRlOiBmdW5jdGlvbihzbGlkZXIpe1xuICAgIHZhciBkYXRhID0gc2VsZi5nZXREYXRhKHNsaWRlcilcblxuICAgIHNsaWRlci5zZXRBdHRyaWJ1dGUoJ21pbicsIGRhdGEubWluKVxuICAgIHNsaWRlci5zZXRBdHRyaWJ1dGUoJ21heCcsIGRhdGEubWF4KVxuXG4gICAgc2xpZGVyLmNsYXNzTGlzdC5hZGQoJ3NsaWRlci1pbnB1dCcpXG5cbiAgICBpZihzbGlkZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdsZWZ0LWxhYmVsJykpXG4gICAgICBzbGlkZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGVmdC1sYWJlbCcpXG5cbiAgICB2YXIgY29udGFpbmVySFRNTCA9IHNlbGYudGVtcGxhdGVIVE1MKGRhdGEpXG5cbiAgICB2YXIgY2xhc3NlcyA9IFsnc2xpZGVyLWNvbnRhaW5lciddXG5cbiAgICBpZiAoY29udGFpbmVySFRNTC5tYXRjaCgnc2xpZGVyLWxpbmUtbGFiZWwnKSlcbiAgICAgIGNsYXNzZXMucHVzaCgnbGluZS1sYWJlbHMnKVxuXG4gICAgaWYgKGNvbnRhaW5lckhUTUwubWF0Y2goJ3NsaWRlci1sYWJlbCcpKVxuICAgICAgY2xhc3Nlcy5wdXNoKFwid2l0aC1sYWJlbFwiKVxuICAgIGVsc2VcbiAgICAgIGNsYXNzZXMucHVzaChcIndpdGhvdXQtbGFiZWxcIilcblxuICAgIGNvbnRhaW5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIicrY2xhc3Nlcy5qb2luKCcgJykrJ1wiIGlkPVwic2xpZGVyJytkYXRhLmlkKydcIj4nXG4gICAgICArIGNvbnRhaW5lckhUTUxcbiAgICAgICsnPC9kaXY+J1xuXG4gICAgc2xpZGVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCBjb250YWluZXJIVE1MKVxuICAgIHZhciBjb250YWluZXIgPSBzbGlkZXIucHJldmlvdXNTaWJsaW5nXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXItaW5wdXQtY29udGFpbmVyJykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgc2xpZGVyLm91dGVySFRNTClcbiAgICBzbGlkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzbGlkZXIpXG5cbiAgICBzbGlkZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnNsaWRlci1pbnB1dCcpXG4gICAgXG4gICAgLy8gVXBkYXRlIGF0dHJpYnV0ZXMgZnJvbSBwcm9jZXNzZWQgZGF0YVxuICAgIC8vXG4gICAgaWYoIXNsaWRlci5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gICAgICBzbGlkZXIudmFsdWUgPSBkYXRhLnZhbHVlIHx8IGRhdGEubWluXG4gICAgcmV0dXJuIHNsaWRlclxuICB9LFxuICBcbiAgdGVtcGxhdGVIVE1MOiBmdW5jdGlvbihkYXRhKXtcbiAgICB2YXIgaHRtbCA9IFwiXCJcbiAgICB2YXIgZmlsbHMgPSBcIlwiXG4gICAgXG4gICAgaWYgKGRhdGEubWFyayB8fCBkYXRhLmxpbmVMYWJlbHMpIHtcbiAgICAgIGZvcih2YXIgaSA9IDE7IGkgPD0gZGF0YS5zZWdtZW50czsgaSsrKSB7XG4gICAgICAgIFxuICAgICAgICBodG1sICs9IFwiPGRpdiBjbGFzcz0nc2xpZGVyLXNlZ21lbnQnPjxzcGFuIGNsYXNzPSdzbGlkZXItc2VnbWVudC1jb250ZW50Jz5cIlxuXG4gICAgICAgIGlmIChkYXRhLm1hcmsgJiYgZGF0YS5tYXJrLmluZGV4T2YoaSkgIT0gLTEpXG4gICAgICAgICAgaHRtbCArPSBcIjxzcGFuIGNsYXNzPSdzbGlkZXItc2VnbWVudC1tYXJrJyBkYXRhLWluZGV4PSdcIitpK1wiJz48L3NwYW4+XCJcblxuICAgICAgICBpZiAoZGF0YS5saW5lTGFiZWxzICYmIGRhdGEubGluZUxhYmVsc1tpXSkgXG4gICAgICAgICAgaHRtbCArPSBcIjxzcGFuIGNsYXNzPSdzbGlkZXItbGluZS1sYWJlbCc+XCIrZGF0YS5saW5lTGFiZWxzW2ldK1wiPC9zcGFuPlwiXG5cbiAgICAgICAgaHRtbCArPSBcIjwvc3Bhbj48L2Rpdj5cIlxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9uZSBsZXNzXG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGRhdGEuc2VnbWVudHM7IGkrKykge1xuICAgICAgZmlsbHMgKz0gXCI8c3BhbiBjbGFzcz0nc2xpZGVyLWZpbGwnIGRhdGEtaW5kZXg9J1wiK2krXCInPjwvc3Bhbj5cIlxuICAgIH1cblxuICAgIGh0bWwgPSBcIjxkaXYgY2xhc3M9J3NsaWRlci1pbnB1dC1jb250YWluZXInPlwiXG4gICAgICArIFwiPGRpdiBjbGFzcz0nc2xpZGVyLXRyYWNrJz5cIiArIGh0bWwgKyBcIjwvZGl2PlwiXG4gICAgICArIFwiPGRpdiBjbGFzcz0nc2xpZGVyLWZpbGxzJz5cIiArIGZpbGxzICsgXCI8L2Rpdj5cIlxuICAgICAgKyBcIjwvZGl2PlwiXG4gICAgICArIHNlbGYubGFiZWxUZW1wbGF0ZShkYXRhKVxuXG4gICAgaWYgKCFkYXRhLmlucHV0RXhpc3RzICYmIGRhdGEuaW5wdXRDbGFzcykge1xuICAgICAgaHRtbCArPSBcIjxpbnB1dCBjbGFzcz0nXCIrZGF0YS5pbnB1dENsYXNzK1wiJyB0eXBlPSdoaWRkZW4nIG5hbWU9J1wiK2RhdGEuaW5wdXQrXCInIHZhbHVlPScnPlwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxcbiAgICBcbiAgfSxcblxuICBsYWJlbFRlbXBsYXRlOiBmdW5jdGlvbihkYXRhKXtcbiAgICB2YXIgaHRtbCA9IFwiXCJcblxuICAgIGlmIChkYXRhLmxhYmVsID09IGZhbHNlKSB7IHJldHVybiBodG1sIH1cblxuICAgIGZvcih2YXIga2V5IGluIGRhdGEubGFiZWxzKXtcbiAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwic2xpZGVyLWxhYmVsLScra2V5KycgaW50ZXJuYWwtbGFiZWxcIiBkYXRhLXNsaWRlci1sYWJlbD1cIicra2V5KydcIj4nXG4gICAgICBodG1sICs9IHNlbGYubGFiZWxIVE1MKGRhdGEsIGtleSwgJycpXG4gICAgICBodG1sICs9ICc8L3NwYW4+PC9zcGFuPiAnXG4gICAgfVxuXG4gICAgaWYgKGh0bWwubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCA9IFwiPGRpdiBjbGFzcz0nc2xpZGVyLWxhYmVsIGFsaWduLVwiKyhkYXRhLnBvc2l0aW9uTGFiZWwgfHwgJ3JpZ2h0JykrXCInPlwiICsgaHRtbCArIFwiPC9kaXY+XCJcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbFxuICB9LFxuXG4gIGxhYmVsSFRNTDogZnVuY3Rpb24oZGF0YSwga2V5LCBsYWJlbCkge1xuICAgIHJldHVybiBzZWxmLmxhYmVsTWV0YShkYXRhLCBrZXksICdiZWZvcmUnKVxuICAgICsgXCI8c3BhbiBjbGFzcz0nbGFiZWwtY29udGVudCc+XCIgKyBsYWJlbCArIFwiPC9zcGFuPlwiXG4gICAgKyBzZWxmLmxhYmVsTWV0YShkYXRhLCBrZXksICdhZnRlcicpXG4gIH0sXG5cbiAgLy8gR3JhYiBhbGwgcHJlZml4ZXMgb3Igc3VmZml4ZXMsIGZvciBleGFtcGxlOlxuICAvLyAtIGRhdGEtYmVmb3JlLWxhYmVsPSckJ1xuICAvLyAtIGRhdGEtYWZ0ZXItbGFiZWw9Jy9tbydcbiAgLy8gLSBkYXRhLWFmdGVyLWxhYmVsLXNpemU9J0dCJ1xuICAvL1xuICBsYWJlbE1ldGE6IGZ1bmN0aW9uKGRhdGEsIGtleSwgcG9zaXRpb24pIHtcbiAgICB2YXIgYWx0S2V5ID0gc2VsZi5jYW1lbENhc2UoJy1sYWJlbC0nK2tleSlcbiAgICB2YXIgbWV0YSA9IGRhdGFbcG9zaXRpb24rYWx0S2V5XSB8fCBkYXRhW3Bvc2l0aW9uKydMYWJlbCddXG4gICAgaWYgKG1ldGEpXG4gICAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0nXCIrcG9zaXRpb24rXCItbGFiZWwnPlwiK21ldGErXCI8L3NwYW4+XCJcbiAgICBlbHNlXG4gICAgICByZXR1cm4gJydcbiAgfSxcblxuICAvLyBJcyB0aGVyZSBhbHJlYWR5IGFuIGlucHV0IG1hdGNoaW5nIHRoaXMgbmFtZT9cbiAgaW5wdXRFeGlzdHM6IGZ1bmN0aW9uKHNsaWRlciwgZGF0YSkge1xuICAgIGlmIChkYXRhLmlucHV0Q2xhc3MpIHtcbiAgICAgIHZhciBpbnB1dCA9IHNlbGYuc2NvcGUoc2xpZGVyKS5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiJytkYXRhLmlucHV0KydcIl0nKVxuXG4gICAgICBpZihpbnB1dCkge1xuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKGRhdGEuaW5wdXRDbGFzcylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZXh0cmFjdERhdGE6IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHBhdHRlcm4gPSAnZGF0YS0nXG4gICAgdmFyIGRhdGEgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgIHZhciBuYW1lID0gZWwuYXR0cmlidXRlc1tpXS5ub2RlTmFtZVxuXG4gICAgICBpZihuZXcgUmVnRXhwKFwiXlwiK3BhdHRlcm4pLnRlc3QobmFtZSkpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShwYXR0ZXJuLCAnJylcbiAgICAgICAgZGF0YVtuYW1lXSA9IGVsLmF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH0sXG5cbiAgZ2V0Q2hhbmdlOiBmdW5jdGlvbiggc2xpZGVyICkge1xuICAgIHZhciBpbml0aWFsID0gTnVtYmVyKHNsaWRlci5kYXRhc2V0LmluaXRpYWxWYWx1ZSlcblxuICAgIGlmICggaW5pdGlhbCA8IHNsaWRlci52YWx1ZSApIHtcbiAgICAgIHJldHVybiBcImluY3JlYXNlZFwiXG4gICAgfSBlbHNlIGlmICggc2xpZGVyLnZhbHVlIDwgaW5pdGlhbCApIHtcbiAgICAgIHJldHVybiBcImRlY3JlYXNlZFwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImluaXRpYWxcIlxuICAgIH1cbiAgfSxcblxuICBsYWJlbEVsZW1lbnRzOiBmdW5jdGlvbihpZCwga2V5LCBleHRlcm5hbCkge1xuICAgIHZhciBzZWxlY3RvciA9ICdbZGF0YS1zbGlkZXItbGFiZWw9JytrZXkrJ10nXG4gICAgdmFyIGludGVybmFsU2VsZWN0b3IgPSBcIiNzbGlkZXJcIitpZCArICcgJyArIHNlbGVjdG9yXG4gICAgdmFyIGV4dGVybmFsU2VsZWN0b3IgPSBzZWxlY3RvciArPSAnOm5vdCguaW50ZXJuYWwtbGFiZWwpJyBcbiAgICBpZiAoZXh0ZXJuYWwpIHsgXG4gICAgICBzZWxlY3RvciA9IGV4dGVybmFsU2VsZWN0b3JcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3IgPSBpbnRlcm5hbFNlbGVjdG9yICsgJywgJyArIGV4dGVybmFsU2VsZWN0b3JcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgfSxcblxuICBzZXRTdGF0ZTogZnVuY3Rpb24oIHNsaWRlciApIHtcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0RGF0YSggc2xpZGVyICksXG4gICAgICAgIHN0YXRlRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdHJhY2stc2xpZGVyLXN0YXRlPVwiIycrc2xpZGVyLmlkKydcIl0nICksXG4gICAgICAgIGNoYW5nZSA9IHNlbGYuZ2V0Q2hhbmdlKCBzbGlkZXIgKVxuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NsaWRlcicrZGF0YS5pZCkuZGF0YXNldC5zbGlkZXJTdGF0ZSA9IGNoYW5nZVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggc3RhdGVFbGVtZW50cywgZnVuY3Rpb24oZWwpIHtcbiAgICAgIGVsLmRhdGFzZXQuc2xpZGVyU3RhdGUgPSBjaGFuZ2VcbiAgICB9KVxuICB9LFxuXG4gIHNldEZpbGw6IGZ1bmN0aW9uKHNsaWRlcikge1xuICAgIHZhciBkYXRhID0gc2VsZi5nZXREYXRhKHNsaWRlcilcbiAgICB2YXIgc2VnbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjc2xpZGVyJytkYXRhLmlkKycgLnNsaWRlci1zZWdtZW50JylcbiAgICB2YXIgZmlsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjc2xpZGVyJytkYXRhLmlkKycgLnNsaWRlci1maWxsJylcbiAgICB2YXIgc2xpZGVySW5kZXggPSBzZWxmLnNsaWRlckluZGV4KHNsaWRlcilcbiAgICBcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGZpbGxzLCBmdW5jdGlvbihmaWxsLCBpbmRleCl7XG4gICAgICBpZiAoZmlsbC5kYXRhc2V0LmluZGV4IDw9IHNsaWRlckluZGV4KSB7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCgnZmlsbGVkJylcbiAgICAgICAgaWYoc2VnbWVudHNbaW5kZXhdKSB7XG4gICAgICAgICAgc2VnbWVudHNbaW5kZXhdLmNsYXNzTGlzdC5hZGQoJ2ZpbGxlZCcpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LnJlbW92ZSgnZmlsbGVkJylcbiAgICAgICAgaWYoc2VnbWVudHNbaW5kZXhdKSB7XG4gICAgICAgICAgc2VnbWVudHNbaW5kZXhdLmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIFxuICB9LFxuXG4gIHNldElucHV0OiBmdW5jdGlvbihzbGlkZXIpIHtcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0RGF0YShzbGlkZXIpXG5cbiAgICAvLyBEb24ndCB1cGRhdGUgaGlkZGVuIHNsaWRlcnNcbiAgICBpZiAoc2xpZGVyLm9mZnNldFBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgaWYgKGRhdGEuaW5wdXQgJiYgZGF0YS52YWx1ZXMpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGRhdGEudmFsdWVzW3NlbGYuc2xpZGVySW5kZXgoc2xpZGVyKV1cbiAgICAgIHZhciBzZWxlY3RvciA9IFwiLlwiK2RhdGEuaW5wdXQucmVwbGFjZSgvXFxXL2csJy0nKVxuICAgICAgdmFyIGlucHV0cyA9IHNlbGYuc2NvcGUoc2xpZGVyKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGlucHV0cywgZnVuY3Rpb24oaW5wdXQpe1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBzZXRMYWJlbHM6IGZ1bmN0aW9uKHNsaWRlcikge1xuICAgIHZhciBkYXRhID0gc2VsZi5nZXREYXRhKHNsaWRlcilcbiAgICB2YXIgaW5kZXggPSBzZWxmLnNsaWRlckluZGV4KHNsaWRlcilcblxuICAgIGlmIChzbGlkZXIub2Zmc2V0UGFyZW50ID09PSBudWxsKSB7IHJldHVybiB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFsnbGFiZWxzJywgJ2V4dGVybmFsTGFiZWxzJ10sIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBleHRlcm5hbCA9ICh0eXBlID09ICdleHRlcm5hbExhYmVscycpXG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhW3R5cGVdKSB7XG4gICAgICAgIHZhciBsYWJlbEVscyA9IHNlbGYubGFiZWxFbGVtZW50cyhkYXRhLmlkLCBrZXksIGV4dGVybmFsKVxuICAgICAgICB2YXIgbGFiZWxzID0gc2VsZi5sYWJlbEF0SW5kZXgoZGF0YVt0eXBlXSwgaW5kZXgpXG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsYWJlbEVscywgZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignLmxhYmVsLWNvbnRlbnQnKVxuXG4gICAgICAgICAgaWYgKCBjb250YWluZXIgKSB7IGNvbnRhaW5lci5pbm5lckhUTUwgPSBsYWJlbHNba2V5XSB9XG4gICAgICAgICAgZWxzZSB7IGVsLmlubmVySFRNTCA9IHNlbGYubGFiZWxIVE1MKGRhdGEsIGtleSwgbGFiZWxzW2tleV0pIH1cblxuICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2VtcHR5LWxhYmVsJywgbGFiZWxzW2tleV0gPT09ICcnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gR2V0IGFsbCBsYWJlbHMgZm9yIHRoZSBjdXJyZW50IHNsaWRlciBwb3NpdGlvblxuICBsYWJlbEF0SW5kZXg6IGZ1bmN0aW9uKGxhYmVscywgaW5kZXgpe1xuICAgIHZhciBzZXQgPSB7fVxuICAgIGZvciAodmFyIGtleSBpbiBsYWJlbHMpIHtcbiAgICAgIHNldFtrZXldID0gbGFiZWxzW2tleV1baW5kZXhdXG4gICAgfVxuICAgIHJldHVybiBzZXRcbiAgfSwgXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBzbGlkZXIgdmFsdWUgYnkgdGhlIG1pbmltdW0gdmFsdWVcbiAgc2xpZGVySW5kZXg6IGZ1bmN0aW9uKHNsaWRlcil7XG4gICAgcmV0dXJuIE51bWJlcihzbGlkZXIudmFsdWUpIC0gTnVtYmVyKHNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKVxuICB9LFxuXG4gIC8vIElmIHNsaWRlciBpcyBpbiBhIGZvcm0sIHJldHVybiB0aGF0IGZvcm0uXG4gIC8vIFRoaXMgYWxvd3MgdXMgdG8gYmUgc3VyZSB0aGF0IHNsaWRlcnMgaW4gb25lXG4gIC8vIGZvcm0gZG8gbm90IHVwZGF0ZSBsYWJlbHMgd2l0aCB0aGUgc2FtZSBuYW1lXG4gIC8vIGluIGFub3RoZXIgZm9ybS5cbiAgLy9cbiAgc2NvcGU6IGZ1bmN0aW9uKHNsaWRlcikge1xuICAgIHZhciBlbCA9IHNsaWRlclxuXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBkb2N1bWVudFxuICB9LFxuXG4gIC8vIEZ1bmN0aW9uIGZvciBlYXN5IG1hcGluZywgYXMgaW46IHNvbWVBcnJheS5tYXAoc2VsZi50cmltKVxuICB0cmltOiBmdW5jdGlvbihuYW1lKXsgXG4gICAgcmV0dXJuIG5hbWUudHJpbSgpXG4gIH0sXG5cbiAgb2JqZWN0U2l6ZTogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGxlbmd0aCA9IDA7IGZvcih2YXIgaSBpbiBvYmplY3QpIHsgbGVuZ3RoKysgfVxuICAgIHJldHVybiBsZW5ndGhcbiAgfSxcblxuICBjYW1lbENhc2U6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLSguKS9nLCBmdW5jdGlvbihtYXRjaCwgZ3JvdXApIHtcbiAgICAgIHJldHVybiBncm91cC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBzZWxmID0gU2xpZGVyXG5cbkV2ZW50LmNoYW5nZShTbGlkZXIuc2V0dXApXG5cbm1vZHVsZS5leHBvcnRzID0gU2xpZGVyXG4iLCJpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT0gJ2Z1bmN0aW9uJykge1xuICAoZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgbmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgb3V0cHV0W25leHRLZXldID0gc291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xuICB9KSgpO1xufVxuIiwidmFyIFRpbWVUb2dnbGUgPSByZXF1aXJlKCcuL2xpYi90b2dnbGUuanMnKVxudmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cblRpbWVUb2dnbGUudGltZWFnbyA9IHJlcXVpcmUoJy4vbGliL3RpbWVhZ28uanMnKVxuVGltZVRvZ2dsZS5kYXRlVG9IVE1MID0gcmVxdWlyZSgnLi9saWIvZGF0ZS10by1odG1sLmpzJylcblxuRXZlbnQucmVhZHkoVGltZVRvZ2dsZS5saXN0ZW4pXG5FdmVudC5jaGFuZ2UoVGltZVRvZ2dsZS5zZXR1cClcblxubW9kdWxlLmV4cG9ydHMgPSBUaW1lVG9nZ2xlXG4iLCIvLyBDb252ZXJ0cyBhIHNpbXBsZSBkYXRlIHN0cmluZyBpbnRvIERhdGUgKyBUaW1lICsgVGltZXpvbmUgd3JhcHBlZCBpbiBIVE1MXG4vL1xuLy8gSW5wdXQ6XG4vLyAtIFN0cmluZywgY29tcGF0aWJsZSB3aXRoIEpTIGRhdGUgcGFyc2luZyBlLmcuIFwiMjAxNC0xMC0yMFwiIG9yIFwiMjAxNC0wNS0yMSAxMDo2M1wiXG4vLyAtIFN0cmluZywgdGltZXpvbmU6IFwiVVRDXCIsIFwiQ1NUXCIsIGV0Yy5cbi8vXG4vLyBSZXR1cm5zOiBIVE1MIHdoaWNoIGlzIFwiMjAxNC0wMS0yOCAxODowMDowMCBDU1RcIiwgc2VwYXJhdGVkIGFuZCB3cmFwcGVkIHdpdGggc3BhbnNcbi8vIHdpdGggY2xhc3NuYW1lczogZGF0ZSwgdGltZSBhbmQgdGltZXpvbmVcbi8vXG52YXIgRGF0ZVRvSFRNTCA9IHtcbiAgc3VwcG9ydGVkOiBmdW5jdGlvbigpe1xuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoXCIyMDE0LTAxLTI5VDE4OjE0OjI5KzAwOjAwXCIpLmdldERhdGUoKSlcbiAgfSxcblxuICBsb2NhbDogZnVuY3Rpb24oZGF0ZVN0cmluZykge1xuICAgIHJldHVybiBEYXRlVG9IVE1MLnBhcnNlKGRhdGVTdHJpbmcsIGZhbHNlKVxuICB9LFxuXG4gIHV0YzogZnVuY3Rpb24oZGF0ZVN0cmluZykge1xuICAgIHJldHVybiBEYXRlVG9IVE1MLnBhcnNlKGRhdGVTdHJpbmcsIHRydWUpXG4gIH0sXG5cbiAgcGFyc2U6IGZ1bmN0aW9uIGRhdGVUb0h0bWwoZGF0ZVN0cmluZywgdXRjKSB7XG4gICAgaWYoIURhdGVUb0hUTUwuc3VwcG9ydGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKVxuXG4gICAgLy8gSWYgZGF0ZSBpcyBpbnZhbGlkLCBiYWlsXG4gICAgaWYoaXNOYU4oZGF0ZS5nZXREYXRlKCkpKXsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmKHV0Yykge1xuICAgICAgdmFyIHkgID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpXG4gICAgICB2YXIgbW8gPSBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSlcbiAgICAgIHZhciBkICA9IHBhZChkYXRlLmdldFVUQ0RhdGUoKSlcbiAgICAgIHZhciBoICA9IHBhZChkYXRlLmdldFVUQ0hvdXJzKCkpXG4gICAgICB2YXIgbSAgPSBwYWQoZGF0ZS5nZXRVVENNaW51dGVzKCkpXG4gICAgICB2YXIgcyAgPSBwYWQoZGF0ZS5nZXRVVENTZWNvbmRzKCkpXG4gICAgICB2YXIgem9uZSA9ICdVVEMnXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB5ICA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgdmFyIG1vID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgICB2YXIgZCAgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgICB2YXIgaCAgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICAgICAgdmFyIG0gID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgICAgdmFyIHMgID0gcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICAgdmFyIHpvbmUgPSBEYXRlVG9IVE1MLnRpbWV6b25lKGRhdGUpXG4gICAgfVxuXG4gICAgdmFyIHN0ciA9ICc8c3BhbiBjbGFzcz1cImRhdGVcIj4nK3krJy0nK21vKyctJytkKyc8L3NwYW4+J1xuICAgIHN0ciArPSAnIDxzcGFuIGNsYXNzPVwidGltZVwiPicraCsnOicrbSsnOicrcysnPC9zcGFuPidcbiAgICBzdHIgKz0gJyA8c3BhbiBjbGFzcz1cInRpbWV6b25lXCI+Jyt6b25lKyc8L3NwYW4+J1xuICAgIHJldHVybiBzdHJcbiAgfSxcblxuICAvLyBFeHRyYWN0IHRpbWV6b25lIGxhYmVsXG4gIHRpbWV6b25lOiBmdW5jdGlvbihkYXRlKXtcbiAgICB2YXIgem9uZSA9IChkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkvLTYwKVxuICAgIHZhciB0eiA9IFN0cmluZyhkYXRlKS5tYXRjaCgvXFwoKC4rKVxcKSQvKVxuXG4gICAgaWYodHopIHtcbiAgICAgIC8vIEJyb3dzZXIgaGFzIGZyaWVuZGx5IHRpbWV6b25lIGxhYmVsIGxpa2UgJ0VTVCdcbiAgICAgIHZhciB6b25lID0gdHpbMV1cbiAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCcm93c2VyIHVzZXMgYSBHTVQgb2Zmc2V0ICsvLVxuICAgICAgdmFyIHpvbmUgPSBcIkdNVCBcIiBcbiAgICAgICAgICB6b25lICs9ICgoem9uZSA+IDApID8gJysnIDogJycpXG4gICAgICAgICAgem9uZSArPSBcIiBcIisgcGFkKHpvbmUqMTAwLCA0KVxuICAgIH1cblxuICAgIHJldHVybiB6b25lXG4gIH1cbn1cblxudmFyIHBhZCA9IGZ1bmN0aW9uIGRhdGVQYWQobnVtLCBwYWQpe1xuICBwYWQgPSBwYWQgfHwgMlxuICB3aGlsZShTdHJpbmcobnVtKS5sZW5ndGggPCBwYWQpIHtcbiAgICBudW0gPSAnMCcgKyBudW1cbiAgfVxuICByZXR1cm4gbnVtXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0ZVRvSFRNTFxuIiwiLy8gVGltZWFnbyBieSBCcmFuZG9uIE1hdGhpcywgYmFzZWQgb24gSmF2YVNjcmlwdCBQcmV0dHkgRGF0ZSBDb3B5cmlnaHQgKGMpIDIwMTEgSm9obiBSZXNpZ1xuLy8gUmV0dXJucyByZWxhdGl2ZSB0aW1lXG5cbnZhciBUaW1lYWdvID0ge1xuICAvLyBzZXR1cCBIVE1MIHRlbXBsYXRlc1xuICBzZXR1cDogZnVuY3Rpb24gdGltZWFnb1NldHVwKCkge1xuXG4gICAgdmFyIHRpbWVFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGltZWFnb1tkYXRldGltZV0nKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aW1lRWxzLCBmdW5jdGlvbihlbCkge1xuICAgICAgdmFyIGRhdGV0aW1lID0gZWwuYXR0cmlidXRlcy5kYXRldGltZS52YWx1ZVxuICAgICAgdmFyIHN0eWxlID0gZWwuZGF0YXNldC50aW1lYWdvU3R5bGVcbiAgICAgIGVsLmlubmVySFRNTCA9IFRpbWVhZ28ucGFyc2UoZGF0ZXRpbWUsIHN0eWxlKVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gSWYgYSBicm93c2VyIGNhbid0IGhhbmRsZSBkYXRlcywgYmFpbC5cbiAgYnJvd3NlclN1cHBvcnQ6IGZ1bmN0aW9uIHRpbWVhZ29Ccm93c2VyU3VwcG9ydCgpIHtcbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKFwiMjAxNC0wMS0yOVQxODoxNDoyOSswMDowMFwiKS5nZXREYXRlKCkpXG4gIH0sXG5cbiAgcGFyc2U6IGZ1bmN0aW9uIHRpbWVhZ29QYXJzZSh0aW1lLCBzdHlsZSkge1xuXG4gICAgaWYgKHR5cGVvZih0aW1lKSA9PSAnc3RyaW5nJykge1xuICAgICAgdGltZSA9IG5ldyBEYXRlKHRpbWUpXG4gICAgfVxuXG4gICAgaWYgKHN0eWxlID09PSAnc2hvcnQnKVxuICAgIHZhciBzYXkgPSB7XG4gICAgICBqdXN0X25vdzogICAgXCJub3dcIixcbiAgICAgIG1pbnV0ZV9hZ286ICBcIjFtXCIsXG4gICAgICBtaW51dGVzX2FnbzogXCJtXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxaFwiLFxuICAgICAgaG91cnNfYWdvOiAgIFwiaFwiLFxuICAgICAgeWVzdGVyZGF5OiAgIFwiMWRcIixcbiAgICAgIGRheXNfYWdvOiAgICBcImRcIixcbiAgICAgIGxhc3Rfd2VlazogICBcIjF3XCIsXG4gICAgICB3ZWVrc19hZ286ICAgXCJ3XCJcbiAgICB9XG5cbiAgICBlbHNlIGlmIChzdHlsZSA9PT0gJ2xvbmcnKVxuICAgIHZhciBzYXkgPSB7XG4gICAgICBqdXN0X25vdzogICAgXCJqdXN0IG5vd1wiLFxuICAgICAgbWludXRlX2FnbzogIFwiMSBtaW51dGUgYWdvXCIsXG4gICAgICBtaW51dGVzX2FnbzogXCIgbWludXRlcyBhZ29cIixcbiAgICAgIGhvdXJfYWdvOiAgICBcIjEgaG91ciBhZ29cIixcbiAgICAgIGhvdXJzX2FnbzogICBcIiBob3VycyBhZ29cIixcbiAgICAgIHllc3RlcmRheTogICBcIjEgZGF5IGFnb1wiLFxuICAgICAgZGF5c19hZ286ICAgIFwiIGRheXMgYWdvXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxIHdlZWsgYWdvXCIsXG4gICAgICB3ZWVrc19hZ286ICAgXCIgd2Vla3MgYWdvXCJcbiAgICB9XG5cbiAgICBlbHNlXG4gICAgdmFyIHNheSA9IHtcbiAgICAgIGp1c3Rfbm93OiAgICBcImp1c3Qgbm93XCIsXG4gICAgICBtaW51dGVfYWdvOiAgXCIxIG1pbnV0ZVwiLFxuICAgICAgbWludXRlc19hZ286IFwiIG1pbnV0ZXNcIixcbiAgICAgIGhvdXJfYWdvOiAgICBcIjEgaG91clwiLFxuICAgICAgaG91cnNfYWdvOiAgIFwiIGhvdXJzXCIsXG4gICAgICB5ZXN0ZXJkYXk6ICAgXCIxIGRheVwiLFxuICAgICAgZGF5c19hZ286ICAgIFwiIGRheXNcIixcbiAgICAgIGxhc3Rfd2VlazogICBcIjEgd2Vla1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwiIHdlZWtzXCJcbiAgICB9XG5cbiAgICB2YXIgc2VjcyAgID0gKChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHRpbWUpLmdldFRpbWUoKSkgLyAxMDAwKVxuICAgIHZhciBtaW5zICAgPSBNYXRoLmZsb29yKHNlY3MgLyA2MClcbiAgICB2YXIgaG91cnMgID0gTWF0aC5mbG9vcihzZWNzIC8gMzYwMClcbiAgICB2YXIgZGF5cyAgID0gTWF0aC5mbG9vcihzZWNzIC8gODY0MDApXG4gICAgdmFyIHdlZWtzICA9IE1hdGguZmxvb3IoZGF5cyAvIDcpXG4gICAgdmFyIG1vbnRocyA9IE1hdGguZmxvb3IoZGF5cyAvIDMwKVxuXG4gICAgaWYoaXNOYU4oc2VjcykgfHwgZGF5cyA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmKGRheXMgPT09IDApIHtcbiAgICAgIGlmICAgICAoc2VjcyA8IDYwKSAgIHJldHVybiBzYXkuanVzdF9ub3dcbiAgICAgIGVsc2UgaWYoc2VjcyA8IDEyMCkgIHJldHVybiBzYXkubWludXRlX2FnbyBcbiAgICAgIGVsc2UgaWYoc2VjcyA8IDM2MDApIHJldHVybiBtaW5zICsgc2F5Lm1pbnV0ZXNfYWdvIFxuICAgICAgZWxzZSBpZihzZWNzIDwgNzIwMCkgcmV0dXJuIHNheS5ob3VyX2Fnb1xuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgcmV0dXJuIGhvdXJzICsgc2F5LmhvdXJzX2Fnb1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihkYXlzID09PSAxKSAgICAgICByZXR1cm4gc2F5Lnllc3RlcmRheVxuICAgICAgZWxzZSBpZihkYXlzIDwgNykgICAgcmV0dXJuIGRheXMgKyBzYXkuZGF5c19hZ29cbiAgICAgIGVsc2UgaWYod2Vla3MgPT09IDEpIHJldHVybiBzYXkubGFzdF93ZWVrXG4gICAgICBlbHNlICAgICAgICAgICAgICAgICByZXR1cm4gd2Vla3MgKyBzYXkud2Vla3NfYWdvXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVGltZWFnb1xuIiwidmFyIFRpbWVhZ28gPSByZXF1aXJlKCcuL3RpbWVhZ28nKVxudmFyIERhdGVUb0hUTUwgPSByZXF1aXJlKCcuL2RhdGUtdG8taHRtbCcpXG52YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLWV2ZW50JylcblxudmFyIFRvZ2dsZSA9IHtcbiAgdGltZUVsczogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpbWUtdG9nZ2xlW2RhdGV0aW1lXScpXG4gIH0sXG5cbiAgLy8gVGhlIGtleSBpcyB0aGUgY3VycmVudCB0aW1lLCB0aGUgdmFsdWUgaXMgdGhlIG5leHQgdGltZSB0eXBlIHRvIGJlIGRpc3BsYXllZFxuICBuZXh0VGltZToge1xuICAgICd0aW1lYWdvJzogJ2xvY2FsJyxcbiAgICAnbG9jYWwnOiAndXRjJyxcbiAgICAndXRjJzogJ3RpbWVhZ28nXG4gIH0sXG5cbiAgLy8gQXR0YWNoIGxpc3RlbmVycywgc2V0dXAgSFRNTCB0ZW1wbGF0ZXNcbiAgc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgIGlmKCFUaW1lYWdvLmJyb3dzZXJTdXBwb3J0KCkpIHJldHVybiBmYWxzZVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChUb2dnbGUudGltZUVscygpLCBUb2dnbGUuaW5pdClcbiAgfSxcblxuICAvLyBBdHRhY2ggbGlzdGVuZXJzIHRvIHRvZ2dsZSB0aW1lIHpvbmVzIHdoaW5lIGNsaWNrZWRcbiAgbGlzdGVuOiBmdW5jdGlvbigpIHtcbiAgICBpZighVGltZWFnby5icm93c2VyU3VwcG9ydCgpKSByZXR1cm4gZmFsc2VcblxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNsaWNrXCIsIFwiLnRpbWUtdG9nZ2xlXCIsIFRvZ2dsZS50b2dnbGUpXG4gIH0sXG5cbiAgLy8gVG9nZ2xlIGFsbCB0aW1lcyBvbiBwYWdlXG4gIHRvZ2dsZTogZnVuY3Rpb24oIGV2ZW50ICl7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChUb2dnbGUudGltZUVscygpLCBmdW5jdGlvbihlbCkge1xuICAgICAgVG9nZ2xlLnRvZ2dsZUVsKGVsKVxuICAgIH0pXG5cbiAgICBpZiAoIGV2ZW50ICYmIGV2ZW50LnRhcmdldCApIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgfVxuICB9LFxuXG4gIC8vIFN3aXRjaCBiZXR3ZWVuIHRpbWUgYWdvLCBVVEMsIGFuZCBsb2NhbCB0aW1lXG4gIHRvZ2dsZUVsOiBmdW5jdGlvbihlbCkge1xuICAgIHZhciBkYXRlID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRldGltZScpXG4gICAgdmFyIG5leHQgPSBUb2dnbGUubmV4dFRpbWVbZWwuZGF0YXNldC5tb2RlIHx8ICd0aW1lYWdvJyBdXG5cbiAgICBUb2dnbGUuc2V0Q29udGVudChlbCwgVG9nZ2xlLmRhdGVIVE1MKGRhdGUsIG5leHQsIGVsKSwgbmV4dClcblxuICAgIHJldHVybiBlbFxuICB9LFxuXG4gIC8vIFN1cHBseSBIVE1MIGZvciBVVEMgYW5kIGxvY2FsIGRhdGV0aW1lXG4gIC8vXG4gIGluaXQ6IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIGRhdGV0aW1lID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRldGltZScpXG4gICAgdmFyIG1vZGUgPSBlbC5kYXRhc2V0Lm1vZGUgfHwgJ3RpbWVhZ28nXG4gICAgdmFyIGh0bWwgPSBUb2dnbGUuZGF0ZUhUTUwoZGF0ZXRpbWUsIG1vZGUsIGVsKVxuXG4gICAgaWYgKGh0bWwpeyBcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAndG9nZ2xlIHRpbWUnKVxuICAgICAgVG9nZ2xlLnNldENvbnRlbnQoZWwsIGh0bWwsIG1vZGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RpbWUtdG9nZ2xlJylcbiAgICB9XG5cbiAgICByZXR1cm4gZWxcbiAgfSxcblxuICBzZXRDb250ZW50OiBmdW5jdGlvbiggZWwsIGh0bWwsIG1vZGUgKSB7XG4gICAgdmFyIGRhdGVUZXh0Tm9kZSA9IGVsLnF1ZXJ5U2VsZWN0b3IoICcuZGF0ZS10ZXh0JyApXG5cbiAgICBpZiAoIGRhdGVUZXh0Tm9kZSApIHtcbiAgICAgIGRhdGVUZXh0Tm9kZS5pbm5lckhUTUwgPSBodG1sXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImRhdGUtdGV4dFwiPicraHRtbCsnPC9zcGFuJ1xuICAgIH1cblxuICAgIGVsLmRhdGFzZXQubW9kZSA9IG1vZGVcbiAgfSxcblxuICBkYXRlSFRNTDogZnVuY3Rpb24oZGF0ZSwgdHlwZSwgZWwpIHtcbiAgICBpZiAodHlwZSA9PSAndGltZWFnbycpXG4gICAgICB2YXIgdCA9IFRpbWVhZ28ucGFyc2UoZGF0ZSwgZWwuZGF0YXNldC50aW1lYWdvKVxuICAgIGVsc2UgaWYgKERhdGVUb0hUTUxbdHlwZV0pXG4gICAgICB2YXIgdCA9IERhdGVUb0hUTUxbdHlwZV0oZGF0ZSlcblxuICAgIGlmICh0KSB7XG4gICAgICByZXR1cm4gXCI8c3BhbiBjbGFzcz0ndGltZS10b2dnbGUtZGF0ZSBcIit0eXBlK1wiJz5cIiArIHQgKyBcIjwvc3Bhbj5cIlxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvZ2dsZVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGVyID0ge1xuICBjaGVja2JveFNlbGVjdG9yOiBcIlt0eXBlPWNoZWNrYm94XVtkYXRhLXRvZ2dsZV0sIFt0eXBlPWNoZWNrYm94XVtkYXRhLXNob3ddLCBbdHlwZT1jaGVja2JveF1bZGF0YS1oaWRlXVwiLFxuICByYWRpb1NlbGVjdG9yOiBcImlucHV0W3R5cGU9cmFkaW9dW2RhdGEtc2hvd10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtaGlkZV0sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtYWRkLWNsYXNzXSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZW1vdmUtY2xhc3NdXCIsXG4gIHNlbGVjdFNlbGVjdG9yOiBcIm9wdGlvbltkYXRhLWhpZGVdLCBvcHRpb25bZGF0YS1zaG93XVwiLFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oKXtcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGljayBjaGFuZ2VcIiwgXCJbZGF0YS10b2dnbGVdLCBbZGF0YS1zaG93XSwgW2RhdGEtaGlkZV0sIFtkYXRhLXRvZ2dsZS1jbGFzc10sIFtkYXRhLWFkZC1jbGFzc10sIFtkYXRhLXJlbW92ZS1jbGFzc11cIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNoYW5nZVwiLCBcIi5zZWxlY3QtdG9nZ2xlclwiLCBUb2dnbGVyLnRyaWdnZXIpXG4gICAgRXZlbnQub24od2luZG93LCAnaGFzaGNoYW5nZScsIFRvZ2dsZXIuaGFzaENoYW5nZSlcbiAgfSxcblxuICBoYXNoQ2hhbmdlOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIHdpbmRvdy5sb2NhdGlvbi5oYXNoICkge1xuXG4gICAgICB2YXIgYW5jaG9yID0gJ1tkYXRhLWFuY2hvcj1cIicrd2luZG93LmxvY2F0aW9uLmhhc2grJ1wiXSdcbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnK2FuY2hvcisgJywgb3B0aW9uJythbmNob3IgKVxuXG4gICAgICBpZiAoIHRhcmdldCApIHtcbiAgICAgICAgaWYgKCB0YXJnZXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzZWxlY3QgPSBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24odGFyZ2V0KVxuICAgICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gdGFyZ2V0LmluZGV4XG4gICAgICAgICAgdGFyZ2V0ID0gc2VsZWN0XG4gICAgICAgIH1cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIHRhcmdldCApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlZnJlc2g6IGZ1bmN0aW9uKCl7XG4gICAgVG9nZ2xlci50b2dnbGVDaGVja2JveGVzKClcbiAgICBUb2dnbGVyLnNldHVwU2VsZWN0cygpXG4gICAgVG9nZ2xlci5zZXR1cFJhZGlvcygpXG4gIH0sXG5cbiAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBTdG9wIGV2ZW50IGFuZCBidWJibGluZyBpZiBsaW5rIGlzIG9ubHkgYmVpbmcgdXNlZCBhcyBhIHRvZ2dsZXJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PSBcIiNcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgZXZlbnQuc3RvcCgpXG4gICAgfSBcblxuICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGluZzogZnVuY3Rpb24odGFyZ2V0LCBldmVudCkge1xuICAgIHZhciBhY3Rpb25zID0gWydoaWRlJywgJ3RvZ2dsZScsICdzaG93JywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ2FkZENsYXNzJ11cbiAgICB2YXIgc2VsZWN0XG5cbiAgICAvLyBTdG9yZSB0aGUgc2VsZWN0LCBhbmQgc2V0IHRoZSB0YXJnZXQgdG8gdGhlIGN1cnJlbnQgb3B0aW9uXG4gICAgLy8gRXZlbnRzIGZpcmUgb24gdGhlIHNlbGVjdCwgYnV0IHRoZSBvcHRpb25zIGhhdmUgdG9nZ2xpbmcgYXR0cmlidXRlc1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS5tYXRjaCgvc2VsZWN0L2kpKSB7XG4gICAgICBzZWxlY3QgPSB0YXJnZXRcbiAgICAgIHRhcmdldCA9IHNlbGVjdC5zZWxlY3RlZE9wdGlvbnNbMF1cbiAgICB9XG5cbiAgICAvLyBSYWRpbyBpbnB1dHMgYW5kIHNlbGVjdHMgZG8gbm90IHN1cHBvcnQgdG9nZ2xpbmcsIHNvIHJlbW92ZSB0aGVtXG4gICAgYWN0aW9ucyA9IGFjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdCB8fCB0YXJnZXQudHlwZSA9PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLm1hdGNoKC90b2dnbGUvKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldC5kYXRhc2V0W2FjdGlvbl0gIT0gbnVsbFxuICAgIH0pXG4gICAgXG4gICAgLy8gRGlzcGF0Y2ggYWxsIGFjdGlvbnNcbiAgICBhY3Rpb25zLmZvckVhY2goIGZ1bmN0aW9uKCBhY3Rpb24gKSB7XG4gICAgICBUb2dnbGVyLmRpc3BhdGNoKCB0YXJnZXQsIGFjdGlvbiApXG4gICAgfSlcbiAgfSxcblxuICBkaXNwYXRjaDogZnVuY3Rpb24oZWwsIHR5cGUpIHtcbiAgICB2YXIgYWN0aW9uID0gdHlwZVxuICAgIHZhciBkYXRhID0gZWwuZGF0YXNldFt0eXBlXVxuXG4gICAgLy8gQWJvcnQgaWYgZWxlbWVudCBkb2Vzbid0IGhhdmUgZGF0YSBmb3IgdGhlIGFjdGlvblxuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSA9PSAndW5kZWZpbmVkJyB8fCBkYXRhID09ICcnKSByZXR1cm5cblxuICAgIC8vIFRvZ2dsZSBhbmQgc2hvdyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBmb3IgY2hlY2tib3hlc1xuICAgIGlmIChlbC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICBhY3Rpb24gPSAodHlwZS5tYXRjaCgvaGlkZXxyZW1vdmUvaSkgPyAhZWwuY2hlY2tlZCA6IGVsLmNoZWNrZWQpXG5cbiAgICBpZiAoZGF0YSl7XG4gICAgICBpZiAodHlwZS5tYXRjaCgvY2xhc3MvaSkpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKGRhdGEsIGFjdGlvbiwgZWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUb2dnbGVyLnNldFN0YXRlKGRhdGEsIGFjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gQWRkLCByZW1vdmUsIG9yIHRvZ2dsZSBjbGFzc25hbWVzLCB0cmlnZ2VyZWQgYnkgZWxlbWVudHMgd2l0aDpcbiAgLy8gIGRhdGEtaGlkZS1jbGFzcywgZGF0YS1zaG93LWNsYXNzLCBhbmQgZGF0YS10b2dnbGUtY2xhc3MgdmFsdWVzXG4gIC8vXG4gIC8vICBEYXRhIHZhbHVlIGV4YW1wbGVzOlxuICAvLyAgIC0gXCJjbGFzc25hbWVcIiAtIGFkZC9yZW1vdmUvdG9nZ2xlIGNsYXNzbmFtZSBvbiBjdXJyZW50IGVsZW1lbnRcbiAgLy8gICAtIFwiZm9vIGJhclwiICAgLSBtdWx0aXBsZSBjbGFzc25hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIChsaWtlIGh0bWwgY2xhc3MgcHJvcGVydHkpXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yXCIgLSBjaGFuZ2UgY2xhc3NuYW1lcyBvbiBlbGVtZW50cyBtYXRjaGVkIGJ5IHNlbGVjdG9yXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yLCBzZWxlY3RvclwiIC0gbWF0Y2ggbXVsdGlwbGUgc2VsZWN0b3JzXG4gIC8vXG4gIC8vICBZb3UgY2FuIHBlcmZvcm0gbXVsdGlwbGUgYWRkL3JlbW92ZSBjbGFzc2VzIGJ5IGpvaW5pbmcgdmFsdWVzIHdpdGggYW4gYCZgXG4gIC8vICBGb3IgZXhhbXBsZTogXCJjbGFzc25hbWUgJiBmb28gYmFyOyBzZWxlY3RvclwiXG4gIC8vICBUaGlzIHdvdWxkIHRvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50IGFuZCB0b2dnbGUgYGZvbyBiYXJgIGNsYXNzbmFtZXNcbiAgLy8gIG9uIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gIC8vXG5cbiAgc2V0Q2xhc3M6IGZ1bmN0aW9uIChzZWxlY3RvcnMsIGFjdGlvbiwgZWwpe1xuICAgIGlmKHR5cGVvZiBzZWxlY3RvcnMgPT0gJ3VuZGVmaW5lZCcgfHwgc2VsZWN0b3JzID09ICcnKSByZXR1cm5cblxuICAgIGlmICh0eXBlb2YoYWN0aW9uKSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIGFjdGlvbiA9IChhY3Rpb24gPyAnYWRkJyA6ICdyZW1vdmUnKVxuICAgIH1cblxuICAgIGlmIChzZWxlY3RvcnMubWF0Y2goLyYvKSkge1xuICAgICAgc2VsZWN0b3JzLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbihzZWwpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKHNlbC50cmltKCksIGFjdGlvbiwgZWwpIFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RvciBhbmQgY2xhc3NuYW1lcywgZm9ybWF0OiBcImNsYXNzbmFtZSBjbGFzc25hbWU7IHNlbGVjdG9yLHNlbGVjdG9yXCJcbiAgICB2YXIgc2V0dGluZ3MgPSBzZWxlY3RvcnMuc3BsaXQoJzsnKVxuICAgIHZhciBjbGFzc25hbWVzID0gc2V0dGluZ3NbMF0udHJpbSgpXG4gICAgdmFyIG1hdGNoZXMgPSBbXVxuICAgIHNlbGVjdG9ycyA9IHNldHRpbmdzWzFdXG5cbiAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMpXG5cbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgYW5kIGVsIGlzIGFuIE9QVElPTiwgdXNlIGl0cyBTRUxFQ1QgYXMgdGhlIG1hdGNoZWQgZWxlbWVudFxuICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwudGFnTmFtZS5tYXRjaCgvb3B0aW9uL2kpKSB7XG4gICAgICBtYXRjaGVzID0gW1RvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihlbCldXG4gICAgICBcbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgdXNlIHRoZSBjdXJyZW50IGVsIGZvciBjbGFzc25hbWVzXG4gICAgfSBlbHNlIGlmIChlbCkge1xuICAgICAgbWF0Y2hlcyA9IFtlbF1cbiAgICB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG1hdGNoZXMsIGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2xhc3NuYW1lcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc25hbWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbi5yZXBsYWNlKC9DbGFzcy8sJycpXG4gICAgICAgIG1hdGNoLmNsYXNzTGlzdFttZXRob2RdKGNsYXNzbmFtZSlcbiAgICAgIH0pXG5cbiAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuKG1hdGNoLCAnY2xhc3MnKVxuICAgIH0pXG4gIH0sXG5cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uKHNlbGVjdG9ycywgc3RhdGUpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICB2YXIgYWN0aW9uID0gVG9nZ2xlci50b2dnbGVBY3Rpb24obWF0Y2gsIHN0YXRlKVxuXG4gICAgICBUb2dnbGVyW2FjdGlvbl0obWF0Y2gpXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgYWN0aW9uKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQWN0aW9uOiBmdW5jdGlvbiggZWwsIGFjdGlvbiApIHtcblxuICAgIGlmICggdHlwZW9mIGFjdGlvbiA9PSAnYm9vbGVhbicgKSB7XG4gICAgICBhY3Rpb24gPSAoIGFjdGlvbiA/ICdzaG93JyA6ICdoaWRlJyApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PSAndG9nZ2xlJykge1xuICAgICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnaGlkaW5nJykgKSB7XG4gICAgICAgIGFjdGlvbiA9ICdzaG93J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uID0gJ2hpZGUnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvblxuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc2hvd2luZycgKSB8fFxuICAgICAgICAgZWwub2Zmc2V0UGFyZW50ICE9IG51bGwgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGRlbicsICdoaWRpbmcnIClcblxuICAgIHZhciBmdWxseVNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFJlbW92ZSBoaWRkZW4gYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Nob3dpbmcnLCAnaGlkZGVuJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKVxuXG4gICAgICAvLyBFbmFibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBzaG93blxuICAgICAgaWYgKCB0eXBlb2YgZWwuZGlzYWJsZWQgIT0gJ3VuZGVmaW5lZCcgKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBGb2N1cyBvbiBrZXkgZWxlbWVudCBpZiBhbiBlbGVtZW50IGV4cGVjdHMgZm9jdXNcbiAgICAgIHZhciBmb2N1c0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXNdJylcbiAgICAgIGlmIChmb2N1c0VsKSB7IGZvY3VzRWwuZm9jdXMoKSB9XG5cbiAgICAgIC8vIFRyaWdnZXIgaW5wdXQgZXZlbnQgb24gcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlblxuICAgICAgdmFyIHJhbmdlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXScpXG4gICAgfVxuXG4gICAgaWYgKCBlbC5kYXRhc2V0LmFuaW1hdGUgKSB7XG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bGx5U2hvdywgdHJ1ZSlcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdzaG93aW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5U2hvdygpXG4gICAgfVxuICB9LFxuXG4gIGhpZGU6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRkZW4nICkgfHwgXG4gICAgICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRpbmcnICkgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc2hvd2luZyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGFkZGVkIGJlZm9yZSB0aGlzIGZpcmVzXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnLCAnc2hvd2luZycgKVxuXG4gICAgdmFyIGZ1bGx5SGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGluZycsICd2aXNpYmxlJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkZGVuJyApXG5cbiAgICAgIC8vIERpc2FibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBoaWRkZW5cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseUhpZGUsIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkaW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5SGlkZSgpXG4gICAgfVxuICB9LFxuXG4gIGdldExlYWZOb2RlczogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIC8vIGlzIHRoZSBwYXJlbnQgaXRzZWxmIGEgbGVhZiBub2RlP1xuICAgIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgcmV0dXJuIFtwYXJlbnRdXG5cbiAgICB2YXIgbm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLCAwKVxuXG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gZWxlbS5jaGlsZHJlbiAmJiBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gIH0sXG5cbiAgdHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuOiBmdW5jdGlvbihlbCwgZXZlbnROYW1lKXtcbiAgICAvLyB3ZSBjYXJlIGFib3V0IGxlYWYgbm9kZXMgc2luY2UgdGhlIGV2ZW50IHdpbGwgYnViYmxlIHRvXG4gICAgLy8gbm9uLWxlYWYgbm9kZXMgZnJvbSB0aGUgbGVhZiBub2Rlc1xuICAgIHZhciBsZWFmQ2hpbGROb2RlcyA9IFRvZ2dsZXIuZ2V0TGVhZk5vZGVzKGVsKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsZWFmQ2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gJ3RvZ2dsZXI6c2hvdycsICd0b2dnbGVyOmhpZGUnLCBldGNcbiAgICAgIEV2ZW50LmZpcmUobm9kZSwgXCJ0b2dnbGVyOlwiICsgZXZlbnROYW1lKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQ2hlY2tib3hlczogZnVuY3Rpb24oY2hlY2tib3hlcykge1xuICAgIGNoZWNrYm94ZXMgPSBjaGVja2JveGVzIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5jaGVja2JveFNlbGVjdG9yKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjaGVja2JveGVzLCBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZylcbiAgfSxcblxuICBzZXR1cFJhZGlvczogZnVuY3Rpb24oKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIucmFkaW9TZWxlY3RvciksIGZ1bmN0aW9uKHJhZGlvLCBpbmRleCl7XG4gICAgICBpZiAoIXJhZGlvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIHZhciByYWRpb05hbWUgICAgICAgICA9IHJhZGlvLmdldEF0dHJpYnV0ZSgnbmFtZScpLFxuICAgICAgICAgICAgc2libGluZ3MgICAgICAgICAgPSBUb2dnbGVyLnBhcmVudEZvcm0ocmFkaW8pLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhZGlvXVtuYW1lPVwiJytyYWRpb05hbWUrJ1wiXScpLFxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnc2hvdycpLFxuICAgICAgICAgICAgYWRkQ2xhc3NTZWxlY3RvcnMgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnYWRkQ2xhc3MnKSxcbiAgICAgICAgICAgIGNoZWNrZWRcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNpYmxpbmdzLCBmdW5jdGlvbihyKXtcblxuICAgICAgICAgIGlmIChyLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrci5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICByLmNoZWNrZWQgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLXNob3cgdmFsdWUgb2YgJydcbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdW5zZXQgZGF0YS1zaG93IHZhbHVlcyB3aWxsIHRvZ2dsZSBvZmYgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LnNob3cgPSByLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggci5kYXRhc2V0LmhpZGUgJiYgci5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIHIuZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICByLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIGhhdmUgYSBkZWZhdWx0IGRhdGEtYWRkLWNsYXNzIHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtYWRkLWNsYXNzIHZhbHVlcyBhcmUgdG9nZ2xlIG9mZiBhbGwgY2xhc3Nlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LmFkZENsYXNzID0gci5kYXRhc2V0LmFkZENsYXNzIHx8ICcnXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZWxlY3RlZCByYWRpbyBidXR0b25zIHJlbW92ZSBjbGFzc2VzIGFjY29yZGluZ1xuICAgICAgICAgIC8vIHRvIHRoZSBkZXNlbGVjdGVkIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICByLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIHIuZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignJicpXG5cblxuICAgICAgICAgIHIuZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuXG5cbiAgICAgICAgICBpZiggci5jaGVja2VkICkgY2hlY2tlZCA9IHJcblxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICggY2hlY2tlZCApIHtcbiAgICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyggY2hlY2tlZCApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZSggc2hvd1NlbGVjdG9ycy5qb2luKCcsJyksICdoaWRlJyApXG4gICAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyggYWRkQ2xhc3NTZWxlY3RvcnMuam9pbignICYgJyksICdyZW1vdmVDbGFzcycgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICB9LFxuXG4gIC8vIEFkZCBkYXRhLWhpZGUgdG8gZWFjaCA8b3B0aW9uPiBjb250YWluaW5nIHRoZSBzZWxlY3RvcnMgZnJvbSBvdGhlclxuICAvLyBvcHRpb24ncyBkYXRhLXNob3cuIFRoaXMgbWFrZXMgdGhlIHRvZ2dsaW5nIG9mIGVsZW1lbnRzIGV4Y2x1c2l2ZS5cbiAgLy9cbiAgc2V0dXBTZWxlY3RzOiBmdW5jdGlvbigpe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnNlbGVjdFNlbGVjdG9yKSwgZnVuY3Rpb24ob3B0aW9uKXtcbiAgICAgIC8vIFByZXZlbnQgYW4gb3B0aW9uIGZyb20gYmVpbmcgY29uc2lkZXJlZCB0d2ljZVxuICAgICAgaWYgKCFvcHRpb24uZGF0YXNldC50b2dnbGVyQWN0aXZlKSB7XG5cbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc2hvdyA9IG9wdGlvbi5kYXRhc2V0LnNob3cgfHwgJydcblxuICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKG9wdGlvbilcbiAgICAgICAgc2VsZWN0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC10b2dnbGVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJylcblxuICAgICAgICB2YXIgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKG9wdGlvbnMsICdzaG93JylcbiAgICAgICAgdmFyIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnYWRkQ2xhc3MnKVxuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob3B0aW9ucywgZnVuY3Rpb24obywgaW5kZXgpIHtcblxuICAgICAgICAgIGlmIChvLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrby5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgby5kYXRhc2V0LnNob3cgPSBvLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIG8uZGF0YXNldC5hZGRDbGFzcyA9IG8uZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggby5kYXRhc2V0LmhpZGUgJiYgby5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIG8uZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICAvLyBJZiBzaG93IHNlbGVjdG9ycyBhcmUgbm90IHByZXNlbnQgaW4gZWxlbWVudCdzIGRhdGEtc2hvd1xuICAgICAgICAgIC8vIEFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycyB0byBiZSBoaWRkZW5cbiAgICAgICAgICBvLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG8uZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignICYgJylcblxuICAgICAgICAgIG8uZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdG9nZ2xlZCBwcm9wZXJseVxuICAgICAgICAvL1xuICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhzZWxlY3QpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICAvLyBGaW5kIHBhcmVudCA8c2VsZWN0PiBmb3IgYW4gb3B0aW9uIChhY2NvdW50cyBmb3Igb3B0aW9uIGdyb3VwcylcbiAgLy9cbiAgZ2V0U2VsZWN0RnJvbU9wdGlvbjogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgcCA9IGVsLnBhcmVudEVsZW1lbnRcblxuICAgIGlmIChwLnRhZ05hbWUgPT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybiBwXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24ocClcbiAgICB9XG4gIH0sXG5cblxuICAvLyBGaW5kIHBhcmVudCA8Zm9ybT4gb3IgZG9jdW1lbnQgaWYgdGhlcmUgaXMgbm8gZm9ybVxuICAvL1xuICBwYXJlbnRGb3JtOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdmFyIGVsID0gZWxlbWVudFxuXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBkb2N1bWVudFxuICB9LFxuXG4gIC8vIFJldHVybiBhIHVuaXF1ZSBhcnJheSBvZiBhbGwgZGF0YSBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZWxlbWVudHNcbiAgLy9cbiAgZGF0YUF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBhdHRyKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlbGVtZW50cywgZnVuY3Rpb24oZWwpIHsgXG4gICAgICByZXR1cm4gZWwuZGF0YXNldFthdHRyXVxuICAgIH0pLmZpbHRlcihmdW5jdGlvbihzZWxlY3RvcnMsIGluZGV4LCBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JzICE9IFwiXCIgJiYgdHlwZW9mIHNlbGVjdG9ycyAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLmluZGV4T2Yoc2VsZWN0b3JzKSA9PT0gaW5kZXhcbiAgICB9KVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KFRvZ2dsZXIubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRvZ2dsZXIucmVmcmVzaClcblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVyXG4iLCJ2YXIgRGF0ZVRpbWUgPSByZXF1aXJlKCAnbHV4b24nICkuRGF0ZVRpbWVcblxuZnVuY3Rpb24gaXNCZWZvcmUoIGRhdGUsIGVuZCApIHtcbiAgZW5kID0gcGFyc2UoIGVuZCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1pbiggZW5kLCBkYXRlIClcbn1cblxuZnVuY3Rpb24gaXNBZnRlciggZGF0ZSwgc3RhcnQgKSB7XG4gIHN0YXJ0ID0gcGFyc2UoIHN0YXJ0IClcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgcmV0dXJuIGRhdGUgPT0gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQmV0d2VlbiggZGF0ZSwgc3RhcnQsIGVuZCApIHtcbiAgc3RhcnQgPSBwYXJzZSggc3RhcnQgKVxuICBlbmQgID0gcGFyc2UoIGVuZCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlICkgPT0gRGF0ZVRpbWUubWluKCBkYXRlLCBlbmQgKVxufVxuXG5mdW5jdGlvbiBwYXJzZSggZGF0ZSApIHtcbiAgdmFyIGZvcm1hdHMgPSBbIFwiZnJvbUlTT1wiLCBcImZyb21TUUxcIiwgXCJmcm9tSFRUUFwiLCBcImZyb21SRkMyODIyXCIsIFwiZnJvbU1pbGxpc1wiIF0sXG4gICAgICBwYXJzZWREYXRlXG5cbiAgaWYgKCB0eXBlb2YgZGF0ZSA9PSAnb2JqZWN0JyApIHtcbiAgICBpZiAoIGRhdGUudG9JU08gKSByZXR1cm4gZGF0ZVxuICAgIHBhcnNlZERhdGUgPSBEYXRlVGltZS5mcm9tT2JqZWN0KCBkYXRlIClcblxuICB9IGVsc2Uge1xuICAgIGRhdGUgPSBTdHJpbmcoIGRhdGUgKVxuICAgIGZvcm1hdHMuZm9yRWFjaCggZnVuY3Rpb24oIGZvcm1hdCApIHtcbiAgICAgIGlmICggIXBhcnNlZERhdGUgfHwgcGFyc2VkRGF0ZS5pbnZhbGlkICkge1xuICAgICAgICBwYXJzZWREYXRlID0gRGF0ZVRpbWVbZm9ybWF0XSggZGF0ZSwgeyBsb2NhbGU6ICdlbi11cycgfSApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmICggIXBhcnNlZERhdGUuaW52YWxpZCApXG4gICAgcmV0dXJuIHBhcnNlZERhdGVcbiAgZWxzZVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCZWZvcmU6IGlzQmVmb3JlLFxuICBpc0FmdGVyOiBpc0FmdGVyLFxuICBpc0JldHdlZW46IGlzQmV0d2VlbixcbiAgcGFyc2U6IHBhcnNlXG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8vICAgICBrZXltYXN0ZXIuanNcbi8vICAgICAoYykgMjAxMS0yMDEzIFRob21hcyBGdWNoc1xuLy8gICAgIGtleW1hc3Rlci5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuOyhmdW5jdGlvbihnbG9iYWwpe1xuICB2YXIgayxcbiAgICBfaGFuZGxlcnMgPSB7fSxcbiAgICBfbW9kcyA9IHsgMTY6IGZhbHNlLCAxODogZmFsc2UsIDE3OiBmYWxzZSwgOTE6IGZhbHNlIH0sXG4gICAgX3Njb3BlID0gJ2FsbCcsXG4gICAgLy8gbW9kaWZpZXIga2V5c1xuICAgIF9NT0RJRklFUlMgPSB7XG4gICAgICAn4oenJzogMTYsIHNoaWZ0OiAxNixcbiAgICAgICfijKUnOiAxOCwgYWx0OiAxOCwgb3B0aW9uOiAxOCxcbiAgICAgICfijIMnOiAxNywgY3RybDogMTcsIGNvbnRyb2w6IDE3LFxuICAgICAgJ+KMmCc6IDkxLCBjb21tYW5kOiA5MVxuICAgIH0sXG4gICAgLy8gc3BlY2lhbCBrZXlzXG4gICAgX01BUCA9IHtcbiAgICAgIGJhY2tzcGFjZTogOCwgdGFiOiA5LCBjbGVhcjogMTIsXG4gICAgICBlbnRlcjogMTMsICdyZXR1cm4nOiAxMyxcbiAgICAgIGVzYzogMjcsIGVzY2FwZTogMjcsIHNwYWNlOiAzMixcbiAgICAgIGxlZnQ6IDM3LCB1cDogMzgsXG4gICAgICByaWdodDogMzksIGRvd246IDQwLFxuICAgICAgZGVsOiA0NiwgJ2RlbGV0ZSc6IDQ2LFxuICAgICAgaG9tZTogMzYsIGVuZDogMzUsXG4gICAgICBwYWdldXA6IDMzLCBwYWdlZG93bjogMzQsXG4gICAgICAnLCc6IDE4OCwgJy4nOiAxOTAsICcvJzogMTkxLFxuICAgICAgJ2AnOiAxOTIsICctJzogMTg5LCAnPSc6IDE4NyxcbiAgICAgICc7JzogMTg2LCAnXFwnJzogMjIyLFxuICAgICAgJ1snOiAyMTksICddJzogMjIxLCAnXFxcXCc6IDIyMFxuICAgIH0sXG4gICAgY29kZSA9IGZ1bmN0aW9uKHgpe1xuICAgICAgcmV0dXJuIF9NQVBbeF0gfHwgeC50b1VwcGVyQ2FzZSgpLmNoYXJDb2RlQXQoMCk7XG4gICAgfSxcbiAgICBfZG93bktleXMgPSBbXTtcblxuICBmb3Ioaz0xO2s8MjA7aysrKSBfTUFQWydmJytrXSA9IDExMStrO1xuXG4gIC8vIElFIGRvZXNuJ3Qgc3VwcG9ydCBBcnJheSNpbmRleE9mLCBzbyBoYXZlIGEgc2ltcGxlIHJlcGxhY2VtZW50XG4gIGZ1bmN0aW9uIGluZGV4KGFycmF5LCBpdGVtKXtcbiAgICB2YXIgaSA9IGFycmF5Lmxlbmd0aDtcbiAgICB3aGlsZShpLS0pIGlmKGFycmF5W2ldPT09aXRlbSkgcmV0dXJuIGk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLy8gZm9yIGNvbXBhcmluZyBtb2RzIGJlZm9yZSB1bmFzc2lnbm1lbnRcbiAgZnVuY3Rpb24gY29tcGFyZUFycmF5KGExLCBhMikge1xuICAgIGlmIChhMS5sZW5ndGggIT0gYTIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYTFbaV0gIT09IGEyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG1vZGlmaWVyTWFwID0ge1xuICAgICAgMTY6J3NoaWZ0S2V5JyxcbiAgICAgIDE4OidhbHRLZXknLFxuICAgICAgMTc6J2N0cmxLZXknLFxuICAgICAgOTE6J21ldGFLZXknXG4gIH07XG4gIGZ1bmN0aW9uIHVwZGF0ZU1vZGlmaWVyS2V5KGV2ZW50KSB7XG4gICAgICBmb3IoayBpbiBfbW9kcykgX21vZHNba10gPSBldmVudFttb2RpZmllck1hcFtrXV07XG4gIH07XG5cbiAgLy8gaGFuZGxlIGtleWRvd24gZXZlbnRcbiAgZnVuY3Rpb24gZGlzcGF0Y2goZXZlbnQpIHtcbiAgICB2YXIga2V5LCBoYW5kbGVyLCBrLCBpLCBtb2RpZmllcnNNYXRjaCwgc2NvcGU7XG4gICAga2V5ID0gZXZlbnQua2V5Q29kZTtcblxuICAgIGlmIChpbmRleChfZG93bktleXMsIGtleSkgPT0gLTEpIHtcbiAgICAgICAgX2Rvd25LZXlzLnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICAvLyBpZiBhIG1vZGlmaWVyIGtleSwgc2V0IHRoZSBrZXkuPG1vZGlmaWVya2V5bmFtZT4gcHJvcGVydHkgdG8gdHJ1ZSBhbmQgcmV0dXJuXG4gICAgaWYoa2V5ID09IDkzIHx8IGtleSA9PSAyMjQpIGtleSA9IDkxOyAvLyByaWdodCBjb21tYW5kIG9uIHdlYmtpdCwgY29tbWFuZCBvbiBHZWNrb1xuICAgIGlmKGtleSBpbiBfbW9kcykge1xuICAgICAgX21vZHNba2V5XSA9IHRydWU7XG4gICAgICAvLyAnYXNzaWduS2V5JyBmcm9tIGluc2lkZSB0aGlzIGNsb3N1cmUgaXMgZXhwb3J0ZWQgdG8gd2luZG93LmtleVxuICAgICAgZm9yKGsgaW4gX01PRElGSUVSUykgaWYoX01PRElGSUVSU1trXSA9PSBrZXkpIGFzc2lnbktleVtrXSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0ZU1vZGlmaWVyS2V5KGV2ZW50KTtcblxuICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUga2V5cHJlc3MgKGZpbHRlcigpIGNhbiBjYW4gYmUgb3ZlcnJpZGRlbilcbiAgICAvLyBieSBkZWZhdWx0IGlnbm9yZSBrZXkgcHJlc3NlcyBpZiBhIHNlbGVjdCwgdGV4dGFyZWEsIG9yIGlucHV0IGlzIGZvY3VzZWRcbiAgICBpZighYXNzaWduS2V5LmZpbHRlci5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgLy8gYWJvcnQgaWYgbm8gcG90ZW50aWFsbHkgbWF0Y2hpbmcgc2hvcnRjdXRzIGZvdW5kXG4gICAgaWYgKCEoa2V5IGluIF9oYW5kbGVycykpIHJldHVybjtcblxuICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcblxuICAgIC8vIGZvciBlYWNoIHBvdGVudGlhbCBzaG9ydGN1dFxuICAgIGZvciAoaSA9IDA7IGkgPCBfaGFuZGxlcnNba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgaGFuZGxlciA9IF9oYW5kbGVyc1trZXldW2ldO1xuXG4gICAgICAvLyBzZWUgaWYgaXQncyBpbiB0aGUgY3VycmVudCBzY29wZVxuICAgICAgaWYoaGFuZGxlci5zY29wZSA9PSBzY29wZSB8fCBoYW5kbGVyLnNjb3BlID09ICdhbGwnKXtcbiAgICAgICAgLy8gY2hlY2sgaWYgbW9kaWZpZXJzIG1hdGNoIGlmIGFueVxuICAgICAgICBtb2RpZmllcnNNYXRjaCA9IGhhbmRsZXIubW9kcy5sZW5ndGggPiAwO1xuICAgICAgICBmb3IoayBpbiBfbW9kcylcbiAgICAgICAgICBpZigoIV9tb2RzW2tdICYmIGluZGV4KGhhbmRsZXIubW9kcywgK2spID4gLTEpIHx8XG4gICAgICAgICAgICAoX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPT0gLTEpKSBtb2RpZmllcnNNYXRjaCA9IGZhbHNlO1xuICAgICAgICAvLyBjYWxsIHRoZSBoYW5kbGVyIGFuZCBzdG9wIHRoZSBldmVudCBpZiBuZWNjZXNzYXJ5XG4gICAgICAgIGlmKChoYW5kbGVyLm1vZHMubGVuZ3RoID09IDAgJiYgIV9tb2RzWzE2XSAmJiAhX21vZHNbMThdICYmICFfbW9kc1sxN10gJiYgIV9tb2RzWzkxXSkgfHwgbW9kaWZpZXJzTWF0Y2gpe1xuICAgICAgICAgIGlmKGhhbmRsZXIubWV0aG9kKGV2ZW50LCBoYW5kbGVyKT09PWZhbHNlKXtcbiAgICAgICAgICAgIGlmKGV2ZW50LnByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlbHNlIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICBpZihldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYoZXZlbnQuY2FuY2VsQnViYmxlKSBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB1bnNldCBtb2RpZmllciBrZXlzIG9uIGtleXVwXG4gIGZ1bmN0aW9uIGNsZWFyTW9kaWZpZXIoZXZlbnQpe1xuICAgIHZhciBrZXkgPSBldmVudC5rZXlDb2RlLCBrLFxuICAgICAgICBpID0gaW5kZXgoX2Rvd25LZXlzLCBrZXkpO1xuXG4gICAgLy8gcmVtb3ZlIGtleSBmcm9tIF9kb3duS2V5c1xuICAgIGlmIChpID49IDApIHtcbiAgICAgICAgX2Rvd25LZXlzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7XG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gZmFsc2U7XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHJlc2V0TW9kaWZpZXJzKCkge1xuICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGZhbHNlO1xuICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuICB9O1xuXG4gIC8vIHBhcnNlIGFuZCBhc3NpZ24gc2hvcnRjdXRcbiAgZnVuY3Rpb24gYXNzaWduS2V5KGtleSwgc2NvcGUsIG1ldGhvZCl7XG4gICAgdmFyIGtleXMsIG1vZHM7XG4gICAga2V5cyA9IGdldEtleXMoa2V5KTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1ldGhvZCA9IHNjb3BlO1xuICAgICAgc2NvcGUgPSAnYWxsJztcbiAgICB9XG5cbiAgICAvLyBmb3IgZWFjaCBzaG9ydGN1dFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gc2V0IG1vZGlmaWVyIGtleXMgaWYgYW55XG4gICAgICBtb2RzID0gW107XG4gICAgICBrZXkgPSBrZXlzW2ldLnNwbGl0KCcrJyk7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IDEpe1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXkpO1xuICAgICAgICBrZXkgPSBba2V5W2tleS5sZW5ndGgtMV1dO1xuICAgICAgfVxuICAgICAgLy8gY29udmVydCB0byBrZXljb2RlIGFuZC4uLlxuICAgICAga2V5ID0ga2V5WzBdXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG4gICAgICAvLyAuLi5zdG9yZSBoYW5kbGVyXG4gICAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgX2hhbmRsZXJzW2tleV0gPSBbXTtcbiAgICAgIF9oYW5kbGVyc1trZXldLnB1c2goeyBzaG9ydGN1dDoga2V5c1tpXSwgc2NvcGU6IHNjb3BlLCBtZXRob2Q6IG1ldGhvZCwga2V5OiBrZXlzW2ldLCBtb2RzOiBtb2RzIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyB1bmJpbmQgYWxsIGhhbmRsZXJzIGZvciBnaXZlbiBrZXkgaW4gY3VycmVudCBzY29wZVxuICBmdW5jdGlvbiB1bmJpbmRLZXkoa2V5LCBzY29wZSkge1xuICAgIHZhciBtdWx0aXBsZUtleXMsIGtleXMsXG4gICAgICBtb2RzID0gW10sXG4gICAgICBpLCBqLCBvYmo7XG5cbiAgICBtdWx0aXBsZUtleXMgPSBnZXRLZXlzKGtleSk7XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgbXVsdGlwbGVLZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICBrZXlzID0gbXVsdGlwbGVLZXlzW2pdLnNwbGl0KCcrJyk7XG5cbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbW9kcyA9IGdldE1vZHMoa2V5cyk7XG4gICAgICAgIGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gY29kZShrZXkpO1xuXG4gICAgICBpZiAoc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzY29wZSA9IGdldFNjb3BlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIV9oYW5kbGVyc1trZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBfaGFuZGxlcnNba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICBvYmogPSBfaGFuZGxlcnNba2V5XVtpXTtcbiAgICAgICAgLy8gb25seSBjbGVhciBoYW5kbGVycyBpZiBjb3JyZWN0IHNjb3BlIGFuZCBtb2RzIG1hdGNoXG4gICAgICAgIGlmIChvYmouc2NvcGUgPT09IHNjb3BlICYmIGNvbXBhcmVBcnJheShvYmoubW9kcywgbW9kcykpIHtcbiAgICAgICAgICBfaGFuZGxlcnNba2V5XVtpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdpdGggY29kZSAna2V5Q29kZScgaXMgY3VycmVudGx5IGRvd25cbiAgLy8gQ29udmVydHMgc3RyaW5ncyBpbnRvIGtleSBjb2Rlcy5cbiAgZnVuY3Rpb24gaXNQcmVzc2VkKGtleUNvZGUpIHtcbiAgICAgIGlmICh0eXBlb2Yoa2V5Q29kZSk9PSdzdHJpbmcnKSB7XG4gICAgICAgIGtleUNvZGUgPSBjb2RlKGtleUNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4KF9kb3duS2V5cywga2V5Q29kZSkgIT0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcmVzc2VkS2V5Q29kZXMoKSB7XG4gICAgICByZXR1cm4gX2Rvd25LZXlzLnNsaWNlKDApO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyKGV2ZW50KXtcbiAgICB2YXIgdGFnTmFtZSA9IChldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudCkudGFnTmFtZTtcbiAgICAvLyBpZ25vcmUga2V5cHJlc3NlZCBpbiBhbnkgZWxlbWVudHMgdGhhdCBzdXBwb3J0IGtleWJvYXJkIGRhdGEgaW5wdXRcbiAgICByZXR1cm4gISh0YWdOYW1lID09ICdJTlBVVCcgfHwgdGFnTmFtZSA9PSAnU0VMRUNUJyB8fCB0YWdOYW1lID09ICdURVhUQVJFQScpO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSBrZXkuPG1vZGlmaWVyPiB0byBmYWxzZVxuICBmb3IoayBpbiBfTU9ESUZJRVJTKSBhc3NpZ25LZXlba10gPSBmYWxzZTtcblxuICAvLyBzZXQgY3VycmVudCBzY29wZSAoZGVmYXVsdCAnYWxsJylcbiAgZnVuY3Rpb24gc2V0U2NvcGUoc2NvcGUpeyBfc2NvcGUgPSBzY29wZSB8fCAnYWxsJyB9O1xuICBmdW5jdGlvbiBnZXRTY29wZSgpeyByZXR1cm4gX3Njb3BlIHx8ICdhbGwnIH07XG5cbiAgLy8gZGVsZXRlIGFsbCBoYW5kbGVycyBmb3IgYSBnaXZlbiBzY29wZVxuICBmdW5jdGlvbiBkZWxldGVTY29wZShzY29wZSl7XG4gICAgdmFyIGtleSwgaGFuZGxlcnMsIGk7XG5cbiAgICBmb3IgKGtleSBpbiBfaGFuZGxlcnMpIHtcbiAgICAgIGhhbmRsZXJzID0gX2hhbmRsZXJzW2tleV07XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyApIHtcbiAgICAgICAgaWYgKGhhbmRsZXJzW2ldLnNjb3BlID09PSBzY29wZSkgaGFuZGxlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBlbHNlIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gYWJzdHJhY3Qga2V5IGxvZ2ljIGZvciBhc3NpZ24gYW5kIHVuYXNzaWduXG4gIGZ1bmN0aW9uIGdldEtleXMoa2V5KSB7XG4gICAgdmFyIGtleXM7XG4gICAga2V5ID0ga2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAga2V5cyA9IGtleS5zcGxpdCgnLCcpO1xuICAgIGlmICgoa2V5c1trZXlzLmxlbmd0aCAtIDFdKSA9PSAnJykge1xuICAgICAga2V5c1trZXlzLmxlbmd0aCAtIDJdICs9ICcsJztcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICAvLyBhYnN0cmFjdCBtb2RzIGxvZ2ljIGZvciBhc3NpZ24gYW5kIHVuYXNzaWduXG4gIGZ1bmN0aW9uIGdldE1vZHMoa2V5KSB7XG4gICAgdmFyIG1vZHMgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIDEpO1xuICAgIGZvciAodmFyIG1pID0gMDsgbWkgPCBtb2RzLmxlbmd0aDsgbWkrKylcbiAgICBtb2RzW21pXSA9IF9NT0RJRklFUlNbbW9kc1ttaV1dO1xuICAgIHJldHVybiBtb2RzO1xuICB9XG5cbiAgLy8gY3Jvc3MtYnJvd3NlciBldmVudHNcbiAgZnVuY3Rpb24gYWRkRXZlbnQob2JqZWN0LCBldmVudCwgbWV0aG9kKSB7XG4gICAgaWYgKG9iamVjdC5hZGRFdmVudExpc3RlbmVyKVxuICAgICAgb2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIG1ldGhvZCwgZmFsc2UpO1xuICAgIGVsc2UgaWYob2JqZWN0LmF0dGFjaEV2ZW50KVxuICAgICAgb2JqZWN0LmF0dGFjaEV2ZW50KCdvbicrZXZlbnQsIGZ1bmN0aW9uKCl7IG1ldGhvZCh3aW5kb3cuZXZlbnQpIH0pO1xuICB9O1xuXG4gIC8vIHNldCB0aGUgaGFuZGxlcnMgZ2xvYmFsbHkgb24gZG9jdW1lbnRcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpIHsgZGlzcGF0Y2goZXZlbnQpIH0pOyAvLyBQYXNzaW5nIF9zY29wZSB0byBhIGNhbGxiYWNrIHRvIGVuc3VyZSBpdCByZW1haW5zIHRoZSBzYW1lIGJ5IGV4ZWN1dGlvbi4gRml4ZXMgIzQ4XG4gIGFkZEV2ZW50KGRvY3VtZW50LCAna2V5dXAnLCBjbGVhck1vZGlmaWVyKTtcblxuICAvLyByZXNldCBtb2RpZmllcnMgdG8gZmFsc2Ugd2hlbmV2ZXIgdGhlIHdpbmRvdyBpcyAocmUpZm9jdXNlZC5cbiAgYWRkRXZlbnQod2luZG93LCAnZm9jdXMnLCByZXNldE1vZGlmaWVycyk7XG5cbiAgLy8gc3RvcmUgcHJldmlvdXNseSBkZWZpbmVkIGtleVxuICB2YXIgcHJldmlvdXNLZXkgPSBnbG9iYWwua2V5O1xuXG4gIC8vIHJlc3RvcmUgcHJldmlvdXNseSBkZWZpbmVkIGtleSBhbmQgcmV0dXJuIHJlZmVyZW5jZSB0byBvdXIga2V5IG9iamVjdFxuICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgIHZhciBrID0gZ2xvYmFsLmtleTtcbiAgICBnbG9iYWwua2V5ID0gcHJldmlvdXNLZXk7XG4gICAgcmV0dXJuIGs7XG4gIH1cblxuICAvLyBzZXQgd2luZG93LmtleSBhbmQgd2luZG93LmtleS5zZXQvZ2V0L2RlbGV0ZVNjb3BlLCBhbmQgdGhlIGRlZmF1bHQgZmlsdGVyXG4gIGdsb2JhbC5rZXkgPSBhc3NpZ25LZXk7XG4gIGdsb2JhbC5rZXkuc2V0U2NvcGUgPSBzZXRTY29wZTtcbiAgZ2xvYmFsLmtleS5nZXRTY29wZSA9IGdldFNjb3BlO1xuICBnbG9iYWwua2V5LmRlbGV0ZVNjb3BlID0gZGVsZXRlU2NvcGU7XG4gIGdsb2JhbC5rZXkuZmlsdGVyID0gZmlsdGVyO1xuICBnbG9iYWwua2V5LmlzUHJlc3NlZCA9IGlzUHJlc3NlZDtcbiAgZ2xvYmFsLmtleS5nZXRQcmVzc2VkS2V5Q29kZXMgPSBnZXRQcmVzc2VkS2V5Q29kZXM7XG4gIGdsb2JhbC5rZXkubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7XG4gIGdsb2JhbC5rZXkudW5iaW5kID0gdW5iaW5kS2V5O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IGFzc2lnbktleTtcblxufSkodGhpcyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qXHJcbiAgVGhpcyBpcyBqdXN0IGEganVuayBkcmF3ZXIsIGNvbnRhaW5pbmcgYW55dGhpbmcgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgY2xhc3Nlcy5cclxuICBCZWNhdXNlIEx1eG9uIGlzIHNtYWxsKGlzaCksIHRoaXMgc2hvdWxkIHN0YXkgc21hbGwgYW5kIHdlIHdvbid0IHdvcnJ5IGFib3V0IHNwbGl0dGluZ1xyXG4gIGl0IHVwIGludG8sIHNheSwgcGFyc2luZ1V0aWwuanMgYW5kIGJhc2ljVXRpbC5qcyBhbmQgc28gb24uIEJ1dCB0aGV5IGFyZSBkaXZpZGVkIHVwIGJ5IGZlYXR1cmUgYXJlYS5cclxuKi9cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG4vLyBUWVBFU1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbi8vIENBUEFCSUxJVElFU1xuXG5mdW5jdGlvbiBoYXNJbnRsKCkge1xuICByZXR1cm4gdHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnICYmIEludGwuRGF0ZVRpbWVGb3JtYXQ7XG59XG5cbmZ1bmN0aW9uIGhhc0Zvcm1hdFRvUGFydHMoKSB7XG4gIHJldHVybiAhaXNVbmRlZmluZWQoSW50bC5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyk7XG59XG5cbi8vIE9CSkVDVFMgQU5EIEFSUkFZU1xuXG5mdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cblxuZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChiZXN0LCBuZXh0KSB7XG4gICAgdmFyIHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuICAgIGlmICghYmVzdCkge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfSBlbHNlIGlmIChjb21wYXJlLmFwcGx5KG51bGwsIFtiZXN0WzBdLCBwYWlyWzBdXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuXG5mdW5jdGlvbiBwaWNrKG9iaiwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGspIHtcbiAgICBhW2tdID0gb2JqW2tdO1xuICAgIHJldHVybiBhO1xuICB9LCB7fSk7XG59XG5cbi8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZnVuY3Rpb24gbnVtYmVyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzTnVtYmVyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufVxuXG4vLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcbmZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5cbmZ1bmN0aW9uIHBhZFN0YXJ0KGlucHV0KSB7XG4gIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAyO1xuXG4gIGlmIChpbnB1dC50b1N0cmluZygpLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gKCcwJy5yZXBlYXQobikgKyBpbnB1dCkuc2xpY2UoLW4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzKGZyYWN0aW9uKSB7XG4gIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvbikpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHZhciBmID0gcGFyc2VGbG9hdCgnMC4nICsgZnJhY3Rpb24pICogMTAwMDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihmKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzKSB7XG4gIHZhciBmYWN0b3IgPSBNYXRoLnBvdygxMCwgZGlnaXRzKTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyICogZmFjdG9yKSAvIGZhY3Rvcjtcbn1cblxuLy8gREFURSBCQVNJQ1NcblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cblxuZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5mdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICB2YXIgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgICBtb2RZZWFyID0geWVhciArIChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuXG4gIGlmIChtb2RNb250aCA9PT0gMikge1xuICAgIHJldHVybiBpc0xlYXBZZWFyKG1vZFllYXIpID8gMjkgOiAyODtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gWzMxLCBudWxsLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV1bbW9kTW9udGggLSAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpIHtcbiAgdmFyIHAxID0gKHdlZWtZZWFyICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQpIC0gTWF0aC5mbG9vcih3ZWVrWWVhciAvIDEwMCkgKyBNYXRoLmZsb29yKHdlZWtZZWFyIC8gNDAwKSkgJSA3LFxuICAgICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICAgIHAyID0gKGxhc3QgKyBNYXRoLmZsb29yKGxhc3QgLyA0KSAtIE1hdGguZmxvb3IobGFzdCAvIDEwMCkgKyBNYXRoLmZsb29yKGxhc3QgLyA0MDApKSAlIDc7XG4gIHJldHVybiBwMSA9PT0gNCB8fCBwMiA9PT0gMyA/IDUzIDogNTI7XG59XG5cbmZ1bmN0aW9uIHVudHJ1bmNhdGVZZWFyKHllYXIpIHtcbiAgaWYgKHllYXIgPiA5OSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2UgcmV0dXJuIHllYXIgPiA2MCA/IDE5MDAgKyB5ZWFyIDogMjAwMCArIHllYXI7XG59XG5cbi8vIFBBUlNJTkdcblxuZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUpIHtcbiAgdmFyIHRpbWVab25lID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgaW50bE9wdHMgPSB7XG4gICAgaG91cjEyOiBmYWxzZSxcbiAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgbWludXRlOiAnMi1kaWdpdCdcbiAgfTtcblxuICBpZiAodGltZVpvbmUpIHtcbiAgICBpbnRsT3B0cy50aW1lWm9uZSA9IHRpbWVab25lO1xuICB9XG5cbiAgdmFyIG1vZGlmaWVkID0gT2JqZWN0LmFzc2lnbih7IHRpbWVab25lTmFtZTogb2Zmc2V0Rm9ybWF0IH0sIGludGxPcHRzKSxcbiAgICAgIGludGwgPSBoYXNJbnRsKCk7XG5cbiAgaWYgKGludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgdmFyIHBhcnNlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdFRvUGFydHMoZGF0ZSkuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAndGltZXpvbmVuYW1lJztcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkID8gcGFyc2VkLnZhbHVlIDogbnVsbDtcbiAgfSBlbHNlIGlmIChpbnRsKSB7XG4gICAgLy8gdGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgZm9yIGFsbCBsb2NhbGVzXG4gICAgdmFyIHdpdGhvdXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIGludGxPcHRzKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGluY2x1ZGVkID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBtb2RpZmllZCkuZm9ybWF0KGRhdGUpLFxuICAgICAgICBkaWZmZWQgPSBpbmNsdWRlZC5zdWJzdHJpbmcod2l0aG91dC5sZW5ndGgpLFxuICAgICAgICB0cmltbWVkID0gZGlmZmVkLnJlcGxhY2UoL15bLCBdKy8sICcnKTtcbiAgICByZXR1cm4gdHJpbW1lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBzaWduZWRPZmZzZXQoJy01JywgJzMwJykgLT4gLTMzMFxuZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICB2YXIgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKSB8fCAwLFxuICAgICAgb2ZmTWluID0gcGFyc2VJbnQob2ZmTWludXRlU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwID8gLW9mZk1pbiA6IG9mZk1pbjtcbiAgcmV0dXJuIG9mZkhvdXIgKiA2MCArIG9mZk1pblNpZ25lZDtcbn1cblxuLy8gQ09FUkNJT05cblxuZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplcikge1xuICB2YXIgaWdub3JlVW5rbm93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSB7fTtcbiAgZm9yICh2YXIgdSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHUpKSB7XG4gICAgICB2YXIgdiA9IG9ialt1XTtcbiAgICAgIGlmICh2ICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2KSAmJiAhTnVtYmVyLmlzTmFOKHYpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBub3JtYWxpemVyKHUsIGlnbm9yZVVua25vd24pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgbm9ybWFsaXplZFttYXBwZWRdID0gdjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gdGltZU9iamVjdChvYmopIHtcbiAgcmV0dXJuIHBpY2sob2JqLCBbJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddKTtcbn1cblxudmFyIGN1c3RvbUluc3BlY3RTeW1ib2wgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0LmN1c3RvbTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuICB9IGNhdGNoIChfZXJyKSB7XG4gICAgcmV0dXJuIFN5bWJvbCgndXRpbC5pbnNwZWN0LmN1c3RvbScpO1xuICB9XG59KCk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbiA9ICdudW1lcmljJyxcbiAgICBzID0gJ3Nob3J0JyxcbiAgICBsID0gJ2xvbmcnLFxuICAgIGQyID0gJzItZGlnaXQnO1xuXG52YXIgREFURV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogblxufTtcblxudmFyIERBVEVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuXG59O1xuXG52YXIgREFURV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuXG59O1xuXG52YXIgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsXG59O1xuXG52YXIgVElNRV9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG5cbnZhciBUSU1FX1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcblxudmFyIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcblxudmFyIFRJTUVfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG52YXIgVElNRV8yNF9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIGhvdXIxMjogZmFsc2Vcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cbnZhciBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZVxufTtcblxuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cbnZhciBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xudmFyIERBVEVUSU1FX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cbnZhciBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG5cbnZhciBEQVRFVElNRV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG5cbnZhciBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xuXG52YXIgREFURVRJTUVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuXG52YXIgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcblxudmFyIERBVEVUSU1FX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxudmFyIERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgT2JqZWN0LmtleXMob2JqKS5zb3J0KCkpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1vbnRoc0xvbmcgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcblxudmFyIG1vbnRoc1Nob3J0ID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG52YXIgbW9udGhzTmFycm93ID0gWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddO1xuXG5mdW5jdGlvbiBtb250aHMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAnbmFycm93JzpcbiAgICAgIHJldHVybiBtb250aHNOYXJyb3c7XG4gICAgY2FzZSAnc2hvcnQnOlxuICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0O1xuICAgIGNhc2UgJ2xvbmcnOlxuICAgICAgcmV0dXJuIG1vbnRoc0xvbmc7XG4gICAgY2FzZSAnbnVtZXJpYyc6XG4gICAgICByZXR1cm4gWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcxMCcsICcxMScsICcxMiddO1xuICAgIGNhc2UgJzItZGlnaXQnOlxuICAgICAgcmV0dXJuIFsnMDEnLCAnMDInLCAnMDMnLCAnMDQnLCAnMDUnLCAnMDYnLCAnMDcnLCAnMDgnLCAnMDknLCAnMTAnLCAnMTEnLCAnMTInXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIHdlZWtkYXlzTG9uZyA9IFsnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheScsICdTdW5kYXknXTtcblxudmFyIHdlZWtkYXlzU2hvcnQgPSBbJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1biddO1xuXG52YXIgd2Vla2RheXNOYXJyb3cgPSBbJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJywgJ1MnXTtcblxuZnVuY3Rpb24gd2Vla2RheXMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAnbmFycm93JzpcbiAgICAgIHJldHVybiB3ZWVrZGF5c05hcnJvdztcbiAgICBjYXNlICdzaG9ydCc6XG4gICAgICByZXR1cm4gd2Vla2RheXNTaG9ydDtcbiAgICBjYXNlICdsb25nJzpcbiAgICAgIHJldHVybiB3ZWVrZGF5c0xvbmc7XG4gICAgY2FzZSAnbnVtZXJpYyc6XG4gICAgICByZXR1cm4gWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3J107XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBtZXJpZGllbXMgPSBbJ0FNJywgJ1BNJ107XG5cbnZhciBlcmFzTG9uZyA9IFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddO1xuXG52YXIgZXJhc1Nob3J0ID0gWydCQycsICdBRCddO1xuXG52YXIgZXJhc05hcnJvdyA9IFsnQicsICdBJ107XG5cbmZ1bmN0aW9uIGVyYXMobGVuZ3RoKSB7XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAnbmFycm93JzpcbiAgICAgIHJldHVybiBlcmFzTmFycm93O1xuICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgIHJldHVybiBlcmFzU2hvcnQ7XG4gICAgY2FzZSAnbG9uZyc6XG4gICAgICByZXR1cm4gZXJhc0xvbmc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIHtcbiAgcmV0dXJuIG1lcmlkaWVtc1tkdC5ob3VyIDwgMTIgPyAwIDogMV07XG59XG5cbmZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZnVuY3Rpb24gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBtb250aHMobGVuZ3RoKVtkdC5tb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBlcmFzKGxlbmd0aClbZHQueWVhciA8IDAgPyAwIDogMV07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFN0cmluZyhrbm93bkZvcm1hdCkge1xuICAvLyB0aGVzZSBhbGwgaGF2ZSB0aGUgb2Zmc2V0cyByZW1vdmVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlbVxuICAvLyB3aXRob3V0IGFsbCB0aGUgaW50bCBzdHVmZiB0aGlzIGlzIGJhY2tmaWxsaW5nXG4gIHZhciBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFsnd2Vla2RheScsICdlcmEnLCAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ3RpbWVab25lTmFtZScsICdob3VyMTInXSksXG4gICAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgICAgZGF0ZVRpbWVIdWdlID0gJ0VFRUUsIExMTEwgZCwgeXl5eSwgaDptbSBhJztcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX1NIT1JUKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXknO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfTUVEKTpcbiAgICAgIHJldHVybiAnTExMIGQsIHl5eXknO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfRlVMTCk6XG4gICAgICByZXR1cm4gJ0xMTEwgZCwgeXl5eSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9IVUdFKTpcbiAgICAgIHJldHVybiAnRUVFRSwgTExMTCBkLCB5eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1NJTVBMRSk6XG4gICAgICByZXR1cm4gJ2g6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuICdoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gJ2g6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9TSU1QTEUpOlxuICAgICAgcmV0dXJuICdISDptbSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuICdISDptbTpzcyc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCk6XG4gICAgICByZXR1cm4gJ0hIOm1tJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuICdISDptbSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuICdNL2QveXl5eSwgaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9NRUQpOlxuICAgICAgcmV0dXJuICdMTEwgZCwgeXl5eSwgaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMKTpcbiAgICAgIHJldHVybiAnTExMTCBkLCB5eXl5LCBoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuICdNL2QveXl5eSwgaDptbTpzcyBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTExMIGQsIHl5eXksIGg6bW06c3MgYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuICdMTExMIGQsIHl5eXksIGg6bW06c3MgYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuICdFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG4gIH1cbn1cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cbnZhciBpbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59O1xuXG4vLyB0aGVzZSBhcmVuJ3QgcmVhbGx5IHByaXZhdGUsIGJ1dCBub3IgYXJlIHRoZXkgcmVhbGx5IHVzZWZ1bCB0byBkb2N1bWVudFxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBMdXhvbkVycm9yID0gZnVuY3Rpb24gKF9FcnJvcikge1xuICBpbmhlcml0cyhMdXhvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEx1eG9uRXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTHV4b25FcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0Vycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIEx1eG9uRXJyb3I7XG59KEVycm9yKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxudmFyIEludmFsaWREYXRlVGltZUVycm9yID0gZnVuY3Rpb24gKF9MdXhvbkVycm9yKSB7XG4gIGluaGVyaXRzKEludmFsaWREYXRlVGltZUVycm9yLCBfTHV4b25FcnJvcik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZERhdGVUaW1lRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZERhdGVUaW1lRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yLmNhbGwodGhpcywgJ0ludmFsaWQgRGF0ZVRpbWU6ICcgKyByZWFzb24pKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRGF0ZVRpbWVFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWRJbnRlcnZhbEVycm9yID0gZnVuY3Rpb24gKF9MdXhvbkVycm9yMikge1xuICBpbmhlcml0cyhJbnZhbGlkSW50ZXJ2YWxFcnJvciwgX0x1eG9uRXJyb3IyKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkSW50ZXJ2YWxFcnJvcihyZWFzb24pIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkSW50ZXJ2YWxFcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3IyLmNhbGwodGhpcywgJ0ludmFsaWQgSW50ZXJ2YWw6ICcgKyByZWFzb24pKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkSW50ZXJ2YWxFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWREdXJhdGlvbkVycm9yID0gZnVuY3Rpb24gKF9MdXhvbkVycm9yMykge1xuICBpbmhlcml0cyhJbnZhbGlkRHVyYXRpb25FcnJvciwgX0x1eG9uRXJyb3IzKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkRHVyYXRpb25FcnJvcihyZWFzb24pIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkRHVyYXRpb25FcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3IzLmNhbGwodGhpcywgJ0ludmFsaWQgRHVyYXRpb246ICcgKyByZWFzb24pKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRHVyYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yID0gZnVuY3Rpb24gKF9MdXhvbkVycm9yNCkge1xuICBpbmhlcml0cyhDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciwgX0x1eG9uRXJyb3I0KTtcblxuICBmdW5jdGlvbiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3I0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgSW52YWxpZFVuaXRFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjUpIHtcbiAgaW5oZXJpdHMoSW52YWxpZFVuaXRFcnJvciwgX0x1eG9uRXJyb3I1KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkVW5pdEVycm9yKHVuaXQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkVW5pdEVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvcjUuY2FsbCh0aGlzLCAnSW52YWxpZCB1bml0ICcgKyB1bml0KSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZFVuaXRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWRBcmd1bWVudEVycm9yID0gZnVuY3Rpb24gKF9MdXhvbkVycm9yNikge1xuICBpbmhlcml0cyhJbnZhbGlkQXJndW1lbnRFcnJvciwgX0x1eG9uRXJyb3I2KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkQXJndW1lbnRFcnJvcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkQXJndW1lbnRFcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3I2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRBcmd1bWVudEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgWm9uZUlzQWJzdHJhY3RFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjcpIHtcbiAgaW5oZXJpdHMoWm9uZUlzQWJzdHJhY3RFcnJvciwgX0x1eG9uRXJyb3I3KTtcblxuICBmdW5jdGlvbiBab25lSXNBYnN0cmFjdEVycm9yKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFpvbmVJc0Fic3RyYWN0RXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNy5jYWxsKHRoaXMsICdab25lIGlzIGFuIGFic3RyYWN0IGNsYXNzJykpO1xuICB9XG5cbiAgcmV0dXJuIFpvbmVJc0Fic3RyYWN0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4qL1xuXG52YXIgWm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWm9uZSgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBab25lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBab25lLnByb3RvdHlwZS5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgb3B0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cblxuICBab25lLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgZXF1YWwgdG8gYW5vdGhlciB6b25lclxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgWm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyB2YWxpZC5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFpvbmUsIFt7XG4gICAga2V5OiAndHlwZScsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB6b25lXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9mZnNldCBpcyBrbm93biB0byBiZSBmaXhlZCBmb3IgdGhlIHdob2xlIHllYXIuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFpvbmU7XG59KCk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xuXG52YXIgTG9jYWxab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKExvY2FsWm9uZSwgX1pvbmUpO1xuXG4gIGZ1bmN0aW9uIExvY2FsWm9uZSgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbFpvbmUpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTG9jYWxab25lLnByb3RvdHlwZS5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG5cbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUpO1xuICB9O1xuXG4gIExvY2FsWm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfTtcblxuICBMb2NhbFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdsb2NhbCc7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoTG9jYWxab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuICdsb2NhbCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoaGFzSW50bCgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICAgICAgfSBlbHNlIHJldHVybiAnbG9jYWwnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaXNWYWxpZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ2luc3RhbmNlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uID0gbmV3IExvY2FsWm9uZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIExvY2FsWm9uZTtcbn0oWm9uZSk7XG5cbnZhciBkdGZDYWNoZSA9IHt9O1xuZnVuY3Rpb24gbWFrZURURih6b25lKSB7XG4gIGlmICghZHRmQ2FjaGVbem9uZV0pIHtcbiAgICBkdGZDYWNoZVt6b25lXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgc2Vjb25kOiAnMi1kaWdpdCdcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbnZhciB0eXBlVG9Qb3MgPSB7XG4gIHllYXI6IDAsXG4gIG1vbnRoOiAxLFxuICBkYXk6IDIsXG4gIGhvdXI6IDMsXG4gIG1pbnV0ZTogNCxcbiAgc2Vjb25kOiA1XG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgdmFyIGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXQoZGF0ZSkucmVwbGFjZSgvXFx1MjAwRS9nLCAnJyksXG4gICAgICBwYXJzZWQgPSAvKFxcZCspXFwvKFxcZCspXFwvKFxcZCspLD8gKFxcZCspOihcXGQrKTooXFxkKykvLmV4ZWMoZm9ybWF0dGVkKSxcbiAgICAgIGZNb250aCA9IHBhcnNlZFsxXSxcbiAgICAgIGZEYXkgPSBwYXJzZWRbMl0sXG4gICAgICBmWWVhciA9IHBhcnNlZFszXSxcbiAgICAgIGZIb3VyID0gcGFyc2VkWzRdLFxuICAgICAgZk1pbnV0ZSA9IHBhcnNlZFs1XSxcbiAgICAgIGZTZWNvbmQgPSBwYXJzZWRbNl07XG5cbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdFRvUGFydHMoZGF0ZSksXG4gICAgICBmaWxsZWQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Zvcm1hdHRlZCRpID0gZm9ybWF0dGVkW2ldLFxuICAgICAgICB0eXBlID0gX2Zvcm1hdHRlZCRpLnR5cGUsXG4gICAgICAgIHZhbHVlID0gX2Zvcm1hdHRlZCRpLnZhbHVlLFxuICAgICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cblxuICAgIGlmICghaXNVbmRlZmluZWQocG9zKSkge1xuICAgICAgZmlsbGVkW3Bvc10gPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsbGVkO1xufVxuXG52YXIgSUFOQVpvbmUgPSBmdW5jdGlvbiAoX1pvbmUpIHtcbiAgaW5oZXJpdHMoSUFOQVpvbmUsIF9ab25lKTtcblxuICBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyID0gZnVuY3Rpb24gaXNWYWxpZFNwZWNpZmllcihzKSB7XG4gICAgcmV0dXJuIHMgJiYgcy5tYXRjaCgvXlthLXpfKy1dezEsMjU2fVxcL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0pPyQvaSk7XG4gIH07XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkWm9uZSh6b25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsIHsgdGltZVpvbmU6IHpvbmUgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8vIEV0Yy9HTVQrOCAtPiA0ODBcblxuXG4gIElBTkFab25lLnBhcnNlR01UT2Zmc2V0ID0gZnVuY3Rpb24gcGFyc2VHTVRPZmZzZXQoc3BlY2lmaWVyKSB7XG4gICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgdmFyIG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eRXRjXFwvR01UKFsrLV1cXGR7MSwyfSkkL2kpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiA2MCAqIHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZnVuY3Rpb24gSUFOQVpvbmUobmFtZSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIElBTkFab25lKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1pvbmUuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy56b25lTmFtZSA9IG5hbWU7XG4gICAgX3RoaXMudmFsaWQgPSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShuYW1lKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBJQU5BWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIF9yZWYpIHtcbiAgICB2YXIgZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuXG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLnpvbmVOYW1lKTtcbiAgfTtcblxuICBJQU5BWm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0cyksXG4gICAgICAgIGR0ZiA9IG1ha2VEVEYodGhpcy56b25lTmFtZSksXG4gICAgICAgIF9yZWYyID0gZHRmLmZvcm1hdFRvUGFydHMgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKSxcbiAgICAgICAgZlllYXIgPSBfcmVmMlswXSxcbiAgICAgICAgZk1vbnRoID0gX3JlZjJbMV0sXG4gICAgICAgIGZEYXkgPSBfcmVmMlsyXSxcbiAgICAgICAgZkhvdXIgPSBfcmVmMlszXSxcbiAgICAgICAgZk1pbnV0ZSA9IF9yZWYyWzRdLFxuICAgICAgICBmU2Vjb25kID0gX3JlZjJbNV0sXG4gICAgICAgIGFzVVRDID0gRGF0ZS5VVEMoZlllYXIsIGZNb250aCAtIDEsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kKTtcblxuICAgIHZhciBhc1RTID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgYXNUUyAtPSBhc1RTICUgMTAwMDtcbiAgICByZXR1cm4gKGFzVVRDIC0gYXNUUykgLyAoNjAgKiAxMDAwKTtcbiAgfTtcblxuICBJQU5BWm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gJ2lhbmEnICYmIG90aGVyWm9uZS56b25lTmFtZSA9PT0gdGhpcy56b25lTmFtZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJQU5BWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnaWFuYSc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJQU5BWm9uZTtcbn0oWm9uZSk7XG5cbnZhciBzaW5nbGV0b24kMSA9IG51bGw7XG5cbmZ1bmN0aW9uIGhvdXJzTWludXRlc09mZnNldCh6KSB7XG4gIHZhciBob3VycyA9IE1hdGgudHJ1bmMoei5maXhlZCAvIDYwKSxcbiAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyh6LmZpeGVkICUgNjApLFxuICAgICAgc2lnbiA9IGhvdXJzID4gMCA/ICcrJyA6ICctJyxcbiAgICAgIGJhc2UgPSBzaWduICsgTWF0aC5hYnMoaG91cnMpO1xuICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgJzonICsgcGFkU3RhcnQobWludXRlcywgMikgOiBiYXNlO1xufVxuXG52YXIgRml4ZWRPZmZzZXRab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKEZpeGVkT2Zmc2V0Wm9uZSwgX1pvbmUpO1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZSA9IGZ1bmN0aW9uIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH07XG5cbiAgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyID0gZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgciA9IHMubWF0Y2goL151dGMoPzooWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/KT8kL2kpO1xuICAgICAgaWYgKHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaXhlZE9mZnNldFpvbmUoc2lnbmVkT2Zmc2V0KHJbMV0sIHJbMl0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoRml4ZWRPZmZzZXRab25lLCBudWxsLCBbe1xuICAgIGtleTogJ3V0Y0luc3RhbmNlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmIChzaW5nbGV0b24kMSA9PT0gbnVsbCkge1xuICAgICAgICBzaW5nbGV0b24kMSA9IG5ldyBGaXhlZE9mZnNldFpvbmUoMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uJDE7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gRml4ZWRPZmZzZXRab25lKG9mZnNldCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZpeGVkT2Zmc2V0Wm9uZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMuZml4ZWQgPSBvZmZzZXQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgRml4ZWRPZmZzZXRab25lLnByb3RvdHlwZS5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gJ2ZpeGVkJyAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoRml4ZWRPZmZzZXRab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuICdmaXhlZCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXhlZCA9PT0gMCA/ICdVVEMnIDogJ1VUQycgKyBob3Vyc01pbnV0ZXNPZmZzZXQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5pdmVyc2FsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBGaXhlZE9mZnNldFpvbmU7XG59KFpvbmUpO1xuXG52YXIgc2luZ2xldG9uJDIgPSBudWxsO1xuXG52YXIgSW52YWxpZFpvbmUgPSBmdW5jdGlvbiAoX1pvbmUpIHtcbiAgaW5oZXJpdHMoSW52YWxpZFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkWm9uZSgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZhbGlkWm9uZSk7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1pvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbnZhbGlkWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgSW52YWxpZFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9O1xuXG4gIEludmFsaWRab25lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEludmFsaWRab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuICdpbnZhbGlkJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICduYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaXNWYWxpZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdpbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDIgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDIgPSBuZXcgSW52YWxpZFpvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaW5nbGV0b24kMjtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEludmFsaWRab25lO1xufShab25lKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVpvbmUoaW5wdXQsIGRlZmF1bHRab25lKSB7XG4gIHZhciBvZmZzZXQgPSB2b2lkIDA7XG4gIGlmIChpc1VuZGVmaW5lZChpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFpvbmU7XG4gIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBab25lKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgIHZhciBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gJ2xvY2FsJykgcmV0dXJuIExvY2FsWm9uZS5pbnN0YW5jZTtlbHNlIGlmIChsb3dlcmVkID09PSAndXRjJyB8fCBsb3dlcmVkID09PSAnZ210JykgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZTtlbHNlIGlmICgob2Zmc2V0ID0gSUFOQVpvbmUucGFyc2VHTVRPZmZzZXQoaW5wdXQpKSAhPSBudWxsKSB7XG4gICAgICAvLyBoYW5kbGUgRXRjL0dNVC00LCB3aGljaCBWOCBjaG9rZXMgb25cbiAgICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBuZXcgSUFOQVpvbmUoaW5wdXQpO2Vsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBJbnZhbGlkWm9uZS5pbnN0YW5jZTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGlucHV0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihpbnB1dCkpID09PSAnb2JqZWN0JyAmJiBpbnB1dC5vZmZzZXQpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBJbnZhbGlkWm9uZS5pbnN0YW5jZTtcbiAgfVxufVxuXG52YXIgbm93ID0gZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gRGF0ZS5ub3coKTtcbn0sXG4gICAgZGVmYXVsdFpvbmUgPSBudWxsLFxuICAgIC8vIG5vdCBzZXR0aW5nIHRoaXMgZGlyZWN0bHkgdG8gTG9jYWxab25lLmluc3RhbmNlIGJjIGxvYWRpbmcgb3JkZXIgaXNzdWVzXG5kZWZhdWx0TG9jYWxlID0gbnVsbCxcbiAgICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVsbCxcbiAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBudWxsLFxuICAgIHRocm93T25JbnZhbGlkID0gZmFsc2U7XG5cbi8qKlxyXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxyXG4gKi9cblxudmFyIFNldHRpbmdzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTZXR0aW5ncygpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTZXR0aW5ncyk7XG4gIH1cblxuICAvKipcclxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cclxuICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAqL1xuICBTZXR0aW5ncy5yZXNldENhY2hlcyA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGVzKCkge1xuICAgIExvY2FsZS5yZXNldENhY2hlKCk7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoU2V0dGluZ3MsIG51bGwsIFt7XG4gICAga2V5OiAnbm93JyxcblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIG5vdztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobikge1xuICAgICAgbm93ID0gbjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVmYXVsdFpvbmVOYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAoZGVmYXVsdFpvbmUgfHwgTG9jYWxab25lLmluc3RhbmNlKS5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSh6KSB7XG4gICAgICBpZiAoIXopIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFpvbmUgPSBub3JtYWxpemVab25lKHopO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtab25lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRab25lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Wm9uZSB8fCBMb2NhbFpvbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVmYXVsdExvY2FsZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBsb2NhbGUgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShsb2NhbGUpIHtcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHROdW1iZXJpbmdTeXN0ZW0nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZ1N5c3RlbTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0T3V0cHV0Q2FsZW5kYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRPdXRwdXRDYWxlbmRhcjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShvdXRwdXRDYWxlbmRhcikge1xuICAgICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3Rocm93T25JbnZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aHJvd09uSW52YWxpZDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEodCkge1xuICAgICAgdGhyb3dPbkludmFsaWQgPSB0O1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU2V0dGluZ3M7XG59KCk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVRva2VucyhzcGxpdHMsIHRva2VuVG9TdHJpbmcpIHtcbiAgdmFyIHMgPSAnJztcbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc3BsaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gX3JlZjtcblxuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzO1xufVxuXG52YXIgdG9rZW5Ub09iamVjdCA9IHtcbiAgRDogREFURV9TSE9SVCxcbiAgREQ6IERBVEVfTUVELFxuICBEREQ6IERBVEVfRlVMTCxcbiAgRERERDogREFURV9IVUdFLFxuICB0OiBUSU1FX1NJTVBMRSxcbiAgdHQ6IFRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIHR0dHQ6IFRJTUVfV0lUSF9MT05HX09GRlNFVCxcbiAgVDogVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBUSU1FXzI0X1dJVEhfU0VDT05EUyxcbiAgVFRUOiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VULFxuICBUVFRUOiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IERBVEVUSU1FX1NIT1JULFxuICBmZjogREFURVRJTUVfTUVELFxuICBmZmY6IERBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IERBVEVUSU1FX0hVR0UsXG4gIEY6IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyxcbiAgRkY6IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMsXG4gIEZGRkY6IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEZvcm1hdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgRm9ybWF0dGVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgZm9ybWF0T3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHsgcm91bmQ6IHRydWUgfSwgb3B0cyk7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBmb3JtYXRPcHRzKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucGFyc2VGb3JtYXQgPSBmdW5jdGlvbiBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICB2YXIgY3VycmVudCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRGdWxsID0gJycsXG4gICAgICAgIGJyYWNrZXRlZCA9IGZhbHNlO1xuICAgIHZhciBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuICAgICAgaWYgKGMgPT09IFwiJ1wiKSB7XG4gICAgICAgIGlmIChjdXJyZW50RnVsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3BsaXRzLnB1c2goeyBsaXRlcmFsOiBicmFja2V0ZWQsIHZhbDogY3VycmVudEZ1bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIGN1cnJlbnRGdWxsID0gJyc7XG4gICAgICAgIGJyYWNrZXRlZCA9ICFicmFja2V0ZWQ7XG4gICAgICB9IGVsc2UgaWYgKGJyYWNrZXRlZCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIGlmIChjID09PSBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnRGdWxsICs9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogZmFsc2UsIHZhbDogY3VycmVudEZ1bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEZ1bGwgPSBjO1xuICAgICAgICBjdXJyZW50ID0gYztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgc3BsaXRzLnB1c2goeyBsaXRlcmFsOiBicmFja2V0ZWQsIHZhbDogY3VycmVudEZ1bGwgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwbGl0cztcbiAgfTtcblxuICBmdW5jdGlvbiBGb3JtYXR0ZXIobG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVyKTtcblxuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdCA9IGZ1bmN0aW9uIGZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBvcHRzKSB7XG4gICAgaWYgKHRoaXMuc3lzdGVtTG9jID09PSBudWxsKSB7XG4gICAgICB0aGlzLnN5c3RlbUxvYyA9IHRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCk7XG4gICAgfVxuICAgIHZhciBkZiA9IHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXREYXRlVGltZSA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKGR0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdERhdGVUaW1lUGFydHMgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZVBhcnRzKGR0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlZE9wdGlvbnMoZHQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLnJlc29sdmVkT3B0aW9ucygpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUubnVtID0gZnVuY3Rpb24gbnVtKG4pIHtcbiAgICB2YXIgcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcblxuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICB2YXIgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICBpZiAocCA+IDApIHtcbiAgICAgIG9wdHMucGFkVG8gPSBwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYy5udW1iZXJGb3JtYXR0ZXIob3B0cykuZm9ybWF0KG4pO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmbXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09ICdlbic7XG4gICAgdmFyIHN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhvcHRzLCBleHRyYWN0KSB7XG4gICAgICByZXR1cm4gX3RoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpO1xuICAgIH0sXG4gICAgICAgIGZvcm1hdE9mZnNldCA9IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvcHRzKSB7XG4gICAgICBpZiAoZHQuaXNPZmZzZXRGaXhlZCAmJiBkdC5vZmZzZXQgPT09IDAgJiYgb3B0cy5hbGxvd1opIHtcbiAgICAgICAgcmV0dXJuICdaJztcbiAgICAgIH1cblxuICAgICAgdmFyIGhvdXJzID0gTWF0aC50cnVuYyhkdC5vZmZzZXQgLyA2MCksXG4gICAgICAgICAgbWludXRlcyA9IE1hdGguYWJzKGR0Lm9mZnNldCAlIDYwKSxcbiAgICAgICAgICBzaWduID0gaG91cnMgPj0gMCA/ICcrJyA6ICctJyxcbiAgICAgICAgICBiYXNlID0gJycgKyBzaWduICsgTWF0aC5hYnMoaG91cnMpO1xuXG4gICAgICBzd2l0Y2ggKG9wdHMuZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgICAgICByZXR1cm4gJycgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyAnOicgKyBfdGhpcy5udW0obWludXRlcywgMik7XG4gICAgICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArICc6JyArIG1pbnV0ZXMgOiBiYXNlO1xuICAgICAgICBjYXNlICd0ZWNoaWUnOlxuICAgICAgICAgIHJldHVybiAnJyArIHNpZ24gKyBfdGhpcy5udW0oTWF0aC5hYnMoaG91cnMpLCAyKSArIF90aGlzLm51bShtaW51dGVzLCAyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVmFsdWUgZm9ybWF0ICcgKyBvcHRzLmZvcm1hdCArICcgaXMgb3V0IG9mIHJhbmdlIGZvciBwcm9wZXJ0eSBmb3JtYXQnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBtZXJpZGllbSA9IGZ1bmN0aW9uIG1lcmlkaWVtKCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIDogc3RyaW5nKHsgaG91cjogJ251bWVyaWMnLCBob3VyMTI6IHRydWUgfSwgJ2RheXBlcmlvZCcpO1xuICAgIH0sXG4gICAgICAgIG1vbnRoID0gZnVuY3Rpb24gbW9udGgobGVuZ3RoLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogJ251bWVyaWMnIH0sICdtb250aCcpO1xuICAgIH0sXG4gICAgICAgIHdlZWtkYXkgPSBmdW5jdGlvbiB3ZWVrZGF5KGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8geyB3ZWVrZGF5OiBsZW5ndGggfSA6IHsgd2Vla2RheTogbGVuZ3RoLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9LCAnd2Vla2RheScpO1xuICAgIH0sXG4gICAgICAgIG1heWJlTWFjcm8gPSBmdW5jdGlvbiBtYXliZU1hY3JvKHRva2VuKSB7XG4gICAgICB2YXIgbWFjcm8gPSB0b2tlblRvT2JqZWN0W3Rva2VuXTtcbiAgICAgIGlmIChtYWNybykge1xuICAgICAgICByZXR1cm4gX3RoaXMuZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG1hY3JvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBlcmEgPSBmdW5jdGlvbiBlcmEobGVuZ3RoKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gZXJhRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoeyBlcmE6IGxlbmd0aCB9LCAnZXJhJyk7XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcodG9rZW4pIHtcbiAgICAgIHZhciBvdXRwdXRDYWwgPSBfdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICAgIC8vIFdoZXJlIHBvc3NpYmxlOiBodHRwOi8vY2xkci51bmljb2RlLm9yZy90cmFuc2xhdGlvbi9kYXRlLXRpbWUjVE9DLVN0YW5kLUFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICBjYXNlICdTU1MnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWlsbGlzZWNvbmQsIDMpO1xuICAgICAgICAvLyBzZWNvbmRzXG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kLCAyKTtcbiAgICAgICAgLy8gbWludXRlc1xuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbnV0ZSk7XG4gICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbnV0ZSwgMik7XG4gICAgICAgIC8vIGhvdXJzXG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMiwgMik7XG4gICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91cik7XG4gICAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAvLyBvZmZzZXRcbiAgICAgICAgY2FzZSAnWic6XG4gICAgICAgICAgLy8gbGlrZSArNlxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoeyBmb3JtYXQ6ICduYXJyb3cnLCBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daIH0pO1xuICAgICAgICBjYXNlICdaWic6XG4gICAgICAgICAgLy8gbGlrZSArMDY6MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiAnc2hvcnQnLCBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daIH0pO1xuICAgICAgICBjYXNlICdaWlonOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiAndGVjaGllJywgYWxsb3daOiBmYWxzZSB9KTtcbiAgICAgICAgY2FzZSAnWlpaWic6XG4gICAgICAgICAgLy8gbGlrZSBFU1RcbiAgICAgICAgICByZXR1cm4gZHQub2Zmc2V0TmFtZVNob3J0O1xuICAgICAgICBjYXNlICdaWlpaWic6XG4gICAgICAgICAgLy8gbGlrZSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcbiAgICAgICAgICByZXR1cm4gZHQub2Zmc2V0TmFtZUxvbmc7XG4gICAgICAgIC8vIHpvbmVcbiAgICAgICAgY2FzZSAneic6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcbiAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgcmV0dXJuIG1lcmlkaWVtKCk7XG4gICAgICAgIC8vIGRhdGVzXG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBkYXk6ICdudW1lcmljJyB9LCAnZGF5JykgOiBfdGhpcy5udW0oZHQuZGF5KTtcbiAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBkYXk6ICcyLWRpZ2l0JyB9LCAnZGF5JykgOiBfdGhpcy5udW0oZHQuZGF5LCAyKTtcbiAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG4gICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla2RheSk7XG4gICAgICAgIGNhc2UgJ2NjYyc6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlcydcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnc2hvcnQnLCB0cnVlKTtcbiAgICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnbG9uZycsIHRydWUpO1xuICAgICAgICBjYXNlICdjY2NjYyc6XG4gICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnbmFycm93JywgdHJ1ZSk7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG4gICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla2RheSk7XG4gICAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlcydcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnc2hvcnQnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ0VFRUUnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ2xvbmcnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ0VFRUVFJzpcbiAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KCduYXJyb3cnLCBmYWxzZSk7XG4gICAgICAgIC8vIG1vbnRocyAtIHN0YW5kYWxvbmVcbiAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgY2FzZSAnTEwnOlxuICAgICAgICAgIC8vIGxpa2UgMDEsIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJ251bWVyaWMnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgY2FzZSAnTExMJzpcbiAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgIHJldHVybiBtb250aCgnc2hvcnQnLCB0cnVlKTtcbiAgICAgICAgY2FzZSAnTExMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKCdsb25nJywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ0xMTExMJzpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ25hcnJvdycsIHRydWUpO1xuICAgICAgICAvLyBtb250aHMgLSBmb3JtYXRcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IG1vbnRoOiAnbnVtZXJpYycgfSwgJ21vbnRoJykgOiBfdGhpcy5udW0oZHQubW9udGgpO1xuICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJzItZGlnaXQnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgY2FzZSAnTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgIHJldHVybiBtb250aCgnc2hvcnQnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ01NTU0nOlxuICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgIHJldHVybiBtb250aCgnbG9uZycsIGZhbHNlKTtcbiAgICAgICAgY2FzZSAnTU1NTU0nOlxuICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgIHJldHVybiBtb250aCgnbmFycm93JywgZmFsc2UpO1xuICAgICAgICAvLyB5ZWFyc1xuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAvLyBsaWtlIDIwMTRcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgeWVhcjogJ251bWVyaWMnIH0sICd5ZWFyJykgOiBfdGhpcy5udW0oZHQueWVhcik7XG4gICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAvLyBsaWtlIDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICcyLWRpZ2l0JyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIudG9TdHJpbmcoKS5zbGljZSgtMiksIDIpO1xuICAgICAgICBjYXNlICd5eXl5JzpcbiAgICAgICAgICAvLyBsaWtlIDAwMTJcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgeWVhcjogJ251bWVyaWMnIH0sICd5ZWFyJykgOiBfdGhpcy5udW0oZHQueWVhciwgNCk7XG4gICAgICAgIGNhc2UgJ3l5eXl5eSc6XG4gICAgICAgICAgLy8gbGlrZSAwMDAwMTJcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgeWVhcjogJ251bWVyaWMnIH0sICd5ZWFyJykgOiBfdGhpcy5udW0oZHQueWVhciwgNik7XG4gICAgICAgIC8vIGVyYXNcbiAgICAgICAgY2FzZSAnRyc6XG4gICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgIHJldHVybiBlcmEoJ3Nob3J0Jyk7XG4gICAgICAgIGNhc2UgJ0dHJzpcbiAgICAgICAgICAvLyBsaWtlIEFubm8gRG9taW5pXG4gICAgICAgICAgcmV0dXJuIGVyYSgnbG9uZycpO1xuICAgICAgICBjYXNlICdHR0dHRyc6XG4gICAgICAgICAgcmV0dXJuIGVyYSgnbmFycm93Jyk7XG4gICAgICAgIGNhc2UgJ2trJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgY2FzZSAna2trayc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhciwgNCk7XG4gICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla051bWJlcik7XG4gICAgICAgIGNhc2UgJ1dXJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwpO1xuICAgICAgICBjYXNlICdvb28nOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQub3JkaW5hbCwgMyk7XG4gICAgICAgIGNhc2UgJ3EnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlcik7XG4gICAgICAgIGNhc2UgJ3FxJzpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5xdWFydGVyLCAyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbWF5YmVNYWNybyh0b2tlbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nID0gZnVuY3Rpb24gZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgdG9rZW5Ub0ZpZWxkID0gZnVuY3Rpb24gdG9rZW5Ub0ZpZWxkKHRva2VuKSB7XG4gICAgICBzd2l0Y2ggKHRva2VuWzBdKSB7XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgIHJldHVybiAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgIHJldHVybiAnbWludXRlJztcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgcmV0dXJuICdob3VyJztcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgcmV0dXJuICdkYXknO1xuICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICB0b2tlblRvU3RyaW5nID0gZnVuY3Rpb24gdG9rZW5Ub1N0cmluZyhsaWxkdXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IHRva2VuVG9GaWVsZCh0b2tlbik7XG4gICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLFxuICAgICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAoZm91bmQsIF9yZWYyKSB7XG4gICAgICB2YXIgbGl0ZXJhbCA9IF9yZWYyLmxpdGVyYWwsXG4gICAgICAgICAgdmFsID0gX3JlZjIudmFsO1xuICAgICAgcmV0dXJuIGxpdGVyYWwgPyBmb3VuZCA6IGZvdW5kLmNvbmNhdCh2YWwpO1xuICAgIH0sIFtdKSxcbiAgICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8uYXBwbHkoZHVyLCByZWFsVG9rZW5zLm1hcCh0b2tlblRvRmllbGQpLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSkpO1xuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnModG9rZW5zLCB0b2tlblRvU3RyaW5nKGNvbGxhcHNlZCkpO1xuICB9O1xuXG4gIHJldHVybiBGb3JtYXR0ZXI7XG59KCk7XG5cbnZhciBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIGlmIChoYXNJbnRsKCkpIHtcbiAgICB2YXIgY29tcHV0ZWRTeXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTtcbiAgICAvLyBub2RlIHNvbWV0aW1lcyBkZWZhdWx0cyB0byBcInVuZFwiLiBPdmVycmlkZSB0aGF0IGJlY2F1c2UgdGhhdCBpcyBkdW1iXG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBjb21wdXRlZFN5cyA9PT0gJ3VuZCcgPyAnZW4tVVMnIDogY29tcHV0ZWRTeXM7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9IGVsc2Uge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gJ2VuLVVTJztcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKGhhc0ludGwoKSkge1xuICAgIGxvY2FsZSA9IEFycmF5LmlzQXJyYXkobG9jYWxlKSA/IGxvY2FsZSA6IFtsb2NhbGVdO1xuXG4gICAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgbG9jYWxlID0gbG9jYWxlLm1hcChmdW5jdGlvbiAobCkge1xuICAgICAgICBsICs9ICctdSc7XG5cbiAgICAgICAgaWYgKG91dHB1dENhbGVuZGFyKSB7XG4gICAgICAgICAgbCArPSAnLWNhLScgKyBvdXRwdXRDYWxlbmRhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgICAgICBsICs9ICctbnUtJyArIG51bWJlcmluZ1N5c3RlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBNb250aHMoZikge1xuICB2YXIgbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIHZhciBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCBpLCAxKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIG1hcFdlZWtkYXlzKGYpIHtcbiAgdmFyIG1zID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDc7IGkrKykge1xuICAgIHZhciBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICB2YXIgbW9kZSA9IGxvYy5saXN0aW5nTW9kZShkZWZhdWx0T0spO1xuXG4gIGlmIChtb2RlID09PSAnZXJyb3InKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2VuJykge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gJ2xhdG4nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2MubnVtYmVyaW5nU3lzdGVtID09PSAnbGF0bicgfHwgIWxvYy5sb2NhbGUgfHwgbG9jLmxvY2FsZS5zdGFydHNXaXRoKCdlbicpIHx8IGhhc0ludGwoKSAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09ICdsYXRuJztcbiAgfVxufVxuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNpbXBsZU51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2ltcGxlTnVtYmVyRm9ybWF0dGVyKTtcblxuICAgIHRoaXMucGFkVG8gPSBvcHRzLnBhZFRvIHx8IDA7XG4gICAgdGhpcy5yb3VuZCA9IG9wdHMucm91bmQgfHwgZmFsc2U7XG4gICAgdGhpcy5mbG9vciA9IG9wdHMuZmxvb3IgfHwgZmFsc2U7XG4gIH1cblxuICBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgLy8gdG8gbWF0Y2ggdGhlIGJyb3dzZXIncyBudW1iZXJmb3JtYXR0ZXIgZGVmYXVsdHNcbiAgICB2YXIgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgdGhpcy5yb3VuZCA/IDAgOiAzKTtcbiAgICByZXR1cm4gcGFkU3RhcnQoZml4ZWQsIHRoaXMucGFkVG8pO1xuICB9O1xuXG4gIHJldHVybiBTaW1wbGVOdW1iZXJGb3JtYXR0ZXI7XG59KCk7XG5cbnZhciBJbnRsTnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnRsTnVtYmVyRm9ybWF0dGVyKGludGwsIG9wdHMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRsTnVtYmVyRm9ybWF0dGVyKTtcblxuICAgIHZhciBpbnRsT3B0cyA9IHsgdXNlR3JvdXBpbmc6IGZhbHNlIH07XG5cbiAgICBpZiAob3B0cy5wYWRUbyA+IDApIHtcbiAgICAgIGludGxPcHRzLm1pbmltdW1JbnRlZ2VyRGlnaXRzID0gb3B0cy5wYWRUbztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yb3VuZCkge1xuICAgICAgaW50bE9wdHMubWF4aW11bUZyYWN0aW9uRGlnaXRzID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vcjtcbiAgICB0aGlzLmludGwgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgSW50bE51bWJlckZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KGkpIHtcbiAgICB2YXIgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IGk7XG4gICAgcmV0dXJuIHRoaXMuaW50bC5mb3JtYXQoZml4ZWQpO1xuICB9O1xuXG4gIHJldHVybiBJbnRsTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBQb2x5RGF0ZUZvcm1hdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9seURhdGVGb3JtYXR0ZXIoZHQsIGludGwsIG9wdHMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb2x5RGF0ZUZvcm1hdHRlcik7XG5cbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgIHRoaXMuaGFzSW50bCA9IGhhc0ludGwoKTtcblxuICAgIHZhciB6ID0gdm9pZCAwO1xuICAgIGlmIChkdC56b25lLnVuaXZlcnNhbCAmJiB0aGlzLmhhc0ludGwpIHtcbiAgICAgIC8vIENocm9taXVtIGRvZXNuJ3Qgc3VwcG9ydCBmaXhlZC1vZmZzZXQgem9uZXMgbGlrZSBFdGMvR01UKzggaW4gaXRzIGZvcm1hdHRlcixcbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNjQzNzQuXG4gICAgICAvLyBTbyB3ZSBoYXZlIHRvIG1ha2UgZG8uIFR3byBjYXNlczpcbiAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAvLyB3ZSBjYW4gZG8gaXMgZm9ybWF0IHRoZSBkYXRlIGluIFVUQy5cbiAgICAgIC8vIDIuIFRoZSBmb3JtYXQgb3B0aW9ucyBkb24ndCB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFRoZW4gd2UgY2FuIGFkanVzdCB0aGVtXG4gICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAvLyBhbmQgdGhlIGJhZCB6b25lIGRvZXNuJ3Qgc2hvdyB1cC5cbiAgICAgIC8vIFdlIGNhbiBjbGVhbiBhbGwgdGhpcyB1cCB3aGVuIENocm9tZSBmaXhlcyB0aGlzLlxuICAgICAgeiA9ICdVVEMnO1xuICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZHQuem9uZS50eXBlID09PSAnbG9jYWwnKSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIHogPSBkdC56b25lLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgdmFyIHJlYWxJbnRsT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG4gICAgICBpZiAoeikge1xuICAgICAgICByZWFsSW50bE9wdHMudGltZVpvbmUgPSB6O1xuICAgICAgfVxuICAgICAgdGhpcy5kdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChpbnRsLCByZWFsSW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIFBvbHlEYXRlRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdCh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdG9rZW5Gb3JtYXQgPSBmb3JtYXRTdHJpbmcodGhpcy5vcHRzKSxcbiAgICAgICAgICBsb2MgPSBMb2NhbGUuY3JlYXRlKCdlbi1VUycpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfTtcblxuICBQb2x5RGF0ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyA9IGZ1bmN0aW9uIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCAmJiBoYXNGb3JtYXRUb1BhcnRzKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMga2luZCBvZiBhIGNvcCBvdXQuIFdlIGFjdHVhbGx5IGNvdWxkIGRvIHRoaXMgZm9yIEVuZ2xpc2guIEhvd2V2ZXIsIHdlIGNvdWxkbid0IGRvIGl0IGZvciBpbnRsIHN0cmluZ3NcbiAgICAgIC8vIGFuZCBJTU8gaXQncyB0b28gd2VpcmQgdG8gaGF2ZSBhbiB1bmNhbm55IHZhbGxleSBsaWtlIHRoYXRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH07XG5cbiAgUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5oYXNJbnRsKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogJ2VuLVVTJyxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtOiAnbGF0bicsXG4gICAgICAgIG91dHB1dENhbGVuZGFyOiAnZ3JlZ29yeSdcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBQb2x5RGF0ZUZvcm1hdHRlcjtcbn0oKTtcblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgTG9jYWxlID0gZnVuY3Rpb24gKCkge1xuICBMb2NhbGUuZnJvbU9wdHMgPSBmdW5jdGlvbiBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfTtcblxuICBMb2NhbGUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikge1xuICAgIHZhciBkZWZhdWx0VG9FTiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgICB2YXIgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGUsXG5cbiAgICAvLyB0aGUgc3lzdGVtIGxvY2FsZSBpcyB1c2VmdWwgZm9yIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MgYnV0IGFubm95aW5nIGZvciBwYXJzaW5nL2Zvcm1hdHRpbmcga25vd24gZm9ybWF0c1xuICAgIGxvY2FsZVIgPSBzcGVjaWZpZWRMb2NhbGUgfHwgKGRlZmF1bHRUb0VOID8gJ2VuLVVTJyA6IHN5c3RlbUxvY2FsZSgpKSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtUiA9IG51bWJlcmluZ1N5c3RlbSB8fCBTZXR0aW5ncy5kZWZhdWx0TnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBvdXRwdXRDYWxlbmRhclIgPSBvdXRwdXRDYWxlbmRhciB8fCBTZXR0aW5ncy5kZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGUobG9jYWxlUiwgbnVtYmVyaW5nU3lzdGVtUiwgb3V0cHV0Q2FsZW5kYXJSLCBzcGVjaWZpZWRMb2NhbGUpO1xuICB9O1xuXG4gIExvY2FsZS5yZXNldENhY2hlID0gZnVuY3Rpb24gcmVzZXRDYWNoZSgpIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG4gIH07XG5cbiAgTG9jYWxlLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIExvY2FsZShsb2NhbGUsIG51bWJlcmluZywgb3V0cHV0Q2FsZW5kYXIsIHNwZWNpZmllZExvY2FsZSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvY2FsZSk7XG5cbiAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICB0aGlzLm51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZztcbiAgICB0aGlzLm91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXI7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRvZG86IGNhY2hlIG1lXG4gIExvY2FsZS5wcm90b3R5cGUubGlzdGluZ01vZGUgPSBmdW5jdGlvbiBsaXN0aW5nTW9kZSgpIHtcbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuXG4gICAgdmFyIGludGwgPSBoYXNJbnRsKCksXG4gICAgICAgIGhhc0ZUUCA9IGludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpLFxuICAgICAgICBpc0FjdHVhbGx5RW4gPSB0aGlzLmxvY2FsZSA9PT0gJ2VuJyB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSAnZW4tdXMnIHx8IGludGwgJiYgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmludGwpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZS5zdGFydHNXaXRoKCdlbi11cycpLFxuICAgICAgICBoYXNOb1dlaXJkbmVzcyA9ICh0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gbnVsbCB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gJ2xhdG4nKSAmJiAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSAnZ3JlZ29yeScpO1xuXG4gICAgaWYgKCFoYXNGVFAgJiYgIShpc0FjdHVhbGx5RW4gJiYgaGFzTm9XZWlyZG5lc3MpICYmICFkZWZhdWx0T0spIHtcbiAgICAgIHJldHVybiAnZXJyb3InO1xuICAgIH0gZWxzZSBpZiAoIWhhc0ZUUCB8fCBpc0FjdHVhbGx5RW4gJiYgaGFzTm9XZWlyZG5lc3MpIHtcbiAgICAgIHJldHVybiAnZW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ludGwnO1xuICAgIH1cbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoYWx0cykge1xuICAgIGlmICghYWx0cyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbHRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSwgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciwgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUucmVkZWZhdWx0VG9FTiA9IGZ1bmN0aW9uIHJlZGVmYXVsdFRvRU4oKSB7XG4gICAgdmFyIGFsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoT2JqZWN0LmFzc2lnbih7fSwgYWx0cywgeyBkZWZhdWx0VG9FTjogdHJ1ZSB9KSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5yZWRlZmF1bHRUb1N5c3RlbSA9IGZ1bmN0aW9uIHJlZGVmYXVsdFRvU3lzdGVtKCkge1xuICAgIHZhciBhbHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHsgZGVmYXVsdFRvRU46IGZhbHNlIH0pKTtcbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLm1vbnRocyA9IGZ1bmN0aW9uIG1vbnRocyQkMShsZW5ndGgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7IG1vbnRoOiBsZW5ndGgsIGRheTogJ251bWVyaWMnIH0gOiB7IG1vbnRoOiBsZW5ndGggfSxcbiAgICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJztcbiAgICAgIGlmICghX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIF90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcE1vbnRocyhmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuZXh0cmFjdChkdCwgaW50bCwgJ21vbnRoJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgZm9ybWF0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgd2Vla2RheXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8geyB3ZWVrZGF5OiBsZW5ndGgsIHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSA6IHsgd2Vla2RheTogbGVuZ3RoIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSc7XG4gICAgICBpZiAoIV90aGlzMi53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBXZWVrZGF5cyhmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmV4dHJhY3QoZHQsIGludGwsICd3ZWVrZGF5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzMi53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyQkMSgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBkZWZhdWx0T0sgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIHVuZGVmaW5lZCwgZGVmYXVsdE9LLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVyaWRpZW1zO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAvLyBmb3IgQU0gYW5kIFBNLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBtYWtlcyBwYXJzaW5nIHdheSBlYXNpZXIuXG4gICAgICBpZiAoIV90aGlzMy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgIHZhciBpbnRsID0geyBob3VyOiAnbnVtZXJpYycsIGhvdXIxMjogdHJ1ZSB9O1xuICAgICAgICBfdGhpczMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5leHRyYWN0KGR0LCBpbnRsLCAnZGF5cGVyaW9kJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMzLm1lcmlkaWVtQ2FjaGU7XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5lcmFzID0gZnVuY3Rpb24gZXJhcyQkMShsZW5ndGgpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBkZWZhdWx0T0sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBlcmFzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IHsgZXJhOiBsZW5ndGggfTtcblxuICAgICAgLy8gVGhpcyBpcyB1dHRlciBidWxsc2hpdC4gRGlmZmVyZW50IGNhbGVuZGFycyBhcmUgZ29pbmcgdG8gZGVmaW5lIGVyYXMgdG90YWxseSBkaWZmZXJlbnRseS4gV2hhdCBJIG5lZWQgaXMgdGhlIG1pbmltdW0gc2V0IG9mIGRhdGVzXG4gICAgICAvLyB0byBkZWZpbml0ZWx5IGVudW1lcmF0ZSB0aGVtLlxuICAgICAgaWYgKCFfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5leHRyYWN0KGR0LCBpbnRsLCAnZXJhJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5leHRyYWN0ID0gZnVuY3Rpb24gZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgdmFyIGRmID0gdGhpcy5kdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpLFxuICAgICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgICBtYXRjaGluZyA9IHJlc3VsdHMuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLm51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uIG51bWJlckZvcm1hdHRlcigpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICAvLyB0aGlzIGZvcmNlc2ltcGxlIG9wdGlvbiBpcyBuZXZlciB1c2VkICh0aGUgb25seSBjYWxsZXIgc2hvcnQtY2lyY3VpdHMgb24gaXQsIGJ1dCBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSlcbiAgICAvLyAoaW4gY29udHJhc3QsIHRoZSByZXN0IG9mIHRoZSBjb25kaXRpb24gaXMgdXNlZCBoZWF2aWx5KVxuICAgIGlmIChvcHRzLmZvcmNlU2ltcGxlIHx8IHRoaXMuZmFzdE51bWJlcnMgfHwgIWhhc0ludGwoKSkge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIob3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50bE51bWJlckZvcm1hdHRlcih0aGlzLmludGwsIG9wdHMpO1xuICAgIH1cbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLmR0Rm9ybWF0dGVyID0gZnVuY3Rpb24gZHRGb3JtYXR0ZXIoZHQpIHtcbiAgICB2YXIgaW50bE9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJiB0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gb3RoZXIubnVtYmVyaW5nU3lzdGVtICYmIHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG90aGVyLm91dHB1dENhbGVuZGFyO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKExvY2FsZSwgW3tcbiAgICBrZXk6ICdmYXN0TnVtYmVycycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPSBzdXBwb3J0c0Zhc3ROdW1iZXJzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIExvY2FsZTtcbn0oKTtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZWdleGVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVnZXhlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoZnVuY3Rpb24gKGYsIHIpIHtcbiAgICByZXR1cm4gZiArIHIuc291cmNlO1xuICB9LCAnJyk7XG4gIHJldHVybiBSZWdFeHAoJ14nICsgZnVsbCArICckJyk7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFeHRyYWN0b3JzKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGV4dHJhY3RvcnMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIGV4dHJhY3RvcnNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBleHRyYWN0b3JzLnJlZHVjZShmdW5jdGlvbiAoX3JlZiwgZXgpIHtcbiAgICAgIHZhciBtZXJnZWRWYWxzID0gX3JlZlswXSxcbiAgICAgICAgICBtZXJnZWRab25lID0gX3JlZlsxXSxcbiAgICAgICAgICBjdXJzb3IgPSBfcmVmWzJdO1xuXG4gICAgICB2YXIgX2V4ID0gZXgobSwgY3Vyc29yKSxcbiAgICAgICAgICB2YWwgPSBfZXhbMF0sXG4gICAgICAgICAgem9uZSA9IF9leFsxXSxcbiAgICAgICAgICBuZXh0ID0gX2V4WzJdO1xuXG4gICAgICByZXR1cm4gW09iamVjdC5hc3NpZ24obWVyZ2VkVmFscywgdmFsKSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICB9LCBbe30sIG51bGwsIDFdKS5zbGljZSgwLCAyKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2Uocykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcGF0dGVybnMgPSBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgcGF0dGVybnNbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gIH1cblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBwYXR0ZXJucywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjM7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYzID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmMyA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciBfcmVmMiA9IF9yZWYzO1xuICAgIHZhciByZWdleCA9IF9yZWYyWzBdO1xuICAgIHZhciBleHRyYWN0b3IgPSBfcmVmMlsxXTtcblxuICAgIHZhciBtID0gcmVnZXguZXhlYyhzKTtcbiAgICBpZiAobSkge1xuICAgICAgcmV0dXJuIGV4dHJhY3RvcihtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtudWxsLCBudWxsXTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlUGFyc2UoKSB7XG4gIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAga2V5c1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChtYXRjaCwgY3Vyc29yKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHZhciBpID0gdm9pZCAwO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldFtrZXlzW2ldXSA9IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG52YXIgb2Zmc2V0UmVnZXggPSAvKD86KFopfChbKy1dXFxkXFxkKSg/Ojo/KFxcZFxcZCkpPykvLFxuICAgIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsOX0pKT8pPyk/LyxcbiAgICBpc29UaW1lUmVnZXggPSBSZWdFeHAoJycgKyBpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZSArIG9mZnNldFJlZ2V4LnNvdXJjZSArICc/JyksXG4gICAgaXNvVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKCcoPzpUJyArIGlzb1RpbWVSZWdleC5zb3VyY2UgKyAnKT8nKSxcbiAgICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgICBpc29XZWVrUmVnZXggPSAvKFxcZHs0fSktP1coXFxkXFxkKS0/KFxcZCkvLFxuICAgIGlzb09yZGluYWxSZWdleCA9IC8oXFxkezR9KS0/KFxcZHszfSkvLFxuICAgIGV4dHJhY3RJU09XZWVrRGF0YSA9IHNpbXBsZVBhcnNlKCd3ZWVrWWVhcicsICd3ZWVrTnVtYmVyJywgJ3dlZWtEYXknKSxcbiAgICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZSgneWVhcicsICdvcmRpbmFsJyksXG4gICAgc3FsWW1kUmVnZXggPSAvKFxcZHs0fSktKFxcZFxcZCktKFxcZFxcZCkvLFxuICAgIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbnNxbFRpbWVSZWdleCA9IFJlZ0V4cChpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZSArICcgPyg/OicgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyAnfChbYS16QS1aX117MSwyNTZ9L1thLXpBLVpfXXsxLDI1Nn0pKT8nKSxcbiAgICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoJyg/OiAnICsgc3FsVGltZVJlZ2V4LnNvdXJjZSArICcpPycpO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPWW1kKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGl0ZW0gPSB7XG4gICAgeWVhcjogcGFyc2VJbnQobWF0Y2hbY3Vyc29yXSksXG4gICAgbW9udGg6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDFdKSB8fCAxLFxuICAgIGRheTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMl0pIHx8IDFcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIGhvdXI6IHBhcnNlSW50KG1hdGNoW2N1cnNvcl0pIHx8IDAsXG4gICAgbWludXRlOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAxXSkgfHwgMCxcbiAgICBzZWNvbmQ6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDJdKSB8fCAwLFxuICAgIG1pbGxpc2Vjb25kOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSlcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDRdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPT2Zmc2V0KG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgICAgZnVsbE9mZnNldCA9IHNpZ25lZE9mZnNldChtYXRjaFtjdXJzb3IgKyAxXSwgbWF0Y2hbY3Vyc29yICsgMl0pLFxuICAgICAgem9uZSA9IGxvY2FsID8gbnVsbCA6IEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShmdWxsT2Zmc2V0KTtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgM107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJQU5BWm9uZShtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciB6b25lID0gbWF0Y2hbY3Vyc29yXSA/IG5ldyBJQU5BWm9uZShtYXRjaFtjdXJzb3JdKSA6IG51bGw7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDFdO1xufVxuXG4vLyBJU08gZHVyYXRpb24gcGFyc2luZ1xuXG52YXIgaXNvRHVyYXRpb24gPSAvXlAoPzooPzooXFxkezEsOX0pWSk/KD86KFxcZHsxLDl9KU0pPyg/OihcXGR7MSw5fSlEKT8oPzpUKD86KFxcZHsxLDl9KUgpPyg/OihcXGR7MSw5fSlNKT8oPzooXFxkezEsOX0pKD86Wy4sXShcXGR7MSw5fSkpP1MpPyk/fChcXGR7MSw5fSlXKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgdmFyIHllYXJTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFszXSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzVdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbNl0sXG4gICAgICBtaWxsaXNlY29uZHNTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHdlZWtTdHIgPSBtYXRjaFs4XTtcblxuXG4gIHJldHVybiBbe1xuICAgIHllYXJzOiBwYXJzZUludCh5ZWFyU3RyKSxcbiAgICBtb250aHM6IHBhcnNlSW50KG1vbnRoU3RyKSxcbiAgICB3ZWVrczogcGFyc2VJbnQod2Vla1N0ciksXG4gICAgZGF5czogcGFyc2VJbnQoZGF5U3RyKSxcbiAgICBob3VyczogcGFyc2VJbnQoaG91clN0ciksXG4gICAgbWludXRlczogcGFyc2VJbnQobWludXRlU3RyKSxcbiAgICBzZWNvbmRzOiBwYXJzZUludChzZWNvbmRTdHIpLFxuICAgIG1pbGxpc2Vjb25kczogcGFyc2VNaWxsaXMobWlsbGlzZWNvbmRzU3RyKVxuICB9XTtcbn1cblxuLy8gVGhlc2UgYXJlIGEgbGl0dGxlIGJyYWluZGVhZC4gRURUICpzaG91bGQqIHRlbGwgdXMgdGhhdCB3ZSdyZSBpbiwgc2F5LCBBbWVyaWNhL05ld19Zb3JrXG4vLyBhbmQgbm90IGp1c3QgdGhhdCB3ZSdyZSBpbiAtMjQwICpyaWdodCBub3cqLiBCdXQgc2luY2UgSSBkb24ndCB0aGluayB0aGVzZSBhcmUgdXNlZCB0aGF0IG9mdGVuXG4vLyBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdFxudmFyIG9ic09mZnNldHMgPSB7XG4gIEdNVDogMCxcbiAgRURUOiAtNCAqIDYwLFxuICBFU1Q6IC01ICogNjAsXG4gIENEVDogLTUgKiA2MCxcbiAgQ1NUOiAtNiAqIDYwLFxuICBNRFQ6IC02ICogNjAsXG4gIE1TVDogLTcgKiA2MCxcbiAgUERUOiAtNyAqIDYwLFxuICBQU1Q6IC04ICogNjBcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgeWVhcjogeWVhclN0ci5sZW5ndGggPT09IDIgPyB1bnRydW5jYXRlWWVhcihwYXJzZUludCh5ZWFyU3RyKSkgOiBwYXJzZUludCh5ZWFyU3RyKSxcbiAgICBtb250aDogbW9udGhTdHIubGVuZ3RoID09PSAyID8gcGFyc2VJbnQobW9udGhTdHIsIDEwKSA6IG1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpICsgMSxcbiAgICBkYXk6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnQoaG91clN0ciksXG4gICAgbWludXRlOiBwYXJzZUludChtaW51dGVTdHIpXG4gIH07XG5cbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50KHNlY29uZFN0cik7XG4gIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgcmVzdWx0LndlZWtkYXkgPSB3ZWVrZGF5U3RyLmxlbmd0aCA+IDMgPyB3ZWVrZGF5c0xvbmcuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDEgOiB3ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUkZDIDI4MjIvNTMyMlxudmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLFxccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoPzooWystXVxcZFxcZCkoXFxkXFxkKSkpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMyODIyKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFsyXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbM10sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNV0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzddLFxuICAgICAgb2JzT2Zmc2V0ID0gbWF0Y2hbOF0sXG4gICAgICBtaWxPZmZzZXQgPSBtYXRjaFs5XSxcbiAgICAgIG9mZkhvdXJTdHIgPSBtYXRjaFsxMF0sXG4gICAgICBvZmZNaW51dGVTdHIgPSBtYXRjaFsxMV0sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cblxuICB2YXIgb2Zmc2V0ID0gdm9pZCAwO1xuICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICB9IGVsc2UgaWYgKG1pbE9mZnNldCkge1xuICAgIG9mZnNldCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cik7XG4gIH1cblxuICByZXR1cm4gW3Jlc3VsdCwgbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpXTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnRyaW0oKTtcbn1cblxuLy8gaHR0cCBkYXRlXG5cbnZhciByZmMxMTIzID0gL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICByZmM4NTAgPSAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICAgIGFzY2lpID0gL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFTQ0lJKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzJdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbM10sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs1XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzZdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzddLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuXG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VJU09EYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtjb21iaW5lUmVnZXhlcyhpc29ZbWRSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb1dlZWtSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1dlZWtEYXRhLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCldLCBbY29tYmluZVJlZ2V4ZXMoaXNvT3JkaW5hbFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPT3JkaW5hbERhdGEsIGV4dHJhY3RJU09UaW1lKV0sIFtjb21iaW5lUmVnZXhlcyhpc29UaW1lUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCldKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSRkMyODIyRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShwcmVwcm9jZXNzUkZDMjgyMihzKSwgW3JmYzI4MjIsIGV4dHJhY3RSRkMyODIyXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSFRUUERhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW2FzY2lpLCBleHRyYWN0QVNDSUldKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VJU09EdXJhdGlvbihzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvRHVyYXRpb24sIGV4dHJhY3RJU09EdXJhdGlvbl0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNRTChzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpXSwgW2NvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0LCBleHRyYWN0SUFOQVpvbmUpXSk7XG59XG5cbnZhciBJTlZBTElEID0gJ0ludmFsaWQgRHVyYXRpb24nLFxuICAgIFVOUEFSU0FCTEUgPSAndW5wYXJzYWJsZSc7XG5cbi8vIHVuaXQgY29udmVyc2lvbiBjb25zdGFudHNcbnZhciBsb3dPcmRlck1hdHJpeCA9IHtcbiAgd2Vla3M6IHtcbiAgICBkYXlzOiA3LFxuICAgIGhvdXJzOiA3ICogMjQsXG4gICAgbWludXRlczogNyAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogNyAqIDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIGRheXM6IHtcbiAgICBob3VyczogMjQsXG4gICAgbWludXRlczogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIGhvdXJzOiB7IG1pbnV0ZXM6IDYwLCBzZWNvbmRzOiA2MCAqIDYwLCBtaWxsaXNlY29uZHM6IDYwICogNjAgKiAxMDAwIH0sXG4gIG1pbnV0ZXM6IHsgc2Vjb25kczogNjAsIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwIH0sXG4gIHNlY29uZHM6IHsgbWlsbGlzZWNvbmRzOiAxMDAwIH1cbn0sXG4gICAgY2FzdWFsTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogNTIsXG4gICAgZGF5czogMzY1LFxuICAgIGhvdXJzOiAzNjUgKiAyNCxcbiAgICBtaW51dGVzOiAzNjUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgcXVhcnRlcnM6IHtcbiAgICBtb250aHM6IDMsXG4gICAgd2Vla3M6IDEzLFxuICAgIGRheXM6IDkxLFxuICAgIGhvdXJzOiA5MSAqIDI0LFxuICAgIG1pbnV0ZXM6IDkxICogMjQgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IDkxICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogNCxcbiAgICBkYXlzOiAzMCxcbiAgICBob3VyczogMzAgKiAyNCxcbiAgICBtaW51dGVzOiAzMCAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxufSwgbG93T3JkZXJNYXRyaXgpLFxuICAgIGRheXNJblllYXJBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDAwLFxuICAgIGRheXNJbk1vbnRoQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQ4MDAsXG4gICAgYWNjdXJhdGVNYXRyaXggPSBPYmplY3QuYXNzaWduKHtcbiAgeWVhcnM6IHtcbiAgICBtb250aHM6IDEyLFxuICAgIHdlZWtzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA3LFxuICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQsXG4gICAgbWludXRlczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyAyOCxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA0LFxuICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAvIDQsXG4gICAgbWludXRlczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAvIDQsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwIC8gNCxcbiAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDAgLyA0XG4gIH0sXG4gIG1vbnRoczoge1xuICAgIHdlZWtzOiBkYXlzSW5Nb250aEFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5Nb250aEFjY3VyYXRlLFxuICAgIGhvdXJzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQsXG4gICAgbWludXRlczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCxcbiAgICBtaWxsaXNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KTtcblxuLy8gdW5pdHMgb3JkZXJlZCBieSBzaXplXG52YXIgb3JkZXJlZFVuaXRzID0gWyd5ZWFycycsICdxdWFydGVycycsICdtb250aHMnLCAnd2Vla3MnLCAnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnLCAnbWlsbGlzZWNvbmRzJ107XG5cbnZhciByZXZlcnNlVW5pdHMgPSBvcmRlcmVkVW5pdHMuc2xpY2UoMCkucmV2ZXJzZSgpO1xuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMgXCJjcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBqdXN0IGxpa2UgdGhpcyBvbmUsIGJ1dCB3aXRoIHRoZXNlIGNoYW5nZXNcIlxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzKSB7XG4gIHZhciBjbGVhciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgLy8gZGVlcCBtZXJnZSBmb3IgdmFsc1xuICB2YXIgY29uZiA9IHtcbiAgICB2YWx1ZXM6IGNsZWFyID8gYWx0cy52YWx1ZXMgOiBPYmplY3QuYXNzaWduKHt9LCBkdXIudmFsdWVzLCBhbHRzLnZhbHVlcyB8fCB7fSksXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3lcbiAgfTtcbiAgcmV0dXJuIG5ldyBEdXJhdGlvbihjb25mKTtcbn1cblxuLy8gc29tZSBmdW5jdGlvbnMgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGEgZHVyYXRpb24sIHNvIGNvbWJpbmVkIHdpdGhcbi8vIG5vcm1hbGl6ZSgpIHRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIGR1cmF0aW9uIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlXG5mdW5jdGlvbiBpc0hpZ2hPcmRlck5lZ2F0aXZlKG9iaikge1xuICAvLyBvbmx5IHJ1bGUgaXMgdGhhdCB0aGUgaGlnaGVzdC1vcmRlciBwYXJ0IG11c3QgYmUgbm9uLW5lZ2F0aXZlXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IG9yZGVyZWRVbml0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciBrID0gX3JlZjtcblxuICAgIGlmIChvYmpba10pIHJldHVybiBvYmpba10gPCAwO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIHZhciBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgICAgYWRkZWQgPSBNYXRoLmZsb29yKGZyb21NYXBbZnJvbVVuaXRdIC8gY29udik7XG4gIHRvTWFwW3RvVW5pdF0gKz0gYWRkZWQ7XG4gIGZyb21NYXBbZnJvbVVuaXRdIC09IGFkZGVkICogY29udjtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWVzKG1hdHJpeCwgdmFscykge1xuICByZXZlcnNlVW5pdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2aW91cywgY3VycmVudCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodmFsc1tjdXJyZW50XSkpIHtcbiAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICBjb252ZXJ0KG1hdHJpeCwgdmFscywgcHJldmlvdXMsIHZhbHMsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG4gIH0sIG51bGwpO1xufVxuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5mdW5jdGlvbiBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gIGlmIChpc051bWJlcihkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhkdXJhdGlvbik7XG4gIH0gZWxzZSBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBEdXJhdGlvbikge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfSBlbHNlIGlmIChkdXJhdGlvbiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Vua25vd24gZHVyYXRpb24gYXJndW1lbnQnKTtcbiAgfVxufVxuXG4vKipcclxuICogQSBEdXJhdGlvbiBvYmplY3QgcmVwcmVzZW50cyBhIHBlcmlvZCBvZiB0aW1lLCBsaWtlIFwiMiBtb250aHNcIiBvciBcIjEgZGF5LCAxIGhvdXJcIi4gQ29uY2VwdHVhbGx5LCBpdCdzIGp1c3QgYSBtYXAgb2YgdW5pdHMgdG8gdGhlaXIgcXVhbnRpdGllcywgYWNjb21wYW5pZWQgYnkgc29tZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gYW5kIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uIFRoZXkgY2FuIGJlIHVzZWQgb24gdGhlaXIgb3duIG9yIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgTHV4b24gdHlwZXM7IGZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB7QGxpbmsgRGF0ZVRpbWUucGx1c30gdG8gYWRkIGEgRHVyYXRpb24gb2JqZWN0IHRvIGEgRGF0ZVRpbWUsIHByb2R1Y2luZyBhbm90aGVyIERhdGVUaW1lLlxyXG4gKlxyXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIER1cmF0aW9uOlxyXG4gKlxyXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbi5mcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uLmZyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT30uXHJcbiAqICogKipVbml0IHZhbHVlcyoqIFNlZSB0aGUge0BsaW5rIHllYXJzfSwge0BsaW5rIG1vbnRoc30sIHtAbGluayB3ZWVrc30sIHtAbGluayBkYXlzfSwge0BsaW5rIGhvdXJzfSwge0BsaW5rIG1pbnV0ZXN9LCB7QGxpbmsgc2Vjb25kc30sIHtAbGluayBtaWxsaXNlY29uZHN9IGFjY2Vzc29ycy5cclxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgIHtAbGluayBsb2NhbGV9IGFuZCB7QGxpbmsgbnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIHBsdXN9LCB7QGxpbmsgbWludXN9LCB7QGxpbmsgbm9ybWFsaXplfSwge0BsaW5rIHNldH0sIHtAbGluayByZWNvbmZpZ3VyZX0sIHtAbGluayBzaGlmdFRvfSwgYW5kIHtAbGluayBuZWdhdGV9LlxyXG4gKiAqICoqT3V0cHV0KiogVG8gY29udmVydCB0aGUgRHVyYXRpb24gaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgYXN9LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvSlNPTn1cclxuICpcclxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxyXG4gKi9cblxudmFyIER1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBEdXJhdGlvbihjb25maWcpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEdXJhdGlvbik7XG5cbiAgICB2YXIgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSAnbG9uZ3Rlcm0nIHx8IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMuY29udmVyc2lvbkFjY3VyYWN5ID0gYWNjdXJhdGUgPyAnbG9uZ3Rlcm0nIDogJ2Nhc3VhbCc7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkUmVhc29uIHx8IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgfVxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgb2YgbWlsbGlzZWNvbmRzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KE9iamVjdC5hc3NpZ24oeyBtaWxsaXNlY29uZHM6IGNvdW50IH0sIG9wdHMpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzLiBcclxuICAgKiBJZiB0aGlzIG9iamVjdCBpcyBlbXB0eSB0aGVuIHplcm8gIG1pbGxpc2Vjb25kcyBkdXJhdGlvbiBpcyByZXR1cm5lZC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5xdWFydGVyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5c1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZXNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZHNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmopKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgIHZhbHVlczogbm9ybWFsaXplT2JqZWN0KG9iaiwgRHVyYXRpb24ubm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGFuIElTTyA4NjAxIGR1cmF0aW9uIHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNNERUMTJIMzBNNVMnKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogMywgbW9udGhzOiA2LCBkYXk6IDQsIGhvdXJzOiAxMiwgbWludXRlczogMzAsIHNlY29uZHM6IDUgfVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1BUMjNIJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDIzIH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08odGV4dCwgb3B0cykge1xuICAgIHZhciBfcGFyc2VJU09EdXJhdGlvbiA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCksXG4gICAgICAgIHBhcnNlZCA9IF9wYXJzZUlTT0R1cmF0aW9uWzBdO1xuXG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgdmFyIG9iaiA9IE9iamVjdC5hc3NpZ24ocGFyc2VkLCBvcHRzKTtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKFVOUEFSU0FCTEUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gcmVhc29uIHRoaXMgaXMgaW52YWxpZFxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEdXJhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREdXJhdGlvbkVycm9yKHJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkUmVhc29uOiByZWFzb24gfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5ub3JtYWxpemVVbml0ID0gZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gICAgdmFyIGlnbm9yZVVua25vd24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiAneWVhcnMnLFxuICAgICAgeWVhcnM6ICd5ZWFycycsXG4gICAgICBxdWFydGVyOiAncXVhcnRlcnMnLFxuICAgICAgcXVhcnRlcnM6ICdxdWFydGVycycsXG4gICAgICBtb250aDogJ21vbnRocycsXG4gICAgICBtb250aHM6ICdtb250aHMnLFxuICAgICAgd2VlazogJ3dlZWtzJyxcbiAgICAgIHdlZWtzOiAnd2Vla3MnLFxuICAgICAgZGF5OiAnZGF5cycsXG4gICAgICBkYXlzOiAnZGF5cycsXG4gICAgICBob3VyOiAnaG91cnMnLFxuICAgICAgaG91cnM6ICdob3VycycsXG4gICAgICBtaW51dGU6ICdtaW51dGVzJyxcbiAgICAgIG1pbnV0ZXM6ICdtaW51dGVzJyxcbiAgICAgIHNlY29uZDogJ3NlY29uZHMnLFxuICAgICAgc2Vjb25kczogJ3NlY29uZHMnLFxuICAgICAgbWlsbGlzZWNvbmQ6ICdtaWxsaXNlY29uZHMnLFxuICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzJ1xuICAgIH1bdW5pdCA/IHVuaXQudG9Mb3dlckNhc2UoKSA6IHVuaXRdO1xuXG4gICAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIEdldCAgdGhlIGxvY2FsZSBvZiBhIER1cmF0aW9uLCBzdWNoICdlbi1HQidcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuICBEdXJhdGlvbi5wcm90b3R5cGUudG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAvLyByZXZlcnNlLWNvbXBhdCBzaW5jZSAxLjI7IHdlIGFsd2F5cyByb3VuZCBkb3duIG5vdywgbmV2ZXIgdXAsIGFuZCB3ZSBkbyBpdCBieSBkZWZhdWx0LiBTbzpcbiAgICAvLyAxLiBhbHdheXMgdHVybiBvZmYgcm91bmRpbmcgaW4gdGhlIHVuZGVybHlpbmcgZm9ybWF0dGVyXG4gICAgLy8gMi4gdHVybiBvZmYgZmxvb3JpbmcgaWYgZWl0aGVyIHJvdW5kaW5nIGlzIHR1cm5lZCBvZmYgb3IgZmxvb3JpbmcgaXMgdHVybmVkIG9mZiwgb3RoZXJ3aXNlIGxlYXZlIGl0IG9uXG4gICAgdmFyIGZtdE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzLCB7IGZsb29yOiB0cnVlLCByb3VuZDogZmFsc2UgfSk7XG4gICAgaWYgKG9wdHMucm91bmQgPT09IGZhbHNlIHx8IG9wdHMuZmxvb3IgPT09IGZhbHNlKSB7XG4gICAgICBmbXRPcHRzLmZsb29yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MsIGZtdE9wdHMpLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRDtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIER1cmF0aW9uJ3MgdmFsdWVzLlxyXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmFsdWVzKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2UuY29udmVyc2lvbkFjY3VyYWN5ID0gdGhpcy5jb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMywgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQM1lUNDVTJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDQsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDRNVDQ1UydcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaW51dGVzOiA1IH0pLnRvSVNPKCkgLy89PiAnUFQ1TSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiA2IH0pLnRvSVNPKCkgLy89PiAnUFQwLjAwNlMnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvSVNPID0gZnVuY3Rpb24gdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBzID0gJ1AnLFxuICAgICAgICBub3JtID0gdGhpcy5ub3JtYWxpemUoKTtcblxuICAgIC8vIElTTyBkdXJhdGlvbnMgYXJlIGFsd2F5cyBwb3NpdGl2ZSwgc28gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICBub3JtID0gaXNIaWdoT3JkZXJOZWdhdGl2ZShub3JtLnZhbHVlcykgPyBub3JtLm5lZ2F0ZSgpIDogbm9ybTtcblxuICAgIGlmIChub3JtLnllYXJzID4gMCkgcyArPSBub3JtLnllYXJzICsgJ1knO1xuICAgIGlmIChub3JtLm1vbnRocyA+IDAgfHwgbm9ybS5xdWFydGVycyA+IDApIHMgKz0gbm9ybS5tb250aHMgKyBub3JtLnF1YXJ0ZXJzICogMyArICdNJztcbiAgICBpZiAobm9ybS5kYXlzID4gMCB8fCBub3JtLndlZWtzID4gMCkgcyArPSBub3JtLmRheXMgKyBub3JtLndlZWtzICogNyArICdEJztcbiAgICBpZiAobm9ybS5ob3VycyA+IDAgfHwgbm9ybS5taW51dGVzID4gMCB8fCBub3JtLnNlY29uZHMgPiAwIHx8IG5vcm0ubWlsbGlzZWNvbmRzID4gMCkgcyArPSAnVCc7XG4gICAgaWYgKG5vcm0uaG91cnMgPiAwKSBzICs9IG5vcm0uaG91cnMgKyAnSCc7XG4gICAgaWYgKG5vcm0ubWludXRlcyA+IDApIHMgKz0gbm9ybS5taW51dGVzICsgJ00nO1xuICAgIGlmIChub3JtLnNlY29uZHMgPiAwIHx8IG5vcm0ubWlsbGlzZWNvbmRzID4gMCkgcyArPSBub3JtLnNlY29uZHMgKyBub3JtLm1pbGxpc2Vjb25kcyAvIDEwMDAgKyAnUyc7XG4gICAgcmV0dXJuIHM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBtaWxsaXNlY29uZHMgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoJ21pbGxpc2Vjb25kcycpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHZhciB2YWxzSW5zcGVjdCA9IEpTT04uc3RyaW5naWZ5KHRoaXMudG9PYmplY3QoKSk7XG4gICAgICByZXR1cm4gJ0R1cmF0aW9uIHtcXG4gIHZhbHVlczogJyArIHZhbHNJbnNwZWN0ICsgJyxcXG4gIGxvY2FsZTogJyArIHRoaXMubG9jYWxlICsgJyxcXG4gIGNvbnZlcnNpb25BY2N1cmFjeTogJyArIHRoaXMuY29udmVyc2lvbkFjY3VyYWN5ICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdEdXJhdGlvbiB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gb3JkZXJlZFVuaXRzLCBfaXNBcnJheTIgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvcjIpLCBfaTIgPSAwLCBfaXRlcmF0b3IyID0gX2lzQXJyYXkyID8gX2l0ZXJhdG9yMiA6IF9pdGVyYXRvcjJbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMjtcblxuICAgICAgaWYgKF9pc0FycmF5Mikge1xuICAgICAgICBpZiAoX2kyID49IF9pdGVyYXRvcjIubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjIgPSBfaXRlcmF0b3IyW19pMisrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pMiA9IF9pdGVyYXRvcjIubmV4dCgpO1xuICAgICAgICBpZiAoX2kyLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMiA9IF9pMi52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGsgPSBfcmVmMjtcblxuICAgICAgdmFyIHZhbCA9IGR1ci5nZXQoaykgKyB0aGlzLmdldChrKTtcbiAgICAgIGlmICh2YWwgIT09IDApIHtcbiAgICAgICAgcmVzdWx0W2tdID0gdmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogcmVzdWx0IH0sIHRydWUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBzaG9ydGVyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkueWVhcnMgLy89PiAyXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5tb250aHMgLy89PiAwXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5kYXlzIC8vPT4gM1xyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQkJDEodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQgdW5pdHMuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xyXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyB5ZWFyczogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyBob3VyczogOCwgbWludXRlczogMzAgfSlcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQkJDEodmFsdWVzKSB7XG4gICAgdmFyIG1peGVkID0gT2JqZWN0LmFzc2lnbih0aGlzLnZhbHVlcywgbm9ybWFsaXplT2JqZWN0KHZhbHVlcywgRHVyYXRpb24ubm9ybWFsaXplVW5pdCkpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogbWl4ZWQgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlIGFuZC9vciBudW1iZXJpbmdTeXN0ZW0uICBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZSgpIHtcbiAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBsb2NhbGUgPSBfcmVmMy5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgY29udmVyc2lvbkFjY3VyYWN5ID0gX3JlZjMuY29udmVyc2lvbkFjY3VyYWN5O1xuXG4gICAgdmFyIGxvYyA9IHRoaXMubG9jLmNsb25lKHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtIH0pLFxuICAgICAgICBvcHRzID0geyBsb2M6IGxvYyB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlcycgb3IgJ2RheXMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe2hvdXJzOiA2MH0pLmFzKCdkYXlzJykgLy89PiAyLjVcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuYXMgPSBmdW5jdGlvbiBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmVkdWNlIHRoaXMgRHVyYXRpb24gdG8gaXRzIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBpbiBpdHMgY3VycmVudCB1bml0cy5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDIsIGRheXM6IDUwMDAgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDE1LCBkYXlzOiAyNTUgfVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTIsIG1pbnV0ZXM6IC00NSB9KS5ub3JtYWxpemUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMTEsIG1pbnV0ZXM6IDE1IH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIG5lZyA9IGlzSGlnaE9yZGVyTmVnYXRpdmUodGhpcy52YWx1ZXMpLFxuICAgICAgICB2YWxzID0gKG5lZyA/IHRoaXMubmVnYXRlKCkgOiB0aGlzKS50b09iamVjdCgpO1xuICAgIG5vcm1hbGl6ZVZhbHVlcyh0aGlzLm1hdHJpeCwgdmFscyk7XG4gICAgdmFyIGR1ciA9IER1cmF0aW9uLmZyb21PYmplY3QodmFscyk7XG4gICAgcmV0dXJuIG5lZyA/IGR1ci5uZWdhdGUoKSA6IGR1cjtcbiAgfTtcblxuICAvKipcclxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuc2hpZnRUbyA9IGZ1bmN0aW9uIHNoaWZ0VG8oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHVuaXRzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICB1bml0c1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1bml0cyA9IHVuaXRzLm1hcChmdW5jdGlvbiAodSkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodSk7XG4gICAgfSk7XG5cbiAgICB2YXIgYnVpbHQgPSB7fSxcbiAgICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgICAgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICB2YXIgbGFzdFVuaXQgPSB2b2lkIDA7XG5cbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IG9yZGVyZWRVbml0cywgX2lzQXJyYXkzID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IzKSwgX2kzID0gMCwgX2l0ZXJhdG9yMyA9IF9pc0FycmF5MyA/IF9pdGVyYXRvcjMgOiBfaXRlcmF0b3IzW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjQ7XG5cbiAgICAgIGlmIChfaXNBcnJheTMpIHtcbiAgICAgICAgaWYgKF9pMyA+PSBfaXRlcmF0b3IzLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWY0ID0gX2l0ZXJhdG9yM1tfaTMrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTMgPSBfaXRlcmF0b3IzLm5leHQoKTtcbiAgICAgICAgaWYgKF9pMy5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjQgPSBfaTMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrID0gX3JlZjQ7XG5cbiAgICAgIGlmICh1bml0cy5pbmRleE9mKGspID49IDApIHtcbiAgICAgICAgbGFzdFVuaXQgPSBrO1xuXG4gICAgICAgIHZhciBvd24gPSAwO1xuXG4gICAgICAgIC8vIGFueXRoaW5nIHdlIGhhdmVuJ3QgYm9pbGVkIGRvd24geWV0IHNob3VsZCBnZXQgYm9pbGVkIHRvIHRoaXMgdW5pdFxuICAgICAgICBmb3IgKHZhciBhayBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlZC5oYXNPd25Qcm9wZXJ0eShhaykpIHtcbiAgICAgICAgICAgIG93biArPSB0aGlzLm1hdHJpeFtha11ba10gKiBhY2N1bXVsYXRlZFtha107XG4gICAgICAgICAgICBhY2N1bXVsYXRlZFtha10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgaW4gdGhpcyB1bml0XG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSBvd24gLSBpO1xuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgZnVydGhlciBkb3duIHRoZSBjaGFpbiB0aGF0IHNob3VsZCBiZSByb2xsZWQgdXAgaW4gdG8gdGhpc1xuICAgICAgICBmb3IgKHZhciBkb3duIGluIHZhbHMpIHtcbiAgICAgICAgICBpZiAob3JkZXJlZFVuaXRzLmluZGV4T2YoZG93bikgPiBvcmRlcmVkVW5pdHMuaW5kZXhPZihrKSkge1xuICAgICAgICAgICAgY29udmVydCh0aGlzLm1hdHJpeCwgdmFscywgZG93biwgYnVpbHQsIGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UsIGtlZXAgaXQgaW4gdGhlIHdpbmdzIHRvIGJvaWwgaXQgbGF0ZXJcbiAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSB2YWxzW2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFueXRoaW5nIGxlZnRvdmVyIGJlY29tZXMgdGhlIGRlY2ltYWwgZm9yIHRoZSBsYXN0IHVuaXRcbiAgICBpZiAobGFzdFVuaXQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlZFtrZXldID4gMCkge1xuICAgICAgICAgICAgYnVpbHRbbGFzdFVuaXRdICs9IGtleSA9PT0gbGFzdFVuaXQgPyBhY2N1bXVsYXRlZFtrZXldIDogYWNjdW11bGF0ZWRba2V5XSAvIHRoaXMubWF0cml4W2xhc3RVbml0XVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IGJ1aWx0IH0sIHRydWUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLm5lZ2F0ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAtMSwgc2Vjb25kczogLTMwIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBuZWdhdGVkID0ge307XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSwgX2lzQXJyYXk0ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3I0KSwgX2k0ID0gMCwgX2l0ZXJhdG9yNCA9IF9pc0FycmF5NCA/IF9pdGVyYXRvcjQgOiBfaXRlcmF0b3I0W1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjU7XG5cbiAgICAgIGlmIChfaXNBcnJheTQpIHtcbiAgICAgICAgaWYgKF9pNCA+PSBfaXRlcmF0b3I0Lmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWY1ID0gX2l0ZXJhdG9yNFtfaTQrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTQgPSBfaXRlcmF0b3I0Lm5leHQoKTtcbiAgICAgICAgaWYgKF9pNC5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjUgPSBfaTQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrID0gX3JlZjU7XG5cbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogbmVnYXRlZCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBHZXQgdGhlIHllYXJzLlxyXG4gICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cbiAgRHVyYXRpb24ucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlci5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5NSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yNSksIF9pNSA9IDAsIF9pdGVyYXRvcjUgPSBfaXNBcnJheTUgPyBfaXRlcmF0b3I1IDogX2l0ZXJhdG9yNVtTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY2O1xuXG4gICAgICBpZiAoX2lzQXJyYXk1KSB7XG4gICAgICAgIGlmIChfaTUgPj0gX2l0ZXJhdG9yNS5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNiA9IF9pdGVyYXRvcjVbX2k1KytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2k1ID0gX2l0ZXJhdG9yNS5uZXh0KCk7XG4gICAgICAgIGlmIChfaTUuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY2ID0gX2k1LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWY2O1xuXG4gICAgICBpZiAodGhpcy52YWx1ZXNbdV0gIT09IG90aGVyLnZhbHVlc1t1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKER1cmF0aW9uLCBbe1xuICAgIGtleTogJ2xvY2FsZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIER1cmF0aW9uLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIER1cmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdudW1iZXJpbmdTeXN0ZW0nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAneWVhcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHF1YXJ0ZXJzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdxdWFydGVycycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbW9udGhzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aHMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrc1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd3ZWVrcycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5cy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGF5cycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBob3Vycy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaG91cnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbnV0ZXMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ21pbnV0ZXMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdzZWNvbmRzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaWxsaXNlY29uZHMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEdXJhdGlvbiBpcyBpbnZhbGlkLiBJbnZhbGlkIGR1cmF0aW9ucyBhcmUgcmV0dXJuZWQgYnkgZGlmZiBvcGVyYXRpb25zXHJcbiAgICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbiA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaW52YWxpZFJlYXNvbicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRHVyYXRpb247XG59KCk7XG5cbnZhciBJTlZBTElEJDEgPSAnSW52YWxpZCBJbnRlcnZhbCc7XG5cbi8vIGNoZWNrcyBpZiB0aGUgc3RhcnQgaXMgZXF1YWwgdG8gb3IgYmVmb3JlIHRoZSBlbmRcbmZ1bmN0aW9uIHZhbGlkYXRlU3RhcnRFbmQoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gISFzdGFydCAmJiAhIWVuZCAmJiBzdGFydC5pc1ZhbGlkICYmIGVuZC5pc1ZhbGlkICYmIHN0YXJ0IDw9IGVuZDtcbn1cblxuLyoqXHJcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBJbnRlcnZhbDpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGFuIEludGVydmFsLCB1c2Uge0BsaW5rIGZyb21EYXRlVGltZXN9LCB7QGxpbmsgYWZ0ZXJ9LCB7QGxpbmsgYmVmb3JlfSwgb3Ige0BsaW5rIGZyb21JU099LlxyXG4gKiAqICoqQWNjZXNzb3JzKiogVXNlIHtAbGluayBzdGFydH0gYW5kIHtAbGluayBlbmR9IHRvIGdldCB0aGUgc3RhcnQgYW5kIGVuZC5cclxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBjb3VudH0sIHtAbGluayBsZW5ndGh9LCB7QGxpbmsgaGFzU2FtZX0sIHtAbGluayBjb250YWluc30sIHtAbGluayBpc0FmdGVyfSwgb3Ige0BsaW5rIGlzQmVmb3JlfS5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG90aGVyIEludGVydmFscyBvdXQgb2YgdGhpcyBvbmUsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHNwbGl0QXR9LCB7QGxpbmsgc3BsaXRCeX0sIHtAbGluayBkaXZpZGVFcXVhbGx5fSwge0BsaW5rIG1lcmdlfSwge0BsaW5rIHhvcn0sIHtAbGluayB1bmlvbn0sIHtAbGluayBpbnRlcnNlY3Rpb259LCBvciB7QGxpbmsgZGlmZmVyZW5jZX0uXHJcbiAqICogKipDb21wYXJpc29uKiogVG8gY29tcGFyZSB0aGlzIEludGVydmFsIHRvIGFub3RoZXIgb25lLCB1c2Uge0BsaW5rIGVxdWFsc30sIHtAbGluayBvdmVybGFwc30sIHtAbGluayBhYnV0c1N0YXJ0fSwge0BsaW5rIGFidXRzRW5kfSwge0BsaW5rIGVuZ3VsZnN9XHJcbiAqICogKipPdXRwdXQqKiogVG8gY29udmVydCB0aGUgSW50ZXJ2YWwgaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LlxyXG4gKi9cblxudmFyIEludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnZhbChjb25maWcpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRlcnZhbCk7XG5cbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5zID0gY29uZmlnLnN0YXJ0O1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5pbnZhbGlkID0gZnVuY3Rpb24gaW52YWxpZChyZWFzb24pIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCduZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIERhdGVUaW1lIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEludGVydmFsRXJyb3IocmVhc29uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7IGludmFsaWRSZWFzb246IHJlYXNvbiB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyA9IGZ1bmN0aW9uIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIHZhciBidWlsdFN0YXJ0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCksXG4gICAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICBzdGFydDogYnVpbHRTdGFydCxcbiAgICAgIGVuZDogYnVpbHRFbmQsXG4gICAgICBpbnZhbGlkUmVhc29uOiB2YWxpZGF0ZVN0YXJ0RW5kKGJ1aWx0U3RhcnQsIGJ1aWx0RW5kKSA/IG51bGwgOiAnaW52YWxpZCBlbmRwb2ludHMnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5hZnRlciA9IGZ1bmN0aW9uIGFmdGVyKHN0YXJ0LCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdCwgZHQucGx1cyhkdXIpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBlbmQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIGJhY2t3YXJkcyB0by5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5iZWZvcmUgPSBmdW5jdGlvbiBiZWZvcmUoZW5kLCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKGVuZCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQubWludXMoZHVyKSwgZHQpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBwYXNzIHtAc2VlIERhdGVUaW1lLmZyb21JU099XHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyhzdHJpbmcsIG9wdHMpIHtcbiAgICBpZiAoc3RyaW5nKSB7XG4gICAgICB2YXIgX3N0cmluZyRzcGxpdCA9IHN0cmluZy5zcGxpdCgvXFwvLyksXG4gICAgICAgICAgcyA9IF9zdHJpbmckc3BsaXRbMF0sXG4gICAgICAgICAgZSA9IF9zdHJpbmckc3BsaXRbMV07XG5cbiAgICAgIGlmIChzICYmIGUpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoRGF0ZVRpbWUuZnJvbUlTTyhzLCBvcHRzKSwgRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKCdpbnZhbGlkIElTTyBmb3JtYXQnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgSW50ZXJ2YWxcclxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byByZXR1cm4gdGhlIGxlbmd0aCBpbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG4gIEludGVydmFsLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgoKSB7XG4gICAgdmFyIHVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdtaWxsaXNlY29uZHMnO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9EdXJhdGlvbi5hcHBseSh0aGlzLCBbdW5pdF0pLmdldCh1bml0KSA6IE5hTjtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBtaW51dGVzLCBob3VycywgZGF5cywgbW9udGhzLCBvciB5ZWFycyBpbmNsdWRlZCBpbiB0aGUgSW50ZXJ2YWwsIGV2ZW4gaW4gcGFydC5cclxuICAgKiBVbmxpa2Uge0BsaW5rIGxlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcclxuICAgKiBhc2tzICd3aGF0IGRhdGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIGludGVydmFsPycsIG5vdCAnaG93IG1hbnkgZGF5cyBsb25nIGlzIHRoaXMgaW50ZXJ2YWw/J1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdD0nbWlsbGlzZWNvbmRzJ10gLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIGNvdW50KCkge1xuICAgIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbWlsbGlzZWNvbmRzJztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gTmFOO1xuICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQuc3RhcnRPZih1bml0KSxcbiAgICAgICAgZW5kID0gdGhpcy5lbmQuc3RhcnRPZih1bml0KTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpKSArIDE7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBhbmQgZW5kIGFyZSBib3RoIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUodW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUubWludXMoMSkuaGFzU2FtZSh0aGlzLnMsIHVuaXQpIDogZmFsc2U7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBEYXRlVGltZXMuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLnZhbHVlT2YoKSA9PT0gdGhpcy5lLnZhbHVlT2YoKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPiBkYXRlVGltZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5pc0JlZm9yZSA9IGZ1bmN0aW9uIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucyA8PSBkYXRlVGltZSAmJiB0aGlzLmUgPiBkYXRlVGltZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldHNcIiB0aGUgc3RhcnQgYW5kL29yIGVuZCBkYXRlcy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5lbmQgLSB0aGUgZW5kaW5nIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uW0RhdGVUaW1lXX0gZGF0ZVRpbWVzIC0gdGhlIHVuaXQgb2YgdGltZSB0byBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnNwbGl0QXQgPSBmdW5jdGlvbiBzcGxpdEF0KCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIHNvcnRlZCA9IGRhdGVUaW1lcy5tYXAoZnJpZW5kbHlEYXRlVGltZSkuc29ydCgpLFxuICAgICAgICByZXN1bHRzID0gW107XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGkgPSAwO1xuXG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgdmFyIGFkZGVkID0gc29ydGVkW2ldIHx8IHRoaXMuZSxcbiAgICAgICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBpbnRvIHNtYWxsZXIgSW50ZXJ2YWxzLCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxyXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGxlbmd0aCBvZiBlYWNoIHJlc3VsdGluZyBpbnRlcnZhbC5cclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnNwbGl0QnkgPSBmdW5jdGlvbiBzcGxpdEJ5KGR1cmF0aW9uKSB7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcygnbWlsbGlzZWNvbmRzJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgYWRkZWQgPSB2b2lkIDAsXG4gICAgICAgIG5leHQgPSB2b2lkIDA7XG5cblxuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIGFkZGVkID0gcy5wbHVzKGR1cik7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogU3BsaXQgdGhpcyBJbnRlcnZhbCBpbnRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNtYWxsZXIgaW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuZGl2aWRlRXF1YWxseSA9IGZ1bmN0aW9uIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUub3ZlcmxhcHMgPSBmdW5jdGlvbiBvdmVybGFwcyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmUgPiBvdGhlci5zICYmIHRoaXMucyA8IG90aGVyLmU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBhZGphY2VudCB0byB0aGUgc3BlY2lmaWVkIEludGVydmFsJ3Mgc3RhcnQuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmFidXRzU3RhcnQgPSBmdW5jdGlvbiBhYnV0c1N0YXJ0KG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK3RoaXMuZSA9PT0gK290aGVyLnM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBlbmQuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmFidXRzRW5kID0gZnVuY3Rpb24gYWJ1dHNFbmQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArb3RoZXIuZSA9PT0gK3RoaXMucztcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuZW5ndWxmcyA9IGZ1bmN0aW9uIGVuZ3VsZnMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gb3RoZXIucyAmJiB0aGlzLmUgPj0gb3RoZXIuZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIGFzIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlci5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucy5lcXVhbHMob3RoZXIucykgJiYgdGhpcy5lLmVxdWFscyhvdGhlci5lKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIFJldHVybnMgbnVsbCBpZiB0aGUgaW50ZXJzZWN0aW9uIGlzIGVtcHR5LCBpLmUuLCB0aGUgaW50ZXJ2YWxzIGRvbid0IGludGVyc2VjdC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA+IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lIDwgb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG5cbiAgICBpZiAocyA+IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtaW5pbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtYXhpbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA8IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cclxuICAgKiBDb21iaW5lcyBvdmVybGFwcGluZyBhbmQgYWRqYWNlbnQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLm1lcmdlID0gZnVuY3Rpb24gbWVyZ2UoaW50ZXJ2YWxzKSB7XG4gICAgdmFyIF9pbnRlcnZhbHMkc29ydCRyZWR1YyA9IGludGVydmFscy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5zIC0gYi5zO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoX3JlZjIsIGl0ZW0pIHtcbiAgICAgIHZhciBzb2ZhciA9IF9yZWYyWzBdLFxuICAgICAgICAgIGN1cnJlbnQgPSBfcmVmMlsxXTtcblxuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Lm92ZXJsYXBzKGl0ZW0pIHx8IGN1cnJlbnQuYWJ1dHNTdGFydChpdGVtKSkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBjdXJyZW50LnVuaW9uKGl0ZW0pXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc29mYXIuY29uY2F0KFtjdXJyZW50XSksIGl0ZW1dO1xuICAgICAgfVxuICAgIH0sIFtbXSwgbnVsbF0pLFxuICAgICAgICBmb3VuZCA9IF9pbnRlcnZhbHMkc29ydCRyZWR1Y1swXSxcbiAgICAgICAgZmluYWwgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMV07XG5cbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGZvdW5kLnB1c2goZmluYWwpO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIEludGVydmFscyByZXByZXNlbnRpbmcgdGhlIHNwYW5zIG9mIHRpbWUgdGhhdCBvbmx5IGFwcGVhciBpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHtbSW50ZXJ2YWxdfSBpbnRlcnZhbHNcclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwueG9yID0gZnVuY3Rpb24geG9yKGludGVydmFscykge1xuICAgIHZhciBfQXJyYXkkcHJvdG90eXBlO1xuXG4gICAgdmFyIHN0YXJ0ID0gbnVsbCxcbiAgICAgICAgY3VycmVudENvdW50ID0gMDtcbiAgICB2YXIgcmVzdWx0cyA9IFtdLFxuICAgICAgICBlbmRzID0gaW50ZXJ2YWxzLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIFt7IHRpbWU6IGkucywgdHlwZTogJ3MnIH0sIHsgdGltZTogaS5lLCB0eXBlOiAnZScgfV07XG4gICAgfSksXG4gICAgICAgIGZsYXR0ZW5lZCA9IChfQXJyYXkkcHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlKS5jb25jYXQuYXBwbHkoX0FycmF5JHByb3RvdHlwZSwgZW5kcyksXG4gICAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaSA9IF9yZWYzO1xuXG4gICAgICBjdXJyZW50Q291bnQgKz0gaS50eXBlID09PSAncycgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cclxuICAgKiBAcGFyYW0gey4uLkludGVydmFsfSBpbnRlcnZhbHNcclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmRpZmZlcmVuY2UgPSBmdW5jdGlvbiBkaWZmZXJlbmNlKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGludGVydmFscyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBpbnRlcnZhbHNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSkubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW50ZXJzZWN0aW9uKGkpO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgJiYgIWkuaXNFbXB0eSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiAnWycgKyB0aGlzLnMudG9JU08oKSArICcgXFx1MjAxMyAnICsgdGhpcy5lLnRvSVNPKCkgKyAnKSc7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsIGFwcHJvcHJpYXRlIGZvciB0aGUgUkVQTC5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuICdJbnRlcnZhbCB7XFxuICBzdGFydDogJyArIHRoaXMuc3RhcnQudG9JU08oKSArICcsXFxuICBlbmQ6ICcgKyB0aGlzLmVuZC50b0lTTygpICsgJyxcXG4gIHpvbmU6ICAgJyArIHRoaXMuc3RhcnQuem9uZS5uYW1lICsgJyxcXG4gIGxvY2FsZTogICAnICsgdGhpcy5zdGFydC5sb2NhbGUgKyAnIH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ0ludGVydmFsIHsgSW52YWxpZCwgcmVhc29uOiAnICsgdGhpcy5pbnZhbGlkUmVhc29uICsgJyB9JztcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gVGhlIHNhbWUgb3B0aW9ucyBhcyB7QGxpbmsgRGF0ZVRpbWUudG9JU099XHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnRvSVNPID0gZnVuY3Rpb24gdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiB0aGlzLnMudG9JU08ob3B0cykgKyAnLycgKyB0aGlzLmUudG9JU08ob3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlRm9ybWF0IC0gdGhlIGZvcm1hdCBzdHJpbmcuIFRoaXMgc3RyaW5nIGZvcm1hdHMgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZS4gU2VlIHtAbGluayBEYXRlVGltZS50b0Zvcm1hdH0gZm9yIGRldGFpbHMuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnNlcGFyYXRvciA9ICAnIOKAkyAnXSAtIGEgc2VwYXJhdG9yIHRvIHBsYWNlIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgcmVwcmVzZW50YXRpb25zXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZGF0ZUZvcm1hdCkge1xuICAgIHZhciBfcmVmNCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWY0JHNlcGFyYXRvciA9IF9yZWY0LnNlcGFyYXRvcixcbiAgICAgICAgc2VwYXJhdG9yID0gX3JlZjQkc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnIOKAkyAnIDogX3JlZjQkc2VwYXJhdG9yO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBJTlZBTElEJDE7XG4gICAgcmV0dXJuICcnICsgdGhpcy5zLnRvRm9ybWF0KGRhdGVGb3JtYXQpICsgc2VwYXJhdG9yICsgdGhpcy5lLnRvRm9ybWF0KGRhdGVGb3JtYXQpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbigpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogODg0ODkyNTcgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ2RheXMnKS50b09iamVjdCgpIC8vPT4geyBkYXlzOiAxLjAyNDE4MTIxNTI3Nzc3NzggfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNCwgc2Vjb25kczogNDkuMjU3IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgc2Vjb25kczogODg0ODkuMjU3IH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0R1cmF0aW9uID0gZnVuY3Rpb24gdG9EdXJhdGlvbih1bml0LCBvcHRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKHRoaXMuaW52YWxpZFJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmUuZGlmZih0aGlzLnMsIHVuaXQsIG9wdHMpO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEludGVydmFsLCBbe1xuICAgIGtleTogJ3N0YXJ0JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnMgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxyXG4gICAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2VuZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgaS5lLiB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbiA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgSW50ZXJ2YWwgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ludmFsaWRSZWFzb24nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEludGVydmFsO1xufSgpO1xuXG4vKipcbiAqIFRoZSBJbmZvIGNsYXNzIGNvbnRhaW5zIHN0YXRpYyBtZXRob2RzIGZvciByZXRyaWV2aW5nIGdlbmVyYWwgdGltZSBhbmQgZGF0ZSByZWxhdGVkIGRhdGEuIEZvciBleGFtcGxlLCBpdCBoYXMgbWV0aG9kcyBmb3IgZmluZGluZyBvdXQgaWYgYSB0aW1lIHpvbmUgaGFzIGEgRFNULCBmb3IgbGlzdGluZyB0aGUgbW9udGhzIGluIGFueSBzdXBwb3J0ZWQgbG9jYWxlLCBhbmQgZm9yIGRpc2NvdmVyaW5nIHdoaWNoIG9mIEx1eG9uIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gKi9cblxudmFyIEluZm8gPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEluZm8oKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5mbyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGNvbnRhaW5zIGEgRFNULlxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbem9uZT0nbG9jYWwnXSAtIFpvbmUgdG8gY2hlY2suIERlZmF1bHRzIHRvIHRoZSBlbnZpcm9ubWVudCdzIGxvY2FsIHpvbmUuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBJbmZvLmhhc0RTVCA9IGZ1bmN0aW9uIGhhc0RTVCgpIHtcbiAgICB2YXIgem9uZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG5cbiAgICB2YXIgcHJvdG8gPSBEYXRlVGltZS5sb2NhbCgpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLnVuaXZlcnNhbCAmJiBwcm90by5vZmZzZXQgIT09IHByb3RvLnNldCh7IG1vbnRoOiA2IH0pLm9mZnNldDtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB6b25lIGlzIGEgdmFsaWQgSUFOQSBzcGVjaWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB6b25lIC0gWm9uZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIEluZm8uaXNWYWxpZElBTkFab25lID0gZnVuY3Rpb24gaXNWYWxpZElBTkFab25lKHpvbmUpIHtcbiAgICByZXR1cm4gISFJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSBtb250aCBuYW1lcy5cbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9mhJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbG9uZycsIHsgb3V0cHV0Q2FsZW5kYXI6ICdpc2xhbWljJyB9KVswXSAvLz0+ICdSYWJpyrsgSSdcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tb250aHMgPSBmdW5jdGlvbiBtb250aHMoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmJGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmJGxvY2FsZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYkbG9jYWxlLFxuICAgICAgICBfcmVmJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmJG51bWJlcmluZ1N5c3RlbSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmJG91dHB1dENhbGVuZGFyID0gX3JlZi5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmJG91dHB1dENhbGVuZGFyID09PSB1bmRlZmluZWQgPyAnZ3JlZ29yeScgOiBfcmVmJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCBtb250aCBuYW1lcy5cbiAgICogRm9ybWF0IG1vbnRocyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIG1vbnRocyBpbiB0aGF0IHRoZXkncmUgbWVhbnQgdG8gYXBwZWFyIG5leHQgdG8gdGhlIGRheSBvZiB0aGUgbW9udGguIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XG4gICAqIGNoYW5nZXMgdGhlIHN0cmluZy5cbiAgICogU2VlIHtAbGluayBtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLm1vbnRoc0Zvcm1hdCA9IGZ1bmN0aW9uIG1vbnRoc0Zvcm1hdCgpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbG9uZyc7XG5cbiAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmMiRsb2NhbGUgPSBfcmVmMi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYyJGxvY2FsZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYyJGxvY2FsZSxcbiAgICAgICAgX3JlZjIkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMiRudW1iZXJpbmdTeXN0ZW0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmMiRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYyJG91dHB1dENhbGVuZGFyID0gX3JlZjIub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjIkb3V0cHV0Q2FsZW5kYXIgPT09IHVuZGVmaW5lZCA/ICdncmVnb3J5JyA6IF9yZWYyJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgd2VlayBuYW1lcy5cbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKClbMF0gLy89PiAnTW9uZGF5J1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcpWzBdIC8vPT4gJ01vbidcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9KVswXSAvLz0+ICdsdW4uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9in2YTYp9ir2YbZitmGJ1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjMkbG9jYWxlID0gX3JlZjMubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMyRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmMyRsb2NhbGUsXG4gICAgICAgIF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjMkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjMkbnVtYmVyaW5nU3lzdGVtO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpLndlZWtkYXlzKGxlbmd0aCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIHdlZWtkYXlzfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9bnVsbF0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8ud2Vla2RheXNGb3JtYXQgPSBmdW5jdGlvbiB3ZWVrZGF5c0Zvcm1hdCgpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbG9uZyc7XG5cbiAgICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmNCRsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY0JGxvY2FsZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWY0JGxvY2FsZSxcbiAgICAgICAgX3JlZjQkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNCRudW1iZXJpbmdTeXN0ZW0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNCRudW1iZXJpbmdTeXN0ZW07XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkud2Vla2RheXMobGVuZ3RoLCB0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ2RlJyB9KSAvLz0+IFsgJ3Zvcm0uJywgJ25hY2htLicgXVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcygpIHtcbiAgICB2YXIgX3JlZjUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBfcmVmNSRsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY1JGxvY2FsZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWY1JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSkubWVyaWRpZW1zKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5lcmFzID0gZnVuY3Rpb24gZXJhcygpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnc2hvcnQnO1xuXG4gICAgdmFyIF9yZWY2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjYkbG9jYWxlID0gX3JlZjYubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNiRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsICdncmVnb3J5JykuZXJhcyhsZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMgaW4gdGhpcyBlbnZpcm9ubWVudC5cbiAgICogU29tZSBmZWF0dXJlcyBvZiBMdXhvbiBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgb24gb2xkZXIgYnJvd3NlcnMsIHRpbWV6b25lIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiB0aGF0J3MgdGhlIGNhc2UuXG4gICAqIEtleXM6XG4gICAqICogYHpvbmVzYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIElBTkEgdGltZXpvbmVzXG4gICAqICogYGludGxUb2tlbnNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6ZWQgdG9rZW4tYmFzZWQgZm9ybWF0dGluZy9wYXJzaW5nXG4gICAqICogYGludGxgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgZ2VuZXJhbCBpbnRlcm5hdGlvbmFsaXphdGlvblxuICAgKiBAZXhhbXBsZSBJbmZvLmZlYXR1cmVzKCkgLy89PiB7IGludGw6IHRydWUsIGludGxUb2tlbnM6IGZhbHNlLCB6b25lczogdHJ1ZSB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG5cblxuICBJbmZvLmZlYXR1cmVzID0gZnVuY3Rpb24gZmVhdHVyZXMoKSB7XG4gICAgdmFyIGludGwgPSBmYWxzZSxcbiAgICAgICAgaW50bFRva2VucyA9IGZhbHNlLFxuICAgICAgICB6b25lcyA9IGZhbHNlO1xuXG4gICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgaW50bCA9IHRydWU7XG4gICAgICBpbnRsVG9rZW5zID0gaGFzRm9ybWF0VG9QYXJ0cygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB6b25lcyA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbicsIHsgdGltZVpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSA9PT0gJ0FtZXJpY2EvTmV3X1lvcmsnO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB6b25lcyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGludGw6IGludGwsIGludGxUb2tlbnM6IGludGxUb2tlbnMsIHpvbmVzOiB6b25lcyB9O1xuICB9O1xuXG4gIHJldHVybiBJbmZvO1xufSgpO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIHZhciB1dGNEYXlTdGFydCA9IGZ1bmN0aW9uIHV0Y0RheVN0YXJ0KGR0KSB7XG4gICAgcmV0dXJuIGR0LnRvVVRDKDAsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG4gIH0sXG4gICAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihEdXJhdGlvbi5mcm9tTWlsbGlzKG1zKS5hcygnZGF5cycpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgdmFyIGRpZmZlcnMgPSBbWyd5ZWFycycsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIueWVhciAtIGEueWVhcjtcbiAgfV0sIFsnbW9udGhzJywgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5tb250aCAtIGEubW9udGggKyAoYi55ZWFyIC0gYS55ZWFyKSAqIDEyO1xuICB9XSwgWyd3ZWVrcycsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGRheXMgPSBkYXlEaWZmKGEsIGIpO1xuICAgIHJldHVybiAoZGF5cyAtIGRheXMgJSA3KSAvIDc7XG4gIH1dLCBbJ2RheXMnLCBkYXlEaWZmXV07XG5cbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIGxvd2VzdE9yZGVyID0gdm9pZCAwLFxuICAgICAgaGlnaFdhdGVyID0gdm9pZCAwO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IGRpZmZlcnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWYyO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmMiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZjIgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZiA9IF9yZWYyO1xuICAgIHZhciB1bml0ID0gX3JlZlswXTtcbiAgICB2YXIgZGlmZmVyID0gX3JlZlsxXTtcblxuICAgIGlmICh1bml0cy5pbmRleE9mKHVuaXQpID49IDApIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXM7XG5cbiAgICAgIGxvd2VzdE9yZGVyID0gdW5pdDtcblxuICAgICAgdmFyIGRlbHRhID0gZGlmZmVyKGN1cnNvciwgbGF0ZXIpO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzID0ge30sIF9jdXJzb3IkcGx1c1t1bml0XSA9IGRlbHRhLCBfY3Vyc29yJHBsdXMpKTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIHZhciBfaGlnaFdhdGVyJG1pbnVzO1xuXG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlci5taW51cygoX2hpZ2hXYXRlciRtaW51cyA9IHt9LCBfaGlnaFdhdGVyJG1pbnVzW3VuaXRdID0gMSwgX2hpZ2hXYXRlciRtaW51cykpO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmZ1bmN0aW9uIF9kaWZmIChlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpIHtcbiAgdmFyIF9oaWdoT3JkZXJEaWZmcyA9IGhpZ2hPcmRlckRpZmZzKGVhcmxpZXIsIGxhdGVyLCB1bml0cyksXG4gICAgICBjdXJzb3IgPSBfaGlnaE9yZGVyRGlmZnNbMF0sXG4gICAgICByZXN1bHRzID0gX2hpZ2hPcmRlckRpZmZzWzFdLFxuICAgICAgaGlnaFdhdGVyID0gX2hpZ2hPcmRlckRpZmZzWzJdLFxuICAgICAgbG93ZXN0T3JkZXIgPSBfaGlnaE9yZGVyRGlmZnNbM107XG5cbiAgdmFyIHJlbWFpbmluZ01pbGxpcyA9IGxhdGVyIC0gY3Vyc29yO1xuXG4gIHZhciBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICByZXR1cm4gWydob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnLCAnbWlsbGlzZWNvbmRzJ10uaW5kZXhPZih1KSA+PSAwO1xuICB9KTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChoaWdoV2F0ZXIgPCBsYXRlcikge1xuICAgICAgdmFyIF9jdXJzb3IkcGx1czI7XG5cbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKChfY3Vyc29yJHBsdXMyID0ge30sIF9jdXJzb3IkcGx1czJbbG93ZXN0T3JkZXJdID0gMSwgX2N1cnNvciRwbHVzMikpO1xuICAgIH1cblxuICAgIGlmIChoaWdoV2F0ZXIgIT09IGN1cnNvcikge1xuICAgICAgcmVzdWx0c1tsb3dlc3RPcmRlcl0gPSAocmVzdWx0c1tsb3dlc3RPcmRlcl0gfHwgMCkgKyByZW1haW5pbmdNaWxsaXMgLyAoaGlnaFdhdGVyIC0gY3Vyc29yKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tT2JqZWN0KE9iamVjdC5hc3NpZ24ocmVzdWx0cywgb3B0cykpO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBfRHVyYXRpb24kZnJvbU1pbGxpcztcblxuICAgIHJldHVybiAoX0R1cmF0aW9uJGZyb21NaWxsaXMgPSBEdXJhdGlvbi5mcm9tTWlsbGlzKHJlbWFpbmluZ01pbGxpcywgb3B0cykpLnNoaWZ0VG8uYXBwbHkoX0R1cmF0aW9uJGZyb21NaWxsaXMsIGxvd2VyT3JkZXJVbml0cykucGx1cyhkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG59XG5cbnZhciBNSVNTSU5HX0ZUUCA9ICdtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0JztcblxuZnVuY3Rpb24gaW50VW5pdChyZWdleCkge1xuICB2YXIgcG9zdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaTtcbiAgfTtcblxuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmKSB7XG4gICAgICB2YXIgcyA9IF9yZWZbMF07XG4gICAgICByZXR1cm4gcG9zdChwYXJzZUludChzKSk7XG4gICAgfSB9O1xufVxuXG5mdW5jdGlvbiBmaXhMaXN0UmVnZXgocykge1xuICAvLyBtYWtlIGRvdHMgb3B0aW9uYWwgYW5kIGFsc28gbWFrZSB0aGVtIGxpdGVyYWxcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgJ1xcXFwuPycpO1xufVxuXG5mdW5jdGlvbiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sICcnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBvbmVPZihzdHJpbmdzLCBzdGFydEluZGV4KSB7XG4gIGlmIChzdHJpbmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiBSZWdFeHAoc3RyaW5ncy5tYXAoZml4TGlzdFJlZ2V4KS5qb2luKCd8JykpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYyKSB7XG4gICAgICAgIHZhciBzID0gX3JlZjJbMF07XG4gICAgICAgIHJldHVybiBzdHJpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSk7XG4gICAgICAgIH0pICsgc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldChyZWdleCwgZ3JvdXBzKSB7XG4gIHJldHVybiB7IHJlZ2V4OiByZWdleCwgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYzKSB7XG4gICAgICB2YXIgaCA9IF9yZWYzWzFdLFxuICAgICAgICAgIG0gPSBfcmVmM1syXTtcbiAgICAgIHJldHVybiBzaWduZWRPZmZzZXQoaCwgbSk7XG4gICAgfSwgZ3JvdXBzOiBncm91cHMgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7IHJlZ2V4OiByZWdleCwgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWY0KSB7XG4gICAgICB2YXIgcyA9IF9yZWY0WzBdO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSB9O1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICB2YXIgb25lID0gL1xcZC8sXG4gICAgICB0d28gPSAvXFxkezJ9LyxcbiAgICAgIHRocmVlID0gL1xcZHszfS8sXG4gICAgICBmb3VyID0gL1xcZHs0fS8sXG4gICAgICBvbmVPclR3byA9IC9cXGR7MSwyfS8sXG4gICAgICBvbmVUb1RocmVlID0gL1xcZHsxLDN9LyxcbiAgICAgIHR3b1RvRm91ciA9IC9cXGR7Miw0fS8sXG4gICAgICBsaXRlcmFsID0gZnVuY3Rpb24gbGl0ZXJhbCh0KSB7XG4gICAgcmV0dXJuIHsgcmVnZXg6IFJlZ0V4cCh0LnZhbCksIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNSkge1xuICAgICAgICB2YXIgcyA9IF9yZWY1WzBdO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH0sIGxpdGVyYWw6IHRydWUgfTtcbiAgfSxcbiAgICAgIHVuaXRhdGUgPSBmdW5jdGlvbiB1bml0YXRlKHQpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuICAgIHN3aXRjaCAodC52YWwpIHtcbiAgICAgIC8vIGVyYVxuICAgICAgY2FzZSAnRyc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcygnc2hvcnQnLCBmYWxzZSksIDApO1xuICAgICAgY2FzZSAnR0cnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoJ2xvbmcnLCBmYWxzZSksIDApO1xuICAgICAgLy8geWVhcnNcbiAgICAgIGNhc2UgJ3knOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezEsNn0vKTtcbiAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG4gICAgICBjYXNlICd5eXl5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICBjYXNlICd5eXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KC9cXGR7NCw2fS8pO1xuICAgICAgY2FzZSAneXl5eXl5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHs2fS8pO1xuICAgICAgLy8gbW9udGhzXG4gICAgICBjYXNlICdNJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnTU0nOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnTU1NJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoJ3Nob3J0JywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdNTU1NJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoJ2xvbmcnLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdMTCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdMTEwnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocygnc2hvcnQnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnTExMTCc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdsb25nJywgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIGRhdGVzXG4gICAgICBjYXNlICdkJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnZGQnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgLy8gb3JkaW5hbHNcbiAgICAgIGNhc2UgJ28nOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcbiAgICAgIGNhc2UgJ29vbyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgIC8vIHRpbWVcbiAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ0gnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdoaCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdoJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnbW0nOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnbSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdzcyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdTJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICBjYXNlICdTU1MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICBjYXNlICd1JzpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvXFxkezEsOX0vKTtcbiAgICAgIC8vIG1lcmlkaWVtXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAvLyB3ZWVrWWVhciAoaylcbiAgICAgIGNhc2UgJ2tra2snOlxuICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcbiAgICAgIGNhc2UgJ2trJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG4gICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuICAgICAgY2FzZSAnVyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ1dXJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIHdlZWtkYXlzXG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ2MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmUpO1xuICAgICAgY2FzZSAnRUVFJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnc2hvcnQnLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgIGNhc2UgJ0VFRUUnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKCdsb25nJywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdjY2MnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKCdzaG9ydCcsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdjY2NjJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnbG9uZycsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBvZmZzZXQvem9uZVxuICAgICAgY2FzZSAnWic6XG4gICAgICBjYXNlICdaWic6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8vLCAyKTtcbiAgICAgIGNhc2UgJ1paWic6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKFxcZHsyfSk/LywgMik7XG4gICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSB3YXkgdG8gZmlndXJlIG91dCB3aGF0IHRoZXkgYXJlXG4gICAgICBjYXNlICd6JzpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvW0EtWmEtel9dezEsMjU2fVxcL1tBLVphLXpfXXsxLDI1Nn0vKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdW5pdCA9IHVuaXRhdGUodG9rZW4pIHx8IHtcbiAgICBpbnZhbGlkUmVhc29uOiBNSVNTSU5HX0ZUUFxuICB9O1xuXG4gIHVuaXQudG9rZW4gPSB0b2tlbjtcblxuICByZXR1cm4gdW5pdDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWdleCh1bml0cykge1xuICB2YXIgcmUgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICByZXR1cm4gdS5yZWdleDtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyAnKCcgKyByLnNvdXJjZSArICcpJztcbiAgfSwgJycpO1xuICByZXR1cm4gWydeJyArIHJlICsgJyQnLCB1bml0c107XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpIHtcbiAgdmFyIG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICB2YXIgYWxsID0ge307XG4gICAgdmFyIG1hdGNoSW5kZXggPSAxO1xuICAgIGZvciAodmFyIGkgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGlmIChoYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICB2YXIgaCA9IGhhbmRsZXJzW2ldLFxuICAgICAgICAgICAgZ3JvdXBzID0gaC5ncm91cHMgPyBoLmdyb3VwcyArIDEgOiAxO1xuICAgICAgICBpZiAoIWgubGl0ZXJhbCAmJiBoLnRva2VuKSB7XG4gICAgICAgICAgYWxsW2gudG9rZW4udmFsWzBdXSA9IGguZGVzZXIobWF0Y2hlcy5zbGljZShtYXRjaEluZGV4LCBtYXRjaEluZGV4ICsgZ3JvdXBzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2hJbmRleCArPSBncm91cHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbbWF0Y2hlcywgYWxsXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW21hdGNoZXMsIHt9XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkYXRlVGltZUZyb21NYXRjaGVzKG1hdGNoZXMpIHtcbiAgdmFyIHRvRmllbGQgPSBmdW5jdGlvbiB0b0ZpZWxkKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnUyc6XG4gICAgICAgIHJldHVybiAnbWlsbGlzZWNvbmQnO1xuICAgICAgY2FzZSAncyc6XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXR1cm4gJ21pbnV0ZSc7XG4gICAgICBjYXNlICdoJzpcbiAgICAgIGNhc2UgJ0gnOlxuICAgICAgICByZXR1cm4gJ2hvdXInO1xuICAgICAgY2FzZSAnZCc6XG4gICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgIGNhc2UgJ28nOlxuICAgICAgICByZXR1cm4gJ29yZGluYWwnO1xuICAgICAgY2FzZSAnTCc6XG4gICAgICBjYXNlICdNJzpcbiAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgIGNhc2UgJ0UnOlxuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiAnd2Vla2RheSc7XG4gICAgICBjYXNlICdXJzpcbiAgICAgICAgcmV0dXJuICd3ZWVrTnVtYmVyJztcbiAgICAgIGNhc2UgJ2snOlxuICAgICAgICByZXR1cm4gJ3dlZWtZZWFyJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICB2YXIgem9uZSA9IHZvaWQgMDtcbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLlopKSB7XG4gICAgem9uZSA9IG5ldyBGaXhlZE9mZnNldFpvbmUobWF0Y2hlcy5aKTtcbiAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy56KSkge1xuICAgIHpvbmUgPSBuZXcgSUFOQVpvbmUobWF0Y2hlcy56KTtcbiAgfSBlbHNlIHtcbiAgICB6b25lID0gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICB2YXIgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZShmdW5jdGlvbiAociwgaykge1xuICAgIHZhciBmID0gdG9GaWVsZChrKTtcbiAgICBpZiAoZikge1xuICAgICAgcltmXSA9IG1hdGNoZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH0sIHt9KTtcblxuICByZXR1cm4gW3ZhbHMsIHpvbmVdO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSB7XG4gIHZhciB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm9ybWF0KSxcbiAgICAgIHVuaXRzID0gdG9rZW5zLm1hcChmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB1bml0Rm9yVG9rZW4odCwgbG9jYWxlKTtcbiAgfSksXG4gICAgICBkaXNxdWFsaWZ5aW5nVW5pdCA9IHVuaXRzLmZpbmQoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5pbnZhbGlkUmVhc29uO1xuICB9KTtcblxuICBpZiAoZGlzcXVhbGlmeWluZ1VuaXQpIHtcbiAgICByZXR1cm4geyBpbnB1dDogaW5wdXQsIHRva2VuczogdG9rZW5zLCBpbnZhbGlkUmVhc29uOiBkaXNxdWFsaWZ5aW5nVW5pdC5pbnZhbGlkUmVhc29uIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9idWlsZFJlZ2V4ID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICAgIHJlZ2V4U3RyaW5nID0gX2J1aWxkUmVnZXhbMF0sXG4gICAgICAgIGhhbmRsZXJzID0gX2J1aWxkUmVnZXhbMV0sXG4gICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCAnaScpLFxuICAgICAgICBfbWF0Y2ggPSBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSxcbiAgICAgICAgcmF3TWF0Y2hlcyA9IF9tYXRjaFswXSxcbiAgICAgICAgbWF0Y2hlcyA9IF9tYXRjaFsxXSxcbiAgICAgICAgX3JlZjYgPSBtYXRjaGVzID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSA6IFtudWxsLCBudWxsXSxcbiAgICAgICAgcmVzdWx0ID0gX3JlZjZbMF0sXG4gICAgICAgIHpvbmUgPSBfcmVmNlsxXTtcblxuICAgIHJldHVybiB7IGlucHV0OiBpbnB1dCwgdG9rZW5zOiB0b2tlbnMsIHJlZ2V4OiByZWdleCwgcmF3TWF0Y2hlczogcmF3TWF0Y2hlcywgbWF0Y2hlczogbWF0Y2hlcywgcmVzdWx0OiByZXN1bHQsIHpvbmU6IHpvbmUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSB7XG4gIHZhciBfZXhwbGFpbkZyb21Ub2tlbnMgPSBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpLFxuICAgICAgcmVzdWx0ID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnJlc3VsdCxcbiAgICAgIHpvbmUgPSBfZXhwbGFpbkZyb21Ub2tlbnMuem9uZSxcbiAgICAgIGludmFsaWRSZWFzb24gPSBfZXhwbGFpbkZyb21Ub2tlbnMuaW52YWxpZFJlYXNvbjtcblxuICByZXR1cm4gW3Jlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbl07XG59XG5cbnZhciBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgICBsZWFwTGFkZGVyID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XTtcblxuZnVuY3Rpb24gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgdmFyIGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgdmFyIHRhYmxlID0gaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyLFxuICAgICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGkgPCBvcmRpbmFsO1xuICB9KSxcbiAgICAgIGRheSA9IG9yZGluYWwgLSB0YWJsZVttb250aDBdO1xuICByZXR1cm4geyBtb250aDogbW9udGgwICsgMSwgZGF5OiBkYXkgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvV2VlayhncmVnT2JqKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ09iai55ZWFyLFxuICAgICAgbW9udGggPSBncmVnT2JqLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ09iai5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSksXG4gICAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuXG5cbiAgdmFyIHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgICAgd2Vla1llYXIgPSB2b2lkIDA7XG5cbiAgaWYgKHdlZWtOdW1iZXIgPCAxKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyIC0gMTtcbiAgICB3ZWVrTnVtYmVyID0gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICh3ZWVrTnVtYmVyID4gd2Vla3NJbldlZWtZZWFyKHllYXIpKSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyICsgMTtcbiAgICB3ZWVrTnVtYmVyID0gMTtcbiAgfSBlbHNlIHtcbiAgICB3ZWVrWWVhciA9IHllYXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHdlZWtZZWFyOiB3ZWVrWWVhciwgd2Vla051bWJlcjogd2Vla051bWJlciwgd2Vla2RheTogd2Vla2RheSB9LCB0aW1lT2JqZWN0KGdyZWdPYmopKTtcbn1cblxuZnVuY3Rpb24gd2Vla1RvR3JlZ29yaWFuKHdlZWtEYXRhKSB7XG4gIHZhciB3ZWVrWWVhciA9IHdlZWtEYXRhLndlZWtZZWFyLFxuICAgICAgd2Vla051bWJlciA9IHdlZWtEYXRhLndlZWtOdW1iZXIsXG4gICAgICB3ZWVrZGF5ID0gd2Vla0RhdGEud2Vla2RheSxcbiAgICAgIHdlZWtkYXlPZkphbjQgPSBkYXlPZldlZWsod2Vla1llYXIsIDEsIDQpLFxuICAgICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuXG4gIHZhciBvcmRpbmFsID0gd2Vla051bWJlciAqIDcgKyB3ZWVrZGF5IC0gd2Vla2RheU9mSmFuNCAtIDMsXG4gICAgICB5ZWFyID0gdm9pZCAwO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIoeWVhcik7XG4gIH0gZWxzZSB7XG4gICAgeWVhciA9IHdlZWtZZWFyO1xuICB9XG5cbiAgdmFyIF91bmNvbXB1dGVPcmRpbmFsID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwubW9udGgsXG4gICAgICBkYXkgPSBfdW5jb21wdXRlT3JkaW5hbC5kYXk7XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB5ZWFyOiB5ZWFyLCBtb250aDogbW9udGgsIGRheTogZGF5IH0sIHRpbWVPYmplY3Qod2Vla0RhdGEpKTtcbn1cblxuZnVuY3Rpb24gZ3JlZ29yaWFuVG9PcmRpbmFsKGdyZWdEYXRhKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ0RhdGEueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ0RhdGEubW9udGgsXG4gICAgICBkYXkgPSBncmVnRGF0YS5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG5cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHllYXI6IHllYXIsIG9yZGluYWw6IG9yZGluYWwgfSwgdGltZU9iamVjdChncmVnRGF0YSkpO1xufVxuXG5mdW5jdGlvbiBvcmRpbmFsVG9HcmVnb3JpYW4ob3JkaW5hbERhdGEpIHtcbiAgdmFyIHllYXIgPSBvcmRpbmFsRGF0YS55ZWFyLFxuICAgICAgb3JkaW5hbCA9IG9yZGluYWxEYXRhLm9yZGluYWwsXG4gICAgICBfdW5jb21wdXRlT3JkaW5hbDIgPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpLFxuICAgICAgbW9udGggPSBfdW5jb21wdXRlT3JkaW5hbDIubW9udGgsXG4gICAgICBkYXkgPSBfdW5jb21wdXRlT3JkaW5hbDIuZGF5O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoLCBkYXk6IGRheSB9LCB0aW1lT2JqZWN0KG9yZGluYWxEYXRhKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai53ZWVrWWVhciksXG4gICAgICB2YWxpZFdlZWsgPSBudW1iZXJCZXR3ZWVuKG9iai53ZWVrTnVtYmVyLCAxLCB3ZWVrc0luV2Vla1llYXIob2JqLndlZWtZZWFyKSksXG4gICAgICB2YWxpZFdlZWtkYXkgPSBudW1iZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiAnd2Vla1llYXIgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrKSB7XG4gICAgcmV0dXJuICd3ZWVrIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vla2RheSkge1xuICAgIHJldHVybiAnd2Vla2RheSBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkT3JkaW5hbERhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoueWVhciksXG4gICAgICB2YWxpZE9yZGluYWwgPSBudW1iZXJCZXR3ZWVuKG9iai5vcmRpbmFsLCAxLCBkYXlzSW5ZZWFyKG9iai55ZWFyKSk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gJ3llYXIgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRPcmRpbmFsKSB7XG4gICAgcmV0dXJuICdvcmRpbmFsIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRNb250aCA9IG51bWJlckJldHdlZW4ob2JqLm1vbnRoLCAxLCAxMiksXG4gICAgICB2YWxpZERheSA9IG51bWJlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuICd5ZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gJ21vbnRoIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkRGF5KSB7XG4gICAgcmV0dXJuICdkYXkgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSW52YWxpZFRpbWVEYXRhKG9iaikge1xuICB2YXIgdmFsaWRIb3VyID0gbnVtYmVyQmV0d2VlbihvYmouaG91ciwgMCwgMjMpLFxuICAgICAgdmFsaWRNaW51dGUgPSBudW1iZXJCZXR3ZWVuKG9iai5taW51dGUsIDAsIDU5KSxcbiAgICAgIHZhbGlkU2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmouc2Vjb25kLCAwLCA1OSksXG4gICAgICB2YWxpZE1pbGxpc2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmoubWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gJ2hvdXIgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gJ21pbnV0ZSBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiAnc2Vjb25kIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWlsbGlzZWNvbmQpIHtcbiAgICByZXR1cm4gJ21pbGxpc2Vjb25kIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBJTlZBTElEJDIgPSAnSW52YWxpZCBEYXRlVGltZScsXG4gICAgSU5WQUxJRF9JTlBVVCA9ICdpbnZhbGlkIGlucHV0JyxcbiAgICBVTlNVUFBPUlRFRF9aT05FID0gJ3Vuc3VwcG9ydGVkIHpvbmUnLFxuICAgIFVOUEFSU0FCTEUkMSA9ICd1bnBhcnNhYmxlJztcblxuLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufVxuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBjbG9uZSQxKGluc3QsIGFsdHMpIHtcbiAgdmFyIGN1cnJlbnQgPSB7XG4gICAgdHM6IGluc3QudHMsXG4gICAgem9uZTogaW5zdC56b25lLFxuICAgIGM6IGluc3QuYyxcbiAgICBvOiBpbnN0Lm8sXG4gICAgbG9jOiBpbnN0LmxvYyxcbiAgICBpbnZhbGlkUmVhc29uOiBpbnN0LmludmFsaWRSZWFzb25cbiAgfTtcbiAgcmV0dXJuIG5ldyBEYXRlVGltZShPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50LCBhbHRzLCB7IG9sZDogY3VycmVudCB9KSk7XG59XG5cbi8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcbmZ1bmN0aW9uIGZpeE9mZnNldChsb2NhbFRTLCBvLCB0eikge1xuICAvLyBPdXIgVVRDIHRpbWUgaXMganVzdCBhIGd1ZXNzIGJlY2F1c2Ugb3VyIG9mZnNldCBpcyBqdXN0IGEgZ3Vlc3NcbiAgdmFyIHV0Y0d1ZXNzID0gbG9jYWxUUyAtIG8gKiA2MCAqIDEwMDA7XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuICB2YXIgbzIgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIC8vIElmIHNvLCBvZmZzZXQgZGlkbid0IGNoYW5nZSBhbmQgd2UncmUgZG9uZVxuICBpZiAobyA9PT0gbzIpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvXTtcbiAgfVxuXG4gIC8vIElmIG5vdCwgY2hhbmdlIHRoZSB0cyBieSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgb2Zmc2V0XG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwO1xuXG4gIC8vIElmIHRoYXQgZ2l2ZXMgdXMgdGhlIGxvY2FsIHRpbWUgd2Ugd2FudCwgd2UncmUgZG9uZVxuICB2YXIgbzMgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuICBpZiAobzIgPT09IG8zKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgbzJdO1xuICB9XG5cbiAgLy8gSWYgaXQncyBkaWZmZXJlbnQsIHdlJ3JlIGluIGEgaG9sZSB0aW1lLiBUaGUgb2Zmc2V0IGhhcyBjaGFuZ2VkLCBidXQgdGhlIHdlIGRvbid0IGFkanVzdCB0aGUgdGltZVxuICByZXR1cm4gW2xvY2FsVFMgLSBNYXRoLm1pbihvMiwgbzMpICogNjAgKiAxMDAwLCBNYXRoLm1heChvMiwgbzMpXTtcbn1cblxuLy8gY29udmVydCBhbiBlcG9jaCB0aW1lc3RhbXAgaW50byBhIGNhbGVuZGFyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBvZmZzZXRcbmZ1bmN0aW9uIHRzVG9PYmoodHMsIG9mZnNldCkge1xuICB0cyArPSBvZmZzZXQgKiA2MCAqIDEwMDA7XG5cbiAgdmFyIGQgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGQuZ2V0VVRDTW9udGgoKSArIDEsXG4gICAgZGF5OiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIG1pbGxpc2Vjb25kOiBkLmdldFVUQ01pbGxpc2Vjb25kcygpXG4gIH07XG59XG5cbi8vIGNvdmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGxvY2FsIHRpbWVzdGFtcCAoZXBvY2gsIGJ1dCB3aXRoIHRoZSBvZmZzZXQgYmFrZWQgaW4pXG5mdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIHZhciBkID0gRGF0ZS5VVEMob2JqLnllYXIsIG9iai5tb250aCAtIDEsIG9iai5kYXksIG9iai5ob3VyLCBvYmoubWludXRlLCBvYmouc2Vjb25kLCBvYmoubWlsbGlzZWNvbmQpO1xuXG4gIC8vIGZvciBsZWdhY3kgcmVhc29ucywgeWVhcnMgYmV0d2VlbiAwIGFuZCA5OSBhcmUgaW50ZXJwcmV0ZWQgYXMgMTlYWDsgcmV2ZXJ0IHRoYXRcbiAgaWYgKG9iai55ZWFyIDwgMTAwICYmIG9iai55ZWFyID49IDApIHtcbiAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgZC5zZXRVVENGdWxsWWVhcihvYmoueWVhcik7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG4vLyBjb252ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgZXBvY2ggdGltZXN0YW1wXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59XG5cbi8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICB2YXIgb1ByZSA9IGluc3QubyxcbiAgICAgIHllYXIgPSBpbnN0LmMueWVhciArIGR1ci55ZWFycyxcbiAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgZHVyLm1vbnRocyArIGR1ci5xdWFydGVycyAqIDMsXG4gICAgICBjID0gT2JqZWN0LmFzc2lnbih7fSwgaW5zdC5jLCB7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgZHVyLmRheXMgKyBkdXIud2Vla3MgKiA3XG4gIH0pLFxuICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICBob3VyczogZHVyLmhvdXJzLFxuICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgIHNlY29uZHM6IGR1ci5zZWNvbmRzLFxuICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kc1xuICB9KS5hcygnbWlsbGlzZWNvbmRzJyksXG4gICAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIHZhciBfZml4T2Zmc2V0ID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSksXG4gICAgICB0cyA9IF9maXhPZmZzZXRbMF0sXG4gICAgICBvID0gX2ZpeE9mZnNldFsxXTtcblxuICBpZiAobWlsbGlzVG9BZGQgIT09IDApIHtcbiAgICB0cyArPSBtaWxsaXNUb0FkZDtcbiAgICAvLyB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgb2Zmc2V0IGJ5IGdvaW5nIG92ZXIgYSBEU1QsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhlIHRzIHRoZSBzYW1lXG4gICAgbyA9IGluc3Quem9uZS5vZmZzZXQodHMpO1xuICB9XG5cbiAgcmV0dXJuIHsgdHM6IHRzLCBvOiBvIH07XG59XG5cbi8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuZnVuY3Rpb24gcGFyc2VEYXRhVG9EYXRlVGltZShwYXJzZWQsIHBhcnNlZFpvbmUsIG9wdHMpIHtcbiAgdmFyIHNldFpvbmUgPSBvcHRzLnNldFpvbmUsXG4gICAgICB6b25lID0gb3B0cy56b25lO1xuXG4gIGlmIChwYXJzZWQgJiYgT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggIT09IDApIHtcbiAgICB2YXIgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgICBpbnN0ID0gRGF0ZVRpbWUuZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cywge1xuICAgICAgem9uZTogaW50ZXJwcmV0YXRpb25ab25lXG4gICAgfSkpO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChVTlBBUlNBQkxFJDEpO1xuICB9XG59XG5cbi8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCkge1xuICByZXR1cm4gZHQuaXNWYWxpZCA/IEZvcm1hdHRlci5jcmVhdGUoTG9jYWxlLmNyZWF0ZSgnZW4tVVMnKSwge1xuICAgIGFsbG93WjogdHJ1ZSxcbiAgICBmb3JjZVNpbXBsZTogdHJ1ZVxuICB9KS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZvcm1hdCkgOiBudWxsO1xufVxuXG4vLyB0ZWNobmljYWwgdGltZSBmb3JtYXRzIChlLmcuIHRoZSB0aW1lIHBhcnQgb2YgSVNPIDg2MDEpLCB0YWtlIHNvbWUgb3B0aW9uc1xuLy8gYW5kIHRoaXMgY29tbW9uaXplcyB0aGVpciBoYW5kbGluZ1xuZnVuY3Rpb24gdG9UZWNoVGltZUZvcm1hdChkdCwgX3JlZikge1xuICB2YXIgX3JlZiRzdXBwcmVzc1NlY29uZHMgPSBfcmVmLnN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NTZWNvbmRzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgX3JlZiRzdXBwcmVzc01pbGxpc2VjID0gX3JlZi5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gX3JlZiRzdXBwcmVzc01pbGxpc2VjID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyxcbiAgICAgIF9yZWYkaW5jbHVkZU9mZnNldCA9IF9yZWYuaW5jbHVkZU9mZnNldCxcbiAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmJGluY2x1ZGVPZmZzZXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmJGluY2x1ZGVPZmZzZXQsXG4gICAgICBfcmVmJGluY2x1ZGVab25lID0gX3JlZi5pbmNsdWRlWm9uZSxcbiAgICAgIGluY2x1ZGVab25lID0gX3JlZiRpbmNsdWRlWm9uZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJGluY2x1ZGVab25lLFxuICAgICAgX3JlZiRzcGFjZVpvbmUgPSBfcmVmLnNwYWNlWm9uZSxcbiAgICAgIHNwYWNlWm9uZSA9IF9yZWYkc3BhY2Vab25lID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWYkc3BhY2Vab25lO1xuXG4gIHZhciBmbXQgPSAnSEg6bW0nO1xuXG4gIGlmICghc3VwcHJlc3NTZWNvbmRzIHx8IGR0LnNlY29uZCAhPT0gMCB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgIGZtdCArPSAnOnNzJztcbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gJy5TU1MnO1xuICAgIH1cbiAgfVxuXG4gIGlmICgoaW5jbHVkZVpvbmUgfHwgaW5jbHVkZU9mZnNldCkgJiYgc3BhY2Vab25lKSB7XG4gICAgZm10ICs9ICcgJztcbiAgfVxuXG4gIGlmIChpbmNsdWRlWm9uZSkge1xuICAgIGZtdCArPSAneic7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSAnWlonO1xuICB9XG5cbiAgcmV0dXJuIHRvVGVjaEZvcm1hdChkdCwgZm10KTtcbn1cblxuLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG52YXIgZGVmYXVsdFVuaXRWYWx1ZXMgPSB7XG4gIG1vbnRoOiAxLFxuICBkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gIHdlZWtOdW1iZXI6IDEsXG4gIHdlZWtkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gIG9yZGluYWw6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufTtcblxuLy8gVW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnMsIHNvcnRlZCBieSBiaWduZXNzXG52YXIgb3JkZXJlZFVuaXRzJDEgPSBbJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddLFxuICAgIG9yZGVyZWRXZWVrVW5pdHMgPSBbJ3dlZWtZZWFyJywgJ3dlZWtOdW1iZXInLCAnd2Vla2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSxcbiAgICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gWyd5ZWFyJywgJ29yZGluYWwnLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ107XG5cbi8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gIHZhciBpZ25vcmVVbmtub3duID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICB5ZWFyOiAneWVhcicsXG4gICAgeWVhcnM6ICd5ZWFyJyxcbiAgICBtb250aDogJ21vbnRoJyxcbiAgICBtb250aHM6ICdtb250aCcsXG4gICAgZGF5OiAnZGF5JyxcbiAgICBkYXlzOiAnZGF5JyxcbiAgICBob3VyOiAnaG91cicsXG4gICAgaG91cnM6ICdob3VyJyxcbiAgICBtaW51dGU6ICdtaW51dGUnLFxuICAgIG1pbnV0ZXM6ICdtaW51dGUnLFxuICAgIHNlY29uZDogJ3NlY29uZCcsXG4gICAgc2Vjb25kczogJ3NlY29uZCcsXG4gICAgbWlsbGlzZWNvbmQ6ICdtaWxsaXNlY29uZCcsXG4gICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmQnLFxuICAgIHdlZWtkYXk6ICd3ZWVrZGF5JyxcbiAgICB3ZWVrZGF5czogJ3dlZWtkYXknLFxuICAgIHdlZWtudW1iZXI6ICd3ZWVrTnVtYmVyJyxcbiAgICB3ZWVrc251bWJlcjogJ3dlZWtOdW1iZXInLFxuICAgIHdlZWtudW1iZXJzOiAnd2Vla051bWJlcicsXG4gICAgd2Vla3llYXI6ICd3ZWVrWWVhcicsXG4gICAgd2Vla3llYXJzOiAnd2Vla1llYXInLFxuICAgIG9yZGluYWw6ICdvcmRpbmFsJ1xuICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICBpZiAoIWlnbm9yZVVua25vd24gJiYgIW5vcm1hbGl6ZWQpIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgem9uZSkge1xuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IG9yZGVyZWRVbml0cyQxLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmMjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZjIgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHUgPSBfcmVmMjtcblxuICAgIGlmIChpc1VuZGVmaW5lZChvYmpbdV0pKSB7XG4gICAgICBvYmpbdV0gPSBkZWZhdWx0VW5pdFZhbHVlc1t1XTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW52YWxpZFJlYXNvbiA9IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG9iaik7XG4gIGlmIChpbnZhbGlkUmVhc29uKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZFJlYXNvbik7XG4gIH1cblxuICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KSxcbiAgICAgIF9vYmpUb1RTID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSksXG4gICAgICB0cyA9IF9vYmpUb1RTWzBdLFxuICAgICAgbyA9IF9vYmpUb1RTWzFdO1xuXG5cbiAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgdHM6IHRzLFxuICAgIHpvbmU6IHpvbmUsXG4gICAgbzogb1xuICB9KTtcbn1cblxuLyoqXHJcbiAqIEEgRGF0ZVRpbWUgaXMgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGRhdGUgYW5kIHRpbWUgYW5kIGFjY29tcGFueWluZyBtZXRob2RzLiBJdCBjb250YWlucyBjbGFzcyBhbmQgaW5zdGFuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XHJcbiAqICogQSB0aW1lc3RhbXAuIEVhY2ggRGF0ZVRpbWUgaW5zdGFuY2UgcmVmZXJzIHRvIGEgc3BlY2lmaWMgbWlsbGlzZWNvbmQgb2YgdGhlIFVuaXggZXBvY2guXHJcbiAqICogQSB0aW1lIHpvbmUuIEVhY2ggaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBpbiB0aGUgY29udGV4dCBvZiBhIHNwZWNpZmljIHpvbmUgKGJ5IGRlZmF1bHQgdGhlIGxvY2FsIHN5c3RlbSdzIHpvbmUpLlxyXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxyXG4gKlxyXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdW5jdGlvbmFsaXR5IGl0IHByb3ZpZGVzOlxyXG4gKlxyXG4gKiAqICoqQ3JlYXRpb24qKjogVG8gY3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBpdHMgY29tcG9uZW50cywgdXNlIG9uZSBvZiBpdHMgZmFjdG9yeSBjbGFzcyBtZXRob2RzOiB7QGxpbmsgbG9jYWx9LCB7QGxpbmsgdXRjfSwgYW5kIChtb3N0IGZsZXhpYmx5KSB7QGxpbmsgZnJvbU9iamVjdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIHN0YW5kYXJkIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUlTT30sIHtAbGluayBmcm9tSFRUUH0sIGFuZCB7QGxpbmsgZnJvbVJGQzI4MjJ9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBjdXN0b20gc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tRm9ybWF0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgbmF0aXZlIEpTIGRhdGUsIHVzZSB7QGxpbmsgZnJvbUpTRGF0ZX0uXHJcbiAqICogKipHcmVnb3JpYW4gY2FsZW5kYXIgYW5kIHRpbWUqKjogVG8gZXhhbWluZSB0aGUgR3JlZ29yaWFuIHByb3BlcnRpZXMgb2YgYSBEYXRlVGltZSBpbmRpdmlkdWFsbHkgKGkuZSBhcyBvcHBvc2VkIHRvIGNvbGxlY3RpdmVseSB0aHJvdWdoIHtAbGluayB0b09iamVjdH0pLCB1c2UgdGhlIHtAbGluayB5ZWFyfSwge0BsaW5rIG1vbnRofSxcclxuICoge0BsaW5rIGRheX0sIHtAbGluayBob3VyfSwge0BsaW5rIG1pbnV0ZX0sIHtAbGluayBzZWNvbmR9LCB7QGxpbmsgbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cclxuICogKiAqKldlZWsgY2FsZW5kYXIqKjogRm9yIElTTyB3ZWVrIGNhbGVuZGFyIGF0dHJpYnV0ZXMsIHNlZSB0aGUge0BsaW5rIHdlZWtZZWFyfSwge0BsaW5rIHdlZWtOdW1iZXJ9LCBhbmQge0BsaW5rIHdlZWtkYXl9IGFjY2Vzc29ycy5cclxuICogKiAqKkNvbmZpZ3VyYXRpb24qKiBTZWUgdGhlIHtAbGluayBsb2NhbGV9IGFuZCB7QGxpbmsgbnVtYmVyaW5nU3lzdGVtfSBhY2Nlc3NvcnMuXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayByZWNvbmZpZ3VyZX0sIHtAbGluayBzZXRab25lfSwge0BsaW5rIHNldExvY2FsZX0sIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIGVuZE9mfSwge0BsaW5rIHN0YXJ0T2Z9LCB7QGxpbmsgdG9VVEN9LCBhbmQge0BsaW5rIHRvTG9jYWx9LlxyXG4gKiAqICoqT3V0cHV0Kio6IFRvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgdXNlIHRoZSB7QGxpbmsgdG9KU09OfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvSFRUUH0sIHtAbGluayB0b09iamVjdH0sIHtAbGluayB0b1JGQzI4MjJ9LCB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9LCB7QGxpbmsgdG9Gb3JtYXR9LCB7QGxpbmsgdG9NaWxsaXN9IGFuZCB7QGxpbmsgdG9KU0RhdGV9LlxyXG4gKlxyXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxyXG4gKi9cblxudmFyIERhdGVUaW1lID0gZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gRGF0ZVRpbWUoY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGF0ZVRpbWUpO1xuXG4gICAgdmFyIHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSxcbiAgICAgICAgaW52YWxpZFJlYXNvbiA9IGNvbmZpZy5pbnZhbGlkUmVhc29uIHx8IChOdW1iZXIuaXNOYU4oY29uZmlnLnRzKSA/IElOVkFMSURfSU5QVVQgOiBudWxsKSB8fCAoIXpvbmUuaXNWYWxpZCA/IFVOU1VQUE9SVEVEX1pPTkUgOiBudWxsKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy50cyA9IGlzVW5kZWZpbmVkKGNvbmZpZy50cykgPyBTZXR0aW5ncy5ub3coKSA6IGNvbmZpZy50cztcblxuICAgIHZhciBjID0gbnVsbCxcbiAgICAgICAgbyA9IG51bGw7XG4gICAgaWYgKCFpbnZhbGlkUmVhc29uKSB7XG4gICAgICB2YXIgdW5jaGFuZ2VkID0gY29uZmlnLm9sZCAmJiBjb25maWcub2xkLnRzID09PSB0aGlzLnRzICYmIGNvbmZpZy5vbGQuem9uZS5lcXVhbHMoem9uZSk7XG4gICAgICBjID0gdW5jaGFuZ2VkID8gY29uZmlnLm9sZC5jIDogdHNUb09iaih0aGlzLnRzLCB6b25lLm9mZnNldCh0aGlzLnRzKSk7XG4gICAgICBvID0gdW5jaGFuZ2VkID8gY29uZmlnLm9sZC5vIDogem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMuem9uZSA9IHpvbmU7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWRSZWFzb247XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMud2Vla0RhdGEgPSBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLm8gPSBvO1xuICB9XG5cbiAgLy8gQ09OU1RSVUNUXG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbG9jYWwgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge251bWJlcn0geWVhciAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgbG9jYWwoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGhcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2hvdXI9MF0gLSBUaGUgaG91ciBvZiB0aGUgZGF5LCBpbiAyNC1ob3VyIHRpbWVcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbGxpc2Vjb25kPTBdIC0gVGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5OTlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyKSAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1XHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5sb2NhbCA9IGZ1bmN0aW9uIGxvY2FsKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IHRzOiBTZXR0aW5ncy5ub3coKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcclxuICAgKiBAcGFyYW0ge251bWJlcn0geWVhciAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUudXRjID0gZnVuY3Rpb24gdXRjKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgem9uZTogRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cclxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBhIEphdmFzY3JpcHQgRGF0ZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tSlNEYXRlID0gZnVuY3Rpb24gZnJvbUpTRGF0ZShkYXRlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICB0czogaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU4sXG4gICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoaS5lLiBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IG1pbGxpc2Vjb25kcyxcbiAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFyJyBhbmQgJ2hvdXInIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXIgLSBhIHllYXIsIHN1Y2ggYXMgMTk4N1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGggLSBhIG1vbnRoLCAxLTEyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm9yZGluYWwgLSBkYXkgb2YgdGhlIHllYXIsIDEtMzY1IG9yIDM2NlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla1llYXIgLSBhbiBJU08gd2VlayB5ZWFyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtkYXkgLSBhbiBJU08gd2Vla2RheSwgMS03LCB3aGVyZSAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXIgLSBob3VyIG9mIHRoZSBkYXksIDAtMjNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kIC0gc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAtNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kIC0gbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgMC05OTlcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb2JqLnpvbmU9J2xvY2FsJ10gLSBpbnRlcnByZXQgdGhlIG51bWJlcnMgaW4gdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIHpvbmUuIENhbiB0YWtlIGFueSB2YWx1ZSB0YWtlbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0Wm9uZSgpXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiwgbW9udGg6IDUsIGRheTogMjV9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTA1LTI1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDEtMDFUMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAndXRjJyB9KSxcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ2xvY2FsJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgd2Vla1llYXI6IDIwMTYsIHdlZWtOdW1iZXI6IDIsIHdlZWtkYXk6IDMgfSkudG9JU09EYXRlKCkgLy89PiAnMjAxNi0wMS0xMydcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIHZhciB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9iai56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKCF6b25lVG9Vc2UuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoVU5TVVBQT1JURURfWk9ORSk7XG4gICAgfVxuXG4gICAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmVUb1VzZS5vZmZzZXQodHNOb3cpLFxuICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgICBjb250YWluc0dyZWdvclllYXIgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC55ZWFyKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgICBkZWZpbml0ZVdlZWtEZWYgPSBub3JtYWxpemVkLndlZWtZZWFyIHx8IG5vcm1hbGl6ZWQud2Vla051bWJlcixcbiAgICAgICAgbG9jID0gTG9jYWxlLmZyb21PYmplY3Qob2JqKTtcblxuICAgIC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFsc1wiKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIHZhciB1c2VXZWVrRGF0YSA9IGRlZmluaXRlV2Vla0RlZiB8fCBub3JtYWxpemVkLndlZWtkYXkgJiYgIWNvbnRhaW5zR3JlZ29yO1xuXG4gICAgLy8gY29uZmlndXJlIG91cnNlbHZlcyB0byBkZWFsIHdpdGggZ3JlZ29yaWFuIGRhdGVzIG9yIHdlZWsgc3R1ZmZcbiAgICB2YXIgdW5pdHMgPSB2b2lkIDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXMgPSB2b2lkIDAsXG4gICAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG4gICAgaWYgKHVzZVdlZWtEYXRhKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRXZWVrVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFdlZWtVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9XZWVrKG9iak5vdyk7XG4gICAgfSBlbHNlIGlmIChjb250YWluc09yZGluYWwpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZE9yZGluYWxVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub09yZGluYWwob2JqTm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkVW5pdHMkMTtcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VW5pdFZhbHVlcztcbiAgICB9XG5cbiAgICAvLyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3Npbmcgc3R1ZmZcbiAgICB2YXIgZm91bmRGaXJzdCA9IGZhbHNlO1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSB1bml0cywgX2lzQXJyYXkyID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IyKSwgX2kyID0gMCwgX2l0ZXJhdG9yMiA9IF9pc0FycmF5MiA/IF9pdGVyYXRvcjIgOiBfaXRlcmF0b3IyW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjM7XG5cbiAgICAgIGlmIChfaXNBcnJheTIpIHtcbiAgICAgICAgaWYgKF9pMiA+PSBfaXRlcmF0b3IyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYzID0gX2l0ZXJhdG9yMltfaTIrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTIgPSBfaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgaWYgKF9pMi5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaTIudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB1ID0gX3JlZjM7XG5cbiAgICAgIHZhciB2ID0gbm9ybWFsaXplZFt1XTtcbiAgICAgIGlmICghaXNVbmRlZmluZWQodikpIHtcbiAgICAgICAgZm91bmRGaXJzdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZvdW5kRmlyc3QpIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IGRlZmF1bHRWYWx1ZXNbdV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gb2JqTm93W3VdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG4gICAgdmFyIGhpZ2hlck9yZGVySW52YWxpZCA9IHVzZVdlZWtEYXRhID8gaGFzSW52YWxpZFdlZWtEYXRhKG5vcm1hbGl6ZWQpIDogY29udGFpbnNPcmRpbmFsID8gaGFzSW52YWxpZE9yZGluYWxEYXRhKG5vcm1hbGl6ZWQpIDogaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEobm9ybWFsaXplZCksXG4gICAgICAgIGludmFsaWRSZWFzb24gPSBoaWdoZXJPcmRlckludmFsaWQgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG5vcm1hbGl6ZWQpO1xuXG4gICAgaWYgKGludmFsaWRSZWFzb24pIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWRSZWFzb24pO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG4gICAgdmFyIGdyZWdvcmlhbiA9IHVzZVdlZWtEYXRhID8gd2Vla1RvR3JlZ29yaWFuKG5vcm1hbGl6ZWQpIDogY29udGFpbnNPcmRpbmFsID8gb3JkaW5hbFRvR3JlZ29yaWFuKG5vcm1hbGl6ZWQpIDogbm9ybWFsaXplZCxcbiAgICAgICAgX29ialRvVFMyID0gb2JqVG9UUyhncmVnb3JpYW4sIG9mZnNldFByb3Zpcywgem9uZVRvVXNlKSxcbiAgICAgICAgdHNGaW5hbCA9IF9vYmpUb1RTMlswXSxcbiAgICAgICAgb2Zmc2V0RmluYWwgPSBfb2JqVG9UUzJbMV0sXG4gICAgICAgIGluc3QgPSBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IHRzRmluYWwsXG4gICAgICB6b25lOiB6b25lVG9Vc2UsXG4gICAgICBvOiBvZmZzZXRGaW5hbCxcbiAgICAgIGxvYzogbG9jXG4gICAgfSk7XG5cbiAgICAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcbiAgICBpZiAobm9ybWFsaXplZC53ZWVrZGF5ICYmIGNvbnRhaW5zR3JlZ29yICYmIG9iai53ZWVrZGF5ICE9PSBpbnN0LndlZWtkYXkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKCdtaXNtYXRjaGVkIHdlZWtkYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdDtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJywge3pvbmU6ICd1dGMnfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LVcwNS00JylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgX3BhcnNlSVNPRGF0ZSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUlTT0RhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VJU09EYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignMjUgTm92IDIwMTYgMTM6MjM6MTIgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignVHVlLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVJGQzI4MjIgPSBmdW5jdGlvbiBmcm9tUkZDMjgyMih0ZXh0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZVJGQzI4MjJEYXRlID0gcGFyc2VSRkMyODIyRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZVJGQzI4MjJEYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlUkZDMjgyMkRhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIEhUVFAgaGVhZGVyIGRhdGVcclxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgSFRUUCBkYXRlcyBhcmUgYWx3YXlzIGluIFVUQywgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biBOb3YgIDYgMDg6NDk6MzcgMTk5NCcpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tSFRUUCA9IGZ1bmN0aW9uIGZyb21IVFRQKHRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgX3BhcnNlSFRUUERhdGUgPSBwYXJzZUhUVFBEYXRlKHRleHQpLFxuICAgICAgICB2YWxzID0gX3BhcnNlSFRUUERhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VIVFRQRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gaW5wdXQgc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXHJcbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIGRlc2NyaXB0aW9uKVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUZvcm1hdCA9IGZ1bmN0aW9uIGZyb21Gb3JtYXQodGV4dCwgZm10KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfb3B0aW9ucyRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfb3B0aW9ucyRsb2NhbGUsXG4gICAgICAgIF9vcHRpb25zJG51bWJlcmluZ1N5cyA9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfb3B0aW9ucyRudW1iZXJpbmdTeXMsXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBkZWZhdWx0VG9FTjogdHJ1ZSB9KSxcbiAgICAgICAgX3BhcnNlRnJvbVRva2VucyA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUZyb21Ub2tlbnNbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VGcm9tVG9rZW5zWzFdLFxuICAgICAgICBpbnZhbGlkUmVhc29uID0gX3BhcnNlRnJvbVRva2Vuc1syXTtcblxuICAgIGlmIChpbnZhbGlkUmVhc29uKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkUmVhc29uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nKHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycsIHsgc2V0Wm9uZTogdHJ1ZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcwOToxMjozNC4zNDInKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVNRTCA9IGZ1bmN0aW9uIGZyb21TUUwodGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBfcGFyc2VTUUwgPSBwYXJzZVNRTCh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZVNRTFswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVNRTFsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKHJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoeyBpbnZhbGlkUmVhc29uOiByZWFzb24gfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIElORk9cblxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCQkMSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbdW5pdF07XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBmcm9tIGludmFsaWQgY2FsZW5kYXIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIDEzdGggbW9udGggb3IgRmVicnVhcnkgMzBcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cclxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBmb3JtYXR0aW5nIG1ldGhvZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG4gIERhdGVUaW1lLnByb3RvdHlwZS5yZXNvbHZlZExvY2FsZU9wdHMgPSBmdW5jdGlvbiByZXNvbHZlZExvY2FsZU9wdHMoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgdmFyIF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcyA9IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIG9wdHMpLnJlc29sdmVkT3B0aW9ucyh0aGlzKSxcbiAgICAgICAgbG9jYWxlID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLmxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgY2FsZW5kYXIgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMuY2FsZW5kYXI7XG5cbiAgICByZXR1cm4geyBsb2NhbGU6IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhciB9O1xuICB9O1xuXG4gIC8vIFRSQU5TRk9STVxuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIHNldFpvbmV9KCd1dGMnKVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9VVEMgPSBmdW5jdGlvbiB0b1VUQygpIHtcbiAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8gYHNldFpvbmUoJ2xvY2FsJylgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9Mb2NhbCA9IGZ1bmN0aW9uIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShuZXcgTG9jYWxab25lKCkpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqXHJcbiAgICogQnkgZGVmYXVsdCwgdGhlIHNldHRlciBrZWVwcyB0aGUgdW5kZXJseWluZyB0aW1lIHRoZSBzYW1lIChhcyBpbiwgdGhlIHNhbWUgVVRDIHRpbWVzdGFtcCksIGJ1dCB0aGUgbmV3IGluc3RhbmNlIHdpbGwgcmVwb3J0IGRpZmZlcmVudCBsb2NhbCB0aW1lcyBhbmQgY29uc2lkZXIgRFNUcyB3aGVuIG1ha2luZyBjb21wdXRhdGlvbnMsIGFzIHdpdGgge0BsaW5rIHBsdXN9LiBZb3UgbWF5IHdpc2ggdG8gdXNlIHtAbGluayB0b0xvY2FsfSBhbmQge0BsaW5rIHRvVVRDfSB3aGljaCBwcm92aWRlIHNpbXBsZSBjb252ZW5pZW5jZSB3cmFwcGVycyBmb3IgY29tbW9ubHkgdXNlZCB6b25lcy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbem9uZT0nbG9jYWwnXSAtIGEgem9uZSBpZGVudGlmaWVyLiBBcyBhIHN0cmluZywgdGhhdCBjYW4gYmUgYW55IElBTkEgem9uZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgZW52aXJvbm1lbnQsIG9yIGEgZml4ZWQtb2Zmc2V0IG5hbWUgb2YgdGhlIGZvcm0gJ3V0YyszJywgb3IgdGhlIHN0cmluZ3MgJ2xvY2FsJyBvciAndXRjJy4gWW91IG1heSBhbHNvIHN1cHBseSBhbiBpbnN0YW5jZSBvZiBhIHtAbGluayBab25lfSBjbGFzcy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmtlZXBMb2NhbFRpbWU9ZmFsc2VdIC0gSWYgdHJ1ZSwgYWRqdXN0IHRoZSB1bmRlcmx5aW5nIHRpbWUgc28gdGhhdCB0aGUgbG9jYWwgdGltZSBzdGF5cyB0aGUgc2FtZSwgYnV0IGluIHRoZSB0YXJnZXQgem9uZS4gWW91IHNob3VsZCByYXJlbHkgbmVlZCB0aGlzLlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnNldFpvbmUgPSBmdW5jdGlvbiBzZXRab25lKHpvbmUpIHtcbiAgICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmNCRrZWVwTG9jYWxUaW1lID0gX3JlZjQua2VlcExvY2FsVGltZSxcbiAgICAgICAga2VlcExvY2FsVGltZSA9IF9yZWY0JGtlZXBMb2NhbFRpbWUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjQka2VlcExvY2FsVGltZSxcbiAgICAgICAgX3JlZjQka2VlcENhbGVuZGFyVGltID0gX3JlZjQua2VlcENhbGVuZGFyVGltZSxcbiAgICAgICAga2VlcENhbGVuZGFyVGltZSA9IF9yZWY0JGtlZXBDYWxlbmRhclRpbSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmNCRrZWVwQ2FsZW5kYXJUaW07XG5cbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKHpvbmUuZXF1YWxzKHRoaXMuem9uZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoIXpvbmUuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoVU5TVVBQT1JURURfWk9ORSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdUUyA9IGtlZXBMb2NhbFRpbWUgfHwga2VlcENhbGVuZGFyVGltZSAvLyBrZWVwQ2FsZW5kYXJUaW1lIGlzIHRoZSBkZXByZWNhdGVkIG5hbWUgZm9yIGtlZXBMb2NhbFRpbWVcbiAgICAgID8gdGhpcy50cyArICh0aGlzLm8gLSB6b25lLm9mZnNldCh0aGlzLnRzKSkgKiA2MCAqIDEwMDAgOiB0aGlzLnRzO1xuICAgICAgcmV0dXJuIGNsb25lJDEodGhpcywgeyB0czogbmV3VFMsIHpvbmU6IHpvbmUgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gdGhlIHByb3BlcnRpZXMgdG8gc2V0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZSgpIHtcbiAgICB2YXIgX3JlZjUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY1Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmNS5vdXRwdXRDYWxlbmRhcjtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXI6IG91dHB1dENhbGVuZGFyIH0pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHsgbG9jOiBsb2MgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogSnVzdCBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIHJlY29uZmlndXJlKHsgbG9jYWxlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnNldExvY2FsZSA9IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogbG9jYWxlIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQgdW5pdHMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKiBZb3UgY2FuIG9ubHkgc2V0IHVuaXRzIHdpdGggdGhpcyBtZXRob2Q7IGZvciBcInNldHRpbmdcIiBtZXRhZGF0YSwgc2VlIHtAbGluayByZWNvbmZpZ3VyZX0gYW5kIHtAbGluayBzZXRab25lfS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDE3IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgaG91cjogOCwgbWludXRlOiAzMCB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHdlZWtkYXk6IDUgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDA1LCBvcmRpbmFsOiAyMzQgfSlcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQkJDEodmFsdWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgICAgc2V0dGluZ1dlZWtTdHVmZiA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtZZWFyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrTnVtYmVyKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrZGF5KTtcblxuICAgIHZhciBtaXhlZCA9IHZvaWQgMDtcbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCkpIHtcbiAgICAgIG1peGVkID0gb3JkaW5hbFRvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWl4ZWQgPSBPYmplY3QuYXNzaWduKHRoaXMudG9PYmplY3QoKSwgbm9ybWFsaXplZCk7XG5cbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX29ialRvVFMzID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpLFxuICAgICAgICB0cyA9IF9vYmpUb1RTM1swXSxcbiAgICAgICAgbyA9IF9vYmpUb1RTM1sxXTtcblxuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHsgdHM6IHRzLCBvOiBvIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXHJcbiAgICpcclxuICAgKiBBZGRpbmcgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG9yIG1pbGxpc2Vjb25kcyBpbmNyZWFzZXMgdGhlIHRpbWVzdGFtcCBieSB0aGUgcmlnaHQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gQWRkaW5nIGRheXMsIG1vbnRocywgb3IgeWVhcnMgc2hpZnRzIHRoZSBjYWxlbmRhciwgYWNjb3VudGluZyBmb3IgRFNUcyBhbmQgbGVhcCB5ZWFycyBhbG9uZyB0aGUgd2F5LiBUaHVzLCBgZHQucGx1cyh7IGhvdXJzOiAyNCB9KWAgbWF5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0aW1lIHRoYW4gYGR0LnBsdXMoeyBkYXlzOiAxIH0pYCBpZiB0aGVyZSdzIGEgRFNUIHNoaWZ0IGluIGJldHdlZW4uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cygxMjMpIC8vfj4gaW4gMTIzIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAtMSB9KSAvL34+IHRoaXMgdGltZSB5ZXN0ZXJkYXlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBTdWJ0cmFjdCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXHJcbiAgICogU2VlIHtAbGluayBwbHVzfVxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLm1pbnVzID0gZnVuY3Rpb24gbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLm5lZ2F0ZSgpO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgYmVnaW5uaW5nIG9mLiBDYW4gYmUgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd5ZWFyJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDEtMDEnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2RheScpLnRvSVNPVGltZSgpOyAvLz0+ICcwMDowMC4wMDAtMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnN0YXJ0T2YgPSBmdW5jdGlvbiBzdGFydE9mKHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG8gPSB7fSxcbiAgICAgICAgbm9ybWFsaXplZFVuaXQgPSBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpO1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFVuaXQpIHtcbiAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgby5tb250aCA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdxdWFydGVycyc6XG4gICAgICBjYXNlICdtb250aHMnOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgby5taW51dGUgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIG8uc2Vjb25kID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gJ3dlZWtzJykge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09ICdxdWFydGVycycpIHtcbiAgICAgIHZhciBxID0gTWF0aC5jZWlsKHRoaXMubW9udGggLyAzKTtcbiAgICAgIG8ubW9udGggPSAocSAtIDEpICogMyArIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0KG8pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgZW5kIChpLmUuIHRoZSBsYXN0IG1pbGxpc2Vjb25kKSBvZiBhIHVuaXQgb2YgdGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGVuZCBvZi4gQ2FuIGJlICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCdtb250aCcpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMzFUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd5ZWFyJykudG9JU08oKTsgLy89PiAnMjAxNC0xMi0zMVQyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLmVuZE9mKCdkYXknKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2hvdXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDA1OjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5lbmRPZiA9IGZ1bmN0aW9uIGVuZE9mKHVuaXQpIHtcbiAgICB2YXIgX3N0YXJ0T2YkcGx1cztcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnN0YXJ0T2YodW5pdCkucGx1cygoX3N0YXJ0T2YkcGx1cyA9IHt9LCBfc3RhcnRPZiRwbHVzW3VuaXRdID0gMSwgX3N0YXJ0T2YkcGx1cykpLm1pbnVzKDEpIDogdGhpcztcbiAgfTtcblxuICAvLyBPVVRQVVRcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXHJcbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNwZWNpZmljIGZvcm1hdCB0b2tlbnMgc3VwcG9ydGVkLlxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0cy5yb3VuZCAtIHJvdW5kIG51bWVyaWNhbCB2YWx1ZXNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGZtdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4oKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMsIGZtdCkgOiBJTlZBTElEJDI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXHJcbiAgICogVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIGJyb3dzZXItc3BlY2lmaWMsIGJ1dCBpbiBnZW5lcmFsIGl0IHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gICAqIG9mIHRoZSBEYXRlVGltZSBpbiB0aGUgYXNzaWduZWQgbG9jYWxlLlxyXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9uc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiA0LzIwLzIwMTdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5USU1FX1NJTVBMRSk7IC8vPT4gJzExOjMyIEFNJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURVRJTUVfU0hPUlQpOyAvLz0+ICc0LzIwLzIwMTcsIDExOjMyIEFNJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe3dlZWtkYXk6ICdsb25nJywgbW9udGg6ICdsb25nJywgZGF5OiAnMi1kaWdpdCd9KTsgLy89PiAnVGh1LCBBcHIgMjAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7d2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0J30pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7aG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0J30pOyAvLz0+ICcxMTozMidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogREFURV9TSE9SVDtcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZSh0aGlzKSA6IElOVkFMSUQkMjtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIGkuZS4gaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cclxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0L2Zvcm1hdFRvUGFydHNcclxuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiBbXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnZGF5JywgdmFsdWU6ICcyNScgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ21vbnRoJywgdmFsdWU6ICcwNScgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdsaXRlcmFsJywgdmFsdWU6ICcvJyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ3llYXInLCB2YWx1ZTogJzE5ODInIH1cclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gXVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWxlUGFydHMgPSBmdW5jdGlvbiB0b0xvY2FsZVBhcnRzKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpIDogW107XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPKCkgLy89PiAnMTk4Mi0wNS0yNVQwMDowMDowMC4wMDBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSVNPID0gZnVuY3Rpb24gdG9JU08oKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvSVNPRGF0ZSgpICsgJ1QnICsgdGhpcy50b0lTT1RpbWUob3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyBkYXRlIGNvbXBvbmVudFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9JU09EYXRlID0gZnVuY3Rpb24gdG9JU09EYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgJ3l5eXktTU0tZGQnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHdlZWsgZGF0ZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09XZWVrRGF0ZSgpIC8vPT4gJzE5ODItVzIxLTInXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSVNPV2Vla0RhdGUgPSBmdW5jdGlvbiB0b0lTT1dlZWtEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJra2trLSdXJ1dXLWNcIik7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB0aW1lIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLmhvdXIoNykubWludXRlKDM0KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLmhvdXIoNykubWludXRlKDM0KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMDc6MzRaJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTT1RpbWUgPSBmdW5jdGlvbiB0b0lTT1RpbWUoKSB7XG4gICAgdmFyIF9yZWY2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgX3JlZjYkc3VwcHJlc3NNaWxsaXNlID0gX3JlZjYuc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gX3JlZjYkc3VwcHJlc3NNaWxsaXNlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY2JHN1cHByZXNzTWlsbGlzZSxcbiAgICAgICAgX3JlZjYkc3VwcHJlc3NTZWNvbmRzID0gX3JlZjYuc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgICBzdXBwcmVzc1NlY29uZHMgPSBfcmVmNiRzdXBwcmVzc1NlY29uZHMgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjYkc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgICBfcmVmNiRpbmNsdWRlT2Zmc2V0ID0gX3JlZjYuaW5jbHVkZU9mZnNldCxcbiAgICAgICAgaW5jbHVkZU9mZnNldCA9IF9yZWY2JGluY2x1ZGVPZmZzZXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmNiRpbmNsdWRlT2Zmc2V0O1xuXG4gICAgcmV0dXJuIHRvVGVjaFRpbWVGb3JtYXQodGhpcywgeyBzdXBwcmVzc1NlY29uZHM6IHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHM6IHN1cHByZXNzTWlsbGlzZWNvbmRzLCBpbmNsdWRlT2Zmc2V0OiBpbmNsdWRlT2Zmc2V0IH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gUkZDIDI4MjItY29tcGF0aWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSwgYWx3YXlzIGluIFVUQ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCAtMDQwMCdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9SRkMyODIyID0gZnVuY3Rpb24gdG9SRkMyODIyKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgJ0VFRSwgZGQgTExMIHl5eXkgaGg6bW06c3MgWlpaJyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSFRUUCBoZWFkZXJzLlxyXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHN0cmluZyBjb25mb3JtcyB0byBSRkMgMTEyMy5cclxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCBHTVQnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzLCAxOSkudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAxOTowMDowMCBHTVQnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSFRUUCA9IGZ1bmN0aW9uIHRvSFRUUCgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMudG9VVEMoKSwgXCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnXCIpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b1NRTERhdGUgPSBmdW5jdGlvbiB0b1NRTERhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCAneXl5eS1NTS1kZCcpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcmlkZXMgaW5jbHVkZU9mZnNldC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b1NRTFRpbWUgPSBmdW5jdGlvbiB0b1NRTFRpbWUoKSB7XG4gICAgdmFyIF9yZWY3ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgX3JlZjckaW5jbHVkZU9mZnNldCA9IF9yZWY3LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNyRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjckaW5jbHVkZU9mZnNldCxcbiAgICAgICAgX3JlZjckaW5jbHVkZVpvbmUgPSBfcmVmNy5pbmNsdWRlWm9uZSxcbiAgICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmNyRpbmNsdWRlWm9uZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmNyRpbmNsdWRlWm9uZTtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHsgaW5jbHVkZU9mZnNldDogaW5jbHVkZU9mZnNldCwgaW5jbHVkZVpvbmU6IGluY2x1ZGVab25lLCBzcGFjZVpvbmU6IHRydWUgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcnJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIC0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUwgPSBmdW5jdGlvbiB0b1NRTCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudG9TUUxEYXRlKCkgKyAnICcgKyB0aGlzLnRvU1FMVGltZShvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvSVNPKCkgOiBJTlZBTElEJDI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB0aGUgUkVQTC5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuICdEYXRlVGltZSB7XFxuICB0czogJyArIHRoaXMudG9JU08oKSArICcsXFxuICB6b25lOiAnICsgdGhpcy56b25lLm5hbWUgKyAnLFxcbiAgbG9jYWxlOiAnICsgdGhpcy5sb2NhbGUgKyAnIH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ0RhdGVUaW1lIHsgSW52YWxpZCwgcmVhc29uOiAnICsgdGhpcy5pbnZhbGlkUmVhc29uICsgJyB9JztcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9NaWxsaXMgPSBmdW5jdGlvbiB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgQlNPTiBzZXJpYWxpemFibGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge0RhdGV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9CU09OID0gZnVuY3Rpb24gdG9CU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSlNEYXRlKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEYXRlVGltZSdzIHllYXIsIG1vbnRoLCBkYXksIGFuZCBzbyBvbi5cclxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b09iamVjdCgpIC8vPT4geyB5ZWFyOiAyMDE3LCBtb250aDogNCwgZGF5OiAyMiwgaG91cjogMjAsIG1pbnV0ZTogNDksIHNlY29uZDogNDIsIG1pbGxpc2Vjb25kOiAyNjggfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uIHRvT2JqZWN0KCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICB2YXIgYmFzZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLm91dHB1dENhbGVuZGFyID0gdGhpcy5vdXRwdXRDYWxlbmRhcjtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IERhdGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge0RhdGV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9KU0RhdGUgPSBmdW5jdGlvbiB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH07XG5cbiAgLy8gQ09NUEFSRVxuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciBhcnJheSBvZiB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcclxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XHJcbiAgICogaTIuZGlmZihpMSkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA0MzgwNzUwMDAwMCB9XHJcbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJywgJ2hvdXJzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LCBob3VyczogMC43NSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIGRpZmYob3RoZXJEYXRlVGltZSkge1xuICAgIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnbWlsbGlzZWNvbmRzJztcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24gfHwgb3RoZXJEYXRlVGltZS5pbnZhbGlkUmVhc29uKTtcblxuICAgIHZhciB1bml0cyA9IG1heWJlQXJyYXkodW5pdCkubWFwKER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICAgIGxhdGVyID0gb3RoZXJJc0xhdGVyID8gb3RoZXJEYXRlVGltZSA6IHRoaXMsXG4gICAgICAgIGRpZmZlZCA9IF9kaWZmKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cyk7XG5cbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgRGF0ZVRpbWUgYW5kIHJpZ2h0IG5vdy5cclxuICAgKiBTZWUge0BsaW5rIGRpZmZ9XHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5kaWZmTm93ID0gZnVuY3Rpb24gZGlmZk5vdygpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ21pbGxpc2Vjb25kcyc7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuZGlmZihEYXRlVGltZS5sb2NhbCgpLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudW50aWwgPSBmdW5jdGlvbiB1bnRpbChvdGhlckRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEludGVydmFsLmZyb21EYXRlVGltZXModGhpcywgb3RoZXJEYXRlVGltZSkgOiB0aGlzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgRGF0ZVRpbWUgaXMgaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lIGFzIGFub3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIG90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5oYXNTYW1lKG90aGVyRFQsICdkYXknKTsgLy9+PiB0cnVlIGlmIGJvdGggdGhlIHNhbWUgY2FsZW5kYXIgZGF5XHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5oYXNTYW1lID0gZnVuY3Rpb24gaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodW5pdCA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodW5pdCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuZW5kT2YodW5pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIEVxdWFsaXR5IGNoZWNrXHJcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXIgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgJiYgb3RoZXIuaXNWYWxpZCAmJiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmIHRoaXMuem9uZS5lcXVhbHMob3RoZXIuem9uZSkgJiYgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXHJcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWluaW11bVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfSB0aGUgbWluIERhdGVUaW1lLCBvciB1bmRlZmluZWQgaWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLm1pbiA9IGZ1bmN0aW9uIG1pbigpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBkYXRlVGltZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RCeShkYXRlVGltZXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaS52YWx1ZU9mKCk7XG4gICAgfSwgTWF0aC5taW4pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWF4IG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5tYXggPSBmdW5jdGlvbiBtYXgoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RCeShkYXRlVGltZXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaS52YWx1ZU9mKCk7XG4gICAgfSwgTWF0aC5tYXgpO1xuICB9O1xuXG4gIC8vIE1JU0NcblxuICAvKipcclxuICAgKiBFeHBsYWluIGhvdyBhIHN0cmluZyB3b3VsZCBiZSBwYXJzZWQgYnkgZnJvbUZvcm1hdCgpXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIGRlc2NyaXB0aW9uKVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0YWtlbiBieSBmcm9tRm9ybWF0KClcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tRm9ybWF0RXhwbGFpbiA9IGZ1bmN0aW9uIGZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICB2YXIgX29wdGlvbnMkbG9jYWxlMiA9IG9wdGlvbnMubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfb3B0aW9ucyRsb2NhbGUyID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlMixcbiAgICAgICAgX29wdGlvbnMkbnVtYmVyaW5nU3lzMiA9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucyRudW1iZXJpbmdTeXMyID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbnVtYmVyaW5nU3lzMixcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoeyBsb2NhbGU6IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sIGRlZmF1bHRUb0VOOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0RXhwbGFpbiBpbnN0ZWFkXHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU3RyaW5nRXhwbGFpbiA9IGZ1bmN0aW9uIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXHJcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXHJcbiAgICogQHR5cGUge09iamVjdH1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKERhdGVUaW1lLCBbe1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbiA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ludmFsaWRSZWFzb24nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9jYWxlIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2VuLUdCJy4gVGhlIGxvY2FsZSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2xvY2FsZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdudW1iZXJpbmdTeXN0ZW0nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ291dHB1dENhbGVuZGFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgem9uZS5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnem9uZU5hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS5uYW1lIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgeWVhclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3llYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncXVhcnRlcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gTWF0aC5jZWlsKHRoaXMuYy5tb250aCAvIDMpIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbW9udGggKDEtMTIpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm1vbnRoIC8vPT4gNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoICgxLTMwaXNoKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkYXknLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5kYXkgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSkuaG91ciAvLz0+IDlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaG91cicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmhvdXIgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbnV0ZSBvZiB0aGUgaG91ciAoMC01OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzApLm1pbnV0ZSAvLz0+IDMwXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ21pbnV0ZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2Vjb25kIG9mIHRoZSBtaW51dGUgKDAtNTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2Vjb25kJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuc2Vjb25kIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyLCA2NTQpLm1pbGxpc2Vjb25kIC8vPT4gNjU0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ21pbGxpc2Vjb25kJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWlsbGlzZWNvbmQgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWsgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd3ZWVrWWVhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrWWVhciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS53ZWVrTnVtYmVyIC8vPT4gMjFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla051bWJlcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuXHJcbiAgICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrZGF5IC8vPT4gNFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd3ZWVrZGF5JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG9yZGluYWwgKGkuZS4gdGhlIGRheSBvZiB0aGUgeWVhcilcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfERhdGVUaW1lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29yZGluYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLm9yZGluYWwgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhTaG9ydCAvLz0+IE9jdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aFNob3J0JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocygnc2hvcnQnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy5tb250aCAtIDFdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aExvbmcgLy89PiBPY3RvYmVyXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ21vbnRoTG9uZycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoJ2xvbmcnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy5tb250aCAtIDFdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheVNob3J0JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KVt0aGlzLndlZWtkYXkgLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5TG9uZyAvLz0+IE1vbmRheVxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd3ZWVrZGF5TG9uZycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cygnbG9uZycsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KVt0aGlzLndlZWtkYXkgLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLm9mZnNldCAvLz0+IC0yNDBcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLm9mZnNldCAvLz0+IDBcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2Zmc2V0JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUub2Zmc2V0KHRoaXMudHMpIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzaG9ydCBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVTVFwiIG9yIFwiRURUXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2Zmc2V0TmFtZVNob3J0JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMsIHtcbiAgICAgICAgICBmb3JtYXQ6ICdzaG9ydCcsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBsb25nIGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRWFzdGVybiBTdGFuZGFyZCBUaW1lXCIgb3IgXCJFYXN0ZXJuIERheWxpZ2h0IFRpbWVcIi5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvZmZzZXROYW1lTG9uZycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiAnbG9uZycsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgdGhpcyB6b25lJ3Mgb2Zmc2V0IGV2ZXIgY2hhbmdlcywgYXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc09mZnNldEZpeGVkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUudW5pdmVyc2FsIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2lzSW5EU1QnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiAxIH0pLm9mZnNldCB8fCB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHsgbW9udGg6IDUgfSkub2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW4gYSBsZWFwIHllYXIsIGZhbHNlIG90aGVyd2lzZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykuaXNJbkxlYXBZZWFyIC8vPT4gZmFsc2VcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2lzSW5MZWFwWWVhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIG1vbnRoXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAyKS5kYXlzSW5Nb250aCAvLz0+IDI5XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAzKS5kYXlzSW5Nb250aCAvLz0+IDMxXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXNJbk1vbnRoJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmRheXNJblllYXIgLy89PiAzNjZcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmRheXNJblllYXIgLy89PiAzNjVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGF5c0luWWVhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdlZWtzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMDQpLndlZWtzSW5XZWVrWWVhciAvLz0+IDUzXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS53ZWVrc0luV2Vla1llYXIgLy89PiA1MlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd3ZWVrc0luV2Vla1llYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ0RBVEVfU0hPUlQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVfU0hPUlQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVfTUVEJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFX01FRDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVfRlVMTCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9GVUxMO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnVHVlc2RheSwgT2N0b2JlciAxNCwgMTk4MydcclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURV9IVUdFJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFX0hVR0U7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FX1NJTVBMRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV9TSU1QTEU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FX1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX1NIT1JUX09GRlNFVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FX1dJVEhfTE9OR19PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfMjRfU0lNUExFJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1NJTVBMRTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfMjRfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0VDT05EUztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfMjRfV0lUSF9MT05HX09GRlNFVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9TSE9SVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX01FRCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9GVUxMJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9GVUxMO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMDMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfSFVHRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfSFVHRTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRGF0ZVRpbWU7XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseURhdGVUaW1lKGRhdGVUaW1laXNoKSB7XG4gIGlmIChkYXRlVGltZWlzaCBpbnN0YW5jZW9mIERhdGVUaW1lKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1laXNoO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoLnZhbHVlT2YgJiYgaXNOdW1iZXIoZGF0ZVRpbWVpc2gudmFsdWVPZigpKSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tT2JqZWN0KGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Vua25vd24gZGF0ZXRpbWUgYXJndW1lbnQnKTtcbiAgfVxufVxuXG5leHBvcnRzLkRhdGVUaW1lID0gRGF0ZVRpbWU7XG5leHBvcnRzLkR1cmF0aW9uID0gRHVyYXRpb247XG5leHBvcnRzLkludGVydmFsID0gSW50ZXJ2YWw7XG5leHBvcnRzLkluZm8gPSBJbmZvO1xuZXhwb3J0cy5ab25lID0gWm9uZTtcbmV4cG9ydHMuRml4ZWRPZmZzZXRab25lID0gRml4ZWRPZmZzZXRab25lO1xuZXhwb3J0cy5JQU5BWm9uZSA9IElBTkFab25lO1xuZXhwb3J0cy5Mb2NhbFpvbmUgPSBMb2NhbFpvbmU7XG5leHBvcnRzLlNldHRpbmdzID0gU2V0dGluZ3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sdXhvbi5qcy5tYXBcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJmdW5jdGlvbiBBZ2VudCgpIHtcbiAgdGhpcy5fZGVmYXVsdHMgPSBbXTtcbn1cblxuW1widXNlXCIsIFwib25cIiwgXCJvbmNlXCIsIFwic2V0XCIsIFwicXVlcnlcIiwgXCJ0eXBlXCIsIFwiYWNjZXB0XCIsIFwiYXV0aFwiLCBcIndpdGhDcmVkZW50aWFsc1wiLCBcInNvcnRRdWVyeVwiLCBcInJldHJ5XCIsIFwib2tcIiwgXCJyZWRpcmVjdHNcIixcbiBcInRpbWVvdXRcIiwgXCJidWZmZXJcIiwgXCJzZXJpYWxpemVcIiwgXCJwYXJzZVwiLCBcImNhXCIsIFwia2V5XCIsIFwicGZ4XCIsIFwiY2VydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7XG4gIC8qKiBEZWZhdWx0IHNldHRpbmcgZm9yIGFsbCByZXF1ZXN0cyBmcm9tIHRoaXMgYWdlbnQgKi9cbiAgQWdlbnQucHJvdG90eXBlW2ZuXSA9IGZ1bmN0aW9uKC8qdmFyYXJncyovKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMucHVzaCh7Zm46Zm4sIGFyZ3VtZW50czphcmd1bWVudHN9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7XG5cbkFnZW50LnByb3RvdHlwZS5fc2V0RGVmYXVsdHMgPSBmdW5jdGlvbihyZXEpIHtcbiAgICB0aGlzLl9kZWZhdWx0cy5mb3JFYWNoKGZ1bmN0aW9uKGRlZikge1xuICAgICAgcmVxW2RlZi5mbl0uYXBwbHkocmVxLCBkZWYuYXJndW1lbnRzKTtcbiAgICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQWdlbnQ7XG4iLCIvKipcbiAqIFJvb3QgcmVmZXJlbmNlIGZvciBpZnJhbWVzLlxuICovXG5cbnZhciByb290O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IC8vIEJyb3dzZXIgd2luZG93XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyAvLyBXZWIgV29ya2VyXG4gIHJvb3QgPSBzZWxmO1xufSBlbHNlIHsgLy8gT3RoZXIgZW52aXJvbm1lbnRzXG4gIGNvbnNvbGUud2FybihcIlVzaW5nIGJyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG4gIHJvb3QgPSB0aGlzO1xufVxuXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2NvbXBvbmVudC1lbWl0dGVyJyk7XG52YXIgUmVxdWVzdEJhc2UgPSByZXF1aXJlKCcuL3JlcXVlc3QtYmFzZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pcy1vYmplY3QnKTtcbnZhciBSZXNwb25zZUJhc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlLWJhc2UnKTtcbnZhciBBZ2VudCA9IHJlcXVpcmUoJy4vYWdlbnQtYmFzZScpO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpe307XG5cbi8qKlxuICogRXhwb3NlIGByZXF1ZXN0YC5cbiAqL1xuXG52YXIgcmVxdWVzdCA9IGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1ldGhvZCwgdXJsKSB7XG4gIC8vIGNhbGxiYWNrXG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiB1cmwpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKS5lbmQodXJsKTtcbiAgfVxuXG4gIC8vIHVybCBmaXJzdFxuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdChtZXRob2QsIHVybCk7XG59XG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRGV0ZXJtaW5lIFhIUi5cbiAqL1xuXG5yZXF1ZXN0LmdldFhIUiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHJvb3QuWE1MSHR0cFJlcXVlc3RcbiAgICAgICYmICghcm9vdC5sb2NhdGlvbiB8fCAnZmlsZTonICE9IHJvb3QubG9jYXRpb24ucHJvdG9jb2xcbiAgICAgICAgICB8fCAhcm9vdC5BY3RpdmVYT2JqZWN0KSkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUC42LjAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuMy4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2goZSkge31cbiAgfVxuICB0aHJvdyBFcnJvcihcIkJyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgY291bGQgbm90IGZpbmQgWEhSXCIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGFkZGVkIHRvIHN1cHBvcnQgSUUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciB0cmltID0gJycudHJpbVxuICA/IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMudHJpbSgpOyB9XG4gIDogZnVuY3Rpb24ocykgeyByZXR1cm4gcy5yZXBsYWNlKC8oXlxccyp8XFxzKiQpL2csICcnKTsgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGdpdmVuIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZShvYmopIHtcbiAgaWYgKCFpc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIG9ialtrZXldKTtcbiAgfVxuICByZXR1cm4gcGFpcnMuam9pbignJicpO1xufVxuXG4vKipcbiAqIEhlbHBzICdzZXJpYWxpemUnIHdpdGggc2VyaWFsaXppbmcgYXJyYXlzLlxuICogTXV0YXRlcyB0aGUgcGFpcnMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcGFpcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICovXG5cbmZ1bmN0aW9uIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIHZhbCkge1xuICBpZiAodmFsICE9IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YWwuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIHYpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBmb3IodmFyIHN1YmtleSBpbiB2YWwpIHtcbiAgICAgICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSArICdbJyArIHN1YmtleSArICddJywgdmFsW3N1YmtleV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYWlycy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpXG4gICAgICAgICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICBwYWlycy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9zZSBzZXJpYWxpemF0aW9uIG1ldGhvZC5cbiAqL1xuXG5yZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdCA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gICogUGFyc2UgdGhlIGdpdmVuIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBgc3RyYC5cbiAgKlxuICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICogQGFwaSBwcml2YXRlXG4gICovXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHN0cikge1xuICB2YXIgb2JqID0ge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdCgnJicpO1xuICB2YXIgcGFpcjtcbiAgdmFyIHBvcztcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBwYWlyID0gcGFpcnNbaV07XG4gICAgcG9zID0gcGFpci5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHBvcyA9PSAtMSkge1xuICAgICAgb2JqW2RlY29kZVVSSUNvbXBvbmVudChwYWlyKV0gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2RlY29kZVVSSUNvbXBvbmVudChwYWlyLnNsaWNlKDAsIHBvcykpXSA9XG4gICAgICAgIGRlY29kZVVSSUNvbXBvbmVudChwYWlyLnNsaWNlKHBvcyArIDEpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEV4cG9zZSBwYXJzZXIuXG4gKi9cblxucmVxdWVzdC5wYXJzZVN0cmluZyA9IHBhcnNlU3RyaW5nO1xuXG4vKipcbiAqIERlZmF1bHQgTUlNRSB0eXBlIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC50eXBlcy54bWwgPSAnYXBwbGljYXRpb24veG1sJztcbiAqXG4gKi9cblxucmVxdWVzdC50eXBlcyA9IHtcbiAgaHRtbDogJ3RleHQvaHRtbCcsXG4gIGpzb246ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgeG1sOiAndGV4dC94bWwnLFxuICB1cmxlbmNvZGVkOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgJ2Zvcm0nOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgJ2Zvcm0tZGF0YSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7XG4gKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBzZXJpYWxpemUsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5zdHJpbmdpZnlcbn07XG5cbi8qKlxuICAqIERlZmF1bHQgcGFyc2Vycy5cbiAgKlxuICAqICAgICBzdXBlcmFnZW50LnBhcnNlWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKHN0cil7XG4gICogICAgICAgcmV0dXJuIHsgb2JqZWN0IHBhcnNlZCBmcm9tIHN0ciB9O1xuICAqICAgICB9O1xuICAqXG4gICovXG5cbnJlcXVlc3QucGFyc2UgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBwYXJzZVN0cmluZyxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnBhcnNlXG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBoZWFkZXIgYHN0cmAgaW50b1xuICogYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXIoc3RyKSB7XG4gIHZhciBsaW5lcyA9IHN0ci5zcGxpdCgvXFxyP1xcbi8pO1xuICB2YXIgZmllbGRzID0ge307XG4gIHZhciBpbmRleDtcbiAgdmFyIGxpbmU7XG4gIHZhciBmaWVsZDtcbiAgdmFyIHZhbDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsaW5lID0gbGluZXNbaV07XG4gICAgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7IC8vIGNvdWxkIGJlIGVtcHR5IGxpbmUsIGp1c3Qgc2tpcCBpdFxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZpZWxkID0gbGluZS5zbGljZSgwLCBpbmRleCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB0cmltKGxpbmUuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgZmllbGRzW2ZpZWxkXSA9IHZhbDtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG1pbWVgIGlzIGpzb24gb3IgaGFzICtqc29uIHN0cnVjdHVyZWQgc3ludGF4IHN1ZmZpeC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzSlNPTihtaW1lKSB7XG4gIC8vIHNob3VsZCBtYXRjaCAvanNvbiBvciAranNvblxuICAvLyBidXQgbm90IC9qc29uLXNlcVxuICByZXR1cm4gL1tcXC8rXWpzb24oJHxbXi1cXHddKS8udGVzdChtaW1lKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZWAgd2l0aCB0aGUgZ2l2ZW4gYHhocmAuXG4gKlxuICogIC0gc2V0IGZsYWdzICgub2ssIC5lcnJvciwgZXRjKVxuICogIC0gcGFyc2UgaGVhZGVyXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIEFsaWFzaW5nIGBzdXBlcmFnZW50YCBhcyBgcmVxdWVzdGAgaXMgbmljZTpcbiAqXG4gKiAgICAgIHJlcXVlc3QgPSBzdXBlcmFnZW50O1xuICpcbiAqICBXZSBjYW4gdXNlIHRoZSBwcm9taXNlLWxpa2UgQVBJLCBvciBwYXNzIGNhbGxiYWNrczpcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJykuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJywgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgU2VuZGluZyBkYXRhIGNhbiBiZSBjaGFpbmVkOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5zZW5kKClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIE9yIHBhc3NlZCB0byBgLnBvc3QoKWA6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIE9yIGZ1cnRoZXIgcmVkdWNlZCB0byBhIHNpbmdsZSBjYWxsIGZvciBzaW1wbGUgY2FzZXM6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogQHBhcmFtIHtYTUxIVFRQUmVxdWVzdH0geGhyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2UocmVxKSB7XG4gIHRoaXMucmVxID0gcmVxO1xuICB0aGlzLnhociA9IHRoaXMucmVxLnhocjtcbiAgLy8gcmVzcG9uc2VUZXh0IGlzIGFjY2Vzc2libGUgb25seSBpZiByZXNwb25zZVR5cGUgaXMgJycgb3IgJ3RleHQnIGFuZCBvbiBvbGRlciBicm93c2Vyc1xuICB0aGlzLnRleHQgPSAoKHRoaXMucmVxLm1ldGhvZCAhPSdIRUFEJyAmJiAodGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAnJyB8fCB0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JykpIHx8IHR5cGVvZiB0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICd1bmRlZmluZWQnKVxuICAgICA/IHRoaXMueGhyLnJlc3BvbnNlVGV4dFxuICAgICA6IG51bGw7XG4gIHRoaXMuc3RhdHVzVGV4dCA9IHRoaXMucmVxLnhoci5zdGF0dXNUZXh0O1xuICB2YXIgc3RhdHVzID0gdGhpcy54aHIuc3RhdHVzO1xuICAvLyBoYW5kbGUgSUU5IGJ1ZzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDA0Njk3Mi9tc2llLXJldHVybnMtc3RhdHVzLWNvZGUtb2YtMTIyMy1mb3ItYWpheC1yZXF1ZXN0XG4gIGlmIChzdGF0dXMgPT09IDEyMjMpIHtcbiAgICBzdGF0dXMgPSAyMDQ7XG4gIH1cbiAgdGhpcy5fc2V0U3RhdHVzUHJvcGVydGllcyhzdGF0dXMpO1xuICB0aGlzLmhlYWRlciA9IHRoaXMuaGVhZGVycyA9IHBhcnNlSGVhZGVyKHRoaXMueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTtcbiAgLy8gZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIHNvbWV0aW1lcyBmYWxzZWx5IHJldHVybnMgXCJcIiBmb3IgQ09SUyByZXF1ZXN0cywgYnV0XG4gIC8vIGdldFJlc3BvbnNlSGVhZGVyIHN0aWxsIHdvcmtzLiBzbyB3ZSBnZXQgY29udGVudC10eXBlIGV2ZW4gaWYgZ2V0dGluZ1xuICAvLyBvdGhlciBoZWFkZXJzIGZhaWxzLlxuICB0aGlzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSB0aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcignY29udGVudC10eXBlJyk7XG4gIHRoaXMuX3NldEhlYWRlclByb3BlcnRpZXModGhpcy5oZWFkZXIpO1xuXG4gIGlmIChudWxsID09PSB0aGlzLnRleHQgJiYgcmVxLl9yZXNwb25zZVR5cGUpIHtcbiAgICB0aGlzLmJvZHkgPSB0aGlzLnhoci5yZXNwb25zZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmJvZHkgPSB0aGlzLnJlcS5tZXRob2QgIT0gJ0hFQUQnXG4gICAgICA/IHRoaXMuX3BhcnNlQm9keSh0aGlzLnRleHQgPyB0aGlzLnRleHQgOiB0aGlzLnhoci5yZXNwb25zZSlcbiAgICAgIDogbnVsbDtcbiAgfVxufVxuXG5SZXNwb25zZUJhc2UoUmVzcG9uc2UucHJvdG90eXBlKTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYm9keSBgc3RyYC5cbiAqXG4gKiBVc2VkIGZvciBhdXRvLXBhcnNpbmcgb2YgYm9kaWVzLiBQYXJzZXJzXG4gKiBhcmUgZGVmaW5lZCBvbiB0aGUgYHN1cGVyYWdlbnQucGFyc2VgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5fcGFyc2VCb2R5ID0gZnVuY3Rpb24oc3RyKSB7XG4gIHZhciBwYXJzZSA9IHJlcXVlc3QucGFyc2VbdGhpcy50eXBlXTtcbiAgaWYgKHRoaXMucmVxLl9wYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXEuX3BhcnNlcih0aGlzLCBzdHIpO1xuICB9XG4gIGlmICghcGFyc2UgJiYgaXNKU09OKHRoaXMudHlwZSkpIHtcbiAgICBwYXJzZSA9IHJlcXVlc3QucGFyc2VbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgfVxuICByZXR1cm4gcGFyc2UgJiYgc3RyICYmIChzdHIubGVuZ3RoIHx8IHN0ciBpbnN0YW5jZW9mIE9iamVjdClcbiAgICA/IHBhcnNlKHN0cilcbiAgICA6IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybiB7RXJyb3J9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZDtcbiAgdmFyIHVybCA9IHJlcS51cmw7XG5cbiAgdmFyIG1zZyA9ICdjYW5ub3QgJyArIG1ldGhvZCArICcgJyArIHVybCArICcgKCcgKyB0aGlzLnN0YXR1cyArICcpJztcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSBtZXRob2Q7XG4gIGVyci51cmwgPSB1cmw7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxucmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9xdWVyeSA9IHRoaXMuX3F1ZXJ5IHx8IFtdO1xuICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMuaGVhZGVyID0ge307IC8vIHByZXNlcnZlcyBoZWFkZXIgbmFtZSBjYXNlXG4gIHRoaXMuX2hlYWRlciA9IHt9OyAvLyBjb2VyY2VzIGhlYWRlciBuYW1lcyB0byBsb3dlcmNhc2VcbiAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24oKXtcbiAgICB2YXIgZXJyID0gbnVsbDtcbiAgICB2YXIgcmVzID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICByZXMgPSBuZXcgUmVzcG9uc2Uoc2VsZik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBlcnIgPSBuZXcgRXJyb3IoJ1BhcnNlciBpcyB1bmFibGUgdG8gcGFyc2UgdGhlIHJlc3BvbnNlJyk7XG4gICAgICBlcnIucGFyc2UgPSB0cnVlO1xuICAgICAgZXJyLm9yaWdpbmFsID0gZTtcbiAgICAgIC8vIGlzc3VlICM2NzU6IHJldHVybiB0aGUgcmF3IHJlc3BvbnNlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICBpZiAoc2VsZi54aHIpIHtcbiAgICAgICAgLy8gaWU5IGRvZXNuJ3QgaGF2ZSAncmVzcG9uc2UnIHByb3BlcnR5XG4gICAgICAgIGVyci5yYXdSZXNwb25zZSA9IHR5cGVvZiBzZWxmLnhoci5yZXNwb25zZVR5cGUgPT0gJ3VuZGVmaW5lZCcgPyBzZWxmLnhoci5yZXNwb25zZVRleHQgOiBzZWxmLnhoci5yZXNwb25zZTtcbiAgICAgICAgLy8gaXNzdWUgIzg3NjogcmV0dXJuIHRoZSBodHRwIHN0YXR1cyBjb2RlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICAgIGVyci5zdGF0dXMgPSBzZWxmLnhoci5zdGF0dXMgPyBzZWxmLnhoci5zdGF0dXMgOiBudWxsO1xuICAgICAgICBlcnIuc3RhdHVzQ29kZSA9IGVyci5zdGF0dXM7IC8vIGJhY2t3YXJkcy1jb21wYXQgb25seVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyLnJhd1Jlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgZXJyLnN0YXR1cyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHJlcyk7XG5cbiAgICB2YXIgbmV3X2VycjtcbiAgICB0cnkge1xuICAgICAgaWYgKCFzZWxmLl9pc1Jlc3BvbnNlT0socmVzKSkge1xuICAgICAgICBuZXdfZXJyID0gbmV3IEVycm9yKHJlcy5zdGF0dXNUZXh0IHx8ICdVbnN1Y2Nlc3NmdWwgSFRUUCByZXNwb25zZScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goY3VzdG9tX2Vycikge1xuICAgICAgbmV3X2VyciA9IGN1c3RvbV9lcnI7IC8vIG9rKCkgY2FsbGJhY2sgY2FuIHRocm93XG4gICAgfVxuXG4gICAgLy8gIzEwMDAgZG9uJ3QgY2F0Y2ggZXJyb3JzIGZyb20gdGhlIGNhbGxiYWNrIHRvIGF2b2lkIGRvdWJsZSBjYWxsaW5nIGl0XG4gICAgaWYgKG5ld19lcnIpIHtcbiAgICAgIG5ld19lcnIub3JpZ2luYWwgPSBlcnI7XG4gICAgICBuZXdfZXJyLnJlc3BvbnNlID0gcmVzO1xuICAgICAgbmV3X2Vyci5zdGF0dXMgPSByZXMuc3RhdHVzO1xuICAgICAgc2VsZi5jYWxsYmFjayhuZXdfZXJyLCByZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBNaXhpbiBgRW1pdHRlcmAgYW5kIGBSZXF1ZXN0QmFzZWAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5SZXF1ZXN0QmFzZShSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogU2V0IENvbnRlbnQtVHlwZSB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy54bWwgPSAnYXBwbGljYXRpb24veG1sJztcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24veG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24odHlwZSl7XG4gIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEFjY2VwdCB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy5qc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXB0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24odHlwZSl7XG4gIHRoaXMuc2V0KCdBY2NlcHQnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXNlclxuICogQHBhcmFtIHtTdHJpbmd9IFtwYXNzXSBvcHRpb25hbCBpbiBjYXNlIG9mIHVzaW5nICdiZWFyZXInIGFzIHR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHdpdGggJ3R5cGUnIHByb3BlcnR5ICdhdXRvJywgJ2Jhc2ljJyBvciAnYmVhcmVyJyAoZGVmYXVsdCAnYmFzaWMnKVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbih1c2VyLCBwYXNzLCBvcHRpb25zKXtcbiAgaWYgKDEgPT09IGFyZ3VtZW50cy5sZW5ndGgpIHBhc3MgPSAnJztcbiAgaWYgKHR5cGVvZiBwYXNzID09PSAnb2JqZWN0JyAmJiBwYXNzICE9PSBudWxsKSB7IC8vIHBhc3MgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9wdGlvbnNcbiAgICBvcHRpb25zID0gcGFzcztcbiAgICBwYXNzID0gJyc7XG4gIH1cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHR5cGU6ICdmdW5jdGlvbicgPT09IHR5cGVvZiBidG9hID8gJ2Jhc2ljJyA6ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgdmFyIGVuY29kZXIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJ0b2EpIHtcbiAgICAgIHJldHVybiBidG9hKHN0cmluZyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBiYXNpYyBhdXRoLCBidG9hIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH07XG5cbiAgcmV0dXJuIHRoaXMuX2F1dGgodXNlciwgcGFzcywgb3B0aW9ucywgZW5jb2Rlcik7XG59O1xuXG4vKipcbiAqIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiAqICAgICAucXVlcnkoJ3NpemU9MTAnKVxuICogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24odmFsKXtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiB2YWwpIHZhbCA9IHNlcmlhbGl6ZSh2YWwpO1xuICBpZiAodmFsKSB0aGlzLl9xdWVyeS5wdXNoKHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgb3B0aW9uc2AgKG9yIGZpbGVuYW1lKS5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5hdHRhY2goJ2NvbnRlbnQnLCBuZXcgQmxvYihbJzxhIGlkPVwiYVwiPjxiIGlkPVwiYlwiPmhleSE8L2I+PC9hPiddLCB7IHR5cGU6IFwidGV4dC9odG1sXCJ9KSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7QmxvYnxGaWxlfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbihmaWVsZCwgZmlsZSwgb3B0aW9ucyl7XG4gIGlmIChmaWxlKSB7XG4gICAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgIHRocm93IEVycm9yKFwic3VwZXJhZ2VudCBjYW4ndCBtaXggLnNlbmQoKSBhbmQgLmF0dGFjaCgpXCIpO1xuICAgIH1cblxuICAgIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKGZpZWxkLCBmaWxlLCBvcHRpb25zIHx8IGZpbGUubmFtZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbigpe1xuICBpZiAoIXRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgdGhpcy5fZm9ybURhdGEgPSBuZXcgcm9vdC5Gb3JtRGF0YSgpO1xuICB9XG4gIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcbn07XG5cbi8qKlxuICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYFxuICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbihlcnIsIHJlcyl7XG4gIGlmICh0aGlzLl9zaG91bGRSZXRyeShlcnIsIHJlcykpIHtcbiAgICByZXR1cm4gdGhpcy5fcmV0cnkoKTtcbiAgfVxuXG4gIHZhciBmbiA9IHRoaXMuX2NhbGxiYWNrO1xuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIGlmIChlcnIpIHtcbiAgICBpZiAodGhpcy5fbWF4UmV0cmllcykgZXJyLnJldHJpZXMgPSB0aGlzLl9yZXRyaWVzIC0gMTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxuXG4gIGZuKGVyciwgcmVzKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggeC1kb21haW4gZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY3Jvc3NEb21haW5FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGJlZW4gdGVybWluYXRlZFxcblBvc3NpYmxlIGNhdXNlczogdGhlIG5ldHdvcmsgaXMgb2ZmbGluZSwgT3JpZ2luIGlzIG5vdCBhbGxvd2VkIGJ5IEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiwgdGhlIHBhZ2UgaXMgYmVpbmcgdW5sb2FkZWQsIGV0Yy4nKTtcbiAgZXJyLmNyb3NzRG9tYWluID0gdHJ1ZTtcblxuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgZXJyLnVybCA9IHRoaXMudXJsO1xuXG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cbi8vIFRoaXMgb25seSB3YXJucywgYmVjYXVzZSB0aGUgcmVxdWVzdCBpcyBzdGlsbCBsaWtlbHkgdG8gd29ya1xuUmVxdWVzdC5wcm90b3R5cGUuYnVmZmVyID0gUmVxdWVzdC5wcm90b3R5cGUuY2EgPSBSZXF1ZXN0LnByb3RvdHlwZS5hZ2VudCA9IGZ1bmN0aW9uKCl7XG4gIGNvbnNvbGUud2FybihcIlRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2Ygc3VwZXJhZ2VudFwiKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBUaGlzIHRocm93cywgYmVjYXVzZSBpdCBjYW4ndCBzZW5kL3JlY2VpdmUgZGF0YSBhcyBleHBlY3RlZFxuUmVxdWVzdC5wcm90b3R5cGUucGlwZSA9IFJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oKXtcbiAgdGhyb3cgRXJyb3IoXCJTdHJlYW1pbmcgaXMgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2Ygc3VwZXJhZ2VudFwiKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5faXNIb3N0ID0gZnVuY3Rpb24gX2lzSG9zdChvYmopIHtcbiAgLy8gTmF0aXZlIG9iamVjdHMgc3RyaW5naWZ5IHRvIFtvYmplY3QgRmlsZV0sIFtvYmplY3QgQmxvYl0sIFtvYmplY3QgRm9ybURhdGFdLCBldGMuXG4gIHJldHVybiBvYmogJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvYmogJiYgIUFycmF5LmlzQXJyYXkob2JqKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSAhPT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbi8qKlxuICogSW5pdGlhdGUgcmVxdWVzdCwgaW52b2tpbmcgY2FsbGJhY2sgYGZuKHJlcylgXG4gKiB3aXRoIGFuIGluc3RhbmNlb2YgYFJlc3BvbnNlYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGZuKXtcbiAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgIGNvbnNvbGUud2FybihcIldhcm5pbmc6IC5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudFwiKTtcbiAgfVxuICB0aGlzLl9lbmRDYWxsZWQgPSB0cnVlO1xuXG4gIC8vIHN0b3JlIGNhbGxiYWNrXG4gIHRoaXMuX2NhbGxiYWNrID0gZm4gfHwgbm9vcDtcblxuICAvLyBxdWVyeXN0cmluZ1xuICB0aGlzLl9maW5hbGl6ZVF1ZXJ5U3RyaW5nKCk7XG5cbiAgcmV0dXJuIHRoaXMuX2VuZCgpO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB4aHIgPSAodGhpcy54aHIgPSByZXF1ZXN0LmdldFhIUigpKTtcbiAgdmFyIGRhdGEgPSB0aGlzLl9mb3JtRGF0YSB8fCB0aGlzLl9kYXRhO1xuXG4gIHRoaXMuX3NldFRpbWVvdXRzKCk7XG5cbiAgLy8gc3RhdGUgY2hhbmdlXG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpe1xuICAgIHZhciByZWFkeVN0YXRlID0geGhyLnJlYWR5U3RhdGU7XG4gICAgaWYgKHJlYWR5U3RhdGUgPj0gMiAmJiBzZWxmLl9yZXNwb25zZVRpbWVvdXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgICB9XG4gICAgaWYgKDQgIT0gcmVhZHlTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIElFOSwgcmVhZHMgdG8gYW55IHByb3BlcnR5IChlLmcuIHN0YXR1cykgb2ZmIG9mIGFuIGFib3J0ZWQgWEhSIHdpbGxcbiAgICAvLyByZXN1bHQgaW4gdGhlIGVycm9yIFwiQ291bGQgbm90IGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gZHVlIHRvIGVycm9yIGMwMGMwMjNmXCJcbiAgICB2YXIgc3RhdHVzO1xuICAgIHRyeSB7IHN0YXR1cyA9IHhoci5zdGF0dXMgfSBjYXRjaChlKSB7IHN0YXR1cyA9IDA7IH1cblxuICAgIGlmICghc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi50aW1lZG91dCB8fCBzZWxmLl9hYm9ydGVkKSByZXR1cm47XG4gICAgICByZXR1cm4gc2VsZi5jcm9zc0RvbWFpbkVycm9yKCk7XG4gICAgfVxuICAgIHNlbGYuZW1pdCgnZW5kJyk7XG4gIH07XG5cbiAgLy8gcHJvZ3Jlc3NcbiAgdmFyIGhhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24oZGlyZWN0aW9uLCBlKSB7XG4gICAgaWYgKGUudG90YWwgPiAwKSB7XG4gICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7XG4gICAgfVxuICAgIGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBlKTtcbiAgfTtcbiAgaWYgKHRoaXMuaGFzTGlzdGVuZXJzKCdwcm9ncmVzcycpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHhoci5vbnByb2dyZXNzID0gaGFuZGxlUHJvZ3Jlc3MuYmluZChudWxsLCAnZG93bmxvYWQnKTtcbiAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGhhbmRsZVByb2dyZXNzLmJpbmQobnVsbCwgJ3VwbG9hZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgLy8gQWNjZXNzaW5nIHhoci51cGxvYWQgZmFpbHMgaW4gSUUgZnJvbSBhIHdlYiB3b3JrZXIsIHNvIGp1c3QgcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgLy8gUmVwb3J0ZWQgaGVyZTpcbiAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvODM3MjQ1L3htbGh0dHByZXF1ZXN0LXVwbG9hZC10aHJvd3MtaW52YWxpZC1hcmd1bWVudC13aGVuLXVzZWQtZnJvbS13ZWItd29ya2VyLWNvbnRleHRcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWF0ZSByZXF1ZXN0XG4gIHRyeSB7XG4gICAgaWYgKHRoaXMudXNlcm5hbWUgJiYgdGhpcy5wYXNzd29yZCkge1xuICAgICAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlLCB0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHNlZSAjMTE0OVxuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrKGVycik7XG4gIH1cblxuICAvLyBDT1JTXG4gIGlmICh0aGlzLl93aXRoQ3JlZGVudGlhbHMpIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuXG4gIC8vIGJvZHlcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSAmJiAnR0VUJyAhPSB0aGlzLm1ldGhvZCAmJiAnSEVBRCcgIT0gdGhpcy5tZXRob2QgJiYgJ3N0cmluZycgIT0gdHlwZW9mIGRhdGEgJiYgIXRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgIC8vIHNlcmlhbGl6ZSBzdHVmZlxuICAgIHZhciBjb250ZW50VHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX3NlcmlhbGl6ZXIgfHwgcmVxdWVzdC5zZXJpYWxpemVbY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdIDogJyddO1xuICAgIGlmICghc2VyaWFsaXplICYmIGlzSlNPTihjb250ZW50VHlwZSkpIHtcbiAgICAgIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgfVxuICAgIGlmIChzZXJpYWxpemUpIGRhdGEgPSBzZXJpYWxpemUoZGF0YSk7XG4gIH1cblxuICAvLyBzZXQgaGVhZGVyIGZpZWxkc1xuICBmb3IgKHZhciBmaWVsZCBpbiB0aGlzLmhlYWRlcikge1xuICAgIGlmIChudWxsID09IHRoaXMuaGVhZGVyW2ZpZWxkXSkgY29udGludWU7XG5cbiAgICBpZiAodGhpcy5oZWFkZXIuaGFzT3duUHJvcGVydHkoZmllbGQpKVxuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoZmllbGQsIHRoaXMuaGVhZGVyW2ZpZWxkXSk7XG4gIH1cblxuICBpZiAodGhpcy5fcmVzcG9uc2VUeXBlKSB7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9IHRoaXMuX3Jlc3BvbnNlVHlwZTtcbiAgfVxuXG4gIC8vIHNlbmQgc3R1ZmZcbiAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgdGhpcyk7XG5cbiAgLy8gSUUxMSB4aHIuc2VuZCh1bmRlZmluZWQpIHNlbmRzICd1bmRlZmluZWQnIHN0cmluZyBhcyBQT1NUIHBheWxvYWQgKGluc3RlYWQgb2Ygbm90aGluZylcbiAgLy8gV2UgbmVlZCBudWxsIGhlcmUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgeGhyLnNlbmQodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnID8gZGF0YSA6IG51bGwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnJlcXVlc3QuYWdlbnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBBZ2VudCgpO1xufTtcblxuW1wiR0VUXCIsIFwiUE9TVFwiLCBcIk9QVElPTlNcIiwgXCJQQVRDSFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBBZ2VudC5wcm90b3R5cGVbbWV0aG9kLnRvTG93ZXJDYXNlKCldID0gZnVuY3Rpb24odXJsLCBmbikge1xuICAgIHZhciByZXEgPSBuZXcgcmVxdWVzdC5SZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0cyhyZXEpO1xuICAgIGlmIChmbikge1xuICAgICAgcmVxLmVuZChmbik7XG4gICAgfVxuICAgIHJldHVybiByZXE7XG4gIH07XG59KTtcblxuQWdlbnQucHJvdG90eXBlLmRlbCA9IEFnZW50LnByb3RvdHlwZVsnZGVsZXRlJ107XG5cbi8qKlxuICogR0VUIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5nZXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEucXVlcnkoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIEhFQUQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdIRUFEJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBPUFRJT05TIHF1ZXJ5IHRvIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5vcHRpb25zID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnT1BUSU9OUycsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBERUxFVEUgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlbCh1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdERUxFVEUnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn1cblxucmVxdWVzdFsnZGVsJ10gPSBkZWw7XG5yZXF1ZXN0WydkZWxldGUnXSA9IGRlbDtcblxuLyoqXG4gKiBQQVRDSCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkYXRhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wYXRjaCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BBVENIJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBPU1QgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucG9zdCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogUFVUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnB1dCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BVVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gbnVsbCAhPT0gb2JqICYmICdvYmplY3QnID09PSB0eXBlb2Ygb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBvZiBtaXhlZC1pbiBmdW5jdGlvbnMgc2hhcmVkIGJldHdlZW4gbm9kZSBhbmQgY2xpZW50IGNvZGVcbiAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pcy1vYmplY3QnKTtcblxuLyoqXG4gKiBFeHBvc2UgYFJlcXVlc3RCYXNlYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RCYXNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RCYXNlYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3RCYXNlKG9iaikge1xuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcbn1cblxuLyoqXG4gKiBNaXhpbiB0aGUgcHJvdG90eXBlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBSZXF1ZXN0QmFzZS5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IFJlcXVlc3RCYXNlLnByb3RvdHlwZVtrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ2xlYXIgcHJldmlvdXMgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIF9jbGVhclRpbWVvdXQoKXtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgZGVsZXRlIHRoaXMuX3RpbWVyO1xuICBkZWxldGUgdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXI7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlc3BvbnNlIGJvZHkgcGFyc2VyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGluY29taW5nIGRhdGEgaW50byByZXF1ZXN0LmJvZHlcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiBwYXJzZShmbil7XG4gIHRoaXMuX3BhcnNlciA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IGZvcm1hdCBvZiBiaW5hcnkgcmVzcG9uc2UgYm9keS5cbiAqIEluIGJyb3dzZXIgdmFsaWQgZm9ybWF0cyBhcmUgJ2Jsb2InIGFuZCAnYXJyYXlidWZmZXInLFxuICogd2hpY2ggcmV0dXJuIEJsb2IgYW5kIEFycmF5QnVmZmVyLCByZXNwZWN0aXZlbHkuXG4gKlxuICogSW4gTm9kZSBhbGwgdmFsdWVzIHJlc3VsdCBpbiBCdWZmZXIuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAucmVzcG9uc2VUeXBlKCdibG9iJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJlc3BvbnNlVHlwZSA9IGZ1bmN0aW9uKHZhbCl7XG4gIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIGRlZmF1bHQgcmVxdWVzdCBib2R5IHNlcmlhbGl6ZXJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGNvbnZlcnQgZGF0YSBzZXQgdmlhIC5zZW5kIG9yIC5hdHRhY2ggaW50byBwYXlsb2FkIHRvIHNlbmRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKGZuKXtcbiAgdGhpcy5fc2VyaWFsaXplciA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRpbWVvdXRzLlxuICpcbiAqIC0gcmVzcG9uc2UgdGltZW91dCBpcyB0aW1lIGJldHdlZW4gc2VuZGluZyByZXF1ZXN0IGFuZCByZWNlaXZpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3BvbnNlLiBJbmNsdWRlcyBETlMgYW5kIGNvbm5lY3Rpb24gdGltZS5cbiAqIC0gZGVhZGxpbmUgaXMgdGhlIHRpbWUgZnJvbSBzdGFydCBvZiB0aGUgcmVxdWVzdCB0byByZWNlaXZpbmcgcmVzcG9uc2UgYm9keSBpbiBmdWxsLiBJZiB0aGUgZGVhZGxpbmUgaXMgdG9vIHNob3J0IGxhcmdlIGZpbGVzIG1heSBub3QgbG9hZCBhdCBhbGwgb24gc2xvdyBjb25uZWN0aW9ucy5cbiAqXG4gKiBWYWx1ZSBvZiAwIG9yIGZhbHNlIG1lYW5zIG5vIHRpbWVvdXQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ8T2JqZWN0fSBtcyBvciB7cmVzcG9uc2UsIGRlYWRsaW5lfVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50aW1lb3V0ID0gZnVuY3Rpb24gdGltZW91dChvcHRpb25zKXtcbiAgaWYgKCFvcHRpb25zIHx8ICdvYmplY3QnICE9PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgIHRoaXMuX3RpbWVvdXQgPSBvcHRpb25zO1xuICAgIHRoaXMuX3Jlc3BvbnNlVGltZW91dCA9IDA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmb3IodmFyIG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgc3dpdGNoKG9wdGlvbikge1xuICAgICAgY2FzZSAnZGVhZGxpbmUnOlxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucy5kZWFkbGluZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXNwb25zZSc6XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVGltZW91dCA9IG9wdGlvbnMucmVzcG9uc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKFwiVW5rbm93biB0aW1lb3V0IG9wdGlvblwiLCBvcHRpb24pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBvbiBlcnJvci5cbiAqXG4gKiBGYWlsZWQgcmVxdWVzdHMgd2lsbCBiZSByZXRyaWVkICdjb3VudCcgdGltZXMgaWYgdGltZW91dCBvciBlcnIuY29kZSA+PSA1MDAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJldHJ5ID0gZnVuY3Rpb24gcmV0cnkoY291bnQsIGZuKXtcbiAgLy8gRGVmYXVsdCB0byAxIGlmIG5vIGNvdW50IHBhc3NlZCBvciB0cnVlXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IGNvdW50ID09PSB0cnVlKSBjb3VudCA9IDE7XG4gIGlmIChjb3VudCA8PSAwKSBjb3VudCA9IDA7XG4gIHRoaXMuX21heFJldHJpZXMgPSBjb3VudDtcbiAgdGhpcy5fcmV0cmllcyA9IDA7XG4gIHRoaXMuX3JldHJ5Q2FsbGJhY2sgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgRVJST1JfQ09ERVMgPSBbXG4gICdFQ09OTlJFU0VUJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFQUREUklORk8nLFxuICAnRVNPQ0tFVFRJTUVET1VUJ1xuXTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSByZXF1ZXN0IHNob3VsZCBiZSByZXRyaWVkLlxuICogKEJvcnJvd2VkIGZyb20gc2VnbWVudGlvL3N1cGVyYWdlbnQtcmV0cnkpXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSBbcmVzXVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2hvdWxkUmV0cnkgPSBmdW5jdGlvbihlcnIsIHJlcykge1xuICBpZiAoIXRoaXMuX21heFJldHJpZXMgfHwgdGhpcy5fcmV0cmllcysrID49IHRoaXMuX21heFJldHJpZXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHRoaXMuX3JldHJ5Q2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgdmFyIG92ZXJyaWRlID0gdGhpcy5fcmV0cnlDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG92ZXJyaWRlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gdW5kZWZpbmVkIGZhbGxzIGJhY2sgdG8gZGVmYXVsdHNcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMgJiYgcmVzLnN0YXR1cyAmJiByZXMuc3RhdHVzID49IDUwMCAmJiByZXMuc3RhdHVzICE9IDUwMSkgcmV0dXJuIHRydWU7XG4gIGlmIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgJiYgfkVSUk9SX0NPREVTLmluZGV4T2YoZXJyLmNvZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTdXBlcmFnZW50IHRpbWVvdXRcbiAgICBpZiAoZXJyLnRpbWVvdXQgJiYgZXJyLmNvZGUgPT0gJ0VDT05OQUJPUlRFRCcpIHJldHVybiB0cnVlO1xuICAgIGlmIChlcnIuY3Jvc3NEb21haW4pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0cnkgcmVxdWVzdFxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9yZXRyeSA9IGZ1bmN0aW9uKCkge1xuXG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG5cbiAgLy8gbm9kZVxuICBpZiAodGhpcy5yZXEpIHtcbiAgICB0aGlzLnJlcSA9IG51bGw7XG4gICAgdGhpcy5yZXEgPSB0aGlzLnJlcXVlc3QoKTtcbiAgfVxuXG4gIHRoaXMuX2Fib3J0ZWQgPSBmYWxzZTtcbiAgdGhpcy50aW1lZG91dCA9IGZhbHNlO1xuXG4gIHJldHVybiB0aGlzLl9lbmQoKTtcbn07XG5cbi8qKlxuICogUHJvbWlzZSBzdXBwb3J0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3JlamVjdF1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiB0aGVuKHJlc29sdmUsIHJlamVjdCkge1xuICBpZiAoIXRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIldhcm5pbmc6IHN1cGVyYWdlbnQgcmVxdWVzdCB3YXMgc2VudCB0d2ljZSwgYmVjYXVzZSBib3RoIC5lbmQoKSBhbmQgLnRoZW4oKSB3ZXJlIGNhbGxlZC4gTmV2ZXIgY2FsbCAuZW5kKCkgaWYgeW91IHVzZSBwcm9taXNlc1wiKTtcbiAgICB9XG4gICAgdGhpcy5fZnVsbGZpbGxlZFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihpbm5lclJlc29sdmUsIGlubmVyUmVqZWN0KSB7XG4gICAgICBzZWxmLmVuZChmdW5jdGlvbihlcnIsIHJlcykge1xuICAgICAgICBpZiAoZXJyKSBpbm5lclJlamVjdChlcnIpO1xuICAgICAgICBlbHNlIGlubmVyUmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uKGNiKSB7XG4gIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBjYik7XG59O1xuXG4vKipcbiAqIEFsbG93IGZvciBleHRlbnNpb25cbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGZuKHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5vayA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgY2IpIHRocm93IEVycm9yKFwiQ2FsbGJhY2sgcmVxdWlyZWRcIik7XG4gIHRoaXMuX29rQ2FsbGJhY2sgPSBjYjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2lzUmVzcG9uc2VPSyA9IGZ1bmN0aW9uKHJlcykge1xuICBpZiAoIXJlcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9va0NhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuX29rQ2FsbGJhY2socmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDwgMzAwO1xufTtcblxuLyoqXG4gKiBHZXQgcmVxdWVzdCBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihmaWVsZCl7XG4gIHJldHVybiB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIEdldCBjYXNlLWluc2Vuc2l0aXZlIGhlYWRlciBgZmllbGRgIHZhbHVlLlxuICogVGhpcyBpcyBhIGRlcHJlY2F0ZWQgaW50ZXJuYWwgQVBJLiBVc2UgYC5nZXQoZmllbGQpYCBpbnN0ZWFkLlxuICpcbiAqIChnZXRIZWFkZXIgaXMgbm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgc3VwZXJhZ2VudCBjb2RlIGJhc2UpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqIEBkZXByZWNhdGVkXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLmdldEhlYWRlciA9IFJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQ7XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0LlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuc2V0KCdYLUFQSS1LZXknLCAnZm9vYmFyJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5zZXQoeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJywgJ1gtQVBJLUtleSc6ICdmb29iYXInIH0pXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihmaWVsZCwgdmFsKXtcbiAgaWYgKGlzT2JqZWN0KGZpZWxkKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBmaWVsZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCBmaWVsZFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldID0gdmFsO1xuICB0aGlzLmhlYWRlcltmaWVsZF0gPSB2YWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgaGVhZGVyIGBmaWVsZGAuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAudW5zZXQoJ1VzZXItQWdlbnQnKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbihmaWVsZCl7XG4gIGRlbGV0ZSB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG4gIGRlbGV0ZSB0aGlzLmhlYWRlcltmaWVsZF07XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXcml0ZSB0aGUgZmllbGQgYG5hbWVgIGFuZCBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdFxuICogZm9yIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiIHJlcXVlc3QgYm9kaWVzLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmZpZWxkKCdmb28nLCAnYmFyJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmZpZWxkKHsgZm9vOiAnYmFyJywgYmF6OiAncXV4JyB9KVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd8QmxvYnxGaWxlfEJ1ZmZlcnxmcy5SZWFkU3RyZWFtfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLmZpZWxkID0gZnVuY3Rpb24obmFtZSwgdmFsKSB7XG4gIC8vIG5hbWUgc2hvdWxkIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBvYmplY3QuXG4gIGlmIChudWxsID09PSBuYW1lIHx8IHVuZGVmaW5lZCA9PT0gbmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignLmZpZWxkKG5hbWUsIHZhbCkgbmFtZSBjYW4gbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICBpZiAodGhpcy5fZGF0YSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCIuZmllbGQoKSBjYW4ndCBiZSB1c2VkIGlmIC5zZW5kKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiKTtcbiAgfVxuXG4gIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG4gICAgICB0aGlzLmZpZWxkKGtleSwgbmFtZVtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgZm9yICh2YXIgaSBpbiB2YWwpIHtcbiAgICAgIHRoaXMuZmllbGQobmFtZSwgdmFsW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB2YWwgc2hvdWxkIGJlIGRlZmluZWQgbm93XG4gIGlmIChudWxsID09PSB2YWwgfHwgdW5kZWZpbmVkID09PSB2YWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIHZhbCBjYW4gbm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgaWYgKCdib29sZWFuJyA9PT0gdHlwZW9mIHZhbCkge1xuICAgIHZhbCA9ICcnICsgdmFsO1xuICB9XG4gIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKG5hbWUsIHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBYm9ydCB0aGUgcmVxdWVzdCwgYW5kIGNsZWFyIHBvdGVudGlhbCB0aW1lb3V0LlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbigpe1xuICBpZiAodGhpcy5fYWJvcnRlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2Fib3J0ZWQgPSB0cnVlO1xuICB0aGlzLnhociAmJiB0aGlzLnhoci5hYm9ydCgpOyAvLyBicm93c2VyXG4gIHRoaXMucmVxICYmIHRoaXMucmVxLmFib3J0KCk7IC8vIG5vZGVcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGJhc2U2NEVuY29kZXIpIHtcbiAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICBjYXNlICdiYXNpYyc6XG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgYmFzZTY0RW5jb2Rlcih1c2VyICsgJzonICsgcGFzcykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhdXRvJzpcbiAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VyO1xuICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3M7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlYXJlcic6IC8vIHVzYWdlIHdvdWxkIGJlIC5hdXRoKGFjY2Vzc1Rva2VuLCB7IHR5cGU6ICdiZWFyZXInIH0pXG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHVzZXIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS53aXRoQ3JlZGVudGlhbHMgPSBmdW5jdGlvbihvbikge1xuICAvLyBUaGlzIGlzIGJyb3dzZXItb25seSBmdW5jdGlvbmFsaXR5LiBOb2RlIHNpZGUgaXMgbm8tb3AuXG4gIGlmIChvbiA9PSB1bmRlZmluZWQpIG9uID0gdHJ1ZTtcbiAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gb247XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIG1heCByZWRpcmVjdHMgdG8gYG5gLiBEb2VzIG5vdGluZyBpbiBicm93c2VyIFhIUiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZWRpcmVjdHMgPSBmdW5jdGlvbihuKXtcbiAgdGhpcy5fbWF4UmVkaXJlY3RzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE1heGltdW0gc2l6ZSBvZiBidWZmZXJlZCByZXNwb25zZSBib2R5LCBpbiBieXRlcy4gQ291bnRzIHVuY29tcHJlc3NlZCBzaXplLlxuICogRGVmYXVsdCAyMDBNQi5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5tYXhSZXNwb25zZVNpemUgPSBmdW5jdGlvbihuKXtcbiAgaWYgKCdudW1iZXInICE9PSB0eXBlb2Ygbikge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnRcIik7XG4gIH1cbiAgdGhpcy5fbWF4UmVzcG9uc2VTaXplID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdG8gYSBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdCAobm90IEpTT04gc3RyaW5nKSBvZiBzY2FsYXIgcHJvcGVydGllcy5cbiAqIE5vdGUgYXMgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcmV0dXJuIGEgdXNlZnVsIG5vbi10aGlzIHZhbHVlLFxuICogaXQgY2Fubm90IGJlIGNoYWluZWQuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBkZXNjcmliaW5nIG1ldGhvZCwgdXJsLCBhbmQgZGF0YSBvZiB0aGlzIHJlcXVlc3RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgdXJsOiB0aGlzLnVybCxcbiAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgIGhlYWRlcnM6IHRoaXMuX2hlYWRlcixcbiAgfTtcbn07XG5cbi8qKlxuICogU2VuZCBgZGF0YWAgYXMgdGhlIHJlcXVlc3QgYm9keSwgZGVmYXVsdGluZyB0aGUgYC50eXBlKClgIHRvIFwianNvblwiIHdoZW5cbiAqIGFuIG9iamVjdCBpcyBnaXZlbi5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgICAvLyBtYW51YWwganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAgLnNlbmQoJ3tcIm5hbWVcIjpcInRqXCJ9JylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBtYW51YWwgeC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCgnbmFtZT10aicpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGRlZmF1bHRzIHRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCgnbmFtZT10b2JpJylcbiAqICAgICAgICAuc2VuZCgnc3BlY2llcz1mZXJyZXQnKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihkYXRhKXtcbiAgdmFyIGlzT2JqID0gaXNPYmplY3QoZGF0YSk7XG4gIHZhciB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcblxuICBpZiAodGhpcy5fZm9ybURhdGEpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLnNlbmQoKSBjYW4ndCBiZSB1c2VkIGlmIC5hdHRhY2goKSBvciAuZmllbGQoKSBpcyB1c2VkLiBQbGVhc2UgdXNlIG9ubHkgLnNlbmQoKSBvciBvbmx5IC5maWVsZCgpICYgLmF0dGFjaCgpXCIpO1xuICB9XG5cbiAgaWYgKGlzT2JqICYmICF0aGlzLl9kYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF0YSAmJiB0aGlzLl9kYXRhICYmIHRoaXMuX2lzSG9zdCh0aGlzLl9kYXRhKSkge1xuICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgbWVyZ2UgdGhlc2Ugc2VuZCBjYWxsc1wiKTtcbiAgfVxuXG4gIC8vIG1lcmdlXG4gIGlmIChpc09iaiAmJiBpc09iamVjdCh0aGlzLl9kYXRhKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICB0aGlzLl9kYXRhW2tleV0gPSBkYXRhW2tleV07XG4gICAgfVxuICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBkYXRhKSB7XG4gICAgLy8gZGVmYXVsdCB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAgICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnZm9ybScpO1xuICAgIHR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIGlmICgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyA9PSB0eXBlKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YVxuICAgICAgICA/IHRoaXMuX2RhdGEgKyAnJicgKyBkYXRhXG4gICAgICAgIDogZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0YSA9ICh0aGlzLl9kYXRhIHx8ICcnKSArIGRhdGE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICB9XG5cbiAgaWYgKCFpc09iaiB8fCB0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdG8ganNvblxuICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnanNvbicpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU29ydCBgcXVlcnlzdHJpbmdgIGJ5IHRoZSBzb3J0IGZ1bmN0aW9uXG4gKlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIHJlcXVlc3QuZ2V0KCcvdXNlcicpXG4gKiAgICAgICAgIC5xdWVyeSgnbmFtZT1OaWNrJylcbiAqICAgICAgICAgLnF1ZXJ5KCdzZWFyY2g9TWFubnknKVxuICogICAgICAgICAuc29ydFF1ZXJ5KClcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBjdXN0b21pemVkIHNvcnQgZnVuY3Rpb25cbiAqICAgICAgIHJlcXVlc3QuZ2V0KCcvdXNlcicpXG4gKiAgICAgICAgIC5xdWVyeSgnbmFtZT1OaWNrJylcbiAqICAgICAgICAgLnF1ZXJ5KCdzZWFyY2g9TWFubnknKVxuICogICAgICAgICAuc29ydFF1ZXJ5KGZ1bmN0aW9uKGEsIGIpe1xuICogICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICogICAgICAgICB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzb3J0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNvcnRRdWVyeSA9IGZ1bmN0aW9uKHNvcnQpIHtcbiAgLy8gX3NvcnQgZGVmYXVsdCB0byB0cnVlIGJ1dCBvdGhlcndpc2UgY2FuIGJlIGEgZnVuY3Rpb24gb3IgYm9vbGVhblxuICB0aGlzLl9zb3J0ID0gdHlwZW9mIHNvcnQgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IHNvcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDb21wb3NlIHF1ZXJ5c3RyaW5nIHRvIGFwcGVuZCB0byByZXEudXJsXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fZmluYWxpemVRdWVyeVN0cmluZyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBxdWVyeSA9IHRoaXMuX3F1ZXJ5LmpvaW4oJyYnKTtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgdGhpcy51cmwgKz0gKHRoaXMudXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHF1ZXJ5O1xuICB9XG4gIHRoaXMuX3F1ZXJ5Lmxlbmd0aCA9IDA7IC8vIE1ha2VzIHRoZSBjYWxsIGlkZW1wb3RlbnRcblxuICBpZiAodGhpcy5fc29ydCkge1xuICAgIHZhciBpbmRleCA9IHRoaXMudXJsLmluZGV4T2YoJz8nKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIHF1ZXJ5QXJyID0gdGhpcy51cmwuc3Vic3RyaW5nKGluZGV4ICsgMSkuc3BsaXQoJyYnKTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgdGhpcy5fc29ydCkge1xuICAgICAgICBxdWVyeUFyci5zb3J0KHRoaXMuX3NvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlBcnIuc29ydCgpO1xuICAgICAgfVxuICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgJz8nICsgcXVlcnlBcnIuam9pbignJicpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXQgb25seVxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9hcHBlbmRRdWVyeVN0cmluZyA9IGZ1bmN0aW9uKCkge2NvbnNvbGUudHJhY2UoXCJVbnN1cHBvcnRlZFwiKTt9XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3RpbWVvdXRFcnJvciA9IGZ1bmN0aW9uKHJlYXNvbiwgdGltZW91dCwgZXJybm8pe1xuICBpZiAodGhpcy5fYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXJyID0gbmV3IEVycm9yKHJlYXNvbiArIHRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgZXJyLnRpbWVvdXQgPSB0aW1lb3V0O1xuICBlcnIuY29kZSA9ICdFQ09OTkFCT1JURUQnO1xuICBlcnIuZXJybm8gPSBlcnJubztcbiAgdGhpcy50aW1lZG91dCA9IHRydWU7XG4gIHRoaXMuYWJvcnQoKTtcbiAgdGhpcy5jYWxsYmFjayhlcnIpO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9zZXRUaW1lb3V0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZGVhZGxpbmVcbiAgaWYgKHRoaXMuX3RpbWVvdXQgJiYgIXRoaXMuX3RpbWVyKSB7XG4gICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICBzZWxmLl90aW1lb3V0RXJyb3IoJ1RpbWVvdXQgb2YgJywgc2VsZi5fdGltZW91dCwgJ0VUSU1FJyk7XG4gICAgfSwgdGhpcy5fdGltZW91dCk7XG4gIH1cbiAgLy8gcmVzcG9uc2UgdGltZW91dFxuICBpZiAodGhpcy5fcmVzcG9uc2VUaW1lb3V0ICYmICF0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcikge1xuICAgIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5fdGltZW91dEVycm9yKCdSZXNwb25zZSB0aW1lb3V0IG9mICcsIHNlbGYuX3Jlc3BvbnNlVGltZW91dCwgJ0VUSU1FRE9VVCcpO1xuICAgIH0sIHRoaXMuX3Jlc3BvbnNlVGltZW91dCk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZUJhc2VgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVzcG9uc2VCYXNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlc3BvbnNlQmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXNwb25zZUJhc2Uob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIFJlc3BvbnNlQmFzZS5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IFJlc3BvbnNlQmFzZS5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEdldCBjYXNlLWluc2Vuc2l0aXZlIGBmaWVsZGAgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlQmFzZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oZmllbGQpIHtcbiAgcmV0dXJuIHRoaXMuaGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBTZXQgaGVhZGVyIHJlbGF0ZWQgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gYC50eXBlYCB0aGUgY29udGVudCB0eXBlIHdpdGhvdXQgcGFyYW1zXG4gKlxuICogQSByZXNwb25zZSBvZiBcIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiXG4gKiB3aWxsIHByb3ZpZGUgeW91IHdpdGggYSBgLnR5cGVgIG9mIFwidGV4dC9wbGFpblwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlQmFzZS5wcm90b3R5cGUuX3NldEhlYWRlclByb3BlcnRpZXMgPSBmdW5jdGlvbihoZWFkZXIpe1xuICAgIC8vIFRPRE86IG1vYXIhXG4gICAgLy8gVE9ETzogbWFrZSB0aGlzIGEgdXRpbFxuXG4gICAgLy8gY29udGVudC10eXBlXG4gICAgdmFyIGN0ID0gaGVhZGVyWydjb250ZW50LXR5cGUnXSB8fCAnJztcbiAgICB0aGlzLnR5cGUgPSB1dGlscy50eXBlKGN0KTtcblxuICAgIC8vIHBhcmFtc1xuICAgIHZhciBwYXJhbXMgPSB1dGlscy5wYXJhbXMoY3QpO1xuICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHRoaXNba2V5XSA9IHBhcmFtc1trZXldO1xuXG4gICAgdGhpcy5saW5rcyA9IHt9O1xuXG4gICAgLy8gbGlua3NcbiAgICB0cnkge1xuICAgICAgICBpZiAoaGVhZGVyLmxpbmspIHtcbiAgICAgICAgICAgIHRoaXMubGlua3MgPSB1dGlscy5wYXJzZUxpbmtzKGhlYWRlci5saW5rKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICB9XG59O1xuXG4vKipcbiAqIFNldCBmbGFncyBzdWNoIGFzIGAub2tgIGJhc2VkIG9uIGBzdGF0dXNgLlxuICpcbiAqIEZvciBleGFtcGxlIGEgMnh4IHJlc3BvbnNlIHdpbGwgZ2l2ZSB5b3UgYSBgLm9rYCBvZiBfX3RydWVfX1xuICogd2hlcmVhcyA1eHggd2lsbCBiZSBfX2ZhbHNlX18gYW5kIGAuZXJyb3JgIHdpbGwgYmUgX190cnVlX18uIFRoZVxuICogYC5jbGllbnRFcnJvcmAgYW5kIGAuc2VydmVyRXJyb3JgIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBiZSBtb3JlXG4gKiBzcGVjaWZpYywgYW5kIGAuc3RhdHVzVHlwZWAgaXMgdGhlIGNsYXNzIG9mIGVycm9yIHJhbmdpbmcgZnJvbSAxLi41XG4gKiBzb21ldGltZXMgdXNlZnVsIGZvciBtYXBwaW5nIHJlc3BvbmQgY29sb3JzIGV0Yy5cbiAqXG4gKiBcInN1Z2FyXCIgcHJvcGVydGllcyBhcmUgYWxzbyBkZWZpbmVkIGZvciBjb21tb24gY2FzZXMuIEN1cnJlbnRseSBwcm92aWRpbmc6XG4gKlxuICogICAtIC5ub0NvbnRlbnRcbiAqICAgLSAuYmFkUmVxdWVzdFxuICogICAtIC51bmF1dGhvcml6ZWRcbiAqICAgLSAubm90QWNjZXB0YWJsZVxuICogICAtIC5ub3RGb3VuZFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0dXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlQmFzZS5wcm90b3R5cGUuX3NldFN0YXR1c1Byb3BlcnRpZXMgPSBmdW5jdGlvbihzdGF0dXMpe1xuICAgIHZhciB0eXBlID0gc3RhdHVzIC8gMTAwIHwgMDtcblxuICAgIC8vIHN0YXR1cyAvIGNsYXNzXG4gICAgdGhpcy5zdGF0dXMgPSB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUeXBlID0gdHlwZTtcblxuICAgIC8vIGJhc2ljc1xuICAgIHRoaXMuaW5mbyA9IDEgPT0gdHlwZTtcbiAgICB0aGlzLm9rID0gMiA9PSB0eXBlO1xuICAgIHRoaXMucmVkaXJlY3QgPSAzID09IHR5cGU7XG4gICAgdGhpcy5jbGllbnRFcnJvciA9IDQgPT0gdHlwZTtcbiAgICB0aGlzLnNlcnZlckVycm9yID0gNSA9PSB0eXBlO1xuICAgIHRoaXMuZXJyb3IgPSAoNCA9PSB0eXBlIHx8IDUgPT0gdHlwZSlcbiAgICAgICAgPyB0aGlzLnRvRXJyb3IoKVxuICAgICAgICA6IGZhbHNlO1xuXG4gICAgLy8gc3VnYXJcbiAgICB0aGlzLmNyZWF0ZWQgPSAyMDEgPT0gc3RhdHVzO1xuICAgIHRoaXMuYWNjZXB0ZWQgPSAyMDIgPT0gc3RhdHVzO1xuICAgIHRoaXMubm9Db250ZW50ID0gMjA0ID09IHN0YXR1cztcbiAgICB0aGlzLmJhZFJlcXVlc3QgPSA0MDAgPT0gc3RhdHVzO1xuICAgIHRoaXMudW5hdXRob3JpemVkID0gNDAxID09IHN0YXR1cztcbiAgICB0aGlzLm5vdEFjY2VwdGFibGUgPSA0MDYgPT0gc3RhdHVzO1xuICAgIHRoaXMuZm9yYmlkZGVuID0gNDAzID09IHN0YXR1cztcbiAgICB0aGlzLm5vdEZvdW5kID0gNDA0ID09IHN0YXR1cztcbiAgICB0aGlzLnVucHJvY2Vzc2FibGVFbnRpdHkgPSA0MjIgPT0gc3RhdHVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG1pbWUgdHlwZSBmb3IgdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMudHlwZSA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykuc2hpZnQoKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhlYWRlciBmaWVsZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucGFyYW1zID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvICo7ICovKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBzdHIpe1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo9ICovKTtcbiAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKTtcbiAgICB2YXIgdmFsID0gcGFydHMuc2hpZnQoKTtcblxuICAgIGlmIChrZXkgJiYgdmFsKSBvYmpba2V5XSA9IHZhbDtcbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG59O1xuXG4vKipcbiAqIFBhcnNlIExpbmsgaGVhZGVyIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcnNlTGlua3MgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKiwgKi8pLnJlZHVjZShmdW5jdGlvbihvYmosIHN0cil7XG4gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8gKjsgKi8pO1xuICAgIHZhciB1cmwgPSBwYXJ0c1swXS5zbGljZSgxLCAtMSk7XG4gICAgdmFyIHJlbCA9IHBhcnRzWzFdLnNwbGl0KC8gKj0gKi8pWzFdLnNsaWNlKDEsIC0xKTtcbiAgICBvYmpbcmVsXSA9IHVybDtcbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG59O1xuXG4vKipcbiAqIFN0cmlwIGNvbnRlbnQgcmVsYXRlZCBmaWVsZHMgZnJvbSBgaGVhZGVyYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAcmV0dXJuIHtPYmplY3R9IGhlYWRlclxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jbGVhbkhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlciwgY2hhbmdlc09yaWdpbil7XG4gIGRlbGV0ZSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LWxlbmd0aCddO1xuICBkZWxldGUgaGVhZGVyWyd0cmFuc2Zlci1lbmNvZGluZyddO1xuICBkZWxldGUgaGVhZGVyWydob3N0J107XG4gIC8vIHNlY3VpcnR5XG4gIGlmIChjaGFuZ2VzT3JpZ2luKSB7XG4gICAgZGVsZXRlIGhlYWRlclsnYXV0aG9yaXphdGlvbiddO1xuICAgIGRlbGV0ZSBoZWFkZXJbJ2Nvb2tpZSddO1xuICB9XG4gIHJldHVybiBoZWFkZXI7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiJdfQ==
15673
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9mbGFzaC1tZXNzYWdlcy5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2Zvcm0tc3VibWl0LWhlbHBlcnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9pbnB1dC1udW1iZXItb25seS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vZW5oYW5jZW1lbnRzL2lucHV0LXVuaXQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy9saW5rLWhlcmUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL2VuaGFuY2VtZW50cy90ZXh0YXJlYS1leHBhbmQuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3R1bmdzdGVuL21vZHVsZXMvY2xpcGJvYXJkLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy90dW5nc3Rlbi9tb2R1bGVzL25vdGlmeS5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vbW9kdWxlcy91bml0LWNvbnZlcnRlci5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvdHVuZ3N0ZW4vdHVuZ3N0ZW4uanMiLCJub2RlX21vZHVsZXMvYmVhbi9iZWFuLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1lbWl0dGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWRpYWxvZy9ub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9mcm9tdG9wLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3Njcm9sbHRvLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZGlhbG9nL25vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1kaWFsb2cvbm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvdGltZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2FuaW1hdGlvbi1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYnViYmxlLWZvcm0tZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL2NhbGxiYWNrLW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvZGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvZGVsYXkuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvbWVkaWEuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvb3B0aW1pemVkLWV2ZW50LW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcGFnZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvcmVzaXplLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3Njcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zaGltcy9jdXN0b20tZXZlbnQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc3VibWl0LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3RhcC1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGhyb3R0bGUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2dldC1sYWJlbC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL2lucHV0LWNoYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3Byb2dyZXNzaXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZm9ybS11cC9saWIvcmVzZXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1mb3JtLXVwL2xpYi9zZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWZvcm0tdXAvbGliL3ZhbGlkYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1zbGlkZXIvbGliL29iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi9kYXRlLXRvLWh0bWwuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10aW1lLXRvZ2dsZS9saWIvdGltZWFnby5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRpbWUtdG9nZ2xlL2xpYi90b2dnbGUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b2dnbGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvdGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2tleW1hc3Rlci9rZXltYXN0ZXIuanMiLCJub2RlX21vZHVsZXMvbHV4b24vYnVpbGQvY2pzLWJyb3dzZXIvbHV4b24uanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2FnZW50LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXF1ZXN0LWJhc2UuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVzcG9uc2UtYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3RVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25mQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDamFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6eU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0ckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBuYW1lc1xuXG4gIGZ1bmN0aW9uIGF0dHIoIHNvdXJjZSwgbmFtZSApe1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09ICdvYmplY3QnKVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSsnXCIgJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZSsnXCIgJyB9XG5cbiAgZnVuY3Rpb24gZGFzaGVyaXplKCBpbnB1dCApIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW1xcVyxfXS9nLCAnLScpLnJlcGxhY2UoLy17Mix9L2csICctJylcbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z05hbWUoIG5hbWUgKSB7XG4gICAgcmV0dXJuIFwic3ZnLVwiK2Rhc2hlcml6ZSggbmFtZSApXG4gIH1cblxuICBmdW5jdGlvbiB1c2UoIG5hbWUsIG9wdGlvbnMgKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB2YXIgaWQgPSBkYXNoZXJpemUoIG5hbWUgKVxuICAgIHZhciBzeW1ib2wgPSBzdmdzKClbaWRdXG5cbiAgICBpZiAoIHN5bWJvbCApIHtcbiAgICAgIHZhciBwYXJlbnQgPSBzeW1ib2wucGFyZW50RWxlbWVudFxuICAgICAgdmFyIHByZWZpeCA9IHBhcmVudC5kYXRhc2V0LnByZWZpeFxuICAgICAgdmFyIGJhc2UgICA9IHBhcmVudC5kYXRhc2V0LnN5bWJvbENsYXNzXG5cbiAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCggJzxzdmc+PHVzZSB4bGluazpocmVmPVwiIycgKyBwcmVmaXggKyAnLScgKyBpZCArICdcIi8+PC9zdmc+JyApLmZpcnN0Q2hpbGQ7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAnY2xhc3MnLCBiYXNlICsgJyAnICsgcHJlZml4ICsgJy0nICsgaWQgKyAnICcgKyAoIG9wdGlvbnMuY2xhc3MgfHwgJycgKS50cmltKCkgKVxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSggJ3ZpZXdCb3gnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCAndmlld0JveCcgKSApXG5cbiAgICAgIGlmICggISggb3B0aW9ucy53aWR0aCB8fCBvcHRpb25zLmhlaWdodCB8fCBvcHRpb25zLnNjYWxlICkgKSB7XG5cbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAgc3ltYm9sLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSlcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgc3ltYm9sLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKCBvcHRpb25zLndpZHRoICkgIHN2Zy5zZXRBdHRyaWJ1dGUoICd3aWR0aCcsICBvcHRpb25zLndpZHRoIClcbiAgICAgICAgaWYgKCBvcHRpb25zLmhlaWdodCApIHN2Zy5zZXRBdHRyaWJ1dGUoICdoZWlnaHQnLCBvcHRpb25zLmhlaWdodCApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdmdcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgXCInK25hbWUrJ1wiIHN2ZyBzeW1ib2wuIEVuc3VyZSB0aGF0IHN2ZyBzY3JpcHRzIGFyZSBsb2FkZWQnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z3MoKXtcbiAgICBpZiAoICFuYW1lcyApIHtcbiAgICAgIG5hbWVzID0ge31cbiAgICAgIGZvciggdmFyIHN5bWJvbCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnc3ZnW2lkXj1lc3ZnXSBzeW1ib2wnICkgKSB7XG4gICAgICAgIG5hbWVzW3N5bWJvbC5kYXRhc2V0Lm5hbWVdID0gc3ltYm9sXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYW1lc1xuICB9XG5cbiAgdmFyIGVzdmcgPSB7XG4gICAgc3Znczogc3ZncyxcbiAgICB1c2U6IHVzZVxuICB9XG5cbiAgLy8gSGFuZGxlIFR1cmJvbGlua3MgcGFnZSBjaGFuZ2UgZXZlbnRzXG4gIGlmICggd2luZG93LlR1cmJvbGlua3MgKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oIGV2ZW50ICkgeyBuYW1lcyA9IG51bGw7IGVzdmcuc3ZncygpIH0pXG4gIH1cblxuICBpZiggdHlwZW9mKCBtb2R1bGUgKSAhPSAndW5kZWZpbmVkJyApIHsgbW9kdWxlLmV4cG9ydHMgPSBlc3ZnIH1cbiAgZWxzZSB3aW5kb3cuZXN2ZyA9IGVzdmdcblxufSkoKSIsIihmdW5jdGlvbigpe1xuXG4gIGZ1bmN0aW9uIGVtYmVkKCkge1xuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vzdmctc3ZnLWljb25zJykpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCAnPHN2ZyBpZD1cImVzdmctc3ZnLWljb25zXCIgZGF0YS1zeW1ib2wtY2xhc3M9XCJzdmctc3ltYm9sXCIgZGF0YS1wcmVmaXg9XCJzdmdcIiB2ZXJzaW9uPVwiMS4xXCIgc3R5bGU9XCJoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZVwiIGRhdGEtdHVyYm9saW5rcy1wZXJtYW5lbnQ+PHN5bWJvbCBpZD1cInN2Zy1hbmdsZS1kb3duXCIgZGF0YS1uYW1lPVwiYW5nbGUtZG93blwiIHZpZXdCb3g9XCIwIDAgMjcgMTVcIiB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMTVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjUuMzA0LjAwNWMuMDkyLjAxMi4xMTYuMDEyLjIwNi4wMzYuMTM1LjAzNy4yNjMuMDk3LjM3Ny4xNzcuMzQ4LjI0NC41NDUuNjY1LjUwOCAxLjA4OC0uMDEuMTA0LS4wMzIuMjA3LS4wNjguMzA1LS4wNDguMTMyLS4xMi4yNTQtLjIxLjM2LS4wMi4wMjgtLjA0Ni4wNTMtLjA3LjA4bC0xMiAxMmMtLjAyNS4wMjItLjA1LjA0Ny0uMDc3LjA3LS4wOC4wNjctLjE3LjEyMy0uMjY0LjE2OC0uMzIuMTQ4LS42OTUuMTQ4LTEuMDE0IDAtLjA5NS0uMDQ1LS4xODQtLjEtLjI2NC0uMTctLjAyNy0uMDItLjA1Mi0uMDQ2LS4wNzctLjA3bC0xMi0xMkMuMjkgMS45OC4yNyAxLjk2Ni4yMTcgMS44OWMtLjA4LS4xMTQtLjE0LS4yNDItLjE3Ni0uMzc3Qy0uMDggMS4wNjYuMDc0LjU3OC40MjguMjguNTM1LjE5LjY1OC4xMi43ODguMDczLjkyLjAyNSAxLjA2IDAgMS4yIDBjLjI0NiAwIC40OS4wNzYuNjkuMjE3LjA3Ni4wNTMuMDkuMDcyLjE2LjEzNGwxMS4xNSAxMS4xNTNMMjQuMzUyLjM1bC4wNzgtLjA3Yy4wNzMtLjA1Ni4wOS0uMDczLjE3LS4xMi4xMjItLjA3LjI1NS0uMTE4LjM5My0uMTQyLjA5My0uMDE2LjExNi0uMDE0LjIxLS4wMThsLjEwNC4wMDV6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LWRvd24tY2lyY2xlXCIgZGF0YS1uYW1lPVwiYXJyb3ctZG93bi1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIyLjIxOCAxOC45NDNsLTUuMjQzIDUuMjQzYy0uMjI2LjI4Mi0uNTU4LjQ4LS45NS40OC0uMDA2IDAtLjAxLS4wMDYtLjAxOC0uMDA2LS4wMDggMC0uMDEzLjAwNS0uMDIuMDA1LS4zMTUgMC0uNjMtLjEyLS44Ny0uMzZsLTUuMzYtNS4zNjJjLS40ODMtLjQ4LS40ODMtMS4yNiAwLTEuNzM4LjQ3OC0uNDggMS4yNTUtLjQ4IDEuNzM3IDBsMy4zIDMuM1Y5LjMyM2MwLS42NzguNTUtMS4yMyAxLjIzLTEuMjMuNjggMCAxLjIzLjU1MiAxLjIzIDEuMjNWMjAuNDNsMy4yMjYtMy4yMjVjLjQ4LS40OCAxLjI2LS40OCAxLjczOCAwIC40OC40OC40OCAxLjI1OCAwIDEuNzM4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWFycm93LXVwLWNpcmNsZVwiIGRhdGEtbmFtZT1cImFycm93LXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMjk0IDE0Ljc5OGMtLjI0LjI0LS41NTYuMzYtLjg3LjM2LS4zMTUgMC0uNjI3LS4xMi0uODY4LS4zNmwtMy4zMDMtMy4zMDVWMjIuNjhjMCAuNjc3LS41NDggMS4yMy0xLjIzIDEuMjMtLjY3OCAwLTEuMjI4LS41NTMtMS4yMjgtMS4yM1YxMS41N2wtMy4yMjcgMy4yMjhjLS40ODIuNDgtMS4yNi40OC0xLjczOCAwLS40ODItLjQ4LS40ODItMS4yNTggMC0xLjczN2w1LjI0My01LjI0N2MuMjI2LS4yODIuNTYtLjQ4Ljk1LS40OC4wMDggMCAuMDEzLjAwNi4wMi4wMDYuMDA4IDAgLjAxMy0uMDA2LjAyLS4wMDYuMzI3IDAgLjY0LjEzLjg2OC4zNmw1LjM2NCA1LjM2N2MuNDguNDguNDggMS4yNiAwIDEuNzM4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWJhY2t1cFwiIGRhdGEtbmFtZT1cImJhY2t1cFwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMTYuMDQgMjMuODljLS45MDUuMDczLTEuODEyLjExLTIuNzA2LjExQzguMDQ3IDI0IDIuNDg0IDIyLjY1NiAwIDIwLjQ4M3YyLjg1YzAgMy4zNjQgNS44NTYgNiAxMy4zMzQgNiAxLjM1OCAwIDIuNjYtLjA4OCAzLjg4OC0uMjVDMTYuNDUyIDI3Ljc4NyAxNiAyNi4yOCAxNiAyNC42NjdjMC0uMjYzLjAxNS0uNTIyLjA0LS43Nzh6bS0yLjcwNy0xLjIyM2MxLjAwNCAwIDEuOTg4LS4wNDcgMi45NDMtLjEzLjU1Ni0yLjE5IDEuOTQzLTQuMDQ1IDMuODA3LTUuMjEzLTIuMTUuNDM2LTQuNDkuNjc2LTYuNzUuNjc2QzguMDQ3IDE4IDIuNDgzIDE2LjY1NiAwIDE0LjQ4M1YxOGMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40NFY4Ljg5M0MyMy44MiAxMC44MDcgMTguMzc3IDEyIDEzLjMzMyAxMiA4LjA0NyAxMiAyLjQ4MyAxMC42NTYgMCA4LjQ4M1YxMmMwIDIuMTEzIDUuOTQ3IDQuNjY3IDEzLjMzMyA0LjY2N3ptMC02YzYuMTA2IDAgMTEuNS0xLjY4MyAxMy4zMzQtMy40MzhWNmMwLTMuMzY0LTUuODU4LTYtMTMuMzM0LTZTMCAyLjYzNiAwIDZjMCAyLjExMyA1Ljk0OCA0LjY2NyAxMy4zMzMgNC42Njd6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI4IDI1LjMzM2gtMi42NjdWMjhjMCAuMzY4LS4zLjY2Ny0uNjY2LjY2Ny0uMzY4IDAtLjY2Ny0uMy0uNjY3LS42Njd2LTIuNjY3aC0yLjY2N2MtLjM2OCAwLS42NjYtLjI5OC0uNjY2LS42NjYgMC0uMzY4LjI5OC0uNjY3LjY2Ni0uNjY3SDI0di0yLjY2N2MwLS4zNjguMy0uNjY2LjY2Ny0uNjY2LjM2NiAwIC42NjYuMjk4LjY2Ni42NjZWMjRIMjhjLjM2NyAwIC42NjcuMy42NjcuNjY3IDAgLjM2OC0uMy42NjYtLjY2Ny42NjZtLTMuMzMzLThjLTQuMDQ0IDAtNy4zMzQgMy4yOS03LjMzNCA3LjMzNFMyMC42MjMgMzIgMjQuNjY3IDMyQzI4LjcxIDMyIDMyIDI4LjcxIDMyIDI0LjY2N2MwLTQuMDQ0LTMuMjktNy4zMzQtNy4zMzMtNy4zMzRcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hlY2stY2lyY2xlXCIgZGF0YS1uYW1lPVwiY2hlY2stY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNC45MjUgMTIuNzQ1bC0xMC4yMiAxMS4yLTcuNTktNy41ODhjLS40OC0uNDgzLS40OC0xLjI1NSAwLTEuNzMyLjQ3Ny0uNDgzIDEuMjUyLS40ODMgMS43MzIgMGw1Ljc3NiA1Ljc3NSA4LjQ5LTkuMzA3Yy40NTctLjUwMiAxLjIzMy0uNTM2IDEuNzMzLS4wOC41LjQ1NS41MzQgMS4yMzIuMDggMS43MzJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2x1c3RlclwiIGRhdGEtbmFtZT1cImNsdXN0ZXJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2IDMyYy0uMDU2IDAtLjExMy0uMDAyLS4xNy0uMDA1LS4xMTItLjAwNy0uMjI0LS4wMi0uMzM1LS4wNC0uMzMyLS4wNi0uNjUzLS4xOC0uOTQyLS4zNTQtLjEzLS4wNzgtLjI1Ni0uMTY3LS4zNzMtLjI2Ni0uMDU1LS4wNDctLjEwOC0uMDk2LS4xNi0uMTQ3QzkuNjA0IDI2LjggNS4yIDIyLjM5Ny44MTMgMTcuOThjLS4wNzYtLjA3Ny0uMTQ4LS4xNTgtLjIxNC0uMjQzLS4xMjctLjE2LS4yMzYtLjMzNS0uMzI0LS41Mi0uMDktLjE4NC0uMTU3LS4zOC0uMjAzLS41OEMuMDIzIDE2LjQzIDAgMTYuMjE1IDAgMTZjMC0uMjE0LjAyNC0uNDMuMDczLS42MzguMDQ2LS4yLjExNC0uMzk1LjIwMy0uNTguMDg4LS4xODQuMTk3LS4zNTguMzIzLS41Mi4wNjUtLjA4NC4xMzctLjE2NS4yMTMtLjI0MkM1LjIgOS42MDQgOS42MDMgNS4yIDE0LjAyLjgxM2MuMDc3LS4wNzYuMTU4LS4xNDguMjQzLS4yMTQuMTYtLjEyNy4zMzUtLjIzNi41Mi0uMzI0LjE4NC0uMDkuMzgtLjE1Ny41OC0uMjAzQzE1LjU3LjAyMyAxNS43ODUgMCAxNiAwYy4yMTQgMCAuNDMuMDI0LjYzOC4wNzMuMi4wNDYuMzk1LjExNC41OC4yMDMuMTg0LjA4OC4zNTguMTk3LjUyLjMyMy4wODQuMDY1LjE2NS4xMzcuMjQyLjIxM0MyMi4zOTYgNS4yIDI2LjggOS42MDMgMzEuMTg3IDE0LjAyYy4wNzYuMDc3LjE0OC4xNTguMjE0LjI0My4xMjcuMTYuMjM2LjMzNS4zMjQuNTIuMDkuMTg0LjE1Ny4zOC4yMDMuNTguMDUuMjA4LjA3My40MjMuMDczLjYzNyAwIC4yMTQtLjAyNC40My0uMDczLjYzOC0uMDQ2LjItLjExNC4zOTUtLjIwMy41OC0uMDg4LjE4NC0uMTk3LjM1OC0uMzIzLjUyLS4wNjUuMDg0LS4xMzcuMTY1LS4yMTMuMjQyLTQuMzg4IDQuNDE2LTguNzkgOC44Mi0xMy4yMDcgMTMuMjA3LS4wNTIuMDUtLjEwNS4xLS4xNi4xNDctLjExNy4xLS4yNDIuMTg4LS4zNzMuMjY3LS4yNzUuMTY2LS41NzguMjgyLS44OTIuMzQ1LS4xMS4wMjItLjIyMy4wMzgtLjMzNS4wNDYtLjA1LjAwNS0uMTAyLjAwOC0uMTUyLjAxSDE2em0wLTEuODgzYy4wNTUgMCAuMTEtLjAwNS4xNjQtLjAxNC4xMDctLjAyLjIxLS4wNTcuMzA1LS4xMTIuMDY4LS4wNC4xMy0uMDg3LjE4Ny0uMTQzIDQuNDEyLTQuMzg0IDguODQtOC43NTUgMTMuMTk1LTEzLjE5NS4wMjYtLjAyNy4wNTItLjA1Ni4wNzUtLjA4Ny4wNDItLjA1NC4wNzctLjExMy4xMDYtLjE3Ni4wNS0uMTEyLjA4LS4yMzQuMDgzLS4zNTYuMDA1LS4xNDUtLjAyMy0uMjktLjA4My0uNDIzLS4wMy0uMDYyLS4wNjQtLjEyLS4xMDYtLjE3NS0uMDIzLS4wMy0uMDUtLjA2LS4wNzUtLjA4Ny00LjM1OC00LjQ0Mi04Ljc1OC04Ljg0Mi0xMy4yLTEzLjItLjAyNy0uMDI2LS4wNTYtLjA1Mi0uMDg3LS4wNzUtLjA1NC0uMDQyLS4xMTMtLjA3Ny0uMTc2LS4xMDYtLjExMi0uMDUtLjIzNC0uMDgtLjM1Ni0uMDgzLS4xNDUtLjAwNS0uMjkuMDIzLS40MjMuMDgzLS4wNi4wMjgtLjExNy4wNjItLjE3LjEwMi0uMDMzLjAyNC0uMDYzLjA1LS4wOTIuMDc4LTQuNDQyIDQuMzU4LTguODQyIDguNzU4LTEzLjIgMTMuMmwtLjA4LjA5Yy0uMDQuMDU1LS4wNzMuMTEyLS4xLjE3My0uMDYuMTMzLS4wOS4yOC0uMDg0LjQyNC4wMDQuMTIyLjAzMi4yNDQuMDgzLjM1NS4wMy4wNjIuMDY0LjEyLjEwNi4xNzUuMDIzLjAzLjA1LjA2LjA3NS4wODcgNC4zNTggNC40NDIgOC43NTggOC44NDIgMTMuMiAxMy4yLjA1NS4wNTMuMTE2LjEuMTgzLjE0LjA4OC4wNS4xODQuMDg3LjI4NC4xMDYuMDU2LjAxMi4xMTIuMDE4LjE3LjAySDE2elwiIGZpbGwtb3BhY2l0eT1cIi41MDJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjxwYXRoIGQ9XCJNMTcuNDgyIDI2LjkzbC0uODQ3Ljg0NmMtLjE3LjE3LS4zOTcuMjYzLS42MzUuMjYzcy0uNDY2LS4wOTUtLjYzNS0uMjY0bC0xMS4xNC0xMS4xNGMtLjE3LS4xNy0uMjY0LS4zOTgtLjI2NC0uNjM2cy4wOTUtLjQ2Ni4yNjQtLjYzNWwxMS4xNC0xMS4xNGMuMTctLjE3LjM5OC0uMjY0LjYzNi0uMjY0cy40NjYuMDk1LjYzNS4yNjRsNC4wNSA0LjA1djUuNDU2Yy0uMTA0LjAzLS4yMDUuMDY0LS4zMDMuMTA2LS4yNy4xMTYtLjUxNy4yODMtLjcyNS40OS0uMi4xOTUtLjM2Mi40MjYtLjQ4LjY4LS4xMDIuMjItLjE3LjQ1NC0uMi42OTUtLjAzMy4yNDgtLjAyNS41LjAyMi43NDUuMDQuMjEzLjExLjQyLjIxLjYxNC4xMjIuMjQ0LjI4OC40NjYuNDg3LjY1NC4xOTMuMTguNDE2LjMzLjY1OC40MzguMi4wOS40MTIuMTUuNjI4LjE4LjExLjAxNS4yMi4wMjIuMzI4LjAyM2guMDYyYy4xMS0uMDA0LjIxOC0uMDE0LjMyNi0uMDMyLjIxNS0uMDM2LjQyNS0uMTAyLjYyMi0uMTk1LjI0My0uMTE1LjQ2Ni0uMjczLjY1Ni0uNDYzcy4zNDgtLjQxNC40NjQtLjY1N2MuMDk1LS4yLjE2Mi0uNDE2LjE5Ny0uNjM2LjAzOC0uMjQuMDQtLjQ4OC4wMDItLjczLS4wMzgtLjI0LS4xMTItLjQ3Mi0uMjItLjY5LS4xMjMtLjI0OC0uMjkyLS40NzUtLjQ5NC0uNjY2LS4yMTQtLjItLjQ2NS0uMzYyLS43MzgtLjQ3Mi0uMDgtLjAzMi0uMTY0LS4wNi0uMjUtLjA4NFY5LjUyOGw1LjgzOCA1LjgzN2MuMTcuMTcuMjYzLjM5Ny4yNjMuNjM1cy0uMDk1LjQ2Ni0uMjY0LjYzNWwtNi42NCA2LjY0LTQuNTA4LTQuNTF2LTYuNTFjLjEzLS4wMzYuMjU4LS4wODMuMzgtLjE0LjI0My0uMTE2LjQ2Ni0uMjc0LjY1Ny0uNDY0LjE4Ny0uMTg2LjM0Mi0uNDA1LjQ1Ny0uNjQzLjA5Ny0uMi4xNjQtLjQxNS4yLS42MzQuMDQyLS4yNDYuMDQzLS41LjAwNS0uNzQ1LS4wMzYtLjI0LS4xMS0uNDcyLS4yMTgtLjY5LS4xMjUtLjI0OC0uMjkzLS40NzUtLjQ5Ni0uNjY2LS4yMTQtLjItLjQ2NS0uMzYyLS43MzctLjQ3Mi0uMTQ0LS4wNTgtLjI5NC0uMS0uNDQ3LS4xMy0uMTUtLjAyNy0uMzA2LS4wNC0uNDYtLjA0LS4xNS4wMDMtLjI5OC4wMi0uNDQ0LjA1LS4xNTYuMDMtLjMxLjA4LS40NTYuMTQyLS4yNy4xMTYtLjUxNi4yODMtLjcyNS40OS0uMTk4LjE5NS0uMzYuNDI2LS40OC42OC0uMTAyLjIxOC0uMTcuNDU0LS4yLjY5NS0uMDMyLjI0Ny0uMDI0LjUuMDIzLjc0NC4wNC4yMTQuMTEuNDIyLjIxLjYxNS4xMi4yNC4yODMuNDYuNDc4LjY0NS4xOTUuMTg2LjQyMi4zMzguNjY4LjQ0OC4xMDYuMDQ3LjIxNi4wODcuMzI4LjExOHY2Ljc2OGMuMDAyLjA1IDAgLjA2LjAxLjExLjAxNi4wOS4wNS4xNzYuMTA0LjI1LjAyOC4wNC4wMzcuMDQ4LjA3LjA4NGw0LjY5MyA0LjY5NC0xLjg4IDEuODgtNi45NjItNi45NjJ2LS44MWMuMTMtLjAzNi4yNTgtLjA4NC4zOC0uMTQyLjI0NC0uMTE1LjQ2Ny0uMjczLjY1Ny0uNDYzcy4zNDgtLjQxNC40NjQtLjY1N2MuMDk0LS4yLjE2LS40MTYuMTk2LS42MzYuMDM4LS4yNC4wNC0uNDg4LjAwMi0uNzMtLjAzNy0uMjQtLjExLS40NzItLjIxOC0uNjktLjEyNC0uMjQ4LS4yOTMtLjQ3NS0uNDk1LS42NjYtLjIxNC0uMi0uNDY1LS4zNjItLjczOC0uNDcyLS4xNDQtLjA1Ny0uMjkzLS4xLS40NDYtLjEzLS4xNS0uMDI3LS4zMDUtLjA0LS40Ni0uMDM4LS4xNTQuMDAyLS4zMDcuMDE4LS40NTguMDUtLjE1LjAzMi0uMy4wOC0uNDQuMTQtLjI3LjExNi0uNTE4LjI4My0uNzI2LjQ5LS4xOTguMTk1LS4zNjIuNDI2LS40OC42OC0uMTAyLjIyLS4xNy40NTQtLjIuNjk1LS4wMzMuMjQ4LS4wMjUuNS4wMjIuNzQ1LjA0My4yMjMuMTE4LjQ0LjIyMy42NC4xMjUuMjM4LjI5LjQ1NS40ODcuNjM4LjE5LjE3OC40MS4zMjMuNjQ3LjQzLjEwNy4wNDYuMjE3LjA4Ni4zMy4xMTd2MS4wN2MwIC4wNCAwIC4wNS4wMDUuMDkuMDEyLjA4OC4wNDQuMTczLjA5Mi4yNS4wMTcuMDI0LjAzNS4wNDguMDU0LjA3bC4wMy4wMzMgNy4xNDYgNy4xNDZ6bS02LjctOS44M2MuMDU1IDAgLjExLS4wMDUuMTY2LS4wMTQuMDk2LS4wMTQuMTktLjA0Mi4yNzgtLjA4LjEwMy0uMDQ3LjItLjExLjI4My0uMTg0LjA5LS4wOC4xNjgtLjE3Ni4yMjgtLjI4LjA1LS4wOTMuMDktLjE5LjExNC0uMjkzLjAzLS4xMy4wMzUtLjI2LjAyLS4zOS0uMDE1LS4xMS0uMDQ2LS4yMTctLjA5Mi0uMzE4LS4wNTUtLjEyLS4xMzMtLjIzLS4yMjctLjMyNC0uMDk4LS4wOTYtLjIxMy0uMTc0LS4zNC0uMjI4LS4xMy0uMDU3LS4yNzQtLjA4Ny0uNDE4LS4wOS0uMTQ1IDAtLjI5LjAyNS0uNDIzLjA4LS4xMjUuMDUtLjI0LjEyMy0uMzQuMjE1LS4wOTcuMDktLjE3OC4yLS4yMzcuMzE3LS4wNS4xLS4wODMuMjA1LS4xLjMxMy0uMDIuMTMtLjAxOC4yNjIuMDA3LjM5LjAyLjEuMDU1LjIuMTAyLjI5LjA1My4xMDIuMTIzLjE5Ni4yMDQuMjc3LjA4Ny4wODUuMTg3LjE1Ni4yOTcuMjEuMDkuMDQyLjE4My4wNzMuMjguMDkuMDU1LjAxLjExLjAxNS4xNjcuMDE3aC4wM3ptMTAuNTMgMGMuMDU2IDAgLjExMi0uMDA1LjE2Ny0uMDE0LjA5NS0uMDE0LjE5LS4wNDIuMjc3LS4wOC4xMDctLjA1LjIwNi0uMTE0LjI5My0uMTkyLjA4Ny0uMDguMTYtLjE3Mi4yMi0uMjczLjA1LS4wOS4wODctLjE4NS4xMS0uMjg1LjAzMi0uMTMuMDQtLjI2NC4wMjItLjM5Ni0uMDE0LS4xMS0uMDQ1LS4yMTctLjA5LS4zMTgtLjA1Ni0uMTItLjEzNC0uMjMtLjIyOC0uMzI0LS4wOTgtLjA5Ni0uMjEzLS4xNzQtLjM0LS4yMjgtLjEzLS4wNTctLjI3NC0uMDg3LS40MTgtLjA5LS4xNDUgMC0uMjkuMDI1LS40MjMuMDgtLjEyNi4wNS0uMjQuMTIzLS4zNC4yMTUtLjA5Ny4wOS0uMTc4LjItLjIzNy4zMTctLjA1LjEtLjA4My4yMDUtLjEuMzEzLS4wMi4xMy0uMDE4LjI2Mi4wMDcuMzkuMDIuMTA2LjA1OC4yMDguMTA4LjMwMi4wNTguMTA1LjEzLjIuMjE4LjI4My4wODIuMDc3LjE3Ni4xNDIuMjc4LjE5LjA5LjA0NC4xODMuMDc1LjI4LjA5Mi4wNTUuMDEuMTEuMDE1LjE2Ny4wMTdoLjAyOHpNMTYgMTEuMDg0Yy4wNTYgMCAuMTEyLS4wMDQuMTY4LS4wMTMuMDk2LS4wMTQuMTktLjA0Mi4yNzgtLjA4LjEwMy0uMDQ3LjE5OC0uMTEuMjgzLS4xODQuMDktLjA4LjE2Ny0uMTc2LjIyNy0uMjgyLjA1LS4wOS4wOS0uMTg1LjExMi0uMjg1LjAzLS4xMjguMDM3LS4yNjMuMDItLjM5NS0uMDE0LS4xMS0uMDQ0LS4yMTctLjA5LS4zMTctLjA1Ni0uMTItLjEzMy0uMjMtLjIyOC0uMzI0LS4wOTctLjA5Ni0uMjEzLS4xNzQtLjM0LS4yMy0uMTMtLjA1NS0uMjc0LS4wODUtLjQxOC0uMDg3LS4xNDQtLjAwMi0uMjkuMDI0LS40MjMuMDc4LS4xMjQuMDUtLjI0LjEyNC0uMzM4LjIxNi0uMDk3LjA5Mi0uMTc4LjItLjIzNy4zMTgtLjA1LjEtLjA4My4yMDQtLjEuMzEzLS4wMi4xMy0uMDIuMjYzLjAwNy4zOS4wMi4xMDYuMDU3LjIwOC4xMDguMzAzLjA1Ny4xMDcuMTMzLjIwNS4yMjIuMjg3LjA4LjA3Ni4xNzMuMTQuMjcyLjE4Ny4wOS4wNDQuMTg4LjA3NS4yODguMDkyLjA1My4wMDguMTA2LjAxMy4xNi4wMTVIMTZ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY29weVwiIGRhdGEtbmFtZT1cImNvcHlcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48ZyBmaWxsLXJ1bGU9XCJub256ZXJvXCI+PHBhdGggZD1cIk0yMi42NjcgNC42NjdjMC0uMzY4LS4zLS42NjctLjY2Ny0uNjY3aC0zLjMzM3YxMC40OTVjMS4yMDgtLjY0IDIuNTYyLTEuMDMyIDQtMS4xMjd2LTguN3pNNCAyNS4zMzNWNEguNjY3Qy4zIDQgMCA0LjMgMCA0LjY2N1YyNmMwIDEuODM3IDEuNDk2IDMuMzMzIDMuMzMzIDMuMzMzaDEyLjAyYy0uODc4LTEuMTY1LTEuNTE3LTIuNTItMS44MTgtNEg0elwiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk0xNCAxMkg3LjMzM2MtLjM2OCAwLS42NjYuMy0uNjY2LjY2NyAwIC4zNjguMjk4LjY2Ni42NjYuNjY2SDE0Yy4zNjggMCAuNjY3LS4yOTguNjY3LS42NjYgMC0uMzY4LS4zLS42NjctLjY2Ny0uNjY3TTE0IDE0LjY2N0g3LjMzM2MtLjM2OCAwLS42NjYuMjk4LS42NjYuNjY2IDAgLjM2OC4yOTguNjY3LjY2Ni42NjdIMTRjLjM2OCAwIC42NjctLjMuNjY3LS42NjcgMC0uMzY4LS4zLS42NjYtLjY2Ny0uNjY2TTE0LjY2NyAxOGMwLS4zNjgtLjMtLjY2Ny0uNjY3LS42NjdINy4zMzNjLS4zNjggMC0uNjY2LjMtLjY2Ni42NjcgMCAuMzY4LjI5OC42NjcuNjY2LjY2N0gxNGMuMzY4IDAgLjY2Ny0uMy42NjctLjY2N003LjMzMyAyMGMtLjM2OCAwLS42NjYuMy0uNjY2LjY2NyAwIC4zNjguMjk4LjY2Ni42NjYuNjY2aDRjLjM2OCAwIC42NjctLjI5OC42NjctLjY2NiAwLS4zNjgtLjMtLjY2Ny0uNjY3LS42NjdoLTR6XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTYgOS4zMzNoMTAuNjY3Yy4zNjggMCAuNjY2LS4yOTguNjY2LS42NjZWMy4zMzNjMC0uMzY4LS4yOTgtLjY2Ni0uNjY2LS42NjZoLTIuMDZDMTQuMzMgMS4xMTUgMTMuMDg3IDAgMTEuMzMzIDAgOS42ODcgMCA4LjM2MyAxIDguMDYgMi42NjdINmMtLjM2OCAwLS42NjcuMjk4LS42NjcuNjY2djUuMzM0YzAgLjM2OC4zLjY2Ni42NjcuNjY2XCIgZmlsbC1vcGFjaXR5PVwiLjMwMlwiLz48cGF0aCBkPVwiTTI2Ljk3IDI0SDI0djIuOTdjMCAuMzY3LS4zLjY2Ni0uNjY3LjY2Ni0uMzY4IDAtLjY2Ni0uMy0uNjY2LS42NjdWMjRoLTIuOTdjLS4zNjggMC0uNjY2LS4zLS42NjYtLjY2NyAwLS4zNjguMy0uNjY2LjY2Ny0uNjY2aDIuOTd2LTIuOTdjMC0uMzcuMjk4LS42NjYuNjY2LS42NjYuMzY4IDAgLjY2Ny4yOTguNjY3LjY2N3YyLjk3aDIuOTdjLjM2NyAwIC42NjYuMjk4LjY2Ni42NjYgMCAuMzY4LS4zLjY2Ny0uNjY3LjY2N20tMy42MzctOS4zMzNjLTQuNzggMC04LjY2NiAzLjg4OC04LjY2NiA4LjY2NiAwIDQuNzggMy44ODYgOC42NjcgOC42NjYgOC42NjdTMzIgMjguMTEyIDMyIDIzLjMzM2MwLTQuNzc4LTMuODg4LTguNjY2LTguNjY3LTguNjY2XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRlcGxveW1lbnRcIiBkYXRhLW5hbWU9XCJkZXBsb3ltZW50XCIgdmlld0JveD1cIjAgMCAxNzYgMjAxXCIgd2lkdGg9XCIxNzZcIiBoZWlnaHQ9XCIyMDFcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNODggNS45ODVsODIuMjcyIDQ3LjV2OTVMODggMTk1Ljk4NWwtODIuMjcyLTQ3LjV2LTk1TDg4IDUuOTg1elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRpY2VcIiBkYXRhLW5hbWU9XCJkaWNlXCIgdmlld0JveD1cIjAgMCA0NSAzMlwiIHdpZHRoPVwiNDVcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0zMC43NjIgMTAuMjMyYzEuMTgzLjY4NCAxLjU5IDIuMi45MDYgMy4zODJsLTkuOSAxNy4xNDhjLS42ODMgMS4xODMtMi4yIDEuNTktMy4zODIuOTA2bC0xNy4xNDgtOS45Yy0xLjE4My0uNjg0LTEuNTktMi4yLS45MDYtMy4zODJsOS45LTE3LjE0OGMuNjg0LTEuMTgzIDIuMi0xLjU5IDMuMzgyLS45MDZsMTcuMTQ4IDkuOXpcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjIuMTMgNS4yNWMuMDItLjAwMi4wNC0uMDAyLjA2LS4wMDJoMTkuODAzYzEuMzY2IDAgMi40NzUgMS4xMSAyLjQ3NSAyLjQ3NXYxOS44MDJjMCAxLjM2Ni0xLjExIDIuNDc1LTIuNDc1IDIuNDc1SDIyLjIwOGwyLjQ0LTQuMjNjLjI3My4xMS41Ny4xNy44OC4xNyAxLjI5IDAgMi4zNC0xLjA0NyAyLjM0LTIuMzM4IDAtLjc1LS4zNTQtMS40MTYtLjkwMi0xLjg0NGw0LjcwMi04LjE0NGMuNjgzLTEuMTgzLjI3Ny0yLjY5OC0uOTA2LTMuMzgyTDIyLjEzIDUuMjV6bTE2LjM1IDE2LjAxM2MxLjI5IDAgMi4zNCAxLjA0OCAyLjM0IDIuMzQgMCAxLjI5LTEuMDUgMi4zMzgtMi4zNCAyLjMzOC0xLjI5IDAtMi4zNC0xLjA0Ny0yLjM0LTIuMzM4IDAtMS4yOSAxLjA1LTIuMzQgMi4zNC0yLjM0em0wLTExLjk1NmMxLjI5IDAgMi4zNCAxLjA0OCAyLjM0IDIuMzQgMCAxLjI5LTEuMDUgMi4zMzgtMi4zNCAyLjMzOC0xLjI5IDAtMi4zNC0xLjA0OC0yLjM0LTIuMzQgMC0xLjI5IDEuMDUtMi4zMzggMi4zNC0yLjMzOHpNMTkuNzEyIDIyLjM0NWMxLjExOC42NDUgMS41MDIgMi4wNzcuODU3IDMuMTk2LS42NDcgMS4xMi0yLjA4IDEuNTAyLTMuMTk3Ljg1Ny0xLjExOC0uNjQ2LTEuNTAyLTIuMDc4LS44NTYtMy4xOTYuNjQ1LTEuMTE3IDIuMDc3LTEuNSAzLjE5NS0uODU1ek0xNy4wOTMgMTMuOTNjMS4xMTguNjQ1IDEuNTAyIDIuMDc3Ljg1NiAzLjE5NS0uNjQ3IDEuMTE4LTIuMDc4IDEuNTAyLTMuMTk3Ljg1Ny0xLjExOC0uNjQ2LTEuNS0yLjA3OC0uODU2LTMuMTk2LjY0Ni0xLjExOCAyLjA3OC0xLjUwMiAzLjE5Ni0uODU2ek0xNC40NzMgNS41MTRjMS4xMTguNjQ2IDEuNTAyIDIuMDc4Ljg1NiAzLjE5Ni0uNjQ2IDEuMTE4LTIuMDc4IDEuNTAyLTMuMTk2Ljg1Ni0xLjExOC0uNjQ1LTEuNTAyLTIuMDc3LS44NTYtMy4xOTUuNjQ1LTEuMTE4IDIuMDc3LTEuNSAzLjE5NS0uODU2elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRvd25sb2FkXCIgZGF0YS1uYW1lPVwiZG93bmxvYWRcIiB2aWV3Qm94PVwiMCAwIDMzIDMyXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDMyLjk3OHYzMkgwelwiLz48cGF0aCBkPVwiTTE1LjUgMjguNjI3VjE2LjkyYy4wMDUtLjEuMDE1LS4xOTUuMDQ1LS4yOS4wOC0uMjYyLjI3LS40OC41MTUtLjYuMTEzLS4wNTQuMjMtLjA4LjM1NS0uMDk1LjA3NC0uMDAzLjA3NC0uMDAzLjE0OCAwIC4xMjQuMDE0LjI0LjA0LjM1NS4wOTUuMjQ1LjEyLjQzNS4zMzguNTE1LjYuMDMuMDk1LjA0LjE5LjA0NC4yOXYxMS43MDdsMi41NC0yLjU0LjA0My0uMDRjLjEyLS4xLjI1LS4xNzYuNC0uMjE2LjEzLS4wMzQuMjY3LS4wNDIuNC0uMDIzLjMyNi4wNDguNjEzLjI2Mi43NTIuNTYuMDQuMDg3LjA2OC4xOC4wODIuMjc1LjAxNC4wOTQuMDE0LjE5IDAgLjI4Ni0uMDIuMTMzLS4wNjYuMjYtLjEzNy4zNzYtLjAzLjA1LS4wNjUuMDkzLS4xMDIuMTM4LTEuMzggMS40NjItMi44NDIgMi44NDQtNC4yNjQgNC4yNjZsLS4wMy4wM2MtLjA1Mi4wNDgtLjExLjA5LS4xNy4xMjYtLjAyNy4wMTYtLjA1NS4wMy0uMDg0LjA0NC0uMTA4LjA1LS4yMjUuMDgtLjM0NC4wOS0uMDk3LjAwNy0uMTk2IDAtLjI5My0uMDIyLS4wOTctLjAyMi0uMTktLjA2LS4yNzUtLjEwOC0uMDc1LS4wNDMtLjE0NS0uMDk3LS4yMDYtLjE1OC0xLjQ1LTEuMzctMi44Mi0yLjgxOC00LjIyNy00LjIyNy0uMTA3LS4xMTItLjE5LS4yNC0uMjQtLjM4Ny0uMTEtLjMzMi0uMDMyLS43MDcuMi0uOTY4LjA2NC0uMDcuMTM4LS4xMzQuMjItLjE4NC4xNS0uMDkyLjMxNS0uMTM2LjQ5LS4xNDcuMDU3IDAgLjA1NyAwIC4xMTQuMDA0LjA1OC4wMDcuMTE0LjAxNi4xNy4wMy4xNy4wNDYuMzE2LjEzNi40NDMuMjU2bDIuNTQgMi41NHptMTAuNDI0LTQuOTg0aC00LjUyYy0uMDM2LS4wMDItLjA3Mi0uMDAyLS4xMDctLjAwNi0uMTQyLS4wMTUtLjI4LS4wNjItLjQwMy0uMTM2LS4wOS0uMDU0LS4xNzQtLjEyNC0uMjQzLS4yMDYtLjI1OC0uMzA1LS4zMDctLjc0OC0uMTItMS4xMDIuMDUtLjA5NC4xMTYtLjE4LjE5NC0uMjU0LjEzLS4xMjMuMjkzLS4yMS40NjctLjI0OC4wOTQtLjAyLjEyLS4wMTguMjE0LS4wMjNoNC40NDRjLjQzLS4wNzUuODU0LS4xOTcgMS4yNjQtLjM0OCAxLjEzMi0uNDIgMi4xOTQtMS4xMDMgMi45MDgtMi4wOS4xNjUtLjIzLjMxLS40Ny40MzMtLjcyNC4yODctLjU5LjQ1LTEuMjM0LjUxNi0xLjg4Ni4wMzctLjM4My4wNDUtLjc3LjAxNS0xLjE1NS0uMDMzLS40MzYtLjExNy0uODY4LS4yNS0xLjI4NS0uMzctMS4xNzMtMS4xMjQtMi4yMTItMi4xMjItMi45MzItLjQ4LS4zNDgtMS4wMTctLjYyLTEuNTgzLS44MDItLjQyLS4xMzUtLjg1Ny0uMjItMS4yOTctLjI1Ny0uMjMyLS4wMi0uNDYzLS4wMjItLjY5Ni0uMDE2bC0uMTAzLS4wMDJjLS4wOS0uMDEyLS4xMTUtLjAxLS4yMDQtLjAzNy0uMi0uMDU4LS4zNzgtLjE4LS41MDUtLjM0NS0uMDU2LS4wNzMtLjA2NC0uMDk1LS4xMDgtLjE3Ni0uMDU0LS4xMTMtLjExLS4yMjQtLjE2OC0uMzM1LS4zNDctLjY1LS43Ny0xLjI1NS0xLjI3LTEuNzk2LS42LS42NDctMS4yOTctMS4yLTIuMDY0LTEuNjM0LS44MjQtLjQ2NS0xLjcyNy0uNzktMi42Ni0uOTUyLS43OTItLjE0LTEuNjA0LS4xNjQtMi40MDMtLjA3Ni0uOC4wODgtMS41ODguMjkyLTIuMzMuNjA0LS44NzUuMzY4LTEuNjg1Ljg4NS0yLjM4OCAxLjUyLS43NzUuNzAyLTEuNDE4IDEuNTQ2LTEuODg3IDIuNDgtLjM0My42ODMtLjU5MyAxLjQxNC0uNzQgMi4xNjUtLjA3LjM3My0uMTE2Ljc0OC0uMTQgMS4xMjdsLS4wMTMuMTA0Yy0uMDA4LjAzNS0uMDE0LjA3LS4wMjQuMTA0LS4wMTguMDY3LS4wNDUuMTMzLS4wNzguMTk1LS4xMzMuMjQ4LS4zNzMuNDMtLjY1LjQ5NS0uMDY3LjAxNi0uMTM3LjAyNC0uMjA3LjAyNS0uMDM1IDAtLjA3LS4wMDMtLjEwNi0uMDA0LS4xMzctLjAyLS4yNzItLjA0OC0uNDA4LS4wNjgtLjQ5Ni0uMDYzLS45OTYtLjA0My0xLjQ4My4wNzMtMS4wMDguMjQyLTEuOTAyLjg3NC0yLjQ2OCAxLjc0LS4xNzMuMjY0LS4zMTUuNTUtLjQyLjg0Ni0uMTEuMzA4LS4xODIuNjI4LS4yMTUuOTUzLS4wNC4zOTItLjAyNS43OTQuMDMgMS4xODQuMDc1LjUzNi4yNDMgMS4wNi41NCAxLjUxNy4wOS4xNC4xOS4yNy4zLjM5My42MzIuNzA0IDEuNTQ2IDEuMDkgMi40NTggMS4yNzUuMzQuMDcuNjkyLjExNiAxLjA0LjEyaDUuMTdsLjEwNy4wMDVjLjA5NC4wMTUuMTE4LjAxNS4yMS4wNDYuMTY4LjA1Ni4zMi4xNi40MzYuMjk1LjA3LjA4Mi4xMjUuMTc1LjE2NS4yNzQuMDQuMS4wNjMuMjA0LjA3LjMxLjAxOC4zNjMtLjE2OC43MTUtLjQ3OC45LS4xMjMuMDc1LS4yNi4xMjItLjQwMy4xMzctLjAzNS4wMDQtLjA3LjAwNC0uMTA3LjAwNi0xLjc0NCAwLTMuNDkuMDE0LTUuMjMzIDAtLjQyLS4wMTItLjgzNi0uMDU3LTEuMjQ3LS4xMzQtMS4xODYtLjIyMy0yLjM0Ni0uNy0zLjI1My0xLjUxMi0uMTY3LS4xNS0uMzI0LS4zMS0uNDctLjQ4LS4xNzctLjIwMy0uMzM3LS40Mi0uNDgtLjY1LS4zOTctLjY0LS42NDUtMS4zNjMtLjc2NC0yLjEwNi0uMDQ3LS4yOTYtLjA3NC0uNTk0LS4wODQtLjg5NC0uMDEtLjI5Ni0uMDAzLS41OTIuMDI3LS44ODcuMDQ3LS40NTUuMTQ1LS45MDUuMjkyLTEuMzM4LjMzOC0uOTkuOTQtMS44ODMgMS43MjMtMi41NzUuNjU2LS41NzggMS40MzYtMS4wMSAyLjI3NC0xLjI2LjYxLS4xODQgMS4yNS0uMjY1IDEuODg4LS4yNWwuMDYtLjM0NGMuMDY3LS4zMjYuMTQ0LS42NDguMjM4LS45NjcuMTk4LS42NjUuNDYyLTEuMzEuNzg4LTEuOTIzLjY2LTEuMjQzIDEuNTc2LTIuMzQ4IDIuNjcyLTMuMjMuODgzLS43MTMgMS44ODItMS4yNzggMi45NDctMS42NjguNzAyLS4yNTYgMS40My0uNDM2IDIuMTcyLS41MzYuMzM3LS4wNDcuNjc2LS4wNzQgMS4wMTctLjA4OC4xNi0uMDA1LjMyMy0uMDA4LjQ4NS0uMDA3LjkxOC4wMTIgMS44My4xMzcgMi43MTUuMzg1IDEuODQ1LjUxOCAzLjUyNyAxLjU1NiA0LjgyOCAyLjk2My41NzUuNjIyIDEuMDY4IDEuMzEzIDEuNDggMi4wNTNsLjAwNC4wMDZjLjA5Mi4wMDUuMTg1LjAxLjI3Ny4wMTguMTAyLjAwOC4yMDIuMDE4LjMwMi4wMy4yMy4wMy40Ni4wNjUuNjg3LjExNC41Ny4xMiAxLjEyOC4zMDggMS42NTcuNTU2IDEuMTQ4LjU0IDIuMTU1IDEuMzY0IDIuOTEyIDIuMzguNTcuNzY4Ljk5OCAxLjY0IDEuMjUyIDIuNTYyLjI3NyAxLjAwNy4zMzggMi4wNi4yMTggMy4wOTctLjA5Ny44MzQtLjMyMiAxLjY1NC0uNjkgMi40MS0uMTczLjM1Ni0uMzc3LjY5Ni0uNjA4IDEuMDE2LS4xNTQuMjEyLS4zMi40MTUtLjQ5NS42MS0uOTAzLjk5Mi0yLjA3NiAxLjcxMi0zLjMzIDIuMTc2LS41NTMuMjA1LTEuMTI4LjM2Ny0xLjcxMi40NTgtLjA0Ny4wMDYtLjA0Ni4wMDYtLjA5My4wMWwtLjA2OC4wMDN6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZ2Vhci1jaXJjbGVcIiBkYXRhLW5hbWU9XCJnZWFyLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTI0LjI1MyA2Ljk3Yy4xNjguMDQ1LjMyLjExNy40NDUuMjQuMDU0LjA1Mi4wNjQuMDY4LjExLjEyOCAxLjA5NiAxLjcxIDIuMDM1IDMuNTE0IDMuMDUgNS4yNzIuMDQuMDc3LjA3NC4xNS4wOTUuMjM2LjA3LjI3Ny4wMDQuNTc4LS4xNzUuOC0uMDczLjA5LS4xNi4xNi0uMjU3LjIybC0xLjY0Ljk1Yy4wMjIuMTU0LjAzNC4zMDguMDQ4LjQ2NC4wMTMuMTkzLjAyMy4zODUuMDI2LjU4LjAwMy40MjMtLjAyMy44NDItLjA3IDEuMjYzdi4wMTNsMS42NC45NS4wNzIuMDQ0Yy4wNy4wNTMuMTMuMTA3LjE4Ni4xNzQuMTYuMi4yMy40NjQuMTkyLjcxOC0uMDEzLjA4Ni0uMDQuMTY0LS4wNzMuMjQ0LS45MzIgMS44MDMtMi4wMjUgMy41Mi0zLjA0IDUuMjc3LS4wNDYuMDczLS4wOTQuMTQtLjE1Ni4yLS4yMDYuMi0uNS4yOTQtLjc4My4yNS0uMTE0LS4wMTgtLjIxNi0uMDYtLjMxOC0uMTEzbC0xLjYzNS0uOTVjLS4xMy4wOTgtLjI2Mi4xODgtLjM5Ni4yOC0uMTkuMTIzLS4xOS4xMjItLjM4NC4yNDItLjM5LjIzLS43ODcuNDM1LTEuMi42MjNsLS4wMTMuMDA2djEuOTFsLS4wMDQuMDg0Yy0uMDEzLjA4Ni0uMDI4LjE2Ny0uMDYuMjQ4LS4wOTIuMjQtLjI4NS40MzItLjUyNS41MjUtLjA4LjAzLS4xNjIuMDQ2LS4yNDcuMDU4LTIuMDMuMDk0LTQuMDYyLjAwNC02LjA5NC4wMDQtLjA4Ni0uMDA1LS4xNjgtLjAxMi0uMjUtLjAzNi0uMjc3LS4wNzgtLjUwNC0uMjg2LS42MDctLjU1Mi0uMDQyLS4xMS0uMDU3LS4yMTgtLjA2My0uMzMzVjI1LjA4Yy0uMTQyLS4wNi0uMjgyLS4xMjgtLjQyMi0uMTk1LS4yMDMtLjEwMi0uMjAzLS4xLS40MDQtLjIwNy0uNDA0LS4yMjItLjc5LS40NjQtMS4xNjgtLjczbC0uMDI3LS4wMi0xLjY2Ljk1Mi0uMDc0LjAzOGMtLjA4LjAzMy0uMTYuMDYtLjI0NS4wNzMtLjI1My4wNC0uNTE3LS4wMzItLjcxNi0uMTkzLS4wNy0uMDU0LS4xMjItLjExNy0uMTc1LS4xODVDNi4xNCAyMi45MDUgNS4yIDIxLjEgNC4xODUgMTkuMzRjLS4wNTItLjEtLjA5NC0uMjAzLS4xMS0uMzE4LS4wNDUtLjI4Mi4wNDgtLjU3Ni4yNDctLjc4LjA2LS4wNjQuMTI4LS4xMS4yLS4xNTdsMS42NDItLjk0OGMtLjAyLS4xNTYtLjAzMy0uMzEtLjA0Ni0uNDY3LS4wMTQtLjIzLS4wMTQtLjIzLS4wMjMtLjQ2LS4wMDYtLjQ2NC4wMTgtLjkyMi4wNy0xLjM4MnYtLjAxNGwtMS42NC0uOTQ3LS4wNy0uMDQ2Yy0uMDctLjA1Mi0uMTMtLjEwNi0uMTg2LS4xNzMtLjE2Mi0uMi0uMjMyLS40NjUtLjE5My0uNzE4LjAxNC0uMDg3LjA0LS4xNjUuMDc0LS4yNDUuOTM1LTEuODAzIDIuMDMtMy41MTggMy4wNDctNS4yNzYuMDYyLS4wOTguMTMtLjE4NC4yMi0uMjU3LjIyMi0uMTguNTIzLS4yNDUuOC0uMTc2LjA4NC4wMi4xNi4wNTYuMjM1LjA5NmwxLjY1Mi45NWMuMDctLjA1Mi4xNDMtLjEwMi4yMTQtLjE1Mi4xOS0uMTI4LjE5LS4xMjguMzg1LS4yNTIuNDU0LS4yNzguOTItLjUyMyAxLjQwNy0uNzQzbC4wMTQtLjAwNlY0Ljk2bC4wMDQtLjA4NWMuMDEyLS4wODUuMDI3LS4xNjYuMDYtLjI0Ny4wOS0uMjQuMjg1LS40MzMuNTI0LS41MjYuMDgtLjAzLjE2Mi0uMDQ2LjI0OC0uMDU4IDIuMDI4LS4wOTQgNC4wNjItLjAwNCA2LjA5My0uMDA0LjExNS4wMDYuMjI0LjAyLjMzMi4wNjIuMjY3LjEwNC40NzQuMzMuNTUzLjYwNy4wMjMuMDg0LjAzLjE2Ni4wMzUuMjUyVjYuODdjLjE0Mi4wNi4yOC4xMy40Mi4xOTYuMjAyLjEwMi4yLjEwMi40LjIwOC40LjIyNC43ODIuNDY2IDEuMTU0LjczM2wuMDIuMDE0IDEuNjI4LS45NDYuMDc2LS4wNGMuMTM4LS4wNTUuMjY2LS4wOC40MTQtLjA4NC4wODUuMDA3LjA4NS4wMDYuMTcuMDJ6bS0yLjIzIDE0Ljk0Yy4xMTguMDI1LjIyLjA2LjMyNS4xMTVsMS4zOC44IDIuMDgtMy42MDctMS4zOS0uODAyYy0uMDY0LS4wNC0uMDgyLS4wNS0uMTQtLjEtLjE1My0uMTMyLS4yNi0uMzEzLS4zLS41MS0uMDE4LS4wODctLjAyLS4xNy0uMDE3LS4yNTguMDI4LS4yMTYuMDctLjQzLjA5OC0uNjQ1LjA0LS4zNy4wNjctLjc0LjA1NS0xLjExLS4wMTUtLjQ0LS4wNjgtLjg3LS4xNDMtMS4zMDRsLS4wMS0uMDg2Yy0uMDAzLS4wODgtLjAwMi0uMTcuMDE2LS4yNTcuMDQtLjE5OC4xNDctLjM4LjMtLjUxLjA1OC0uMDUyLjA3Ni0uMDYuMTQtLjFsMS4zODgtLjgwMy0yLjA4LTMuNjA1LTEuMzc1Ljc5OGMtLjA3LjAzNS0uMDg1LjA0Ni0uMTU4LjA3Mi0uMTkuMDY3LS40MDIuMDctLjU5NC4wMDYtLjA4NC0uMDI4LS4xNTctLjA3LS4yMzItLjExNS0uMTIzLS4wOTItLjI0LS4xOTQtLjM2Mi0uMjktLjM0OC0uMjYyLS43MS0uNTAyLTEuMDkzLS43MS0uMzgyLS4yMS0uNzgtLjM4Ni0xLjE4Ny0uNTQybC0uMDc4LS4wMzRjLS4wNjYtLjAzNy0uMDg0LS4wNDQtLjE0NS0uMDktLjE2LS4xMi0uMjc3LS4yOS0uMzMyLS40ODMtLjAyNC0uMDgyLS4wMy0uMTY1LS4wMzUtLjI1VjUuODhoLTQuMTY4VjcuNDljLS4wMDQuMDg2LS4wMTIuMTY4LS4wMzYuMjUyLS4wNTYuMTkyLS4xNzQuMzYzLS4zMzMuNDgzLS4wNi4wNDUtLjA4LjA1Mi0uMTQ1LjA5LS4yLjA4Ni0uNDAyLjE2LS42MDIuMjQ1LS43NDUuMzM3LTEuNDQ2Ljc0OC0yLjA3MiAxLjI3NmwtLjA3LjA1MmMtLjA3NC4wNDctLjE0Ny4wODgtLjIzLjExNi0uMTkyLjA2NS0uNDA0LjA2NC0uNTk1LS4wMDMtLjA3My0uMDI0LS4wOS0uMDM1LS4xNTctLjA3TDguMzMgOS4xMjVsLTIuMDg2IDMuNjA4IDEuMzg3LjgwMmMuMDY2LjA0LjA4My4wNS4xNDIuMS4xNTMuMTMyLjI2LjMxNC4zLjUxMi4wMTguMDg3LjAyLjE3LjAxNi4yNTgtLjAyLjE1NC0uMDUuMzA3LS4wNzMuNDYtLjA1OC40My0uMDkuODYyLS4wOCAxLjI5Ny4wMS40MzcuMDY1Ljg2OC4xNCAxLjI5N2wuMDEuMDg2Yy4wMDQuMDc3LjAwNy4wOTYgMCAuMTcyLS4wMjMuMjAyLS4xMTMuMzkzLS4yNTMuNTQtLjA2LjA2Mi0uMTMuMTEtLjIwMy4xNThsLTEuMzkuODAyIDIuMDg0IDMuNjEgMS40MDMtLjgwNWMuMDc4LS4wNC4xNTQtLjA3NS4yNC0uMDk2LjE5Ni0uMDQ4LjQwNy0uMDMuNTkuMDUzLjA3Mi4wMzIuMDg3LjA0NC4xNTIuMDg1LjEyLjA5Mi4yMzYuMTkyLjM1Ni4yODYuMy4yMjYuNjEuNDMzLjkzOC42MTguNDQuMjUuOS40NTUgMS4zNy42MzZsLjA4LjAzNGMuMDY1LjAzNy4wODMuMDQ0LjE0My4wOS4xNi4xMi4yNzguMjkuMzMyLjQ4Mi4wMjMuMDg0LjAzLjE2Ni4wMzUuMjUzdjEuNjA2aDQuMTY4di0xLjYwN2MuMDA0LS4wODcuMDEtLjE3LjAzNS0uMjUzLjA1NS0uMTkuMTcyLS4zNjMuMzMyLS40ODMuMDYtLjA0NS4wNzgtLjA1Mi4xNDQtLjA5LjE5Ny0uMDg1LjQtLjE2LjU5OC0uMjQ1LjQ1NS0uMjA3Ljg5NS0uNDQgMS4zMS0uNzE2LjI2LS4xNzMuNTA2LS4zNjIuNzQ1LS41NmwuMDctLjA1NGMuMDY0LS4wNC4wOC0uMDUyLjE1LS4wODMuMTA4LS4wNS4yMTgtLjA2OC4zMzUtLjA3OC4wODYgMCAuMDg2IDAgLjE3Mi4wMXpcIi8+PHBhdGggZD1cIk0xNi4xNDggMTEuMDUyYy42OTguMDI2IDEuMzc4LjE4IDIuMDEuNDg0LjUzMy4yNTcgMS4wMi42MTMgMS40MyAxLjA0Mi40MS40My43NC45MzQuOTcgMS40OC4xOS40NS4zMTMuOTMuMzYzIDEuNDE1LjA1Mi40OTguMDI3IDEuMDA1LS4wNzQgMS40OTUtLjMxNCAxLjUzMy0xLjM3MiAyLjg1My0yLjc5NyAzLjQ5Ny0uNTk4LjI3LTEuMjQ3LjQxOC0xLjkwMi40MzQtLjY1OC4wMTYtMS4zMi0uMS0xLjkzMi0uMzQtLjU1My0uMjItMS4wNjYtLjU0LTEuNTA2LS45MzgtLjQ0LS40LS44MDUtLjg3Ni0xLjA3NS0xLjQwMy0uMjItLjQzMi0uMzc3LS44OTYtLjQ2Mi0xLjM3My0uMDgtLjQ1Mi0uMS0uOTE2LS4wNTItMS4zNzQuMDYtLjU2NS4yMTUtMS4xMi40NjItMS42MzIuNDMtLjg5IDEuMTMtMS42NDMgMS45ODctMi4xMzcuNjM3LS4zNjYgMS4zNDItLjU3MyAyLjA3My0uNjM4LjE3LS4wMS4zMzYtLjAxNi41MDUtLjAxM3ptLS4yMDYgMS44NGMtLjQzNy4wMTYtLjg2My4xMTItMS4yNTcuMzAyLS44MS4zOS0xLjQyOCAxLjEzOC0xLjY1MiAyLjAxLS4wOS4zNTQtLjExOC43MjUtLjA4IDEuMDg4LjAzMi4zMy4xMi42NTIuMjU1Ljk1NC4xNTMuMzQuMzcuNjUuNjMyLjkxLjI2My4yNjQuNTczLjQ4LjkxMi42MzIuMzc0LjE3Ljc4LjI2IDEuMTkuMjcuNDEzLjAxMi44MjYtLjA2IDEuMjEtLjIxLjM0Ny0uMTM4LjY2OC0uMzM4Ljk0NC0uNTkuMjc1LS4yNDguNTA0LS41NDguNjczLS44NzguMTM3LS4yNy4yMzQtLjU2LjI4OC0uODU3LjA2LS4zMzYuMDYzLS42OC4wMTItMS4wMTgtLjE0LS45Mi0uNzEtMS43NDMtMS41MTQtMi4yMDctLjQtLjIzLS44NC0uMzU4LTEuMjk3LS40LS4xMDctLjAwNS0uMjEyLS4wMDgtLjMxOC0uMDA3elwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1nZWFyXCIgZGF0YS1uYW1lPVwiZ2VhclwiIHZpZXdCb3g9XCIwIDAgMzIgMzNcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjMuMDE4IDEuODQyYy4yNTguMDIyLjUxLjA4Ljc0Ni4xODUuMTk4LjA4OC4zODYuMi41NTMuMzM4LjEzMi4xMDYuMjUuMjI3LjM1NS4zNi4zMzYuNDMyLjQ4Ni45Ny40OTUgMS41MS4wMDcuMzg0LS4wNTQuNzYyLS4xNCAxLjEzNWwtLjU4NCAyLjE0OC4wMi4wMi4wMi4wMiAyLjE0LS41ODMuMTk4LS4wNDZjLjItLjA0LjQwMi0uMDc0LjYwNi0uMDg4LjQyLS4wMy44NS4wMSAxLjI0Ni4xNTcuMjcuMS41MjIuMjUuNzM2LjQ0Mi4zOTcuMzYuNjY4Ljg2Ny43NCAxLjQuMDM3LjI2LjAyNS41MjQtLjAzLjc4LS4wOTUuNDQ0LS4zMTMuODUtLjU4MyAxLjIxMi0uMTI1LjE2Ni0uMjYyLjMyMi0uNDAzLjQ3NGwtMS41NzIgMS41Ni4wMDguMDMuMDEuMDM1Yy43MTYuMTkgMS40MjYuNCAyLjE0OC41NjcuMDkuMDI2LjA5LjAyNi4xOC4wNTUuMTk1LjA2NS4zODUuMTM3LjU3LjIyNy4zNi4xNzYuNjk4LjQxLjk2Mi43MTYuMTc0LjIuMzE1LjQyOC40MS42NzYuMjA4LjU0LjIwMyAxLjE2NS0uMDE2IDEuNzAyLS4wOS4yMjQtLjIyLjQzMi0uMzc3LjYxNS0uMjg2LjMzNC0uNjYuNTgtMS4wNTUuNzYtLjIyLjEwMi0uNDUuMTgtLjY4LjI1MmwtMi4xNDIuNTY2LS4wMS4wMzYtLjAwOC4wMyAxLjU2NyAxLjU1NGMuMDcuMDczLjA3LjA3My4xMzguMTQ3LjEzNi4xNTMuMjY1LjMxLjM4LjQ4LjIzNS4zNS40MTUuNzQuNDg3IDEuMTU3LjA1LjI4NS4wNDUuNTc3LS4wMTYuODYtLjExMi41MjQtLjQxOCAxLjAxMi0uODQgMS4zNDItLjE5My4xNS0uNDEuMjY1LS42NC4zNDUtLjQxMi4xNDQtLjg1OC4xNy0xLjI5LjEyOC0uMjQzLS4wMjMtLjQ4LS4wNjgtLjcxNi0uMTIzbC0yLjE0Ny0uNTgzLS4wMi4wMi0uMDIuMDIuNTgzIDIuMTQyYy4wMjUuMS4wMjQuMS4wNDcuMTk4LjA0LjIuMDcyLjQuMDg3LjYwNS4wMjcuNC0uMDA3LjgxLS4xNCAxLjE5LS4wOTIuMjctLjIzMy41MjQtLjQyLjc0Mi0uMzYuNDI0LS44ODguNzEzLTEuNDQuNzktLjI2LjAzNS0uNTI1LjAyMy0uNzgtLjAzMi0uNjU1LS4xNC0xLjIwOC0uNTQtMS42OS0uOTg4bC0xLjU1NS0xLjU3LS4wMy4wMS0uMDM4LjAxLS41NjMgMi4xMzJjLS4wMy4wOTgtLjAyOC4wOTctLjA2LjE5NC0uMDUzLjE2LS4xMS4zMi0uMTguNDc0LS4xOS40MTUtLjQ1Mi44MDItLjgwNCAxLjA5NC0uMjA1LjE3LS40NC4zMDUtLjY5LjM5NS0uNTA2LjE4LTEuMDgzLjE3My0xLjU4Ni0uMDE1LS4yNDYtLjA5My0uNDc1LS4yMy0uNjc0LS40LS4zNi0uMzEtLjYxNi0uNzE4LS44LTEuMTUtLjA4My0uMTktLjE1LS4zODctLjIxLS41ODVsLS41NjYtMi4xNC0uMDM2LS4wMS0uMDMtLjAxLTEuNTU1IDEuNTY4Yy0uMDczLjA3LS4wNzMuMDctLjE0Ny4xMzgtLjEyNy4xMTMtLjI1Ny4yMi0uMzk1LjMyLS4zNTQuMjUzLS43NTQuNDUyLTEuMTg1LjUzNi0uMjguMDU0LS41Ny4wNTgtLjg1Mi4wMDYtLjUyOC0uMDk3LTEuMDI0LS4zOS0xLjM2Ni0uODA0LS4xNjgtLjIwNC0uMjk4LS40MzgtLjM4NS0uNjg3LS4xNTYtLjQ0Ni0uMTc1LS45MjctLjEyLTEuMzk0LjAyNS0uMjA2LjA2Ni0uNDEuMTEyLS42MTJsLjU4NS0yLjE0OC0uMDItLjAyLS4wMi0uMDItMi4xNC41ODItLjE5OC4wNDZjLS4xNjYuMDM0LS4zMzMuMDYzLS41MDIuMDgtLjQzNC4wNDMtLjg4LjAxNS0xLjI5Ni0uMTI4LS4yNy0uMDkzLS41MjQtLjIzNC0uNzQyLS40Mi0uNDIzLS4zNjItLjcxMy0uODktLjc5LTEuNDQyLS4wMzMtLjI0LS4wMjUtLjQ4NC4wMi0uNzIyLjEyNi0uNjc3LjUzNy0xLjI1Ljk5Ny0xLjc0NWwxLjU3LTEuNTYtLjAxLS4wMy0uMDA4LS4wMzYtMi4xMzQtLjU2My0uMTk0LS4wNThjLS4xOTMtLjA2NS0uMzg0LS4xMzgtLjU2OC0uMjI3LS4zOC0uMTg1LS43My0uNDM0LTEtLjc2LS4xNy0uMjA1LS4zMDYtLjQzOC0uMzk1LS42OS0uMTg2LS41MjUtLjE3My0xLjEyNy4wMzgtMS42NDQuMS0uMjQyLjI0Mi0uNDY2LjQxNy0uNjYuNDQ2LS40OTYgMS4wNy0uNzc0IDEuNjk2LS45NjhsMi4xNDItLjU2NS4wMS0uMDM1LjAwOC0uMDMtMS41NjYtMS41NTUtLjE0LS4xNDhjLS40MTMtLjQ2Ny0uNzYtMS4wMTUtLjg2NS0xLjY0LS4wNDUtLjI2Mi0uMDQ1LS41MzIuMDAzLS43OTQuMDk4LS41MjcuMzkyLTEuMDI0LjgwNy0xLjM2NS4yMDMtLjE2Ny40MzUtLjI5Ni42ODMtLjM4My40MTQtLjE0NS44Ni0uMTcyIDEuMjkzLS4xMy4yNDIuMDIyLjQ4LjA2OC43MTYuMTIybDIuMTQ3LjU4NS4wMi0uMDIyLjAyLS4wMi0uNTg0LTIuMTRjLS4wMjUtLjEtLjAyNS0uMS0uMDQ3LS4yLS4wNC0uMi0uMDc0LS40LS4wODgtLjYwNC0uMDMtLjQyLjAxLS44NS4xNTctMS4yNDYuMDkyLS4yNS4yMjgtLjQ4NC40LS42ODcuMzUtLjQwNi44NTItLjY5IDEuMzgtLjc3Ny4yNi0uMDQ0LjUyNy0uMDQuNzg2LjAxLjQzLjA4LjgzLjI4IDEuMTg0LjUzMi4xOTguMTQuMzguMy41Ni40NjRsMS41NTggMS41Ny4wMy0uMDA4LjAzNi0uMDEuNTYzLTIuMTM2LjA2LS4xOTNjLjA1My0uMTYuMTEtLjMyLjE4Mi0uNDc0LjE4LS4zOTguNDI2LS43Ny43NTctMS4wNTcuMjMyLS4yLjUwMi0uMzU4Ljc5NC0uNDUyLjQ5Mi0uMTU4IDEuMDQ0LS4xNDYgMS41MjguMDM2LjI0Ni4wOTIuNDc0LjIzLjY3NC40LjM1OC4zMS42MTUuNzE3LjggMS4xNDguMDgyLjE5LjE0OC4zODcuMjEuNTg1bC41NjUgMi4xNDIuMDM1LjAxLjAzMi4wMDggMS41NTMtMS41NjYuMTQ4LS4xNGMuNDUzLS40Ljk4LS43MzggMS41OC0uODU0LjE2LS4wMy4zMi0uMDQzLjQ4LS4wNDMuMDYyIDAgLjA2IDAgLjEyMy4wMDV6bS02LjkzMiA3LjQ4Yy4zNC4wMDYuNjc4LjAzMyAxLjAxMy4wOS41OTUuMDk4IDEuMTc3LjI3OCAxLjcyNC41MzMgMS4yNC41OCAyLjI4OCAxLjU0MyAyLjk3IDIuNzMuMzU0LjYxNS42MSAxLjI4Ni43NSAxLjk4LjE1My43NS4xNzcgMS41MjIuMDcgMi4yNzgtLjA5NC42OC0uMjk1IDEuMzQ1LS41OTMgMS45NjQtLjMzNi43LS43OTcgMS4zNC0xLjM1MyAxLjg4My0uNTk1LjU4Mi0xLjMgMS4wNS0yLjA2NiAxLjM3NS0uNzk0LjMzNi0xLjY1LjUxMy0yLjUxMy41MjUtLjg2NS4wMS0xLjczLS4xNDYtMi41MzYtLjQ2My0uNzc0LS4zMDYtMS40OS0uNzYtMi4xLTEuMzI3LS41ODgtLjU0OC0xLjA3Ni0xLjItMS40MzQtMS45Mi0uMzA2LS42MTQtLjUxNS0xLjI3Ni0uNjE4LTEuOTU0LS4xMTUtLjc1NS0uMS0xLjUzLjA0Mi0yLjI4LjEzNC0uNjk2LjM4LTEuMzcuNzI2LTEuOTkuNjU0LTEuMTcyIDEuNjY0LTIuMTMzIDIuODY1LTIuNzMuNTktLjI5MyAxLjIyMy0uNDk4IDEuODcyLS42MDUuMjc4LS4wNDUuNTYtLjA3Mi44NC0uMDg0LjExNS0uMDA0LjIzLS4wMDUuMzQ0LS4wMDV6XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTIzLjAxOCAxLjg0MmMuMjU4LjAyMi41MS4wOC43NDYuMTg1LjE5OC4wODguMzg2LjIuNTUzLjMzOC4xMzIuMTA2LjI1LjIyNy4zNTUuMzYuMzM2LjQzMi40ODYuOTcuNDk1IDEuNTEuMDA3LjM4NC0uMDU0Ljc2Mi0uMTQgMS4xMzVsLS41ODQgMi4xNDguMDIuMDIuMDIuMDIgMi4xNC0uNTgzLjE5OC0uMDQ2Yy4yLS4wNC40MDItLjA3NC42MDYtLjA4OC40Mi0uMDMuODUuMDEgMS4yNDYuMTU3LjI3LjEuNTIyLjI1LjczNi40NDIuMzk3LjM2LjY2OC44NjcuNzQgMS40LjAzNy4yNi4wMjUuNTI0LS4wMy43OC0uMDk1LjQ0NC0uMzEzLjg1LS41ODMgMS4yMTItLjEyNS4xNjYtLjI2Mi4zMjItLjQwMy40NzRsLTEuNTcyIDEuNTYuMDA4LjAzLjAxLjAzNWMuNzE2LjE5IDEuNDI2LjQgMi4xNDguNTY3LjA5LjAyNi4wOS4wMjYuMTguMDU1LjE5NS4wNjUuMzg1LjEzNy41Ny4yMjcuMzYuMTc2LjY5OC40MS45NjIuNzE2LjE3NC4yLjMxNS40MjguNDEuNjc2LjIwOC41NC4yMDMgMS4xNjUtLjAxNiAxLjcwMi0uMDkuMjI0LS4yMi40MzItLjM3Ny42MTUtLjI4Ni4zMzQtLjY2LjU4LTEuMDU1Ljc2LS4yMi4xMDItLjQ1LjE4LS42OC4yNTJsLTIuMTQyLjU2Ni0uMDEuMDM2LS4wMDguMDMgMS41NjcgMS41NTRjLjA3LjA3My4wNy4wNzMuMTM4LjE0Ny4xMzYuMTUzLjI2NS4zMS4zOC40OC4yMzUuMzUuNDE1Ljc0LjQ4NyAxLjE1Ny4wNS4yODUuMDQ1LjU3Ny0uMDE2Ljg2LS4xMTIuNTI0LS40MTggMS4wMTItLjg0IDEuMzQyLS4xOTMuMTUtLjQxLjI2NS0uNjQuMzQ1LS40MTIuMTQ0LS44NTguMTctMS4yOS4xMjgtLjI0My0uMDIzLS40OC0uMDY4LS43MTYtLjEyM2wtMi4xNDctLjU4My0uMDIuMDItLjAyLjAyLjU4MyAyLjE0MmMuMDI1LjEuMDI0LjEuMDQ3LjE5OC4wNC4yLjA3Mi40LjA4Ny42MDUuMDI3LjQtLjAwNy44MS0uMTQgMS4xOS0uMDkyLjI3LS4yMzMuNTI0LS40Mi43NDItLjM2LjQyNC0uODg4LjcxMy0xLjQ0Ljc5LS4yNi4wMzUtLjUyNS4wMjMtLjc4LS4wMzItLjY1NS0uMTQtMS4yMDgtLjU0LTEuNjktLjk4OGwtMS41NTUtMS41Ny0uMDMuMDEtLjAzOC4wMS0uNTYzIDIuMTMyYy0uMDMuMDk4LS4wMjguMDk3LS4wNi4xOTQtLjA1My4xNi0uMTEuMzItLjE4LjQ3NC0uMTkuNDE1LS40NTIuODAyLS44MDQgMS4wOTQtLjIwNS4xNy0uNDQuMzA1LS42OS4zOTUtLjUwNi4xOC0xLjA4My4xNzMtMS41ODYtLjAxNS0uMjQ2LS4wOTMtLjQ3NS0uMjMtLjY3NC0uNC0uMzYtLjMxLS42MTYtLjcxOC0uOC0xLjE1LS4wODMtLjE5LS4xNS0uMzg3LS4yMS0uNTg1bC0uNTY2LTIuMTQtLjAzNi0uMDEtLjAzLS4wMS0xLjU1NSAxLjU2OGMtLjA3My4wNy0uMDczLjA3LS4xNDcuMTM4LS4xMjcuMTEzLS4yNTcuMjItLjM5NS4zMi0uMzU0LjI1My0uNzU0LjQ1Mi0xLjE4NS41MzYtLjI4LjA1NC0uNTcuMDU4LS44NTIuMDA2LS41MjgtLjA5Ny0xLjAyNC0uMzktMS4zNjYtLjgwNC0uMTY4LS4yMDQtLjI5OC0uNDM4LS4zODUtLjY4Ny0uMTU2LS40NDYtLjE3NS0uOTI3LS4xMi0xLjM5NC4wMjUtLjIwNi4wNjYtLjQxLjExMi0uNjEybC41ODUtMi4xNDgtLjAyLS4wMi0uMDItLjAyLTIuMTQuNTgyLS4xOTguMDQ2Yy0uMTY2LjAzNC0uMzMzLjA2My0uNTAyLjA4LS40MzQuMDQzLS44OC4wMTUtMS4yOTYtLjEyOC0uMjctLjA5My0uNTI0LS4yMzQtLjc0Mi0uNDItLjQyMy0uMzYyLS43MTMtLjg5LS43OS0xLjQ0Mi0uMDMzLS4yNC0uMDI1LS40ODQuMDItLjcyMi4xMjYtLjY3Ny41MzctMS4yNS45OTctMS43NDVsMS41Ny0xLjU2LS4wMS0uMDMtLjAwOC0uMDM2LTIuMTM0LS41NjMtLjE5NC0uMDU4Yy0uMTkzLS4wNjUtLjM4NC0uMTM4LS41NjgtLjIyNy0uMzgtLjE4NS0uNzMtLjQzNC0xLS43Ni0uMTctLjIwNS0uMzA2LS40MzgtLjM5NS0uNjktLjE4Ni0uNTI1LS4xNzMtMS4xMjcuMDM4LTEuNjQ0LjEtLjI0Mi4yNDItLjQ2Ni40MTctLjY2LjQ0Ni0uNDk2IDEuMDctLjc3NCAxLjY5Ni0uOTY4bDIuMTQyLS41NjUuMDEtLjAzNS4wMDgtLjAzLTEuNTY2LTEuNTU1LS4xNC0uMTQ4Yy0uNDEzLS40NjctLjc2LTEuMDE1LS44NjUtMS42NC0uMDQ1LS4yNjItLjA0NS0uNTMyLjAwMy0uNzk0LjA5OC0uNTI3LjM5Mi0xLjAyNC44MDctMS4zNjUuMjAzLS4xNjcuNDM1LS4yOTYuNjgzLS4zODMuNDE0LS4xNDUuODYtLjE3MiAxLjI5My0uMTMuMjQyLjAyMi40OC4wNjguNzE2LjEyMmwyLjE0Ny41ODUuMDItLjAyMi4wMi0uMDItLjU4NC0yLjE0Yy0uMDI1LS4xLS4wMjUtLjEtLjA0Ny0uMi0uMDQtLjItLjA3NC0uNC0uMDg4LS42MDQtLjAzLS40Mi4wMS0uODUuMTU3LTEuMjQ2LjA5Mi0uMjUuMjI4LS40ODQuNC0uNjg3LjM1LS40MDYuODUyLS42OSAxLjM4LS43NzcuMjYtLjA0NC41MjctLjA0Ljc4Ni4wMS40My4wOC44My4yOCAxLjE4NC41MzIuMTk4LjE0LjM4LjMuNTYuNDY0bDEuNTU4IDEuNTcuMDMtLjAwOC4wMzYtLjAxLjU2My0yLjEzNi4wNi0uMTkzYy4wNTMtLjE2LjExLS4zMi4xODItLjQ3NC4xOC0uMzk4LjQyNi0uNzcuNzU3LTEuMDU3LjIzMi0uMi41MDItLjM1OC43OTQtLjQ1Mi40OTItLjE1OCAxLjA0NC0uMTQ2IDEuNTI4LjAzNi4yNDYuMDkyLjQ3NC4yMy42NzQuNC4zNTguMzEuNjE1LjcxNy44IDEuMTQ4LjA4Mi4xOS4xNDguMzg3LjIxLjU4NWwuNTY1IDIuMTQyLjAzNS4wMS4wMzIuMDA4IDEuNTUzLTEuNTY2LjE0OC0uMTRjLjQ1My0uNC45OC0uNzM4IDEuNTgtLjg1NC4xNi0uMDMuMzItLjA0My40OC0uMDQzLjA2MiAwIC4wNiAwIC4xMjMuMDA1ek0xMi43ODMgMjUuNTc1bC4xLjAyNmMuMTI2LjA0LjI1Mi4wOC4zOC4xMTcuMjEuMDYuNDIzLjExLjYzOC4xNThsLjEuMDI3Yy4wODYuMDM0LjExLjA0LjE4OC4wODcuMTQ3LjA5LjI3LjIyLjM0OC4zNzIuMDQzLjA4Mi4wNDYuMTA1LjA3NS4xOTJsLjcgMi42NDdjLjAyNC4wODQuMDUuMTY3LjA4Mi4yNDguMDIyLjA1Ny4wNDUuMTE0LjA3LjE3LjAxNy4wMzYuMDMuMDYyLjA1LjA5OC4wMTUuMDMuMDMuMDU3LjA0Ny4wODcuMDY1LjExLjE1My4yMzUuMjc3LjI4Ni4wNjguMDI3LjE0Ny4wMzIuMjIuMDI0LjA1LS4wMDYuMS0uMDIyLjE0NC0uMDQ4LjA1Ni0uMDMzLjEwNC0uMDguMTQ2LS4xMy4wNi0uMDcyLjExMi0uMTU0LjE1Ni0uMjM4LjA4LS4xNTYuMTQtLjMyMi4xODgtLjQ5bC43LTIuNjU0Yy4wMy0uMDg3LjAzMi0uMTEuMDc1LS4xOTIuMDk1LS4xODQuMjUtLjMzNC40NC0uNDIuMTQzLS4wNjguMzAzLS4wOS40NTYtLjEyNi4xMjgtLjAzLjEyNy0uMDMuMjU0LS4wNjQuMTctLjA0Ny4zMzYtLjA5Ny41MDItLjE1bC4xLS4wMjdjLjA5Mi0uMDE0LjExNC0uMDIuMjA3LS4wMi4xNzMuMDA0LjM0NC4wNTYuNDkuMTUuMDc3LjA1LjA5Mi4wNjcuMTYuMTNsMS45MyAxLjk0NGMuMDYyLjA1OC4xMjcuMTE2LjE5NC4xNy4wNDguMDQuMDk2LjA3OC4xNDYuMTEzLjAzLjAyMi4wNi4wNC4wOS4wNi4wMy4wMi4wNTcuMDM2LjA4Ny4wNTMuMTEuMDYyLjI1LjEyNy4zODIuMTA4LjA3NC0uMDEuMTQ1LS4wNDUuMjA0LS4wOS4wNDItLjAzLjA3Ny0uMDY4LjEwMi0uMTEzLjAzMi0uMDU2LjA1LS4xMi4wNi0uMTg0LjAxOC0uMDk0LjAyLS4xOS4wMTctLjI4NS0uMDA4LS4xNzQtLjA0LS4zNDctLjA4LS41MTZsLS43MjYtMi42NjJjLS4wMi0uMDktLjAzLS4xMTItLjAzMy0uMjA0LS4wMS0uMjA4LjA1LS40MTYuMTctLjU4Ni4wOTItLjEyOC4yMTgtLjIyNi4zMzItLjMzMmwuMjc0LS4yNy4yNy0uMjkuMDc0LS4wN2MuMDcyLS4wNTcuMDg4LS4wNzUuMTY4LS4xMi4xNS0uMDguMzI0LS4xMi40OTUtLjExMy4wOTMuMDA0LjExNS4wMTMuMjA0LjAzMmwyLjY1My43MmMuMDg1LjAyLjE3LjAzNy4yNTYuMDUuMDYuMDEuMTIuMDIuMTgyLjAyNS4wMzYuMDAzLjA3My4wMDYuMTEuMDA3LjAzMi4wMDIuMDY2LjAwMy4xLjAwMi4xMjYtLjAwMi4yOC0uMDE1LjM4NC0uMDk2LjA1OC0uMDQ2LjEwMi0uMTEzLjEzMi0uMTguMDItLjA0OC4wMzItLjA5OC4wMy0uMTUgMC0uMDY0LS4wMTctLjEyOC0uMDQtLjE5LS4wMy0uMDktLjA3Ny0uMTczLS4xMjgtLjI1My0uMDk0LS4xNDgtLjIxLS4yOC0uMzMtLjQwOGwtMS45NS0xLjkzNWMtLjA2Mi0uMDY4LS4wOC0uMDgzLS4xMy0uMTYtLjExMi0uMTc1LS4xNjMtLjM4Ni0uMTQ1LS41OTIuMDA4LS4wOTIuMDE3LS4xMTQuMDQtLjIwMy4wNC0uMTI2LjA4LS4yNTMuMTE3LS4zOC4wNTgtLjIxLjExLS40MjMuMTU4LS42MzdsLjAyOC0uMWMuMDM0LS4wODQuMDQtLjEwOC4wODctLjE4Ni4wOS0uMTQ4LjIyLS4yNy4zNzItLjM1LjA4Mi0uMDQuMTA1LS4wNDQuMTkyLS4wNzNsMi42NDgtLjY5OGMuMDgzLS4wMjUuMTY2LS4wNTIuMjQ3LS4wODNsLjE2OC0uMDcuMS0uMDVjLjAzLS4wMTUuMDU2LS4wMy4wODYtLjA0OC4xMS0uMDY1LjIzNS0uMTUzLjI4NS0uMjc2LjAyNy0uMDcuMDMyLS4xNS4wMjMtLjIyMi0uMDA1LS4wNS0uMDItLjEtLjA0Ny0uMTQ1LS4wMzMtLjA1Ny0uMDgtLjEwNC0uMTI4LS4xNDYtLjA3My0uMDYyLS4xNTUtLjExMi0uMjQtLjE1Ni0uMTU1LS4wOC0uMzItLjE0LS40OS0uMTg4bC0yLjY1My0uN2MtLjA4OC0uMDI4LS4xMS0uMDMyLS4xOTMtLjA3NC0uMTg0LS4wOTYtLjMzNC0uMjUyLS40Mi0uNDQtLjA2Ny0uMTQzLS4wOS0uMzAzLS4xMjYtLjQ1NS0uMDMtLjEyNS0uMDY0LS4yNS0uMS0uMzc3LS4wMzctLjEyNy0uMDc1LS4yNTQtLjExNi0uMzhsLS4wMjYtLjFjLS4wMTMtLjA5LS4wMi0uMTE0LS4wMTgtLjIwNi4wMDMtLjE3My4wNTUtLjM0My4xNDgtLjQ5LjA1LS4wNzYuMDY4LS4wOS4xMy0uMTZMMjcuNzggMTBjLjA1OC0uMDY1LjExNi0uMTMuMTctLjE5Ni4wNC0uMDQ4LjA3Ny0uMDk2LjExMy0uMTQ2LjAyLS4wMy4wNDItLjA2LjA2LS4wOS4wMTgtLjAyNy4wMzgtLjA2LjA1My0uMDg3LjA2Mi0uMTEuMTI3LS4yNS4xMS0uMzgtLjAxLS4wNzItLjA0NC0uMTM4LS4wODQtLjE5Ni0uMDMtLjA0NS0uMDcyLS4wODQtLjEyLS4xMS0uMDU3LS4wMzItLjEyLS4wNS0uMTg0LS4wNjItLjA5NC0uMDE3LS4xOS0uMDItLjI4Ni0uMDE1LS4xNzYuMDA3LS4zNDguMDQtLjUxOC4wOGwtMi42Ni43MjZjLS4wODguMDItLjExLjAyOC0uMjAyLjAzMi0uMjA3LjAxLS40MTUtLjA1LS41ODUtLjE3LS4wNzUtLjA1Mi0uMDktLjA3LS4xNTQtLjEzNmwtLjI3LS4yOWMtLjE1My0uMTUzLS4zMS0uMzA0LS40Ny0uNDVsLS4wNzItLjA3NGMtLjA1Ni0uMDcyLS4wNzMtLjA4OC0uMTE4LS4xNjgtLjA4My0uMTUyLS4xMjMtLjMyNS0uMTE1LS40OTcuMDA0LS4wOS4wMTMtLjExMy4wMzItLjIwM2wuNzIyLTIuNjU0Yy4wMi0uMDg1LjAzNy0uMTcuMDUtLjI1NS4wMS0uMDYuMDE4LS4xMi4wMjQtLjE4LjAwNC0uMDM4LjAwNi0uMDcuMDA4LS4xMXYtLjFjMC0uMTI3LS4wMTQtLjI4LS4wOTYtLjM4NS0uMDQ0LS4wNTYtLjEwNy0uMDk3LS4xNy0uMTI3LS4wNS0uMDI0LS4xMDUtLjAzOC0uMTYtLjAzNy0uMDY1IDAtLjEzLjAxNi0uMTkuMDM3LS4wOS4wMzMtLjE3My4wNzgtLjI1NC4xMy0uMTQ4LjA5NC0uMjguMjEtLjQwOC4zM2wtMS45MzMgMS45NDhjLS4wNjguMDYyLS4wODIuMDgtLjE2LjEzLS4xNzQuMTEtLjM4NC4xNjMtLjU5LjE0NS0uMDkyLS4wMDgtLjExNC0uMDE4LS4yMDItLjA0LS4xMjYtLjA0LS4yNTItLjA4LS4zOC0uMTE2LS4yMS0uMDU4LS40MjMtLjExLS42MzgtLjE1N2wtLjEtLjAyN2MtLjA4NS0uMDM0LS4xMS0uMDQtLjE4OC0uMDg3LS4xNDgtLjA5LS4yNy0uMjItLjM1LS4zNzMtLjA0Mi0uMDgyLS4wNDUtLjEwNS0uMDc0LS4xOTNMMTYuNjkyIDIuOGMtLjAyNS0uMDg0LS4wNTItLjE2Ni0uMDgzLS4yNDhsLS4wNy0uMTY4Yy0uMDI0LS4wNS0uMDQ4LS4wOTctLjA3NC0uMTQ0LS4wMTYtLjAzLS4wMy0uMDU0LS4wNDgtLjA4LS4wNjUtLjEtLjE0OC0uMjEtLjI2My0uMjUyLS4wNjYtLjAyNS0uMTQyLS4wMy0uMjEtLjAyLS4wNTIuMDA0LS4xLjAyLS4xNDYuMDQ2LS4wNTYuMDMzLS4xMDMuMDgtLjE0NC4xMjgtLjA2Mi4wNzMtLjExMy4xNTUtLjE1Ny4yNC0uMDgyLjE1Ni0uMTQuMzItLjE5LjQ5bC0uNyAyLjY1NWMtLjAyOC4wODgtLjAzLjExLS4wNzQuMTkzLS4wOTUuMTg1LS4yNTIuMzM1LS40NC40MjItLjE0NC4wNjYtLjMwNC4wODgtLjQ1Ny4xMjMtLjEyNy4wMzItLjI1My4wNjQtLjM3OC4xLS4xMjguMDM2LS4yNTUuMDc1LS4zOC4xMTVsLS4xLjAyNWMtLjA5Mi4wMTMtLjExNC4wMi0uMjA2LjAxOC0uMTcyLS4wMDMtLjM0Mi0uMDU1LS40ODctLjE0OC0uMDc4LS4wNS0uMDkzLS4wNjgtLjE2LS4xM0wxMCA0LjIyMmMtLjA2NC0uMDYtLjEyOC0uMTE3LS4xOTYtLjE3Mi0uMDQ3LS4wMzgtLjA5NS0uMDc2LS4xNDUtLjExLS4wMy0uMDIyLS4wNjItLjA0My0uMDkzLS4wNjMtLjAyOC0uMDE4LS4wNTYtLjAzNS0uMDg1LS4wNS0uMTEyLS4wNjMtLjI1LS4xMjgtLjM4Mi0uMTEtLjA3LjAxLS4xMzguMDQ0LS4xOTYuMDg0LS4wNDcuMDMzLS4wODQuMDczLS4xMTIuMTIyLS4wMzIuMDU2LS4wNS4xMi0uMDYuMTgyLS4wMTcuMDk0LS4wMi4xOS0uMDE1LjI4NS4wMDcuMTc0LjA0LjM0Ni4wOC41MTVsLjcyNyAyLjY2Yy4wMi4wOS4wMjcuMTEyLjAzMi4yMDQuMDEuMjA2LS4wNS40MTMtLjE3LjU4Mi0uMDUyLjA3Ni0uMDcuMDktLjEzNS4xNTVsLS4yODcuMjdjLS4xNTUuMTU0LS4zMDUuMzEtLjQ1LjQ3bC0uMDc1LjA3M2MtLjA3Mi4wNTctLjA4OC4wNzUtLjE3LjEyLS4xNS4wODItLjMyNC4xMjMtLjQ5Ni4xMTUtLjA5Mi0uMDA0LS4xMTUtLjAxMy0uMjA0LS4wMzJMNC45MTQgOC44Yy0uMDg0LS4wMi0uMTctLjAzNy0uMjU1LS4wNS0uMDYtLjAxLS4xMi0uMDItLjE4Mi0uMDI1bC0uMTEtLjAwOGgtLjFjLS4xMyAwLS4yODcuMDE1LS4zOTQuMTAzLS4wNTIuMDQyLS4wOS4xMDItLjEyLjE2My0uMDIzLjA1LS4wMzYuMTA0LS4wMzUuMTYgMCAuMDY0LjAxNi4xMjguMDM4LjE5LjAzMi4wODguMDc4LjE3My4xMy4yNTQuMDk0LjE0OC4yMDguMjguMzMuNDA3bDEuOTQ3IDEuOTM0Yy4wNjIuMDY4LjA4LjA4My4xMy4xNi4xMTIuMTc1LjE2My4zODQuMTQ1LjU5LS4wMDguMDkyLS4wMTguMTE0LS4wNC4yMDMtLjA0LjEyNy0uMDguMjU0LS4xMTcuMzgyLS4wNTguMjEtLjExLjQyMy0uMTU3LjYzOEw2LjEgMTRjLS4wMzUuMDg1LS4wNC4xMDgtLjA4OC4xODctLjA5LjE0Ny0uMjIuMjctLjM3My4zNS0uMDgzLjA0LS4xMDYuMDQ1LS4xOTQuMDczbC0yLjY0Ny42OThjLS4wODQuMDI1LS4xNjYuMDUyLS4yNDcuMDgzbC0uMTcuMDdjLS4wMzQuMDE3LS4wNjUuMDMyLS4wOTguMDUtLjAzLjAxNi0uMDU3LjAzLS4wODcuMDQ4LS4xMS4wNjYtLjIzNi4xNTQtLjI4Ni4yNzctLjAyOC4wNy0uMDM0LjE1LS4wMjUuMjIzLjAwNS4wNS4wMi4xLjA0Ny4xNDQuMDMzLjA1Ni4wOC4xMDMuMTMuMTQ1LjA3Mi4wNi4xNTQuMTEyLjI0LjE1Ni4xNTQuMDguMzIuMTM4LjQ4OC4xODdsMi42NTUuN2MuMDg3LjAzLjExLjAzMy4xOTIuMDc2LjE4My4wOTUuMzMzLjI1LjQyLjQ0LjA2Ny4xNDMuMDkuMzAzLjEyNC40NTUuMDMyLjEyNy4wNjUuMjUzLjEuMzc4LjAzNy4xMjguMDc1LjI1NS4xMTUuMzhsLjAyNS4xYy4wMTMuMDkyLjAyLjExNS4wMTguMjA2LS4wMDMuMTczLS4wNTUuMzQzLS4xNDguNDg4LS4wNS4wNzctLjA2OC4wOTItLjEzLjE2bC0xLjk0MyAxLjkzYy0uMDYuMDY0LS4xMTcuMTI4LS4xNzIuMTk1LS4wNC4wNDgtLjA3Ni4wOTYtLjExLjE0Ni0uMDIzLjAzLS4wNDMuMDYtLjA2My4wOS0uMDE4LjAzLS4wMzUuMDU4LS4wNS4wODctLjA2My4xMTItLjEyOC4yNS0uMTEuMzgyLjAxLjA3LjA0NC4xMzguMDgzLjE5Ni4wMzIuMDQ1LjA3Mi4wODQuMTIuMTEuMDU3LjAzMi4xMi4wNS4xODMuMDYuMDk0LjAxOC4xOS4wMi4yODUuMDE2LjE3Ni0uMDA4LjM1LS4wNC41Mi0uMDgzbDIuNjYtLjcyYy4wOS0uMDIuMTEyLS4wMy4yMDQtLjAzMy4yMDYtLjAxLjQxMy4wNS41ODMuMTcuMDc1LjA1Mi4wOS4wNy4xNTQuMTM1LjA4OC4wOTcuMTc4LjE5Mi4yNy4yODcuMTUzLjE1NS4zMS4zMDUuNDcuNDUzbC4wNzIuMDczYy4wNTcuMDcyLjA3NC4wODguMTE4LjE3LjA4My4xNS4xMjMuMzIzLjExNS40OTUtLjAwNC4wOTMtLjAxMy4xMTUtLjAzMi4yMDRMOC44IDI3LjA4N2MtLjAyLjA4NC0uMDM3LjE3LS4wNS4yNTQtLjAxLjA2LS4wMi4xMjItLjAyNC4xODMtLjAwNC4wMzctLjAwNy4wNzQtLjAwOC4xMS0uMDAyLjAzNS0uMDAyLjA2Ni0uMDAyLjEuMDAzLjEyOC4wMTYuMjguMDk4LjM4Ni4wNDYuMDU4LjExMi4xMDIuMTguMTMyLjA0Ny4wMi4wOTguMDMyLjE1LjAzLjA2NCAwIC4xMjgtLjAxNi4xODgtLjAzOC4wOS0uMDMzLjE3NS0uMDc4LjI1NS0uMTMuMTQ4LS4wOTQuMjgtLjIwOC40MDctLjMzbDEuOTM1LTEuOTVjLjA2Ny0uMDYuMDgyLS4wOC4xNi0uMTMuMTE1LS4wNzMuMjQ4LS4xMjIuMzg0LS4xNC4wOTItLjAxLjExNS0uMDA3LjIwNy0uMDA0bC4xMDMuMDE1ek0xNi4wODYgOS4zMmMuMzQuMDA4LjY3OC4wMzUgMS4wMTMuMDkuNTk1LjEgMS4xNzcuMjggMS43MjQuNTM1IDEuMjQuNTggMi4yODggMS41NDMgMi45NyAyLjczLjM1NC42MTUuNjEgMS4yODYuNzUgMS45OC4xNTMuNzUuMTc3IDEuNTIyLjA3IDIuMjc4LS4wOTQuNjgtLjI5NSAxLjM0NS0uNTkzIDEuOTY0LS4zMzYuNy0uNzk3IDEuMzQtMS4zNTMgMS44ODMtLjU5NS41ODItMS4zIDEuMDUtMi4wNjYgMS4zNzUtLjc5NC4zMzYtMS42NS41MTMtMi41MTMuNTI1LS44NjUuMDEtMS43My0uMTQ2LTIuNTM2LS40NjMtLjc3NC0uMzA2LTEuNDktLjc2LTIuMS0xLjMyNy0uNTg4LS41NDgtMS4wNzYtMS4yLTEuNDM0LTEuOTItLjMwNi0uNjE0LS41MTUtMS4yNzYtLjYxOC0xLjk1NC0uMTE1LS43NTUtLjEtMS41My4wNDItMi4yOC4xMzQtLjY5Ni4zOC0xLjM3LjcyNi0xLjk5LjY1NC0xLjE3MiAxLjY2NC0yLjEzMyAyLjg2NS0yLjczLjU5LS4yOTMgMS4yMjMtLjQ5OCAxLjg3Mi0uNjA1LjI3OC0uMDQ1LjU2LS4wNzIuODQtLjA4NC4xMTUtLjAwNC4yMy0uMDA1LjM0NC0uMDA1em0tLjE0OCAxLjg4NGMtLjY4LjAxMi0xLjM0OC4xNi0xLjk2NC40NDctLjU0LjI1My0xLjAzNC42MDgtMS40NDYgMS4wNC0uMzg2LjQwNS0uNy44NzctLjkyNSAxLjM5LS4xOTguNDUzLS4zMjUuOTM3LS4zNzUgMS40My0uMDU1LjU0NS0uMDE4IDEuMS4xMTIgMS42MzMuMDkyLjM4LjIzLjc0Ny40MTQgMS4wOTIuNTE1Ljk3NSAxLjM2NCAxLjc1NiAyLjM4IDIuMTg2LjU3LjI0MyAxLjE4Ni4zNyAxLjgwNC4zNzcuNjIyLjAwOCAxLjI0My0uMTAzIDEuODItLjMzMi41NTgtLjIyIDEuMDcyLS41NDQgMS41MS0uOTUyLjQyMy0uMzk0Ljc3NC0uODYzIDEuMDMyLTEuMzguMjEtLjQyMy4zNTYtLjg3Ni40MzMtMS4zNC4wODctLjUyNC4wODctMS4wNiAwLTEuNTg0LS4wNzQtLjQ0Ny0uMjEyLS44ODItLjQwOC0xLjI5LS40Ny0uOTc0LTEuMjctMS43NzUtMi4yNDUtMi4yNDQtLjYxMi0uMjk1LTEuMjc4LS40NS0xLjk1NS0uNDctLjA2Mi0uMDAyLS4xMjUtLjAwMy0uMTg3LS4wMDJ6XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWhlYXJ0LWNpcmNsZVwiIGRhdGEtbmFtZT1cImhlYXJ0LWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTEuMjI4IDYuODNjLjQ1LjAyNy44OTQuMSAxLjMyNi4yMzQgMS40ODguNDYgMi43MTIgMS41NjQgMy40NyAyLjkxMi4wOC0uMTQ2LjE3Mi0uMjg3LjI2My0uNDI3LjQ5LS43MiAxLjA4Ni0xLjM1NSAxLjgxNi0xLjgzLjU0NS0uMzU3IDEuMTUtLjYxNyAxLjc4NS0uNzYyLjU2NS0uMTMgMS4xNS0uMTY2IDEuNzI3LS4xMTIuNDgyLjA0Ni45NTguMTU1IDEuNDEzLjMyLjQxNi4xNTIuODE1LjM1MyAxLjE4Ni41OTQuOTM0LjYwNyAxLjY4NSAxLjQ3NSAyLjE3NCAyLjQ3My4zNTguNzMyLjU3NiAxLjUyNy42NiAyLjMzNi4wNC4zNzQuMDU2Ljc1My4wMzQgMS4xMy0uMDQ0Ljc5Mi0uMjU0IDEuNTctLjU1IDIuMzA0LS40NCAxLjA5OC0xLjA3IDIuMTE2LTEuNzcgMy4wNjgtMS4yMjMgMS42Ny0yLjY3MyAzLjE3NC00LjE5MiA0LjU3Ny0xLjI1NiAxLjE2LTIuNTY4IDIuMjY1LTMuOTQ0IDMuMjgybC0uMDcuMDQ4Yy0uMjU4LjE0NC0uNTQ1LjE5NC0uODMuMTA2LS4wODUtLjAyNS0uMTYtLjA2My0uMjM2LS4xMDYtLjE3Ny0uMTItLjM0Ni0uMjUzLS41MTctLjM4My0xLjIwNy0uOTMyLTIuMzc2LTEuOTEzLTMuNDk3LTIuOTQ4QzEwLjMgMjIuNTYgOS4xNzMgMjEuNDE1IDguMTUgMjAuMThjLS43LS44NDgtMS4zNTUtMS43NC0xLjkwNS0yLjY5My0uNDEtLjcxLS43NjItMS40Ni0uOTk4LTIuMjQ0LS4xNS0uNTAzLS4yNTItMS4wMi0uMjgyLTEuNTQ2LS4wMTgtLjMyMy0uMDEtLjY0OC4wMTgtLjk3LjA4LS45Ni4zNDYtMS45MDYuODEtMi43NTMuNDQzLS44MTIgMS4wNjUtMS41MjQgMS44MTctMi4wNjQuMzk3LS4yODUuODMtLjUyIDEuMjg1LS43LjU3OC0uMjI2IDEuMTgzLS4zNSAxLjgwMi0uMzg1LjE3OC0uMDA2LjM1NC0uMDA2LjUzIDB6bTkuNzc4IDIuMDI0Yy0uMzEuMDEyLS42MTUuMDU4LS45MTIuMTUtLjIyNC4wNy0uNDQuMTYyLS42NDYuMjc1LTEuMTcuNjQtMS44NzcgMS44Ny0yLjI2NyAzLjEwNi0uMDY1LjIwNi0uMTIuNDE0LS4xNzIuNjI0bC0uMDI2LjA4NmMtLjA2Ny4xNy0uMTYuMzItLjMuNDQtLjQuMzQyLTEuMDE2LjMxNS0xLjM4NS0uMDYtLjEwNy0uMTEtLjE3OC0uMjM4LS4yMzQtLjM4LS4wNTUtLjE4Ni0uMS0uMzc1LS4xNTMtLjU2Mi0uMzc3LTEuMjM0LTEuMDIzLTIuNDY3LTIuMTU0LTMuMTYzLS4xNTMtLjA5My0uMzEyLS4xNzctLjQ3Ny0uMjQ3LS4zNjctLjE1NS0uNzYtLjI0NS0xLjE1NS0uMjY1LS4zMzYtLjAxOC0uNjc0LjAxNS0xIC4wOTMtLjI4LjA2OC0uNTUuMTY3LS44MDUuMjk1LS44MzMuNDE4LTEuNDkgMS4xMy0xLjg4IDEuOTczLS4yMjguNDkyLS4zNjUgMS4wMjQtLjQyMiAxLjU2My0uMDQyLjQwNy0uMDQ0LjgxNi4wMiAxLjIyLjEwNC42NDYuMzQ0IDEuMjY3LjYzMyAxLjg1Mi40NDYuOTAyIDEuMDIgMS43MzggMS42MzggMi41My44MDYgMS4wMyAxLjcgMS45OTIgMi42MzYgMi45MDggMS4yNzcgMS4yNTMgMi42MzUgMi40MiA0LjA0MyAzLjUyNGwuMDM2LjAyN2MxLjAxNS0uNzgzIDEuOTk3LTEuNjEzIDIuOTQ1LTIuNDc4Ljc4Ny0uNzE3IDEuNTUtMS40NiAyLjI3Ni0yLjI0Ljk3OC0xLjA1IDEuOTAzLTIuMTY3IDIuNjUtMy4zOTUuNDctLjc3Ny44ODctMS42MTcgMS4wNzUtMi41MTIuMDk4LS40NzQuMTEtLjk1My4wNi0xLjQzMy0uMDU0LS41MDYtLjE3Ny0xLjAwNS0uMzgtMS40Ny0uMzUtLjgwMy0uOTM3LTEuNDk2LTEuNjkzLTEuOTQtLjI0OC0uMTQ4LS41MTMtLjI2Ni0uNzg4LS4zNTMtLjMyNC0uMTAzLS42NTctLjE1NS0uOTk1LS4xNjZoLS4xN3pcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbG9jay1jaXJjbGVcIiBkYXRhLW5hbWU9XCJsb2NrLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNOS41NTggMTEuMTM0YzAtLjMzOC4wMDctLjY3Ni4wMS0xLjAxNC4wMy0uNzUzLjE3LTEuNDkyLjQ0Ni0yLjE5NC42NjgtMS42OTYgMi4wNjMtMy4wNTcgMy43NzUtMy42ODMuNjU4LS4yNCAxLjM0NS0uMzYyIDIuMDQ0LS4zODguMTY2LS4wMDIuMTY1LS4wMDIuMzMyIDAgLjcuMDI2IDEuMzg2LjE0NyAyLjA0NS4zODggMS43MTIuNjI2IDMuMTA4IDEuOTg3IDMuNzc2IDMuNjgzLjI3Ny43MDIuNDE2IDEuNDQuNDQ1IDIuMTk0LjAwNS4zMzguMDEuNjc2LjAxMyAxLjAxNC42MzQuMDIgMS4yNy4wNDQgMS45MDMuMDcuMDc3LjAxLjE1LjAyLjIyMy4wNDYuMjQuMDgzLjQ0LjI2Ny41NDIuNS4wNDIuMDk1LjA2Mi4xOTIuMDc0LjI5NC4xOCA0LjMxLjAwNCA4LjYyNy4wMDQgMTIuOTQtLjAwNS4xMDMtLjAxNy4yMDItLjA1LjMtLjA4My4yNC0uMjY3LjQ0LS41LjU0Mi0uMDk1LjA0Mi0uMTkyLjA2Mi0uMjk0LjA3NS01LjUzNC4yMy0xMS4wNzguMDA0LTE2LjYxNy4wMDQtLjEwMy0uMDA0LS4yLS4wMTYtLjMtLjA1LS4yNC0uMDgzLS40NC0uMjY2LS41NDItLjUtLjA0Mi0uMDk1LS4wNjItLjE5LS4wNzQtLjI5My0uMTgtNC4zMS0uMDA0LTguNjI3LS4wMDQtMTIuOTQuMDA1LS4xMDMuMDE3LS4yLjA1LS4zLjA4My0uMjQuMjY3LS40NC41LS41NDIuMDk1LS4wNC4xOTItLjA2Mi4yOTQtLjA3NC42MzQtLjAyNiAxLjI3LS4wNSAxLjkwNC0uMDd6bTEzLjc5NCAxLjkwNUg4LjY0OHYxMS4wMjZoMTQuNzA0VjEzLjA0em0tOC4zMDMgNS4yNDdjLS41Ny0uMzQ3LS45Mi0uOTkyLS44ODYtMS42NjcuMDEtLjE4My4wNDYtLjM2NS4xMS0uNTM4LjA3LS4xOTUuMTc2LS4zNzguMzEtLjU0LjE1LS4xOC4zMzQtLjMzMi41NC0uNDQ0LjI0NC0uMTMyLjUwNy0uMi43ODItLjIyLjA5NS0uMDAyLjA5NC0uMDAyLjE4OCAwIC4yNzUuMDIuNTM4LjA4OC43OC4yMi4yMDguMTEyLjM5NC4yNjQuNTQ0LjQ0NS4xMzIuMTYuMjM3LjM0NC4zMS41NC4wNjIuMTcyLjA5OC4zNTQuMTA4LjUzNy4wMzQuNjgyLS4zMjQgMS4zMzMtLjkwMiAxLjY3Ny4wMjMgMS4wMy4wNDMgMi4wNi0uMDE4IDMuMDg1LS4wMTUuMTQ3LS4wNTcuMjg3LS4xMzYuNDEzLS4yMTguMzUtLjY1Ni41MTQtMS4wNS4zOTItLjEwNS0uMDMyLS4yMDQtLjA4My0uMjktLjE1LS4wOTctLjA3NC0uMTgtLjE2OC0uMjQtLjI3NC0uMDY2LS4xMTgtLjEwMy0uMjQ2LS4xMTYtLjM4LS4wNi0xLjAzLS4wNzMtMi4wNjUtLjAzNS0zLjA5NnptNS41NC03LjIwNGMuMDAzLS4zMDUuMDA3LS42MS4wMDMtLjkxNy0uMDIyLS41NzUtLjEzNC0xLjEzOC0uMzYtMS42Ny0uNTIyLTEuMjM0LTEuNTg2LTIuMi0yLjg2Ny0yLjYtLjUxNy0uMTYtMS4wNjItLjIyNy0xLjYwMy0uMi0uNDk2LjAyNi0uOTg2LjEzLTEuNDQ4LjMxMy0uNTE2LjIwMi0uOTk0LjUtMS40MDQuODczLS40MzYuMzk3LS43OTYuODc4LTEuMDUyIDEuNDEtLjI4My41ODgtLjQyNiAxLjIyMy0uNDUgMS44NzMtLjAwNS4zMDYgMCAuNjEyLjAwMi45MTcgMy4wNi0uMDcgNi4xMi0uMDcgOS4xOCAwelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA1NCAzMlwiIHdpZHRoPVwiNTRcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0zMi4yMDcgMjUuOTQ2TDIxLjcyIDMybC0xMS4yMzQtNi40ODZMMCAxOS40NlY2LjQ4NUwxMS4yMzUgMCAyMS43MiA2LjA1NCAzMi4yMDcgMCA0My40NCA2LjQ4NmwxMC40ODcgNi4wNTV2MTIuOTc0TDQyLjY5MyAzMmwtMTAuNDg2LTYuMDU0em0uNjYtMS4zNDNWMTQuMjdsOS4wNTQgNS4xOS4wMDMgMTAuMzc4LTkuMDU1LTUuMjM1em0tMjAuODg0LjA0NlYxNC4yN2w5LjA4NSA1LjIxOC4wMDIgMTAuNDQtOS4wODYtNS4yOHpNMS40OTggMTguNTk0VjguMjE1bDguOTg4IDUuMTl2MTAuMzhsLTguOTg4LTUuMTl6TTIxLjcyIDcuNzg1bDguOTkgNS4xODgtOC45OSA1LjE5LTguOTg4LTUuMTkgOC45OS01LjE5em0yMC45NzMgMGw4Ljk4OCA1LjE4OC04Ljk4NyA1LjE5LTguOTktNS4xOSA4Ljk5LTUuMTl6TTExLjIzNSAxLjcyOGw4Ljk4OCA1LjE5LTguOTg4IDUuMTg4LTguOTktNS4xOSA4Ljk5LTUuMTg4em0yMC45NyAwbDguOTkgNS4xOS04Ljk5IDUuMTg4LTguOTg3LTUuMTkgOC45ODgtNS4xODh6XCIvPjxwYXRoIGQ9XCJNMS40MzcgMTguNjQzTDEuNDQyIDguMTFsMTkuNjUyIDExLjM1LjAxIDEwLjU0NUwxLjQzNiAxOC42NDN6bTMxLjM3IDZsLjAzLTEwLjQ2NCA5LjE0NyA1LjI0My0uMDEgMTAuNTgyLTkuMTY4LTUuMzYzelwiIGZpbGwtb3BhY2l0eT1cIi4zNDVcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1tZXNzYWdlLWNpcmNsZVwiIGRhdGEtbmFtZT1cIm1lc3NhZ2UtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNy4zNDIgMjMuNTgybC0zLjUzIDMuNTMtLjA2Ni4wNmMtLjEyLjA4OC0uMjQ1LjE1NS0uMzkyLjE4NS0uMzguMDc2LS43NzgtLjExMi0uOTYtLjQ1NS0uMDcyLS4xMzMtLjEtLjI3Mi0uMTA3LS40MnYtMi45Yy0uMDg3IDAtLjE3NC0uMDAyLS4yNi0uMDAzbC0uNDEtLjAyMmMtLjMzMy0uMDMtLjY2NS0uMDcyLS45OTQtLjE0LS42NC0uMTMyLTEuMjY2LS4zNDQtMS44NTYtLjYzLTEuMzMtLjY0My0yLjQ3My0xLjY1OC0zLjI3My0yLjktLjQ1Ny0uNzEzLS44LTEuNDk2LTEuMDEyLTIuMzE0LS4yMDMtLjc4My0uMjg0LTEuNTk3LS4yNDMtMi40MDUuMDQzLS44NjQuMjI4LTEuNzE4LjU0Ni0yLjUyLjM1Ny0uOS44NzctMS43MyAxLjUyNy0yLjQ0Ni42OTItLjc2IDEuNTMtMS4zODggMi40NTUtMS44MzYuNzEtLjM0MyAxLjQ3LS41OCAyLjI0OC0uNy4zMzUtLjA1LjY3Mi0uMDc3IDEuMDEtLjA5IDIuNjY1LS4wMzQgNS4zMy0uMDM0IDcuOTk2IDAgLjMzOC4wMTMuNjc0LjA0IDEuMDEuMDkuNzc4LjEyIDEuNTQuMzU3IDIuMjQ4LjcuOTI2LjQ0OCAxLjc2MyAxLjA3NSAyLjQ1NCAxLjgzNi42NS43MTUgMS4xNyAxLjU0NyAxLjUyNyAyLjQ0NS4zMi44MDIuNTA1IDEuNjU2LjU1IDIuNTIuMDQuODA3LS4wNCAxLjYyLS4yNDQgMi40MDQtLjIxMi44MTgtLjU1NiAxLjYtMS4wMTMgMi4zMTMtLjg3IDEuMzUzLTIuMTQ2IDIuNDM0LTMuNjI3IDMuMDYzLS42NjguMjgzLTEuMzc0LjQ3NS0yLjA5NC41NjctLjMzNi4wNDMtLjY3Mi4wNi0xLjAxLjA2NWgtMi40OHptLjEyMy01LjgyNmMuMTI4LjAxLjI1LjA0LjM2NC4xLjA5Ny4wNS4xODYuMTIuMjYuMjAzLjI2Ny4zMDUuMjkuNzY3LjA1OCAxLjEtLjA1NS4wNzgtLjEyMi4xNDYtLjE5OC4yMDMtLjE0My4xMDYtLjMxLjE2LS40ODUuMTc1LTIuMjA1LjA2LTQuNDEyLjA2LTYuNjE3IDAtLjE3Ni0uMDE0LS4zNDItLjA3LS40ODUtLjE3NS0uMzI2LS4yNDItLjQ0OC0uNjktLjI5LTEuMDYzLjAzNy0uMDg4LjA4OC0uMTcuMTUtLjI0LjA3NC0uMDg0LjE2My0uMTU0LjI2LS4yMDUuMTE1LS4wNi4yMzctLjA5LjM2NS0uMSAyLjIwNS0uMDU4IDQuNDEyLS4wNTggNi42MTcgMHptMy43NDctMi44NDdjLjE4LjAxNy4zNS4wNzUuNDkzLjE5LjM3My4yOTMuNDQ3Ljg0Ni4xNjYgMS4yMjgtLjA3LjA5Ni0uMTYuMTc4LS4yNjMuMjQtLjEyMi4wNy0uMjU1LjEwNy0uMzk1LjEyLTMuNDU3LjExNy02LjkyLjExNy0xMC4zNzYgMC0uMTgtLjAxNy0uMzUtLjA3NS0uNDk0LS4xOS0uMzcyLS4yOTMtLjQ0Ny0uODQ2LS4xNjUtMS4yMjguMDctLjA5Ni4xNi0uMTc4LjI2NC0uMjQuMTIzLS4wNy4yNTUtLjEwNy4zOTYtLjEyIDMuNDU3LS4xMTcgNi45Mi0uMTE3IDEwLjM3NiAwem0wLTIuODVjLjE0LjAxNS4yNzMuMDUuMzk1LjEyMy4xMDMuMDYuMTkzLjE0My4yNjQuMjQuMjgyLjM4LjIwOC45MzQtLjE2NSAxLjIyOC0uMTQ0LjExNS0uMzEyLjE3My0uNDkzLjE5Mi0zLjQ1Ny4xMTUtNi45Mi4xMTUtMTAuMzc2IDAtLjE4LS4wMi0uMzUtLjA3Ny0uNDk0LS4xOS0uMzcyLS4yOTUtLjQ0Ny0uODQ4LS4xNjUtMS4yMy4wNy0uMDk2LjE2LS4xNzguMjY0LS4yNC4xMjMtLjA3LjI1NS0uMTA3LjM5Ni0uMTIgMy40NTctLjExNyA2LjkyLS4xMTcgMTAuMzc2IDB6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbm8tY2lyY2xlXCIgZGF0YS1uYW1lPVwibm8tY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0xNi4yODggMy45M2MuNDguMDE4Ljk1OC4wNTIgMS40MzQuMTIgMS4yLjE3NCAyLjM3LjUzIDMuNDYzIDEuMDUzIDIuMTM1IDEuMDIgMy45NSAyLjY5IDUuMTUzIDQuNzI3LjU5NiAxLjAxIDEuMDQyIDIuMTA0IDEuMzIgMy4yNDIuMjcyIDEuMTIuMzg0IDIuMjguMzMgMy40My0uMDYgMS4yNTQtLjMxOCAyLjQ5NS0uNzYgMy42Ny0xLjE3IDMuMDk4LTMuNjQ0IDUuNjMzLTYuNzEzIDYuODc3LTEuNDMuNTgtMi45Ny44NzgtNC41MTUuODc4LTEuNTQ0IDAtMy4wODQtLjMtNC41MTUtLjg4LTIuMjg0LS45MjUtNC4yNTYtMi41Ny01LjU5LTQuNjQyLS41NTUtLjg2Ni0xLTEuODA1LTEuMzE1LTIuNzg1LS4zNTUtMS4xLS41NS0yLjI1LS41NzctMy40MDQtLjAyOC0xLjE1NC4xMS0yLjMxLjQxMi0zLjQyNS4zMTgtMS4xOC44Mi0yLjMxIDEuNDgtMy4zNCAxLjItMS44NjYgMi45Mi0zLjM5IDQuOTItNC4zNDcgMS4wOTItLjUyNCAyLjI2NC0uODggMy40NjMtMS4wNTIuNDc2LS4wNjguOTU0LS4xMDIgMS40MzQtLjEyLjI5LS4wMDMuMjg4LS4wMDMuNTc2IDB6TTIzLjY3IDkuOEw5Ljg3NCAyMy41OTdjLjczNi41OSAxLjU1NiAxLjA3NCAyLjQzMiAxLjQzIDEuMTcuNDc0IDIuNDMyLjcxOCAzLjY5NS43MThzMi41MjQtLjI0NCAzLjY5NS0uNzJjMi41MS0xLjAxNyA0LjUzNi0zLjA5IDUuNDktNS42MjUuMzYzLS45Ni41NzMtMS45NzYuNjIyLTMgLjA1LTEuMDIzLS4wNjItMi4wNTMtLjMzLTMuMDQtLjI2LS45NjYtLjY3LTEuODktMS4yMS0yLjczLS4xODMtLjI4OC0uMzgzLS41NjUtLjU5Ni0uODN6TTIyLjEzIDguMjU2Yy0uNTgtLjQ2NS0xLjIxMy0uODY1LTEuODg1LTEuMTg2LS44OTQtLjQyNy0xLjg1Mi0uNzE4LTIuODMzLS44Ni0uMzktLjA1Ni0uNzgtLjA4My0xLjE3NS0uMDk4LS4yMzUtLjAwMy0uMjM0LS4wMDMtLjQ3IDAtLjM5NC4wMTUtLjc4NS4wNDItMS4xNzUuMS0uOTguMTQtMS45NC40My0yLjgzMy44Ni0xLjYzNy43ODMtMy4wNDQgMi4wMy00LjAyNSAzLjU1Ny0uNTQuODQtLjk1IDEuNzY0LTEuMjEgMi43My0uMjQ2LjkxMi0uMzYgMS44Ni0uMzM4IDIuODAzLjAyMy45NDYuMTgyIDEuODg4LjQ3MiAyLjc4OC4yNi44MDIuNjIgMS41NyAxLjA3NiAyLjI3Ni4xODQuMjg3LjM4NC41NjQuNTk3LjgzbDEzLjc5OC0xMy44elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBlbmNpbC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJwZW5jaWwtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjkyNSAxOC4xNjVjMy44NTctNC4xOTMgOC4wNTctOC4wNTggMTIuMDg2LTEyLjA4Ny4xMjMtLjExMi4yNTYtLjE5OC40MTctLjI0LjA3LS4wMi4wODgtLjAyLjE2LS4wMy4wOC0uMDAyLjA4LS4wMDIuMTYyIDAgLjA3LjAxLjA4OC4wMS4xNTguMDMuMTM0LjAzNS4yNDguMS4zNTcuMTg1IDEuNjM0IDEuNDk3IDMuMTM3IDMuMTMyIDQuNzA0IDQuNy4wNTUuMDYuMTA2LjEyLjE0Ny4xOTIuMTM2LjIzNi4xNi41MjYuMDY4Ljc4Mi0uMDM3LjEwNC0uMDk0LjE5Mi0uMTYuMjgtMy44NjUgNC4yMTYtOC4wODcgOC4wOS0xMi4xMzIgMTIuMTM1bC0uMDIyLjAyYy0uMDcuMDY2LS4xNS4xMi0uMjM3LjE2LS4wMjIuMDEyLS4wNDQuMDIyLS4wNjcuMDMyLTIuMTY0LjcxOC00LjM4NCAxLjI1Ni02LjU3NyAxLjg4Mi0uMTM3LjAzMy0uMjcuMDQ3LS40MS4wMjQtLjM1Ny0uMDYtLjY1NC0uMzMyLS43NDYtLjY4NC0uMDM1LS4xMzYtLjAzMy0uMjctLjAxMy0uNDA4LjUzLTIuMjIgMS4yNTItNC4zOSAxLjg3OC02LjU4Mi4wMDYtLjAyLjAxMy0uMDM3LjAyLS4wNTUuMDM0LS4wOTUuMDg0LS4xODYuMTQ4LS4yNjdsLjAxNi0uMDIuMDE3LS4wMmMuMDA4LS4wMS4wMTYtLjAyLjAyNS0uMDI4em0uMTYgNS43OTZsMy4zMzUtLjk1MmMtLjgxLS43Ny0xLjYxNi0xLjU0Ni0yLjM5LTIuMzVsLS45NDQgMy4zMDN6bTUuMTg1LTEuODUybDcuMDEzLTcuMDEzLTMuMzMtMy4zMy03LjAzMiA3LjAzYzEuMTQgMS4wODIgMi4yOCAyLjE2NCAzLjM1IDMuMzEzem00Ljk5Ni0xMS42NThsMy4zMyAzLjMzTDI0IDExLjM4bC0zLjMzMi0zLjMzMi0yLjQwMiAyLjQwMnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wbHVzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInBsdXMtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy4yNCAxNy4zNzZoLTUuNzkydjUuNzkyYzAgLjgtLjY1IDEuNDQ4LTEuNDQ4IDEuNDQ4LS44IDAtMS40NDgtLjY0OC0xLjQ0OC0xLjQ0OHYtNS43OTJIOC43NmMtLjggMC0xLjQ0OC0uNjUtMS40NDgtMS40NDggMC0uOC42NS0xLjQ0OCAxLjQ0OC0xLjQ0OGg1Ljc5MlY4LjY4OGMwLS44LjY1LTEuNDQ4IDEuNDQ4LTEuNDQ4LjggMCAxLjQ0OC42NSAxLjQ0OCAxLjQ0OHY1Ljc5Mmg1Ljc5MmMuOCAwIDEuNDQ4LjY1IDEuNDQ4IDEuNDQ4IDAgLjgtLjY1IDEuNDQ4LTEuNDQ4IDEuNDQ4XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXByb2dyZXNzLWNpcmNsZVwiIGRhdGEtbmFtZT1cInByb2dyZXNzLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIxLjI4OGMtLjU4IDAtMS4wNDguNDctMS4wNDggMS4wNDh2My41MmMwIC41OC40NyAxLjA1IDEuMDQ4IDEuMDUuNTc4IDAgMS4wNDgtLjQ3IDEuMDQ4LTEuMDV2LTMuNTJjMC0uNTgtLjQ3LTEuMDQ4LTEuMDQ4LTEuMDQ4XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI1Ljk1NSAxNC45bC0zLjQ1OC0uMDA4Yy0uNTk3LjAxMy0xLjA1LjQ2Ny0xLjA1IDEuMDQ2LS4wMDIuNTguNDY3IDEuMDUgMS4wNDYgMS4wNWwzLjQ1OC4wMDdoLjAwM2MuNTc3IDAgMS4wNDYtLjQ2OCAxLjA0OC0xLjA0NiAwLS41OC0uNDY3LTEuMDUtMS4wNDUtMS4wNVwiIGZpbGwtb3BhY2l0eT1cIi4yNTFcIi8+PHBhdGggZD1cIk0xNi4wMjUgMi44MzJoLS4wMDNjLS41NzcgMC0xLjA0NS40NjgtMS4wNDcgMS4wNDZsLS4wMSA1LjQ2Yy0uMDAyLjU4LjQ2NiAxLjA1IDEuMDQ0IDEuMDVoLjAwMmMuNTc4IDAgMS4wNDYtLjQ2NyAxLjA0Ny0xLjA0NWwuMDEtNS40NmMuMDAyLS41OC0uNDY2LTEuMDUtMS4wNDUtMS4wNVwiLz48cGF0aCBkPVwiTTEzLjc1IDIwLjgxYy0uNTM2LS4yMjMtMS4xNDguMDMtMS4zNy41NjVsLTEuMzc1IDMuMjk4Yy0uMjIzLjUzNC4wMyAxLjE0Ny41NjMgMS4zNy4xMzMuMDU0LjI3LjA4Mi40MDMuMDgyLjQxMiAwIC44LS4yNDMuOTctLjY0N2wxLjM3My0zLjI5N2MuMjI0LS41MzMtLjAyOC0xLjE0Ny0uNTYyLTEuMzdcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTE5LjYwNCAyMS4zOTNjLS4yMi0uNTM3LS44MzMtLjc5LTEuMzY3LS41NzItLjUzNS4yMi0uNzkuODMzLS41NyAxLjM3bDEuMzU0IDMuMjk4Yy4xNjguNDA2LjU2LjY1Ljk3LjY1LjEzMyAwIC4yNy0uMDI0LjM5OC0uMDc4LjUzNi0uMjIuNzktLjgzMy41NzItMS4zNjdsLTEuMzU2LTMuM3pcIiBmaWxsLW9wYWNpdHk9XCIuNFwiLz48cGF0aCBkPVwiTTkuNSAxNi45NjRoLjAwMmMuNTc4IDAgMS4wNDYtLjQ2OCAxLjA0OC0xLjA0NiAwLS41OC0uNDY3LTEuMDUtMS4wNDYtMS4wNUw2LjA1IDE0Ljg2aC0uMDAzQzUuNDcgMTQuODYgNSAxNS4zMyA1IDE1LjkwOGMtLjAwMy41NzguNDY1IDEuMDUgMS4wNDUgMS4wNWwzLjQ1NS4wMDd6XCIgZmlsbC1vcGFjaXR5PVwiLjkwMlwiLz48cGF0aCBkPVwiTTIxLjA3NSAxMy44M2MuMTY2LjQwNS41NTcuNjUuOTcuNjUuMTMyIDAgLjI2Ny0uMDI2LjM5OC0uMDhsMy4xNTgtMS4yOTZjLjUzNS0uMjIuNzktLjgzMy41Ny0xLjM2Ni0uMjItLjUzNS0uODMtLjc5My0xLjM2Ny0uNTdsLTMuMTU4IDEuMjk0Yy0uNTM2LjIyLS43OS44MzMtLjU3IDEuMzY3XCIgZmlsbC1vcGFjaXR5PVwiLjJcIi8+PHBhdGggZD1cIk0xMC45OTIgMTcuOTljLS4yMi0uNTM2LS44My0uNzk0LTEuMzY3LS41N2wtMy4yMjggMS4zMzJjLS41MzUuMjItLjc5LjgzMy0uNTcgMS4zNjYuMTY3LjQwNS41NTguNjUuOTcuNjUuMTMgMCAxLjU1Ny0uNTU4IDEuNjg4LS42MTNsMS45MzgtLjc5OGMuNTM1LS4yMi43OS0uODMzLjU3LTEuMzY3XCIgZmlsbC1vcGFjaXR5PVwiLjhcIi8+PHBhdGggZD1cIk0yMS4yOCAxOS43NWMtLjQwNy0uNDA4LTEuMDctLjQxLTEuNDgtLjAwMi0uNDEuNDEtLjQxMiAxLjA3Mi0uMDAyIDEuNDgybDIuNDgyIDIuNDljLjIwNS4yMDQuNDc1LjMwOC43NDMuMzA4cy41MzUtLjEwMy43NC0uMzA2Yy40MS0uNDEuNDEtMS4wNy4wMDMtMS40ODJsLTIuNDg1LTIuNDl6XCIgZmlsbC1vcGFjaXR5PVwiLjM0OVwiLz48cGF0aCBkPVwiTTE5LjkwMiAxMi4wNGMuMjA1LjIwNS40NzQuMzA4Ljc0My4zMDguMjY4IDAgLjUzNi0uMTAyLjc0LS4zMDVsMi40MDUtMi4zOTdjLjQxLS40MS40MTItMS4wNzIuMDAyLTEuNDgyLS40MDgtLjQxLTEuMDctLjQxLTEuNDgtLjAwM2wtMi40MDUgMi4zOThjLS40MTIuNDEtLjQxMiAxLjA3LS4wMDUgMS40ODJcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguMTMgMTAuODEzYy4xMzIuMDU0LjI3LjA4LjQwMy4wOC40MSAwIC44LS4yNDIuOTY4LS42NDVsMS4yOTItMy4xMDdjLjIyMy0uNTMyLS4wMy0xLjE0NS0uNTY0LTEuMzY4LS41MzUtLjIyMi0xLjE1LjAzMi0xLjM3LjU2NWwtMS4yOTIgMy4xMDZjLS4yMjIuNTM0LjAzIDEuMTQ3LjU2NCAxLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjEwMlwiLz48cGF0aCBkPVwiTTEzLjE3NiA2LjMyNmMtLjIyLS41MzUtLjgzNC0uNzkzLTEuMzY4LS41Ny0uNTM0LjIyMi0uNzkuODM0LS41NyAxLjM3bDEuMjg3IDMuMTE1Yy4xNjYuNDA2LjU1Ni42NS45Ny42NS4xMyAwIC4yNjctLjAyNS4zOTctLjA4LjUzNi0uMjIuNzktLjgzMy41Ny0xLjM2N2wtMS4yODYtMy4xMTd6TTEwLjYyNiAxMi4wMTVjLjIwNC4yMDUuNDczLjMwOC43NDIuMzA4LjI2NyAwIC41MzUtLjEwMi43NC0uMzA1LjQxLS40MS40MS0xLjA3My4wMDItMS40ODJsLTIuMzkzLTIuNGMtLjQxLS40MS0xLjA3Mi0uNDEtMS40OC0uMDAyLS40MTIuNDEtLjQxMyAxLjA3LS4wMDUgMS40ODJsMi4zOTQgMi40elwiLz48cGF0aCBkPVwiTTEyLjE4NiAxOS43M2MtLjQxLS40MTItMS4wNzItLjQxMy0xLjQ4Mi0uMDA0TDguMjA4IDIyLjIxYy0uNDEuNDEtLjQxIDEuMDcyLS4wMDIgMS40ODIuMjA0LjIwNi40NzIuMzA4Ljc0My4zMDguMjY1IDAgLjUzMy0uMS43MzctLjMwNWwyLjQ5NS0yLjQ4NWMuNDEtLjQwOC40MS0xLjA3LjAwNC0xLjQ4XCIgZmlsbC1vcGFjaXR5PVwiLjcwMlwiLz48cGF0aCBkPVwiTTI1LjU5IDE4Ljc4N2wtMy4yMTQtMS4zMzhjLS41MzQtLjIyMy0xLjE0OC4wMy0xLjM3LjU2My0uMjIyLjUzNS4wMyAxLjE0OC41NjUgMS4zN2wzLjIxNCAxLjM0Yy4xMy4wNTQuMjY4LjA4LjQwMy4wOC40MSAwIC44LS4yNDMuOTY3LS42NDQuMjIzLS41MzctLjAzLTEuMTUtLjU2NC0xLjM3M1wiIGZpbGwtb3BhY2l0eT1cIi4zMDJcIi8+PHBhdGggZD1cIk02LjQwNyAxMy4wN2wzLjE2IDEuMzE0Yy4xMy4wNTQuMjY3LjA4LjQuMDguNDEgMCAuOC0uMjQzLjk2OC0uNjQ2LjIyMy0uNTMzLS4wMy0xLjE0Ni0uNTY0LTEuMzdsLTMuMTU2LTEuMzE0Yy0uNTM1LS4yMjItMS4xNS4wMy0xLjM3LjU2NC0uMjIzLjUzNS4wMyAxLjE0OC41NjMgMS4zN1wiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wcm9ncmVzc1wiIGRhdGEtbmFtZT1cInByb2dyZXNzXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGw9XCJub25lXCIvPjxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48cGF0aCBkPVwiTTE2IDIyLjkxNWMtLjc1OCAwLTEuMzcuNjEzLTEuMzcgMS4zN3Y0LjYwNWMwIC43NTYuNjEyIDEuMzcgMS4zNyAxLjM3Ljc1NiAwIDEuMzctLjYxNCAxLjM3LTEuMzd2LTQuNjA1YzAtLjc1Ny0uNjE0LTEuMzctMS4zNy0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjUwMlwiLz48cGF0aCBkPVwiTTI5LjAxOCAxNC41NmwtNC41MjItLjAwOGMtLjc4LjAxNi0xLjM3My42MS0xLjM3MyAxLjM2Ny0uMDAyLjc1Ni42MSAxLjM3IDEuMzY4IDEuMzcybDQuNTIyLjAxaC4wMDNjLjc1NSAwIDEuMzY3LS42MTIgMS4zNy0xLjM3IDAtLjc1NS0uNjEtMS4zNy0xLjM2Ny0xLjM3XCIgZmlsbC1vcGFjaXR5PVwiLjI1MVwiLz48cGF0aCBkPVwiTTE2LjAzMy4yNDJoLS4wMDJjLS43NTQgMC0xLjM2Ny42MS0xLjM3IDEuMzY3bC0uMDE1IDUuNjhjMCAuNzU1LjYxIDEuMzcgMS4zNjcgMS4zNzJoLjAwM2MuNzU2IDAgMS4zNy0uNjEgMS4zNy0xLjM2OGwuMDE2LTUuNjhjLjAwMy0uNzU3LS42MS0xLjM3LTEuMzY3LTEuMzcyXCIvPjxwYXRoIGQ9XCJNMTMuMDYgMjIuMjljLS43MDMtLjI5Mi0xLjUwMy4wNC0xLjc5NS43MzhMOS40NjggMjcuMzRjLS4yOS43LjA0IDEuNS43MzYgMS43OS4xNzQuMDc0LjM1Mi4xMS41MjguMTEuNTM3IDAgMS4wNDUtLjMxOCAxLjI2Ni0uODQ2bDEuNzk2LTQuMzFjLjI5Mi0uNy0uMDM3LTEuNTAzLS43MzUtMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuNlwiLz48cGF0aCBkPVwiTTIwLjcxMyAyMy4wNTJjLS4yODctLjcwMi0xLjA5LTEuMDM1LTEuNzg4LS43NDgtLjcuMjg3LTEuMDM1IDEuMDktLjc0NyAxLjc5bDEuNzczIDQuMzEzYy4yMi41My43My44NSAxLjI3Ljg1LjE3MiAwIC4zNS0uMDMyLjUyLS4xLjctLjI5IDEuMDMzLTEuMDkuNzQ3LTEuNzlsLTEuNzc0LTQuMzE1elwiIGZpbGwtb3BhY2l0eT1cIi40XCIvPjxwYXRoIGQ9XCJNNy41IDE3LjI2aC4wMDNjLjc1NSAwIDEuMzY4LS42MSAxLjM3LTEuMzY3IDAtLjc1OC0uNjEtMS4zNzItMS4zNjctMS4zNzNsLTQuNTE4LS4wMWgtLjAwM2MtLjc1NiAwLTEuMzcuNjEyLTEuMzcgMS4zNjgtLjAwMy43NTcuNjEgMS4zNzIgMS4zNjcgMS4zNzNsNC41Mi4wMXpcIiBmaWxsLW9wYWNpdHk9XCIuOTAyXCIvPjxwYXRoIGQ9XCJNMjIuNjM2IDEzLjE2MmMuMjE4LjUzLjczLjg1IDEuMjY3Ljg1LjE3NCAwIC4zNS0uMDM0LjUyMi0uMTA1bDQuMTMtMS42OTRjLjY5OC0uMjg3IDEuMDMzLTEuMDkuNzQ0LTEuNzg2LS4yOS0uNy0xLjA4OC0xLjAzNy0xLjc5LS43NDVsLTQuMTMgMS42OTJjLS43LjI4Ny0xLjAzMiAxLjA5LS43NDQgMS43ODhcIiBmaWxsLW9wYWNpdHk9XCIuMlwiLz48cGF0aCBkPVwiTTkuNDUgMTguNjAyYy0uMjg3LS43LTEuMDg1LTEuMDQtMS43ODctLjc0NWwtNC4yMiAxLjc0Yy0uNy4yOS0xLjAzMyAxLjA5LS43NDUgMS43ODguMjE3LjUzLjcyOC44NSAxLjI2Ny44NS4xNzIgMCAyLjAzNi0uNzMgMi4yMDgtLjhsMi41MzQtMS4wNDVjLjctLjI4OCAxLjAzMy0xLjA5Ljc0NC0xLjc4OFwiIGZpbGwtb3BhY2l0eT1cIi44XCIvPjxwYXRoIGQ9XCJNMjIuOTA2IDIwLjkwNGMtLjUzMy0uNTM0LTEuNC0uNTM3LTEuOTM3LS4wMDItLjUzNy41MzQtLjU0IDEuNC0uMDA0IDEuOTM3bDMuMjQ2IDMuMjU1Yy4yNy4yNjcuNjIuNDAyLjk3LjQwMi4zNTIgMCAuNy0uMTM0Ljk3LS40LjUzNi0uNTM0LjUzNy0xLjQuMDAzLTEuOTM3bC0zLjI1LTMuMjU2elwiIGZpbGwtb3BhY2l0eT1cIi4zNDlcIi8+PHBhdGggZD1cIk0yMS4xMDMgMTAuODIyYy4yNjcuMjY4LjYyLjQwMi45Ny40MDIuMzUyIDAgLjctLjEzMy45Ny0uMzk4bDMuMTQ0LTMuMTM1Yy41MzYtLjUzNC41MzgtMS40LjAwMy0xLjkzNy0uNTM1LS41MzUtMS40LS41MzctMS45MzgtLjAwNEwyMS4xMSA4Ljg4M2MtLjU0LjUzNS0uNTQgMS40LS4wMDcgMS45MzhcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTguNzg2IDkuMjE3Yy4xNzMuMDcuMzUuMTA2LjUyNi4xMDYuNTM2IDAgMS4wNDctLjMxOCAxLjI2Ni0uODQ0bDEuNjktNC4wNjRjLjI5LS42OTctLjA0LTEuNS0uNzQtMS43OS0uNy0uMjktMS41LjA0LTEuNzkyLjczOGwtMS42OSA0LjA2Yy0uMjkuNy4wNCAxLjUuNzQgMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuMTAyXCIvPjxwYXRoIGQ9XCJNMTIuMzA3IDMuMzVjLS4yOS0uNy0xLjA5LTEuMDM3LTEuNzktLjc0NC0uNjk4LjI4OC0xLjAzMiAxLjA5LS43NDMgMS43OWwxLjY4MiA0LjA3NGMuMjE2LjUyOC43MjcuODQ4IDEuMjY3Ljg0OC4xNzMgMCAuMzUtLjAzMy41Mi0uMTA1LjctLjI4NyAxLjAzNC0xLjA5Ljc0Ni0xLjc4N0wxMi4zMDYgMy4zNXpNOC45NzMgMTAuNzljLjI2Ny4yNjcuNjE4LjQuOTcuNC4zNSAwIC43LS4xMzIuOTY3LS4zOTcuNTM2LS41MzUuNTQtMS40MDMuMDAzLTEuOTM4bC0zLjEzLTMuMTM3Yy0uNTMzLS41MzctMS40LS41MzgtMS45MzYtLjAwNC0uNTM3LjUzNS0uNTQgMS40LS4wMDQgMS45MzhsMy4xMyAzLjEzN3pcIi8+PHBhdGggZD1cIk0xMS4wMTIgMjAuODc2Yy0uNTM2LS41MzctMS40MDItLjUzOC0xLjkzNy0uMDA0bC0zLjI2NSAzLjI1Yy0uNTM1LjUzMy0uNTM3IDEuNC0uMDAyIDEuOTM2LjI2Ny4yNy42MTguNDAzLjk3LjQwMy4zNSAwIC43LS4xMy45NjctLjM5OGwzLjI2My0zLjI1Yy41MzYtLjUzMy41MzctMS40LjAwNC0xLjkzNlwiIGZpbGwtb3BhY2l0eT1cIi43MDJcIi8+PHBhdGggZD1cIk0yOC41NCAxOS42NDVsLTQuMjAzLTEuNzVjLS42OTctLjI5LTEuNS4wNC0xLjc5LjczOC0uMjkuNjk4LjA0IDEuNS43MzggMS43OTJsNC4yMDIgMS43NWMuMTcuMDcuMzUuMTA2LjUyNi4xMDYuNTM3IDAgMS4wNDUtLjMxNyAxLjI2NC0uODQyLjI5Mi0uNy0uMDM4LTEuNTAyLS43MzctMS43OTNcIiBmaWxsLW9wYWNpdHk9XCIuMzAyXCIvPjxwYXRoIGQ9XCJNMy40NTYgMTIuMTY3bDQuMTMgMS43MmMuMTcyLjA3LjM1LjEwNS41MjYuMTA1LjUzNyAwIDEuMDQ3LS4zMTggMS4yNjQtLjg0Ni4yOTItLjY5Ny0uMDM4LTEuNDk4LS43MzctMS43OWwtNC4xMy0xLjcyYy0uNjk4LS4yOS0xLjUuMDQtMS43OS43NC0uMjkyLjY5OC4wMzggMS41LjczNiAxLjc5XCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXF1ZXN0aW9uLWNpcmNsZVwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTcuNDYgMTcuMjkydjMuMDUzYzAgLjgwNy0uNjUzIDEuNDYtMS40NiAxLjQ2LS44MDcgMC0xLjQ2LS42NTMtMS40Ni0xLjQ2di00LjMzYzAtLjgwNC42NTMtMS40NiAxLjQ2LTEuNDYgMS41ODQgMCAyLjg3LTEuMjg0IDIuODctMi44NjggMC0xLjU4NC0xLjI4Ni0yLjg3LTIuODctMi44N3MtMi44NyAxLjI4Ni0yLjg3IDIuODdjMCAuODA2LS42NTQgMS40Ni0xLjQ2IDEuNDYtLjgxIDAtMS40NjItLjY1NC0xLjQ2Mi0xLjQ2IDAtMy4xOTQgMi41OTgtNS43OTIgNS43OTItNS43OTJzNS43OTIgMi41OTggNS43OTIgNS43OTJjMCAyLjY5LTEuODQgNC45NTYtNC4zMyA1LjYwNU0xNiAyNS4zOThjLS43OTggMC0xLjQ0NC0uNjQzLTEuNDQ0LTEuNDQ0IDAtLjc5NS42NDYtMS40MzggMS40NDQtMS40MzguNzk4IDAgMS40NDQuNjQzIDEuNDQ0IDEuNDM4IDAgLjgtLjY0NiAxLjQ0NC0xLjQ0NCAxLjQ0NFwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZWZyZXNoLWNpcmNsZVwiIGRhdGEtbmFtZT1cInJlZnJlc2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yNS42MjggMTAuMTA3bC0xLjA0OCA0LjEyYy0uMDEyLjA0Ni0uMDQ0LjA4Ni0uMDY0LjEzNS0uMTcyLjQ2LS42MzguNzk0LTEuMTMuNzk0LS4wMzMgMC0uMDY1LS4wMS0uMS0uMDEyLS4wMzItLjAwMy0uMDYtLjAwOC0uMDktLjAxMy0uMDM4LS4wMDYtLjA3Ny0uMDA0LS4xMTQtLjAxM2wtNC4xMTctMS4wNWMtLjY2LS4xNjgtMS4wNi0uODM2LS44OTMtMS40OTcuMTctLjY2My44MzYtMS4wNjIgMS41MDItLjg5bDEuNDYyLjM3Yy0uNTA2LS42MTQtMS4xMjItMS4xMzctMS44NDItMS41My0xLjQ3LS44MS0zLjE3LS45OS00Ljc3NS0uNTI2LTEuNjEzLjQ3LTIuOTQ1IDEuNTM4LTMuNzUgMy4wMS0uODEgMS40Ny0xIDMuMTY4LS41MjYgNC43NzcuOTY3IDMuMzI3IDQuNDYgNS4yNDcgNy43ODUgNC4yNzYuNjU1LS4xODUgMS4zMzguMTg1IDEuNTI1LjgzOC4xOTMuNjU0LS4xODIgMS4zMzYtLjgzOCAxLjUzLS44MTMuMjM1LTEuNjMyLjM1LTIuNDQuMzUtMy43OSAwLTcuMjktMi40ODYtOC40MDItNi4zMDItLjY1My0yLjI0Ni0uMzkyLTQuNjA4LjczMi02LjY1NiAxLjEyNS0yLjA0NiAyLjk4LTMuNTMzIDUuMjI0LTQuMTkgMi4yNDItLjY1IDQuNjA0LS4zOTMgNi42NS43MyAxLjAxNS41NiAxLjg5MyAxLjI5OCAyLjU5OCAyLjE3M2wuMjYtMS4wM2MuMTctLjY2Mi44NDItMS4wNjQgMS41LS44OS42NTguMTY2IDEuMDU4LjgzNy44OSAxLjQ5N1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZXN0b3JlXCIgZGF0YS1uYW1lPVwicmVzdG9yZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTI0LjM0IDcuMjE2Yy0yLjM4NC0yLjIyMy01LjQ5LTMuMzg4LTguNzUtMy4yNzMtMy4zOTYuMTItNi42NCAxLjcwMy04LjkgNC4zNDgtMS40NTYgMS43MDctMi4zOTcgMy43MjMtMi43NzcgNS44ODhsLTEuNDU2LTIuMTkzYy0uMzU2LS41MzUtMS4wNzYtLjY4LTEuNjEyLS4zMjUtLjUzNS4zNTQtLjY4MiAxLjA3Ni0uMzI1IDEuNjFsMy40NzggNS4yNGMuNDE1LjY1OCAxLjQyLjY5NSAxLjkuMDU3bDQuMDItNC41NzVjLjQyMy0uNDgzLjM3NS0xLjIxNy0uMTA3LTEuNjQyLS40ODItLjQyMi0xLjIxNi0uMzc0LTEuNjQuMTA3bC0xLjk4MiAyLjI1NmMuMjk1LTEuODEgMS4wNi0zLjQ5NiAyLjI3LTQuOTEgMS44MzgtMi4xNTIgNC40NjctMy40NCA3LjIxMi0zLjUzNiAyLjYzOC0uMDk2IDUuMTU0Ljg1IDcuMDg1IDIuNjUgMS45MyAxLjggMy4wNDQgNC4yNDQgMy4xMzYgNi44ODMuMDk0IDIuNjM4LS44NDYgNS4xNTMtMi42NDcgNy4wODUtMS44IDEuOTMtNC4yNDYgMy4wNDQtNi44ODQgMy4xMzYtLjY0My4wMjMtMS4xNDUuNTYtMS4xMjMgMS4yMDMuMDIzLjYyOC41MzggMS4xMjIgMS4xNjMgMS4xMjJoLjA0YzMuMjYtLjExNCA2LjI4LTEuNDkgOC41MDMtMy44NzQgMi4yMjUtMi4zODUgMy4zODctNS40OTQgMy4yNzItOC43NS0uMTE0LTMuMjYtMS40OS02LjI4LTMuODc0LTguNTA0XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlYXJjaC1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzZWFyY2gtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMyAzM1wiIHdpZHRoPVwiMzNcIiBoZWlnaHQ9XCIzM1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2LjAyNFwiIGN5PVwiMTYuMDI0XCIgcj1cIjE2LjAyNFwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk03LjcxNiAxMy43N2MwLTMuMzYyIDIuNzM4LTYuMTAyIDYuMTA1LTYuMTAyIDMuMzYzIDAgNi4xIDIuNzQgNi4xIDYuMTAzIDAgMy4zNjUtMi43MzcgNi4xMDUtNi4xIDYuMTA1LTMuMzY2IDAtNi4xMDQtMi43NC02LjEwNC02LjEwNG0xOC4xOSAxMC43ODVsLTUuODgtNS44ODJjMS4wNzMtMS4zNTMgMS43NC0zLjA0MiAxLjc0LTQuOTAyIDAtNC4zOC0zLjU2NC03Ljk0OC03Ljk0NS03Ljk0OC00LjM4MyAwLTcuOTUgMy41NjctNy45NSA3Ljk1IDAgNC4zODIgMy41NjcgNy45NSA3Ljk1IDcuOTUgMS44NTcgMCAzLjU0OC0uNjcgNC45LTEuNzQ0bDUuODgzIDUuODgyYy4xOC4xOC40MTUuMjcuNjUyLjI3LjIzNiAwIC40NzItLjA5LjY1LS4yNy4zNjMtLjM1OC4zNjMtLjk0MyAwLTEuMzA1XCIgZmlsbC1ydWxlPVwibm9uemVyb1wiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXN0YXItY2lyY2xlXCIgZGF0YS1uYW1lPVwic3Rhci1jaXJjbGVcIiB2aWV3Qm94PVwiMCAwIDMzIDMzXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMzXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGN4PVwiMTYuMDI0XCIgY3k9XCIxNi4wMjRcIiByPVwiMTYuMDI0XCIgZmlsbC1vcGFjaXR5PVwiLjE0OVwiLz48cGF0aCBkPVwiTTE2LjA4IDUuMTU1Yy4yOC4wMjUuNTM1LjE0Mi43MS4zNjcuMDUzLjA2Ny4wOS4xMzcuMTI2LjIxM2wyLjYwNyA2LjEwNmg2LjA2bC4wODIuMDA1Yy4xNy4wMjIuMzI1LjA3LjQ2Ni4xNy4zNzYuMjYzLjUxMi43NzMuMzE3IDEuMTg4LS4wNi4xMy0uMTUuMjMzLS4yNTQuMzI4bC01LjIxMyA0LjM0MiAyLjYzIDcuMDE0LjAyNS4wOGMuMDQuMTY3LjA0OC4zMy4wMDQuNS0uMTE4LjQ0NS0uNTU0Ljc1LTEuMDE0LjcwOC0uMTcyLS4wMTYtLjMyMy0uMDgtLjQ2Ny0uMTc0bC02LjEzNi00LjM4TDkuODkgMjZsLS4wNzIuMDQ2Yy0uMTUuMDgtLjMwNy4xMy0uNDguMTMyLS40NjIuMDAyLS44Ny0uMzQtLjk0Ny0uNzk2LS4wMjgtLjE3LS4wMDQtLjMzMy4wNS0uNDk2bDIuNjI4LTcuMDE0LTUuMjEzLTQuMzQtLjA2Mi0uMDU3Yy0uMDk2LS4xMDQtLjE3NS0uMjE1LS4yMjQtLjM1LS4xNi0uNDMuMDItLjkyNi40MTgtMS4xNTYuMTUtLjA4Ny4zMDgtLjEyMi40NzgtLjEzaDYuMDYybDIuNjMyLTYuMTA4LjAzNi0uMDc0Yy4wNDItLjA3Mi4wODYtLjE0LjE0NC0uMi4xNTUtLjE2Ny4zNTQtLjI1OC41NzYtLjI5Ni4wODItLjAwNy4wODItLjAwNy4xNjQtLjAwN3ptLTIuMDQ1IDguMDJjLS4wMzUuMDcyLS4wNzIuMTQtLjEyLjIwNS0uMTMuMTY4LS4zMTYuMjktLjUyMi4zNDMtLjA4LjAyLS4xNTYuMDI2LS4yMzYuMDNoLTQuMDVsMy43MDYgMy4wODQuMDYyLjA1N2MuMDU4LjA2My4xMS4xMjUuMTU0LjIuMDk3LjE3LjE0LjM3LjEyMy41NjctLjAxLjA4Ny0uMDMuMTY2LS4wNTcuMjQ3bC0xLjc2OCA0LjcxNyA0LjE0LTIuOTU1LjA3Mi0uMDQ3Yy4wNzYtLjA0LjE1LS4wNzYuMjMzLS4wOTguMTktLjA1Mi4zOTctLjA0My41ODMuMDI1LjA4LjAzLjE1LjA3Mi4yMjMuMTJsNC4xNCAyLjk1NC0xLjc2OC00LjcxNy0uMDI2LS4wOGMtLjAyLS4wODMtLjAzNC0uMTY0LS4wMzUtLjI1IDAtLjE5Ny4wNi0uMzkzLjE3NS0uNTU0LjA1LS4wNy4xMDctLjEyOC4xNy0uMTg2bDMuNzA1LTMuMDg0aC00LjA1bC0uMDc4LS4wMDRjLS4wOC0uMDEtLjE1Ny0uMDI0LS4yMzQtLjA1LS4yNi0uMDktLjQ1LS4yODMtLjU2Ni0uNTI4bC0xLjk4LTQuNjM3Yy0uNjY1IDEuNTQ3LTEuMzMgMy4wOTMtMS45OTcgNC42NHpcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3RhdHVzLWZhaWxlZFwiIGRhdGEtbmFtZT1cInN0YXR1cy1mYWlsZWRcIiB2aWV3Qm94PVwiMCAwIDMzIDMyXCIgd2lkdGg9XCIzM1wiIGhlaWdodD1cIjMyXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBkPVwiTTE2LjIxNyAyNi42N2MtLjc1NCAwLTEuMzYyLS42MS0xLjM2Mi0xLjM2IDAtLjc1Mi42MDgtMS4zNiAxLjM2Mi0xLjM2Ljc1IDAgMS4zNi42MDggMS4zNiAxLjM2IDAgLjc1LS42MSAxLjM2LTEuMzYgMS4zNk0xNC45NyAxMy4wNmMwLS42ODguNTU4LTEuMjQ3IDEuMjQ3LTEuMjQ3LjY4OCAwIDEuMjQ3LjU2IDEuMjQ3IDEuMjQ3djguMTYzYzAgLjY5LS41NiAxLjI0OC0xLjI0NyAxLjI0OC0uNjkgMC0xLjI0OC0uNTU3LTEuMjQ4LTEuMjQ4di04LjE2M3ptMTcuNDIzIDE3LjMyTDE3LjY1Ljg5Yy0uMDI2LS4wNS0uMDYtLjA4LS4wODYtLjEyNi0uMTkyLS4zMTItLjQ3Ny0uNTQtLjgxNi0uNjYgMCAwIC4wMDMtLjAwNC4wMDUtLjAwNEMxNi41OC4wNCAxNi40MDMgMCAxNi4yMTcgMGMtLjU2NyAwLTEuMDYzLjI5NC0xLjM0OC43Ni0uMDI1LjA0My0uMDU4LjA3Ni0uMDguMTE4TC4xMzMgMzAuMTk0Yy0uMTk1LjM4Ni0uMTc1Ljg0Ni4wNTIgMS4yMTIuMjMuMzcuNjMuNTk0IDEuMDYzLjU5NEgzMS4yMWMuNjkgMCAxLjI0Ny0uNTYgMS4yNDctMS4yNDcgMC0uMTMtLjAyNy0uMjUyLS4wNjQtLjM3MlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtcGFydGlhbFwiIGRhdGEtbmFtZT1cInN0YXR1cy1wYXJ0aWFsXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZD1cIk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDB6bS4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFjMS43NjQtLjAxNCAzLjUyLS4zNzUgNS4xNDctMS4wNjQgMS41NTUtLjY1OCAyLjk4Mi0xLjYxIDQuMTktMi43OSAxLjE2OC0xLjE0MiAyLjEzLTIuNDkyIDIuODItMy45Ny41NjYtMS4yMS45NS0yLjUgMS4xMzUtMy44Mi4yMDctMS40NzguMTctMi45OS0uMTEtNC40NTQtLjI0LTEuMjUtLjY2LTIuNDYzLTEuMjQtMy41OTQtMS4zMi0yLjU3LTMuNDYtNC42OS02LjA1LTUuOTc3LTEuMTktLjU5NC0yLjQ2OC0xLjAwNy0zLjc4LTEuMjI2LS41NjUtLjA5NS0xLjEzMy0uMTQ3LTEuNzAzLS4xNzMtLjE3LS4wMDQtLjM0LS4wMTUtLjUxLjAwMnpcIi8+PHBhdGggZD1cIk0xNi4wMTMgMi40NzJ2MjcuMDU1bC4xMDIuMDFjMS43NjQtLjAxNCAzLjUyLS4zNzUgNS4xNDctMS4wNjQgMS41NTUtLjY1OCAyLjk4Mi0xLjYxIDQuMTktMi43OSAxLjE2OC0xLjE0MiAyLjEzLTIuNDkyIDIuODItMy45Ny41NjYtMS4yMS45NS0yLjUgMS4xMzUtMy44Mi4yMDctMS40NzguMTctMi45OS0uMTEtNC40NTQtLjI0LTEuMjUtLjY2LTIuNDYzLTEuMjQtMy41OTQtMS4zMi0yLjU3LTMuNDYtNC42OS02LjA1LTUuOTc3LTEuMTktLjU5NC0yLjQ2OC0xLjAwNy0zLjc4LTEuMjI2LS41NjUtLjA5NS0xLjEzMy0uMTQ3LTEuNzAzLS4xNzMtLjE3LS4wMDQtLjM0LS4wMTUtLjUxLjAwMnpcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3RhdHVzLXBlbmRpbmdcIiBkYXRhLW5hbWU9XCJzdGF0dXMtcGVuZGluZ1wiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjAgMTguNjY2aC02LjY2NlY4YzAtLjczNi41OTYtMS4zMzIgMS4zMzItMS4zMzJDMTUuNDA0IDYuNjY4IDE2IDcuMjY0IDE2IDh2OGg0Yy43MzggMCAxLjMzNC41OTYgMS4zMzQgMS4zMzQgMCAuNzQtLjU5NiAxLjMzMi0xLjMzNCAxLjMzMk0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc3luYy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJzeW5jLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjUuNzU0IDE5LjI2N2MtMS4zODQgMy45MTItNS4xMDIgNi41MzgtOS4yNTQgNi41MzgtMi43NzYgMC01LjQ1LTEuMTY4LTcuMzYtMy4wMTR2LjgzM2MwIC42OC0uNTQ3IDEuMjI3LTEuMjI3IDEuMjI3LS42NzcgMC0xLjIyNy0uNTQ3LTEuMjI3LTEuMjI3di00Ljc3YzAtLjY3OC41NS0xLjIyOCAxLjIyNy0xLjIyOGg0Ljc3Yy42OCAwIDEuMjI4LjU1IDEuMjI4IDEuMjI3IDAgLjY3OC0uNTQ3IDEuMjI3LTEuMjI2IDEuMjI3aC0yLjY2OGMxLjQxIDEuOTU4IDMuODggMy4yNyA2LjQ4NCAzLjI3IDMuMTE0IDAgNS45MDUtMS45NyA2Ljk0My00LjkwMy4yMjMtLjYzOC45MjItLjk3NCAxLjU2NS0uNzQ4LjYzOC4yMjUuOTcyLjkzLjc0NiAxLjU2N002LjI5NCAxMi43OGMxLjM4My0zLjkxIDUuMS02LjUzNyA5LjI1NC02LjUzNyAyLjc3NSAwIDUuNDUzIDEuMTcgNy4zNiAzLjAxOHYtLjgzNWMwLS42NzUuNTQ3LTEuMjI3IDEuMjI3LTEuMjI3LjY3NyAwIDEuMjI3LjU1MiAxLjIyNyAxLjIyN3Y0Ljc3YzAgLjY4LS41NSAxLjIyNy0xLjIyNyAxLjIyN2gtNC43N2MtLjY3OCAwLTEuMjI4LS41NDctMS4yMjgtMS4yMjcgMC0uNjc3LjU1LTEuMjI3IDEuMjI3LTEuMjI3aDIuNjY3Yy0xLjQwNy0xLjk1Ni0zLjg4LTMuMjctNi40ODItMy4yNy0zLjExNSAwLTUuOTA1IDEuOTctNi45NCA0LjkwMi0uMTguNTAzLS42NTMuODE4LTEuMTU3LjgxOC0uMTM2IDAtLjI3My0uMDItLjQwOC0uMDctLjY0LS4yMjctLjk3NS0uOTI3LS43NS0xLjU2N1wiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aHVtYnMtdXAtY2lyY2xlXCIgZGF0YS1uYW1lPVwidGh1bWJzLXVwLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNlwiIGN5PVwiMTZcIiByPVwiMTZcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMjMuMDcgMTguNmMuNzggMCAxLjQxMy42MzQgMS40MTMgMS40MTUgMCAuNzgtLjYzMiAxLjQxNC0xLjQxMyAxLjQxNGgtLjk0M2MuNzggMCAxLjQxNC42MzIgMS40MTQgMS40MTMgMCAuNzgtLjYzMiAxLjQxNC0xLjQxMyAxLjQxNEgxNmMtMy43NyAwLTIuODI4LTEuODg2LTEwLjM3LTEuODg2VjEzLjg5aDIuODNjMy4yOTggMCA3LjA3LTMuMDM3IDcuMDctNy41NCAwLTEuNDkgMi44MjctMS42OCAyLjgyNyAxLjE0OCAwIDEuODg1LS45NDMgNS40NS0uOTQzIDUuNDVoNy41NGMuNzgyIDAgMS40MTUuNjMzIDEuNDE1IDEuNDEzcy0uNjM0IDEuNDEzLTEuNDE1IDEuNDEzaC0uOTQzYy43ODIgMCAxLjQxNC42MzQgMS40MTQgMS40MTQgMCAuNzgyLS42MzIgMS40MTQtMS40MTQgMS40MTRoLS45NDJcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctd2FybmluZy1jaXJjbGVcIiBkYXRhLW5hbWU9XCJ3YXJuaW5nLWNpcmNsZVwiIHZpZXdCb3g9XCIwIDAgMzMgMzNcIiB3aWR0aD1cIjMzXCIgaGVpZ2h0PVwiMzNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgY3g9XCIxNi4wMjRcIiBjeT1cIjE2LjAyNFwiIHI9XCIxNi4wMjRcIiBmaWxsLW9wYWNpdHk9XCIuMTQ5XCIvPjxwYXRoIGQ9XCJNMTYuODk4IDE3Ljk4NWMwIC40OTMtLjQuODkyLS44OTIuODkycy0uODktLjQtLjg5LS44OTJWMTMuMTJjMC0uNDkuMzk4LS44OS44OS0uODlzLjg5Mi40Ljg5Mi44OXY0Ljg2NXptLS44OTIgMy4yNDJjLS40NDYgMC0uODEtLjM2NC0uODEtLjgxIDAtLjQ1LjM2NC0uODEuODEtLjgxLjQ0OCAwIC44MS4zNi44MS44MSAwIC40NDYtLjM2Mi44MS0uODEuODFtOS42MTQgMS44MzdMMTYuODAzIDUuNDNjLS4zMDMtLjYwNS0xLjI5LS42MDUtMS41OTQgMEw2LjI5MyAyMy4yNmMtLjE0LjI3Ni0uMTI1LjYwNC4wNC44NjYuMTYuMjY0LjQ0OC40MjUuNzU3LjQyNWgxNy44NjdjLjQ5MiAwIC44OTItLjQuODkyLS44OSAwLS4yMy0uMDg3LS40NC0uMjMtLjU5NlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy14LWNpcmNsZVwiIGRhdGEtbmFtZT1cIngtY2lyY2xlXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGNpcmNsZSBjeD1cIjE2XCIgY3k9XCIxNlwiIHI9XCIxNlwiIGZpbGwtb3BhY2l0eT1cIi4xNDlcIi8+PHBhdGggZD1cIk0yMy40ODQgMjEuNjhjLjQ3OC40NzcuNDc4IDEuMjU0IDAgMS43MzItLjI0LjI0LS41NTQuMzYtLjg2OC4zNi0uMzEgMC0uNjI1LS4xMi0uODY1LS4zNkwxNiAxNy42NjJsLTUuNzUgNS43NWMtLjI0LjI0LS41NTUuMzYtLjg2Ni4zNi0uMzE0IDAtLjYyOC0uMTItLjg2OC0uMzYtLjQ3OC0uNDc4LS40NzgtMS4yNTUgMC0xLjczM2w1Ljc1Mi01Ljc1Mi01Ljc1Mi01Ljc1Yy0uNDc4LS40NzctLjQ3OC0xLjI1MyAwLTEuNzMuNDc4LS40OCAxLjI1NS0uNDggMS43MzUgMEwxNiAxNC4xOTVsNS43NS01Ljc1Yy40OC0uNDggMS4yNTYtLjQ4IDEuNzM0IDBzLjQ3OCAxLjI1NSAwIDEuNzMzbC01Ljc1MiA1Ljc0OCA1Ljc1MiA1Ljc1elwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1idXR0b25zXCIgZGF0YS1uYW1lPVwiYnV0dG9uc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2MzY2RkYlwiIGQ9XCJNMzI2LjkgNDFjMS42IDAgMyAxLjQgMyAzdjI5LjhjMCAxLjYtMS40IDMtMyAzSDE0MC44Yy0xLjYgMC0zLTEuNC0zLTNWNDRjMC0xLjYgMS40LTMgMy0zaDE4Ni4xbTAtNUgxNDAuOGMtNC40IDAtOCAzLjYtOCA4djI5LjhjMCA0LjQgMy42IDggOCA4aDE4Ni4xYzQuNCAwIDgtMy42IDgtOFY0NGMwLTQuNC0zLjYtOC04LTh6XCIvPjxwYXRoIGZpbGw9XCIjOGM5YmE1XCIgZD1cIk0xOTguNyA1NC4xaDcwLjJ2OS42aC03MC4yelwiLz48cGF0aCBmaWxsPVwiI2RkMmY0MVwiIGQ9XCJNMzI3LjQgOTQuMUgxNDAuNmMtNC4yIDAtNy43IDMuNS03LjcgNy43djMwLjRjMCA0LjIgMy41IDcuNyA3LjcgNy43aDE4Ni43YzQuMiAwIDcuNy0zLjUgNy43LTcuN3YtMzAuNGMuMS00LjItMy40LTcuNy03LjYtNy43em0tNTguNiAyNy43aC03MC4ydi05LjZoNzAuMnY5LjZ6XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0zMjcuMSAxNTIuMkgxNDAuOWMtNC40IDAtNy45IDMuNi03LjkgNy45VjE5MGMwIDQuNCAzLjYgNy45IDcuOSA3LjloMTg2LjJjNC40IDAgNy45LTMuNiA3LjktNy45di0yOS45Yy4xLTQuMy0zLjUtNy45LTcuOS03Ljl6bS01OC4zIDI3LjZoLTcwLjJ2LTkuNmg3MC4ydjkuNnpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jYXJkc1wiIGRhdGEtbmFtZT1cImNhcmRzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk00MDUuOSAzNkgyNTguNWMtNC41IDAtOC4xIDMuNi04LjEgOC4xdjE0NS44YzAgNC41IDMuNiA4LjEgOC4xIDguMWgxNDcuNGM0LjUgMCA4LjEtMy42IDguMS04LjFWNDQuMWMwLTQuNS0zLjYtOC4xLTguMS04LjF6bS0xNTAuNCA4LjFjMC0xLjYgMS40LTMgMy0zaDE0Ny40YzEuNiAwIDMgMS40IDMgM1YxNTZIMjU1LjVWNDQuMXpNMjA5LjYgNDAuN2MxLjYgMCAzIDEuNCAzIDN2MTQ2LjFjMCAxLjYtMS40IDMtMyAzSDYxLjljLTEuNiAwLTMtMS40LTMtM3YtMTQ2YzAtMS42IDEuNC0zIDMtM2gxNDcuN20wLTUuMUg2MS45Yy00LjUgMC04LjEgMy43LTguMSA4LjF2MTQ2LjFjMCA0LjUgMy43IDguMSA4LjEgOC4xaDE0Ny43YzQuNSAwIDguMS0zLjcgOC4xLTguMVY0My44Yy4xLTQuNS0zLjYtOC4xLTguMS04LjF6XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk00MDEuNSAxODcuMWgtNTMuNmMtMS45IDAtMy41LTEuNi0zLjUtMy41di0xMi43YzAtMS45IDEuNi0zLjUgMy41LTMuNWg1My42YzEuOSAwIDMuNSAxLjYgMy41IDMuNXYxMi43YzAgMS45LTEuNiAzLjUtMy41IDMuNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jb2xvci13aGVlbFwiIGRhdGEtbmFtZT1cImNvbG9yLXdoZWVsXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjMmFjODRmXCIgZD1cIk0zMDYuOCA4MS44Yy03LjktMTYuMS0yMC45LTI5LjEtMzctMzctLjguOC0xLjQgMS44LTEuOSAyLjhsLTExLjMgMjYuMi0xMS4yIDI2LjJjLTIuMSA0LjggMS40IDguMiA2LjIgNi4ybDI2LjItMTEuM0wzMDQgODMuNmMxLS40IDItMS4xIDIuOC0xLjh6XCIvPjxwYXRoIGZpbGw9XCIjNTlhNzAyXCIgZD1cIk0zMTAuNiA5MS4xYy0xLjEgMC0yLjIuMy0zLjMuN2wtMjYuNSAxMC42LTI2LjUgMTAuNmMtNC45IDEuOS00LjkgNi44IDAgOC43bDI2LjUgMTAuNiAyNi41IDEwLjZjMS4xLjQgMi4yLjYgMy4zLjcgMi44LTguMiA0LjMtMTcgNC4zLTI2LjJzLTEuNS0xOC4xLTQuMy0yNi4zelwiLz48cGF0aCBmaWxsPVwiI2VmYzEwMlwiIGQ9XCJNMzA2LjggMTUyLjdjLS44LS44LTEuOC0xLjQtMi44LTEuOWwtMjYuMi0xMS4zLTI2LjItMTEuM2MtNC44LTIuMS04LjIgMS40LTYuMiA2LjJsMTEuMyAyNi4yIDExLjMgMjYuMmMuNSAxLjEgMS4xIDIgMS45IDIuOCAxNS45LTcuOCAyOS0yMC44IDM2LjktMzYuOXpcIi8+PHBhdGggZmlsbD1cIiNmNjk1MjRcIiBkPVwiTTIzNC4zIDE5Ny45YzkuMiAwIDE4LTEuNSAyNi4yLTQuMyAwLTEuMS0uMy0yLjItLjctMy4zbC0xMC42LTI2LjUtMTAuNi0yNi41Yy0xLjktNC45LTYuOC00LjktOC43IDBsLTEwLjYgMjYuNS0xMC42IDI2LjVjLS40IDEuMS0uNiAyLjItLjcgMy4zIDguMyAyLjggMTcuMSA0LjMgMjYuMyA0LjN6XCIvPjxwYXRoIGZpbGw9XCIjZjk2NjIzXCIgZD1cIk0yMTcuMSAxMjguM2wtMjYuMiAxMS4zLTI2LjIgMTEuM2MtMS4xLjUtMiAxLjEtMi44IDEuOSA3LjkgMTYuMSAyMC45IDI5LjEgMzcgMzcgLjgtLjggMS40LTEuOCAxLjktMi44bDExLjMtMjYuMiAxMS4zLTI2LjJjMS45LTQuOS0xLjUtOC4zLTYuMy02LjN6XCIvPjxwYXRoIGZpbGw9XCIjYTgxZDI3XCIgZD1cIk0yMTQuMyAxMTIuOWwtMjYuNS0xMC42LTI2LjUtMTAuNmMtMS4xLS40LTIuMi0uNi0zLjMtLjctMi44IDguMi00LjMgMTctNC4zIDI2LjJzMS41IDE4IDQuMyAyNi4yYzEuMSAwIDIuMi0uMyAzLjMtLjdsMjYuNS0xMC42IDI2LjUtMTAuNmM0LjgtMS44IDQuOC02LjcgMC04LjZ6XCIvPjxwYXRoIGZpbGw9XCIjYTM0NmNlXCIgZD1cIk0xNjEuOCA4MS44Yy44LjggMS44IDEuNCAyLjggMS45TDE5MC44IDk1bDI2LjIgMTEuM2M0LjggMi4xIDguMi0xLjQgNi4yLTYuMkwyMTIgNzMuOGwtMTEuMy0yNi4yYy0uNS0xLjEtMS4xLTItMS45LTIuOC0xNiA3LjgtMjkuMSAyMC45LTM3IDM3elwiLz48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMjM0LjMgMzYuNmMtOS4yIDAtMTggMS41LTI2LjIgNC4zIDAgMS4xLjMgMi4yLjcgMy4zbDEwLjYgMjYuNUwyMzAgOTcuMmMxLjkgNC45IDYuOCA0LjkgOC43IDBsMTAuNi0yNi41IDEwLjYtMjYuNWMuNC0xLjEuNi0yLjIuNy0zLjMtOC4zLTIuOC0xNy4xLTQuMy0yNi4zLTQuM3pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1kaWFsb2dcIiBkYXRhLW5hbWU9XCJkaWFsb2dcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTM0OS4xIDE5Ny4zSDExOC45Yy0xLjggMC0zLjMtMS41LTMuMy0zLjNWMzkuNGMwLTEuOCAxLjUtMy4zIDMuMy0zLjNoMjMwLjJjMS44IDAgMy4zIDEuNSAzLjMgMy4zVjE5NGMwIDEuOC0xLjUgMy4zLTMuMyAzLjN6XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNzcuOCAxNzAuOGMtMyAwLTUuNS0yLjUtNS41LTUuNVY2My43YzAtMyAyLjUtNS41IDUuNS01LjVoMTEyLjRjMyAwIDUuNSAyLjUgNS41IDUuNXYxMDEuNmMwIDMtMi41IDUuNS01LjUgNS41SDE3Ny44elwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMjkwLjIgNjAuN2MxLjYgMCAzIDEuNCAzIDN2MTAxLjZjMCAxLjYtMS40IDMtMyAzSDE3Ny44Yy0xLjYgMC0zLTEuNC0zLTNWNjMuN2MwLTEuNiAxLjQtMyAzLTNoMTEyLjRtMC01SDE3Ny44Yy00LjQgMC04IDMuNi04IDh2MTAxLjZjMCA0LjQgMy42IDggOCA4aDExMi40YzQuNCAwIDgtMy42IDgtOFY2My43YzAtNC40LTMuNi04LTgtOHpcIi8+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTI2MC40IDE1OC4yaC01Mi45Yy0xLjkgMC0zLjUtMS42LTMuNS0zLjV2LTEyLjVjMC0xLjkgMS42LTMuNSAzLjUtMy41aDUyLjljMS45IDAgMy41IDEuNiAzLjUgMy41djEyLjVjMCAxLjktMS41IDMuNS0zLjUgMy41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWZlZWRiYWNrXCIgZGF0YS1uYW1lPVwiZmVlZGJhY2tcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PGcgZmlsbD1cIiNmOTY2MjNcIj48cGF0aCBmaWxsLW9wYWNpdHk9XCIuNDhcIiBkPVwiTTMxNS4yOTQgMTQ0LjE1bC00LjA5OCAxMC4xTDI1MC42OSAxMjkuN2w0LjA5Ny0xMC4xelwiLz48cGF0aCBkPVwiTTIxNy4yNjQgMTA0LjM2OGwtNC4xIDEwLjEtNjAuNTA2LTI0LjU1MyA0LjEtMTAuMXpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjI0XCIgZD1cIk0yMDYuOTA2IDE5OC4yM2wtMTAuMS00LjA5OCAyNC41NTMtNjAuNTA3IDEwLjEgNC4wOTh6XCIvPjxwYXRoIGZpbGwtb3BhY2l0eT1cIi43MlwiIGQ9XCJNMjQ2LjcwNiAxMDAuMjcybC0xMC4xLTQuMDk4IDI0LjU1My02MC41MDcgMTAuMDk4IDQuMDk4elwiLz48cGF0aCBmaWxsLW9wYWNpdHk9XCIuMzZcIiBkPVwiTTI3Mi4zMjggMTkzLjU4OGwtMTAuMDQgNC4yNDUtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjg0XCIgZD1cIk0yMzEuMDg2IDk2LjIyM2wtMTAuMDQgNC4yNDQtMjUuNDI4LTYwLjE0OCAxMC4wNC00LjI0NXpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjEyXCIgZD1cIk0xNTcuMzkgMTU1LjI0NmwtNC4yNDYtMTAuMDQgNjAuMTQ4LTI1LjQyOCA0LjI0NCAxMC4wNHpcIi8+PHBhdGggZmlsbC1vcGFjaXR5PVwiLjZcIiBkPVwiTTI1NC43NjIgMTE0LjA3NmwtNC4yNDUtMTAuMDQgNjAuMTQ4LTI1LjQyOCA0LjI0NCAxMC4wNHpcIi8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctaWNvbnNcIiBkYXRhLW5hbWU9XCJpY29uc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2YwZjNmNlwiIGQ9XCJNMzM0LjggMTE5cy01MC41IDYyLjQtMTEyLjggNjIuNFMxMDkuMyAxMTkgMTA5LjMgMTE5czUwLjUtNjIuNCAxMTIuOC02Mi40UzMzNC44IDExOSAzMzQuOCAxMTl6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk0yMjIuMSAxODMuOWMtMTguMSAwLTQ3LTUuNS04MS4zLTMxLjctMjAuNC0xNS42LTMyLjktMzEtMzMuNS0zMS42TDEwNiAxMTlsMS4zLTEuNmMuNS0uNiAxMy0xNiAzMy41LTMxLjYgMzQuMy0yNi4yIDYzLjEtMzEuNyA4MS4zLTMxLjcgMTguMSAwIDQ3IDUuNSA4MS4zIDMxLjcgMjAuNCAxNS42IDMyLjkgMzEgMzMuNSAzMS42bDEuMyAxLjYtMS4zIDEuNmMtLjUuNi0xMyAxNi0zMy41IDMxLjYtMzQuNCAyNi4yLTYzLjIgMzEuNy04MS4zIDMxLjd6TTExMi42IDExOWM4LjMgOS42IDU0LjYgNTkuOSAxMDkuNSA1OS45czEwMS4yLTUwLjMgMTA5LjUtNTkuOWMtOC4zLTkuNi01NC42LTU5LjktMTA5LjUtNTkuOVMxMjAuOSAxMDkuNCAxMTIuNiAxMTl6XCIvPjxwYXRoIGZpbGw9XCIjNTlhNzAyXCIgZD1cIk0yMjIuMSA2OS40Yy0yNyAwLTQ5IDIxLjktNDkgNDlzMjEuOSA0OSA0OSA0OWMyNyAwIDQ5LTIxLjkgNDktNDlzLTIyLTQ5LTQ5LTQ5em0xMS41IDQwLjljLTYuNCAwLTExLjUtNS4yLTExLjUtMTEuNXM1LjItMTEuNSAxMS41LTExLjVjNi40IDAgMTEuNSA1LjIgMTEuNSAxMS41cy01LjIgMTEuNS0xMS41IDExLjV6XCIvPjxwYXRoIGZpbGw9XCIjNTQ5MTAzXCIgZD1cIk0yMzMuNiAxMTAuM2MtNi40IDAtMTEuNS01LjItMTEuNS0xMS41IDAtLjYuMS0xLjMuMi0xLjloLS4yYy0xMS45IDAtMjEuNSA5LjYtMjEuNSAyMS41czkuNiAyMS41IDIxLjUgMjEuNSAyMS41LTkuNiAyMS41LTIxLjVjMC0zLjgtMS03LjQtMi44LTEwLjYtMiAxLjYtNC41IDIuNS03LjIgMi41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWlucHV0c1wiIGRhdGEtbmFtZT1cImlucHV0c1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiIzI5N2FkZlwiIGQ9XCJNMjc4LjkgNjQuMmgtODkuOGMtMjkuMSAwLTUyLjggMjMuOC01Mi44IDUyLjggMCAyOS4xIDIzLjggNTIuOCA1Mi44IDUyLjhoODkuOGMyOS4xIDAgNTIuOC0yMy44IDUyLjgtNTIuOCAwLTI5LjEtMjMuNy01Mi44LTUyLjgtNTIuOHptLS44IDk1LjhjLTIzLjMgMC00Mi4yLTE4LjktNDIuMi00Mi4yIDAtMjMuMyAxOC45LTQyLjIgNDIuMi00Mi4yIDIzLjMgMCA0Mi4yIDE4LjkgNDIuMiA0Mi4yIDAgMjMuMy0xOC45IDQyLjItNDIuMiA0Mi4yelwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLW1lc3NhZ2VzXCIgZGF0YS1uYW1lPVwibWVzc2FnZXNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBjbGFzcz1cInN0MFwiIGQ9XCJNMzQ5LjEgMTk3LjNIMTE4LjljLTEuOCAwLTMuMy0xLjUtMy4zLTMuM1YzOS40YzAtMS44IDEuNS0zLjMgMy4zLTMuM2gyMzAuMmMxLjggMCAzLjMgMS41IDMuMyAzLjNWMTk0YzAgMS44LTEuNSAzLjMtMy4zIDMuM3pcIi8+PHBhdGggZmlsbD1cIiM1OWE3MDJcIiBkPVwiTTMyNy4xIDgwLjNIMTQwLjZjLTIuMSAwLTMuOC0xLjctMy44LTMuOFYzNmgxOTQuMXY0MC41YzAgMi4xLTEuNyAzLjgtMy44IDMuOHpcIi8+PHBhdGggZmlsbD1cIiM1NDkxMDNcIiBkPVwiTTE0MC42IDgwLjNoNDAuNVYzNmgtNDQuM3Y0MC41YzAgMi4xIDEuNyAzLjggMy44IDMuOHpcIi8+PGNpcmNsZSBmaWxsPVwiIzdiYzExN1wiIGN4PVwiMzA3LjdcIiBjeT1cIjU4LjFcIiByPVwiMTEuOFwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBhbmVsXCIgZGF0YS1uYW1lPVwicGFuZWxcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNkNmRkZTdcIiBkPVwiTTM3MS40IDQxYzEuNiAwIDMgMS40IDMgM3Y1NmMwIDEuNi0xLjQgMy0zIDNIOTYuNmMtMS42IDAtMy0xLjQtMy0zVjQ0YzAtMS42IDEuNC0zIDMtM2gyNzQuOG0wLTVIOTYuNmMtNC40IDAtOCAzLjYtOCA4djU2YzAgNC40IDMuNiA4IDggOGgyNzQuOGM0LjQgMCA4LTMuNiA4LThWNDRjMC00LjQtMy42LTgtOC04ek0zNzEuNCAxOThIOTYuNmMtNC40IDAtOC0zLjYtOC04di01NmMwLTQuNCAzLjYtOCA4LThoMjc0LjhjNC40IDAgOCAzLjYgOCA4djU2YzAgNC40LTMuNiA4LTggOHpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wcm9ncmVzcy1iYXJzXCIgZGF0YS1uYW1lPVwicHJvZ3Jlc3MtYmFyc1wiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2RmZTNlNlwiIGQ9XCJNNDAxLjYgMTI5LjVINjYuNGMtNi45IDAtMTIuNS01LjYtMTIuNS0xMi41czUuNi0xMi41IDEyLjUtMTIuNWgzMzUuM2M2LjkgMCAxMi41IDUuNiAxMi41IDEyLjUtLjEgNi45LTUuNyAxMi41LTEyLjYgMTIuNXpcIi8+PHBhdGggZmlsbD1cIiNlZmMxMDJcIiBkPVwiTTMzMy40IDEyOS41aC0yNjdjLTYuOSAwLTEyLjUtNS42LTEyLjUtMTIuNXM1LjYtMTIuNSAxMi41LTEyLjVoMjY3YzYuOSAwIDEyLjUgNS42IDEyLjUgMTIuNS0uMSA2LjktNS43IDEyLjUtMTIuNSAxMi41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlY3Rpb25cIiBkYXRhLW5hbWU9XCJzZWN0aW9uXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGZpbGw9XCIjZjY5NTI0XCIgZD1cIk0yMjguOSAxMTIuM2gtNzYuMVY1NS45YzAtMTAuOSA4LjgtMTkuNyAxOS43LTE5LjdoNTYuNHY3Ni4xelwiLz48cGF0aCBmaWxsPVwiI2Q2ZGRlN1wiIGQ9XCJNMjI4LjkgMTk3LjhoLTU2LjZjLTEwLjggMC0xOS41LTguNy0xOS41LTE5LjV2LTU2LjZoNzYuMXY3Ni4xek0zMTUuMiAxMTIuM2gtNzYuMVYzNi4ySDI5NmMxMC42IDAgMTkuMiA4LjYgMTkuMiAxOS4ydjU2Ljl6TTI5NS43IDE5Ny44aC01Ni42di03Ni4xaDc2LjF2NTYuNmMwIDEwLjctOC43IDE5LjUtMTkuNSAxOS41elwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNsaWRlcnNcIiBkYXRhLW5hbWU9XCJzbGlkZXJzXCIgdmlld0JveD1cIjAgMCA0NjggMjM0XCIgd2lkdGg9XCI0NjhcIiBoZWlnaHQ9XCIyMzRcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxjaXJjbGUgZmlsbD1cIiMyOTdhZGZcIiBjeD1cIjE2NC42XCIgY3k9XCIxMTdcIiByPVwiNi42XCIvPjxwYXRoIGZpbGw9XCIjMjk3YWRmXCIgZD1cIk0xNDUuNyAxMTdjMC0xLjcuMy0zLjQuNy01SDgwLjJjLTItNS02LjgtOC41LTEyLjUtOC41LTcuNSAwLTEzLjUgNi0xMy41IDEzLjVzNiAxMy41IDEzLjUgMTMuNWM1LjcgMCAxMC41LTMuNSAxMi41LTguNWg2Ni4yYy0uNS0xLjYtLjctMy4zLS43LTV6XCIvPjxwYXRoIGZpbGw9XCIjZDZkZGU3XCIgZD1cIk00MDAuMyAxMDMuNWMtNS43IDAtMTAuNSAzLjUtMTIuNSA4LjVIMjQ2LjVjLTItNS02LjgtOC41LTEyLjUtOC41cy0xMC41IDMuNS0xMi41IDguNWgtMzguNmMtMi4yLTgtOS41LTEzLjktMTguMi0xMy45LTEwLjQgMC0xOC45IDguNS0xOC45IDE4LjkgMCAxMC40IDguNSAxOC45IDE4LjkgMTguOSA4LjcgMCAxNi01LjkgMTguMi0xMy45aDM4LjZjMiA1IDYuOCA4LjUgMTIuNSA4LjVzMTAuNS0zLjUgMTIuNS04LjVoMTQxLjNjMiA1IDYuOCA4LjUgMTIuNSA4LjUgNy41IDAgMTMuNS02IDEzLjUtMTMuNXMtNi0xMy41LTEzLjUtMTMuNXptLTIzNS43IDI3LjRjLTcuNyAwLTEzLjktNi4yLTEzLjktMTMuOXM2LjItMTMuOSAxMy45LTEzLjkgMTMuOSA2LjIgMTMuOSAxMy45LTYuMiAxMy45LTEzLjkgMTMuOXptMTguOS0xMi4zYzAtLjUuMS0xLjEuMS0xLjZzMC0xLjEtLjEtMS42YzAgLjUuMSAxLjEuMSAxLjZzLS4xIDEuMS0uMSAxLjZ6bS0uMiAxLjRjMC0uMi4xLS41LjEtLjcgMCAuMy0uMS41LS4xLjd6bTAtNmMwIC4yLjEuNS4xLjcgMC0uMy0uMS0uNS0uMS0uN3pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10YWJsZXNcIiBkYXRhLW5hbWU9XCJ0YWJsZXNcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiNjM2NkZGJcIiBkPVwiTTM2Ni42IDE5Ny45YzQuNCAwIDguMS0zLjYgOC4xLTguMVY0NC4yYzAtNC40LTMuNi04LjEtOC4xLTguMUgxMDEuNGMtNC40IDAtOC4xIDMuNi04LjEgOC4xVjE4OS44YzAgNC40IDMuNiA4LjEgOC4xIDguMWgyNjUuMnptMy0xNTMuN3Y0My42aC04Ni4yVjQxLjJoODMuMmMxLjYgMCAzIDEuNCAzIDN6bS0xODAgNDMuNlY0MS4yaDg4Ljd2NDYuNmgtODguN3ptODguOCA1LjFWMTQyaC04OC43VjkyLjloODguN3ptLTE4MC00OC43YzAtMS42IDEuNC0zIDMtM2g4My4ydjQ2LjZIOTguNFY0NC4yem0wIDQ4LjdoODYuMlYxNDJIOTguNFY5Mi45em0zIDk5LjljLTEuNiAwLTMtMS40LTMtM1YxNDdoODYuMnY0NS44aC04My4yem04OC4yIDBWMTQ3aDg4Ljd2NDUuOGgtODguN3ptMTgwLTNjMCAxLjYtMS40IDMtMyAzaC04My4yVjE0N2g4Ni4ydjQyLjh6bTAtNDcuOGgtODYuMlY5Mi45aDg2LjJWMTQyelwiLz48cGF0aCBmaWxsPVwiI2EzNDZjZVwiIGQ9XCJNMzY5LjYgNDQuMnY0My42aC04Ni4yVjQxLjJoODMuMmMxLjYgMCAzIDEuNCAzIDN6TTE4OS42IDQxLjJoODguN3Y0Ni42aC04OC43ek05OC40IDQ0LjJjMC0xLjYgMS40LTMgMy0zaDgzLjJ2NDYuNkg5OC40VjQ0LjJ6XCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdGV4dFwiIGRhdGEtbmFtZT1cInRleHRcIiB2aWV3Qm94PVwiMCAwIDQ2OCAyMzRcIiB3aWR0aD1cIjQ2OFwiIGhlaWdodD1cIjIzNFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEuNDE0XCI+PHBhdGggZmlsbD1cIiMyOTdhZGZcIiBkPVwiTTIyOCAxNzIuN2wtOC4zLTIxLjhoLTUyLjFsLTguMyAyMS44aC0yMi42bDQ0LjYtMTEzLjVoMjQuOWw0NC42IDExMy41SDIyOHptLTM0LjMtOTMuNGwtMjAuNCA1NC4xaDQwLjlsLTIwLjUtNTQuMXpNMzEzLjUgMTcyLjd2LTguOWMtNi4xIDctMTUuNyAxMC45LTI2LjYgMTAuOS0xMy40IDAtMjguNi05LTI4LjYtMjcuMiAwLTE4LjkgMTUuMS0yNi43IDI4LjYtMjYuNyAxMS4xIDAgMjAuNiAzLjYgMjYuNiAxMC42di0xMi4zYzAtOS41LTcuOC0xNS4zLTE5LjItMTUuMy05LjIgMC0xNy4yIDMuNC0yNC4zIDEwLjRsLTcuMy0xMi40YzkuNS05IDIxLjQtMTMuMyAzNC42LTEzLjMgMTguMiAwIDM0LjIgNy43IDM0LjIgMjkuOHY1NC41aC0xOHptMC0xOC43di0xMi40Yy00LjEtNS42LTExLjctOC41LTE5LjYtOC41LTEwIDAtMTcuNSA1LjgtMTcuNSAxNC44IDAgOC45IDcuNSAxNC42IDE3LjUgMTQuNiA3LjggMCAxNS41LTIuOSAxOS42LTguNXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10aW1lXCIgZGF0YS1uYW1lPVwidGltZVwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48Y2lyY2xlIGZpbGw9XCIjYzNjZGRiXCIgY3g9XCIyMzRcIiBjeT1cIjExN1wiIHI9XCI4MC44XCIvPjxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0yNjEuMSAxNDguMWMtMSAwLTItLjQtMi44LTEuMmwtMjcuMS0yNy4xYy0uOC0uOC0xLjItMS44LTEuMi0yLjhWNTYuMmMwLTIuMiAxLjgtNCA0LTRzNCAxLjggNCA0djU5LjJsMjUuOSAyNS45YzEuNiAxLjYgMS42IDQuMSAwIDUuNy0uOC43LTEuOCAxLjEtMi44IDEuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy12YWxpZGF0aW9uXCIgZGF0YS1uYW1lPVwidmFsaWRhdGlvblwiIHZpZXdCb3g9XCIwIDAgNDY4IDIzNFwiIHdpZHRoPVwiNDY4XCIgaGVpZ2h0PVwiMjM0XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMS40MTRcIj48cGF0aCBmaWxsPVwiI2RkMmY0MVwiIGQ9XCJNMzMyIDY5LjdIMTM2Yy00LjQgMC04IDMuNi04IDh2ODMuMmMwIDEuOSAxLjUgMy40IDMuNCAzLjRoMjA1LjJjMS45IDAgMy40LTEuNSAzLjQtMy40Vjc3LjdjMC00LjQtMy42LTgtOC04em0tMTQxLjcgNzUuNWgtNTIuMXYtOS4zaDUyLjF2OS4zek0zMzUgMTExLjhIMTMzVjc3LjdjMC0xLjYgMS40LTMgMy0zaDE5NmMxLjYgMCAzIDEuNCAzIDN2MzQuMXpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zdGF0dXMtY29tcGxldGVkXCIgZGF0YS1uYW1lPVwic3RhdHVzLWNvbXBsZXRlZFwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxLjQxNFwiPjxwYXRoIGQ9XCJNMjQuOTY1IDEyLjgwMmwtMTAuMjY3IDExLjI1LTcuNjI2LTcuNjIxYTEuMjMyIDEuMjMyIDAgMCAxIDAtMS43NDEgMS4yMjQgMS4yMjQgMCAwIDEgMS43NCAwbDUuODA1IDUuODAyIDguNTMxLTkuMzQ5YTEuMjMgMS4yMyAwIDAgMSAxLjgxNyAxLjY1OU0xNiAwQzcuMTc4IDAgMCA3LjE3OCAwIDE2czcuMTc4IDE2IDE2IDE2IDE2LTcuMTc4IDE2LTE2UzI0LjgyMiAwIDE2IDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIvPjwvc3ltYm9sPjwvc3ZnPicpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgRE9NIGlzIGFscmVhZHkgcmVhZHksIGVtYmVkIFNWR3NcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgeyBlbWJlZCgpIH1cblxuICAvLyBIYW5kbGUgVHVyYm9saW5rcyBwYWdlIGNoYW5nZSBldmVudHNcbiAgaWYgKCB3aW5kb3cuVHVyYm9saW5rcyApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHVyYm9saW5rczpsb2FkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdGFuZGFyZCBET00gcmVhZHkgZXZlbnRzXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbn0pKCkiLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLWV2ZW50JylcbnZhciBub3RpZnkgPSByZXF1aXJlKCcuLi9tb2R1bGVzL25vdGlmeScpXG5cbi8vIElmIGEgcGFnZSBoYXMgYW4gZWxlbWVudCAuZm9ybS1mbGFzaCwgdHJpZ2dlciBhIG5vdGlmaWNhdGlvblxuLy9cbkV2ZW50LmNoYW5nZShmdW5jdGlvbigpe1xuICB2YXIgZmxhc2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmxhc2gtbWVzc2FnZTpub3QoLmZpcmVkKScpXG4gIGlmIChmbGFzaCkge1xuICAgIGZsYXNoLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicsJ2ZpcmVkJylcbiAgICBub3RpZnkoZmxhc2guZGF0YXNldC50eXBlLCBmbGFzaC5pbm5lckhUTUwudHJpbSgpKVxuICB9XG59KVxuXG4iLCJ2YXIgdG9vbGJveCAgICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnIClcbnZhciBFdmVudCAgICAgICAgID0gdG9vbGJveC5ldmVudFxudmFyIG5vdGlmeSAgICAgICAgPSByZXF1aXJlKCAnLi4vbW9kdWxlcy9ub3RpZnknIClcblxuXG4vLyBIYW5kbGUgc3VibWl0IGJlaGF2aW9yczpcbi8vICAtIGRpc2FibGUgYnV0dG9uIG9uIHN1Ym1pdFxuLy8gIC0gc3VibWl0IG1lc3NhZ2VzXG4vL1xuRXZlbnQub24oIGRvY3VtZW50LCAnc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcblxuICAvLyBTZW5kIGZvcm0gbWVzc2FnZXNcbiAgLy8gTG9vayBmb3IgYW4gZWxlbWVudCB3aXRoIHRoZSBkYXRhLXN1Ym1pdC1tZXNzYWdlIG9yIHVzZSB0aGUgZm9ybSBpdHNlbGZcbiAgdmFyIG1lc3NhZ2UgPSAoIGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdWJtaXQtbWVzc2FnZV0nKSB8fCBldmVudC50YXJnZXQgKS5kYXRhc2V0LnN1Ym1pdE1lc3NhZ2VcbiAgaWYgKCBtZXNzYWdlICkgbm90aWZ5KCAnZm9ybS1hY3Rpb24nLCBtZXNzYWdlIClcblxuICB2YXIgYnV0dG9uID0gZXZlbnQudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPXN1Ym1pdF0nKVxuICBpZiAoIGJ1dHRvbi5kYXRhc2V0LmRpc2FibGVPblN1Ym1pdCA9PSAnZmFsc2UnICkgcmV0dXJuXG5cbiAgaWYgKCFidXR0b24uZGF0YXNldC5kaXNhYmxlV2l0aCkgYnV0dG9uLmRhdGFzZXQuZGlzYWJsZU9uU3VibWl0ID0gdHJ1ZVxuICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXG5cbiAgLy8gTG9vayBmb3IgZWxlbWVudHMgd2l0aCBkaXNhYmxlLXdpdGggdGV4dCBhbmQgcmVwbGFjZSB0aGUgdGV4dFxuICB2YXIgZWxlbWVudHMgPSBldmVudC50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGlzYWJsZS13aXRoXScpXG5cbiAgdG9vbGJveC5lYWNoKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsICkge1xuICAgIHZhciBidXR0b25UZXh0ID0gZWwucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykgfHwgZWxcblxuICAgIGVsLmRhdGFzZXQuZW5hYmxlZFRleHQgPSBidXR0b25UZXh0LmlubmVySFRNTFxuICAgIGJ1dHRvblRleHQuaW5uZXJIVE1MID0gZWwuZGF0YXNldC5kaXNhYmxlV2l0aFxuICB9KVxuXG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gIC8vIFRoaXMgYWxsb3dzIHRoZSBzdWJtaXQgZnVuY3Rpb25zIHRvIG9jY3VyXG4gIHRvb2xib3guZXZlbnQuZGVsYXkoIGZ1bmN0aW9uKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwnKVxuICB9KVxuXG4gIGlmICggZG9jdW1lbnQuYm9keS5kYXRhc2V0LmZha2VTdWJtaXQgKSB7XG4gICAgdmFyIGV2ID0gbmV3IEN1c3RvbUV2ZW50KCdmYWtlLXN1Ym1pdCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KVxuICAgIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KCBldiApIFxuICB9IGVsc2Uge1xuICAgIGV2ZW50LnRhcmdldC5zdWJtaXQoKVxuICB9XG5cbn0pXG5cbi8vIFdoZW4gYSBiYWNrIGJ1dHRvbiBpcyB1c2VkOlxuLy8gIC0gRGlzYWJsZWQgYnV0dG9ucyByZW1haW4gZGlzYWJsZWRcbi8vICAtIFByb2dyZXNzIG5vdGlmaWNhdGlvbnMgcmVtYWluIGFjdGl2ZVxuLy9cbi8vIFRoaXMgcmVuYWJsZXMgYnV0dG9ucyBhbmQgaGlkZXMgbm90aWZpY2F0aW9ucy5cbndpbmRvdy5vbnBhZ2VzaG93ID0gZnVuY3Rpb24oZXZlbnQpIHtcblxuICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsJylcbiAgXG4gIHZhciBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kaXNhYmxlLXdpdGhdW2Rpc2FibGVkXSxbZGF0YS1kaXNhYmxlLW9uLXN1Ym1pdF1bZGlzYWJsZWRdJylcbiAgaWYgKCBidXR0b24gKSBidXR0b24uZGlzYWJsZWQgPSBmYWxzZVxuXG4gIGlmICggYnV0dG9uICYmIGJ1dHRvbi5kYXRhc2V0LmVuYWJsZWRUZXh0ICkge1xuICAgIHZhciBidXR0b25UZXh0ID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5idXR0b24tdGV4dCcpIHx8IGJ1dHRvblxuICAgIGJ1dHRvblRleHQuaW5uZXJIVE1MID0gYnV0dG9uLmRhdGFzZXQuZW5hYmxlZFRleHRcbiAgfVxuXG4gIC8vIERpc21pc3MgbGVmdG92ZXIgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uc1xuICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcubm90aWZpY2F0aW9uLmZvcm0tYWN0aW9uJyApICkge1xuICAgIG5vdGlmeS5yZW1vdmUoKVxuICB9XG59XG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLWV2ZW50JylcblxuZnVuY3Rpb24gbnVtYmVySW5wdXRPbmx5KGV2ZW50KSB7XG4gIHZhciBrZXkgPSBldmVudC5rZXlDb2RlLFxuICAgICAgbnVtYmVyS2V5cyA9ICggNDcgPCBrZXkgJiYga2V5IDwgNTggKSxcbiAgICAgIG51bVBhZEtleXMgPSAoIDk1IDwga2V5ICYmIGtleSA8IDEwNiApLFxuICAgICAgZGVjaW1hbHMgICA9ICgga2V5ID09IDExMCB8fCBrZXkgPT0gMTkwICksXG4gICAgICBtb2RpZmllcnMgID0gKCBFdmVudC5rZXkuYWx0IHx8IEV2ZW50LmtleS5zaGlmdCApLFxuICAgICAgaW5wdXRLZXkgICA9ICEoKCBrZXkgPCA0NiAmJiBrZXkgIT0gMzIgKSB8fCBFdmVudC5rZXkuY29tbWFuZCApLFxuICAgICAgbnVtSW5wdXQgICA9ICgoIG51bWJlcktleXMgfHwgbnVtUGFkS2V5cyB8fCBkZWNpbWFscyApICYmICEoIG1vZGlmaWVycyAmJiA0NyA8IGtleSApIClcblxuICBpZiAoICFudW1JbnB1dCAmJiBpbnB1dEtleSApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxufVxuXG4vLyBQcmV2ZW50IG5vbiBudW1lcmljIGlucHV0IG9uIGlucHV0IHR5cGUgb2YgbnVtYmVyXG5FdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywgJ2lucHV0W3R5cGU9bnVtYmVyXScsIG51bWJlcklucHV0T25seSApXG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoJ2NvbXBvc2UtdG9vbGJveCcpLFxuICAgIEV2ZW50ID0gdG9vbGJveC5ldmVudCxcbiAgICBjb252ZXJ0ID0gcmVxdWlyZSgnLi4vbW9kdWxlcy91bml0LWNvbnZlcnRlcicpLFxuICAgIGZvcm1VcCA9IHJlcXVpcmUoICdjb21wb3NlLWZvcm0tdXAnIClcblxuZnVuY3Rpb24gc2V0dXAoZWwpIHtcbiAgZWwuZGF0YXNldC51bml0S2V5ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV1cblxuICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyZW5kJywgc2V0dXBJbnB1dChlbCkgKVxuICBlbC5pbnNlcnRBZGphY2VudEhUTUwoICdhZnRlcmVuZCcsIHNldHVwU2VsZWN0KGVsKSApXG5cbiAgdmFyIHNlbGVjdCA9IGVsLm5leHRFbGVtZW50U2libGluZ1xuXG4gIHNldFZhbHVlKGVsKVxuICAvLyBBZGQgc29tZSBwYWRkaW5nIGJldHdlZW4gaW5wdXQgZW50cnkgYW5kIHNlbGVjdCwgYmFzZWQgb24gd2lkdGggb2Ygc2VsZWN0XG4gIGVsLnN0eWxlLnBhZGRpbmdSaWdodCA9IChlbC5vZmZzZXRXaWR0aCAtIHNlbGVjdC5vZmZzZXRMZWZ0ICsgMTApICsgJ3B4J1xufVxuXG5mdW5jdGlvbiByYW5kSUQgKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpXG59XG5cbmZ1bmN0aW9uIHNldHVwU2VsZWN0KGVsKSB7XG4gIHZhciB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddLFxuICAgICAgc2VsZWN0SWQgPSBgdW5pdC1zZWxlY3QtJHtyYW5kSUQoKX1gLFxuICAgICAgc2VsZWN0ID0gYDxzcGFuIGNsYXNzPSd1bml0LXNlbGVjdCc+PHNlbGVjdCBpZD0nJHtzZWxlY3RJZH0nIHRhYmluZGV4PSctMScgYXJpYS1sYWJlbD0ndW5pdHMnIGRhdGEtZGVmYXVsdD0nJHtlbC5kYXRhc2V0LnVuaXR9JyBkYXRhLWluaXRpYWwtdmFsdWU9JyR7ZWwuZGF0YXNldC51bml0fScgZGF0YS11bml0LXNlbGVjdD0nJHtlbC5kYXRhc2V0LnVuaXRLZXl9Jz5gLFxuICAgICAgc2VsZWN0ZWQgPSBlbC5kYXRhc2V0LnVuaXQsXG4gICAgICB3cmFwcGVyID0gdG9vbGJveC5nZXRDbG9zZXN0KCBlbCwgJ2xhYmVsJyApLFxuICAgICAgY2hlY2tlZFxuXG4gIHVuaXRzLmZvckVhY2goZnVuY3Rpb24odW5pdCkge1xuICAgIGNoZWNrZWQgPSAoIChzZWxlY3RlZCA9PSB1bml0KSA/ICcgc2VsZWN0ZWQnIDogJycgKVxuICAgIHNlbGVjdCArPSBgPG9wdGlvbiR7Y2hlY2tlZH0+JHt1bml0fTwvb3B0aW9uPmBcbiAgfSlcblxuICBpZiAoIHdyYXBwZXIgKSB7XG4gICAgdmFyIGRlZmF1bHRJbnB1dCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignW2RhdGEtcmVzdG9yZS1kZWZhdWx0XScpXG4gICAgaWYgKCBkZWZhdWx0SW5wdXQgKSBkZWZhdWx0SW5wdXQuZGF0YXNldC5yZXN0b3JlRGVmYXVsdCArPSBgLCAjJHtzZWxlY3RJZH1gXG4gIH1cblxuICBzZWxlY3QgPSBzZWxlY3QgKyBcIjwvc2VsZWN0Pjwvc3Bhbj5cIlxuXG4gIHJldHVybiBzZWxlY3Rcbn1cblxuZnVuY3Rpb24gc2V0dXBJbnB1dChlbCkge1xuICBuYW1lID0gZWwubmFtZVxuICBlbC5uYW1lID0gbmFtZSArICdfdmFsdWUnXG4gIHJldHVybiAnPGlucHV0IGRhdGEtdW5pdC1pbnB1dD1cIicrZWwuZGF0YXNldC51bml0S2V5KydcIiB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIicrbmFtZSsnXCI+J1xufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZShlbCkge1xuICBlbCA9IGVsLnRhcmdldCB8fCBlbFxuICB2YXIgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LWlucHV0PVwiJytlbC5kYXRhc2V0LnVuaXRLZXkrJ1wiXScpXG4gIHZhciBzZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LXNlbGVjdD1cIicrZWwuZGF0YXNldC51bml0S2V5KydcIl0nKVxuICBpbnB1dC52YWx1ZSA9IGNvbnZlcnQoZWwudmFsdWUsIHNlbGVjdC52YWx1ZSwgZWwuZGF0YXNldC51bml0KS52YWx1ZVxufVxuXG5mdW5jdGlvbiB1bml0Q2hhbmdlKGV2ZW50KSB7XG4gIHZhciB1bml0S2V5ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudW5pdFNlbGVjdFxuICB2YXIgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LWtleT1cIicrdW5pdEtleSsnXCJdJylcbiAgc2V0VmFsdWUoZWwpXG59XG5cbkV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gIHRvb2xib3guZWFjaCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXVuaXRdJyApLCBzZXR1cCApXG59KVxuXG5FdmVudC5vbihkb2N1bWVudCwgJ2lucHV0JywgJ1tkYXRhLXVuaXRdJywgc2V0VmFsdWUpXG5FdmVudC5vbihkb2N1bWVudCwgJ2lucHV0JywgJ1tkYXRhLXVuaXQtc2VsZWN0XScsIHVuaXRDaGFuZ2UpXG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCdjb21wb3NlLWV2ZW50JylcblxuRXZlbnQuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWF0Y2gtdXJsXScpLCBmdW5jdGlvbihub2RlKXtcbiAgICB2YXIgbWF0Y2hlciA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLW1hdGNoLXVybCcpXG4gICAgaWYgKG1hdGNoZXIgJiYgbmV3IFJlZ0V4cChub2RlLmRhdGFzZXQubWF0Y2hVcmwsIFwiaVwiKS50ZXN0KGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdoZXJlJylcbiAgICB9XG4gIH0pXG59KVxuXG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKVxuXG5mdW5jdGlvbiBhdXRvU2l6ZVRleHRhcmVhKCB0ZXh0YXJlYSApIHtcbiAgdmFyIHBhcmVudCA9IHRleHRhcmVhLnBhcmVudEVsZW1lbnRcblxuICBpZiAoIHRleHRhcmVhLnZhbHVlID09ICcnICkgcmV0dXJuXG4gIGlmICggcGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnaW5wdXQtd3JhcHBlcicpICkge1xuXG4gICAgcGFyZW50LnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnN0eWxlLmhlaWdodFxuICAgIHZhciBvZmZzZXQgPSB0ZXh0YXJlYS5vZmZzZXRIZWlnaHQgLSB0ZXh0YXJlYS5jbGllbnRIZWlnaHRcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0bydcbiAgICB2YXIgbmV3SGVpZ2h0ID0gKCB0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgKyBvZmZzZXQgKVxuICAgIHZhciBtYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiAuOTVcblxuICAgIGlmICggbmV3SGVpZ2h0IDwgbWF4SGVpZ2h0IClcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCdcbiAgICBlbHNlXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBtYXhIZWlnaHQgKyAncHgnXG5cbiAgICBwYXJlbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gIH1cbn1cblxuRXZlbnQuY2hhbmdlKGZ1bmN0aW9uKCl7XG4gIHZhciB0ZXh0YXJlYXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYScpXG4gIEV2ZW50LmRlbGF5KCBmdW5jdGlvbigpeyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRleHRhcmVhcywgYXV0b1NpemVUZXh0YXJlYSkgfSApXG59KVxuXG5FdmVudC5vbihkb2N1bWVudCwgJ2tleXVwIHRvZ2dsZXI6c2hvdycsICd0ZXh0YXJlYScsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgYXV0b1NpemVUZXh0YXJlYShldmVudC5jdXJyZW50VGFyZ2V0KVxufSlcblxuXG4iLCJ2YXIgZXZlbnQgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLmV2ZW50XG5cbi8vIFB1YmxpYyBBUEkgZnVuY3Rpb25cbnZhciBjbGlwYm9hcmQgPSBmdW5jdGlvbigpIHtcblxuICAvLyBMaXN0ZW4gZm9yIGNsaWNrIGV2ZW50c1xuICBldmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1jb3B5LXRhcmdldF0nLCBjb3B5IClcblxuICAvLyBDb3B5IHRvIGNsaXBib2FyZCBoYW5kbGVyXG4gIGZ1bmN0aW9uIGNvcHkoIGV2ZW50ICkge1xuXG4gICAgLy8gQXNzaWdubWVudFxuICAgIHZhciBjb3B5VHJpZ2dlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGNvcHlFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggY29weVRyaWdnZXIuZGF0YXNldC5jb3B5VGFyZ2V0IClcblxuICAgIC8vIFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIElzIHRoZSBlbGVtZW50IHNlbGVjdGFibGU/XG4gICAgaWYgKCBjb3B5RWxlbWVudCAmJiBjb3B5RWxlbWVudC5zZWxlY3QgKSB7XG5cbiAgICAgIC8vIFNlbGVjdCB0ZXh0XG4gICAgICBjb3B5RWxlbWVudC5zZWxlY3QoKTtcblxuICAgICAgLy8gR2l2ZSBpdCBhIHRyeVxuICAgICAgdHJ5IHtcblxuICAgICAgICAvLyBDb3B5IHRleHRcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoICdjb3B5JyApXG5cbiAgICAgICAgLy8gQmx1ciB0aGUgZWxlbWVudFxuICAgICAgICBjb3B5RWxlbWVudC5ibHVyKClcblxuICAgICAgICAvLyBUcmlnZ2VyIGNvcGllZCBzdGF0ZVxuICAgICAgICBjb3B5VHJpZ2dlci5jbGFzc0xpc3QuYWRkKCAnY29waWVkJyApXG5cbiAgICAgICAgLy8gUmVtb3ZlIGNvcGllZCBzdGF0ZSBhZnRlciBhIGNvdXBsZSBzZWNvbmRzXG4gICAgICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvcHlUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoICdjb3BpZWQnIClcbiAgICAgICAgfSwgMjAwMCApXG5cbiAgICAgIC8vIElmIGl0IGJvcmtzXG4gICAgICB9IGNhdGNoICggZXJyICkge1xuXG4gICAgICAgIC8vIEdvIG51Y2xlYXJcbiAgICAgICAgYWxlcnQoICdwbGVhc2UgcHJlc3MgQ3RybC9DbWQrQyB0byBjb3B5JyApXG5cbiAgICAgIH1cblxuICAgIH1cblxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcGJvYXJkXG4iLCJ2YXIgRXZlbnQgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBlc3ZnICA9IHJlcXVpcmUoICcuLi9fZXN2ZycgKSxcblxuICAgIGRlZmF1bHRzQnlUeXBlID0ge1xuICAgICAgc3VjY2VzczogeyBkaXNtaXNzQWZ0ZXI6IDM1MDAgfSxcbiAgICB9LFxuXG4gICAgaWNvbnNCeVR5cGUgPSB7XG4gICAgICBtZXNzYWdlOiAgICAgICAgXCJtZXNzYWdlLWNpcmNsZVwiLFxuICAgICAgZXJyb3I6ICAgICAgICAgIFwibm8tY2lyY2xlXCIsXG4gICAgICBwcm9ncmVzczogICAgICAgXCJwcm9ncmVzcy1jaXJjbGVcIixcbiAgICAgICdmb3JtLWFjdGlvbic6ICBcInByb2dyZXNzLWNpcmNsZVwiLFxuICAgICAgc3VjY2VzczogICAgICAgIFwidGh1bWJzLXVwLWNpcmNsZVwiLFxuICAgIH0sXG5cbiAgICBhdXRvRGlzbWlzc1RpbWVvdXQsXG4gICAgbWVzc2FnZUVsLFxuXG4gICAgdGVtcGxhdGUgPSAnXFxcbjxkaXYgY2xhc3M9XCJub3RpZmljYXRpb25cIj5cXFxuICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLWNvbnRlbnRcIj5cXFxuICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tbWVzc2FnZVwiIHJvbGU9XCJhbGVydFwiPjwvZGl2PlxcXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1jbG9zZVwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJjbG9zZSBtZXNzYWdlXCI+XFxcbiAgICA8L2J1dHRvbj5cXFxuICA8L2Rpdj5cXFxuPC9kaXY+XFxcbidcblxuZnVuY3Rpb24gbm90aWZ5ICh0eXBlLCBtZXNzYWdlLCBvcHRpb25zKSB7XG5cbiAgaWYgKCAhb3B0aW9ucyAmJiB0eXBlb2YgbWVzc2FnZSA9PSAnb2JqZWN0JyApIHtcbiAgICBvcHRpb25zID0gbWVzc2FnZVxuICAgIG1lc3NhZ2UgPSB0eXBlXG4gICAgdHlwZSA9ICdtZXNzYWdlJ1xuICB9XG5cbiAgaWYgKCAhbWVzc2FnZSApIHtcbiAgICBtZXNzYWdlID0gdHlwZVxuICAgIHR5cGUgPSAnbWVzc2FnZSdcbiAgfVxuXG4gIHJldHVybiBzaG93KCB0eXBlLCBtZXNzYWdlLCB0b29sYm94Lm1lcmdlKCBkZWZhdWx0c0J5VHlwZVt0eXBlXSwgb3B0aW9ucyB8fCB7fSApIClcbn1cblxuZnVuY3Rpb24gc2hvdyAoIHR5cGUsIG1lc3NhZ2UsIG9wdGlvbnMgKSB7XG5cbiAgY2xlYXJUaW1lb3V0KCBhdXRvRGlzbWlzc1RpbWVvdXQgKVxuICBpZiAoIG1lc3NhZ2VFbCApIHJldHVybiBkaXNtaXNzKCBmdW5jdGlvbigpeyBzaG93KCB0eXBlLCBtZXNzYWdlLCBvcHRpb25zICkgfSlcblxuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCggJ2JlZm9yZWVuZCcsIHRlbXBsYXRlIClcbiAgbWVzc2FnZUVsICAgICA9IGRvY3VtZW50LmJvZHkubGFzdENoaWxkXG4gIHZhciB0eXBlSWNvbiAgPSBlc3ZnLnVzZSggaWNvbnNCeVR5cGVbdHlwZV0gfHwgdHlwZSApXG4gIHZhciBjbG9zZUljb24gPSBlc3ZnLnVzZSggJ3gtY2lyY2xlJywgeyAnc2NhbGUnOiB0cnVlLCAnY2xhc3MnOiAnY2xvc2UtaWNvbicgfSApXG5cbiAgdmFyIG1zZyA9IG1lc3NhZ2VFbC5xdWVyeVNlbGVjdG9yKCAnLm5vdGlmaWNhdGlvbi1tZXNzYWdlJyApXG4gIG1zZy5pbm5lckhUTUwgPSBtZXNzYWdlXG5cbiAgaWYgKCB0eXBlSWNvbiApIG1zZy5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmViZWdpbicsIFwiPHNwYW4gY2xhc3M9J25vdGlmaWNhdGlvbi10eXBlLWljb24nPlwiICsgdHlwZUljb24ub3V0ZXJIVE1MICsgXCI8L3NwYW4+XCIgKVxuICBpZiAoIGNsb3NlSWNvbiApIG1lc3NhZ2VFbC5xdWVyeVNlbGVjdG9yKCAnLm5vdGlmaWNhdGlvbi1jbG9zZScgKS5pbm5lckhUTUwgPSBjbG9zZUljb24ub3V0ZXJIVE1MXG5cbiAgaWYgKCB0eXBlICkge1xuXG4gICAgbWVzc2FnZUVsLmNsYXNzTGlzdC5hZGQoIHR5cGUgKVxuXG4gICAgaWYgKCBvcHRpb25zICYmIG9wdGlvbnMuZGlzbWlzc0FmdGVyICl7XG4gICAgICBhdXRvRGlzbWlzc1RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggZGlzbWlzcywgb3B0aW9ucy5kaXNtaXNzQWZ0ZXIgKVxuICAgIH1cbiAgfVxuXG4gIG1lc3NhZ2VFbCA9IGRvY3VtZW50LmJvZHkubGFzdENoaWxkXG5cbiAgRXZlbnQua2V5T25lKCAnZXNjJywgZGlzbWlzcyApXG4gIEV2ZW50Lm9uZSggbWVzc2FnZUVsLCAnY2xpY2snLCAnLm5vdGlmaWNhdGlvbi1jbG9zZScsIGRpc21pc3MgKVxuXG4gIHJldHVybiB7XG4gICAgZGlzbWlzczogZGlzbWlzc1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc21pc3MgKCBjYWxsYmFjayApIHtcblxuICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ub3RpZmljYXRpb24nKSA9PSBudWxsICkgeyByZXR1cm4gfVxuXG4gIGNsZWFyVGltZW91dCggYXV0b0Rpc21pc3NUaW1lb3V0IClcblxuICB2YXIgY2JcblxuICBpZiAoIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICkge1xuICAgIGNiID0gZnVuY3Rpb24oKSB7IHJlbW92ZSgpOyBjYWxsYmFjaygpIH1cbiAgfSBlbHNlIHtcbiAgICBjYiA9IHJlbW92ZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIGNiLCA1MDAgKVxuXG4gIEV2ZW50Lm9uZSggbWVzc2FnZUVsLCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXQgKVxuXG4gICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIG1lc3NhZ2VFbCwgY2IgKVxuICB9KVxuXG4gIG1lc3NhZ2VFbC5jbGFzc0xpc3QuYWRkKCAnZGlzbWlzcycgKVxufVxuXG5mdW5jdGlvbiByZW1vdmUgKCkge1xuICBtZXNzYWdlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5ID4gLm5vdGlmaWNhdGlvbicpXG5cbiAgaWYgKG1lc3NhZ2VFbCkge1xuICAgIG1lc3NhZ2VFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBtZXNzYWdlRWwgKVxuICB9XG4gIG1lc3NhZ2VFbCA9IG51bGxcbn1cblxubm90aWZ5LmRpc21pc3MgPSBkaXNtaXNzXG5ub3RpZnkucmVtb3ZlID0gcmVtb3ZlXG5cbm1vZHVsZS5leHBvcnRzID0gbm90aWZ5XG4iLCJjb25zdCB1bml0c1RhYmxlID0ge1xuICBiaXQ6IDEsXG4gIGJ5dGU6IDgsXG4gIGtpbG9ieXRlOiAxMDAwICogOCxcbiAgbWVnYWJ5dGU6IDEwMDAgKiAxMDAwICogOCxcbiAgZ2lnYWJ5dGU6IDEwMDAgKiAxMDAwICogMTAwMCAqIDgsXG4gIHRlcmFieXRlOiAxMDAwICogMTAwMCAqIDEwMDAgKiAxMDAwICogOCAgXG59XG5jb25zdCBhbGlhc2VzID0ge1xuICBiOiAnYml0JyxcbiAgQjogJ2J5dGUnLFxuICBLQjogJ2tpbG9ieXRlJyxcbiAgTUI6ICdtZWdhYnl0ZScsXG4gIEdCOiAnZ2lnYWJ5dGUnLFxuICBUQjogJ3RlcmFieXRlJ1xufVxuXG5mdW5jdGlvbiBzaG9ydFVuaXQodW5pdCkge1xuICBmb3IgKGxldCBrZXkgaW4gYWxpYXNlcykge1xuICAgIGlmIChhbGlhc2VzW2tleV0gPT0gdW5pdCkgdW5pdCA9IGtleVxuICB9XG5cbiAgcmV0dXJuIHVuaXRcbn1cbmZ1bmN0aW9uIGxvbmdVbml0KHNpemUsIHVuaXQpIHtcbiAgcmV0dXJuIHBsdXJhbGl6ZShzaXplLCB1bml0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdW5pdC5zbGljZSgxKSlcbn1cblxuZnVuY3Rpb24gYWxpYXModW5pdCkge1xuICByZXR1cm4gYWxpYXNlc1t1bml0XSB8fCB1bml0LnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGx1cmFsaXplKHZhbCwgdW5pdCkge1xuICBpZiAoIHZhbCAhPSAxICkgdW5pdCArPSAncydcbiAgcmV0dXJuIHVuaXRcbn1cblxuZnVuY3Rpb24gY29udmVydChudW0sIGFzLCB0bykge1xuICB2YXIgdG8gICAgID0gYWxpYXModG8pLFxuICAgICAgYmFzZSAgID0gdW5pdHNUYWJsZVthbGlhcyhhcyldLFxuICAgICAgdGFyZ2V0ID0gdW5pdHNUYWJsZVt0b11cbiAgdmFyIG51bSAgICA9IChudW0gKiBiYXNlIC8gdGFyZ2V0KVxuICBcbiAgXG4gIHZhciBjb252ZXJzaW9uID0geyBcbiAgICB2YWx1ZTogbnVtLFxuICAgIHVuaXQ6ICBzaG9ydFVuaXQodG8pLFxuICAgIGxvbmc6ICBsb25nVW5pdChudW0sIHRvKVxuICB9XG4gIHJldHVybiBjb252ZXJzaW9uXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydFxuIiwiLy8gSWNvbnMgbXVzdCBjb21lIGJlZm9yZSBldmVudCByZWdpc3RyYXRpb25zXG5yZXF1aXJlKCAnLi9faWNvbnMnICkgLy8gSW1wb3J0IHN2ZyBpY29ucyAoZnJvbSBFc3ZnKVxudmFyIGVzdmcgPSByZXF1aXJlKCAnLi9fZXN2ZycgKVxuXG52YXIgdG9vbGJveCAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnIClcbnZhciB0aW1lVG9nZ2xlID0gcmVxdWlyZSggJ2NvbXBvc2UtdGltZS10b2dnbGUnICkgLy8gU3dpdGNoIHRpbWUgZWxlbWVudHMgYmV0d2VlbiBsb2NhbCBhbmQgVVRDXG52YXIgdG9nZ2xlciAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvZ2dsZXInIClcbnZhciBmb3JtVXAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtZm9ybS11cCcgKVxudmFyIGRpYWxvZyAgICAgPSByZXF1aXJlKCAnY29tcG9zZS1kaWFsb2cnIClcbnZhciBhamF4ICAgICAgID0gcmVxdWlyZSggJ3N1cGVyYWdlbnQnIClcbnZhciBjbGlwYm9hcmQgID0gcmVxdWlyZSggJy4vbW9kdWxlcy9jbGlwYm9hcmQnIClcbnZhciBub3RpZnkgICAgID0gcmVxdWlyZSggJy4vbW9kdWxlcy9ub3RpZnknIClcbnZhciBldmVudCAgICAgID0gdG9vbGJveC5ldmVudFxuXG5ldmVudC5zY3JvbGwuZGlzYWJsZVBvaW50ZXIoKSAgICAgICAgLy8gZGlzYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBzY3JvbGwgZm9yIHBlcmZvcm1hbmNlICh0byBhdm9pZCBleHRyYSByZXBhaW50cylcbmNsaXBib2FyZCgpO1xuXG5yZXF1aXJlKCAnY29tcG9zZS1zbGlkZXInICkgICAgICAgICAgLy8gT3VyIHNsaWRlciAocmFuZ2UgaW5wdXQpIGNvbXBvbmVudFxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2ZsYXNoLW1lc3NhZ2VzJyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvZm9ybS1zdWJtaXQtaGVscGVycycgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2lucHV0LW51bWJlci1vbmx5JyApXG5yZXF1aXJlKCAnLi9lbmhhbmNlbWVudHMvaW5wdXQtdW5pdCcgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL2xpbmstaGVyZScgKVxucmVxdWlyZSggJy4vZW5oYW5jZW1lbnRzL3RleHRhcmVhLWV4cGFuZCcgKVxuXG5ldmVudC5jaGFuZ2UoIHRpbWVUb2dnbGUudGltZWFnby5zZXR1cCApXG5mb3JtVXAuZGlmZi53YXRjaCgpXG5cbi8vIFB1YmxpYyBBUEkgb2JqZWN0XG53aW5kb3cuVHVuZ3N0ZW4gPSBtb2R1bGUuZXhwb3J0cyA9IHRvb2xib3gubWVyZ2UoIHtcbiAgYWpheCAgICAgICAgOiBhamF4LFxuICBmb3JtICAgICAgICA6IGZvcm1VcCxcbiAgdG9nZ2xlciAgICAgOiB0b2dnbGVyLFxuICBjbGlwYm9hcmQgICA6IGNsaXBib2FyZCxcbiAgbm90aWZ5ICAgICAgOiBub3RpZnksXG4gIGVzdmcgICAgICAgIDogZXN2ZyxcbiAgdGltZVRvZ2dsZSAgOiB0aW1lVG9nZ2xlLFxuICBkaWFsb2cgICAgICA6IGRpYWxvZ1xufSwgdG9vbGJveCApXG4iLCIvKiFcbiAgKiBCZWFuIC0gY29weXJpZ2h0IChjKSBKYWNvYiBUaG9ybnRvbiAyMDExLTIwMTJcbiAgKiBodHRwczovL2dpdGh1Yi5jb20vZmF0L2JlYW5cbiAgKiBNSVQgbGljZW5zZVxuICAqL1xuKGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGRlZmluaXRpb24pXG4gIGVsc2UgY29udGV4dFtuYW1lXSA9IGRlZmluaXRpb24oKVxufSkoJ2JlYW4nLCB0aGlzLCBmdW5jdGlvbiAobmFtZSwgY29udGV4dCkge1xuICBuYW1lICAgID0gbmFtZSAgICB8fCAnYmVhbidcbiAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpc1xuXG4gIHZhciB3aW4gICAgICAgICAgICA9IHdpbmRvd1xuICAgICwgb2xkICAgICAgICAgICAgPSBjb250ZXh0W25hbWVdXG4gICAgLCBuYW1lc3BhY2VSZWdleCA9IC9bXlxcLl0qKD89XFwuLiopXFwufC4qL1xuICAgICwgbmFtZVJlZ2V4ICAgICAgPSAvXFwuLiovXG4gICAgLCBhZGRFdmVudCAgICAgICA9ICdhZGRFdmVudExpc3RlbmVyJ1xuICAgICwgcmVtb3ZlRXZlbnQgICAgPSAncmVtb3ZlRXZlbnRMaXN0ZW5lcidcbiAgICAsIGRvYyAgICAgICAgICAgID0gZG9jdW1lbnQgfHwge31cbiAgICAsIHJvb3QgICAgICAgICAgID0gZG9jLmRvY3VtZW50RWxlbWVudCB8fCB7fVxuICAgICwgVzNDX01PREVMICAgICAgPSByb290W2FkZEV2ZW50XVxuICAgICwgZXZlbnRTdXBwb3J0ICAgPSBXM0NfTU9ERUwgPyBhZGRFdmVudCA6ICdhdHRhY2hFdmVudCdcbiAgICAsIE9ORSAgICAgICAgICAgID0ge30gLy8gc2luZ2xldG9uIGZvciBxdWljayBtYXRjaGluZyBtYWtpbmcgYWRkKCkgZG8gb25lKClcblxuICAgICwgc2xpY2UgICAgICAgICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2VcbiAgICAsIHN0cjJhcnIgICAgICAgID0gZnVuY3Rpb24gKHMsIGQpIHsgcmV0dXJuIHMuc3BsaXQoZCB8fCAnICcpIH1cbiAgICAsIGlzU3RyaW5nICAgICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdzdHJpbmcnIH1cbiAgICAsIGlzRnVuY3Rpb24gICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdmdW5jdGlvbicgfVxuICAgICwgaXNPYmplY3QgICAgICAgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG8gPT0gJ29iamVjdCcgfVxuXG4gICAgLy8gVHJ5IHRvIGJ1aWxkIGFuIG9wdGlvbnMgb2JqZWN0LiBJZiBhbnkga2V5IGluIGBtYXliZU9wdGlvbnNgXG4gICAgLy8gbWF0Y2hlcyBhIGtleSBpbiBgZGVmYXVsdHNgLCBpdCB3aWxsIGJlIGNvcGllZCBpbnRvIGEgY2xvbmVcbiAgICAvLyBvZiBgZGVmYXVsdHNgLCB0aHVzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQuXG4gICAgLCBidWlsZE9wdGlvbnMgPSBmdW5jdGlvbiAob3JpZ2luYWxEZWZhdWx0cywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHt9XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9yaWdpbmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxEZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gb3JpZ2luYWxEZWZhdWx0c1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNPYmplY3QobWF5YmVPcHRpb25zKSkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoa2V5IGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkgJiYgbWF5YmVPcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBtYXliZU9wdGlvbnNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0c1xuICAgICAgfVxuXG4gICAgICAvLyBldmVudHMgdGhhdCB3ZSBjb25zaWRlciB0byBiZSAnbmF0aXZlJywgYW55dGhpbmcgbm90IGluIHRoaXMgbGlzdCB3aWxsXG4gICAgICAvLyBiZSB0cmVhdGVkIGFzIGEgY3VzdG9tIGV2ZW50XG4gICAgLCBzdGFuZGFyZE5hdGl2ZUV2ZW50cyA9XG4gICAgICAgICdjbGljayBkYmxjbGljayBtb3VzZXVwIG1vdXNlZG93biBjb250ZXh0bWVudSAnICAgICAgICAgICAgICAgICAgKyAvLyBtb3VzZSBidXR0b25zXG4gICAgICAgICdtb3VzZXdoZWVsIG1vdXNlbXVsdGl3aGVlbCBET01Nb3VzZVNjcm9sbCAnICAgICAgICAgICAgICAgICAgICAgKyAvLyBtb3VzZSB3aGVlbFxuICAgICAgICAnbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBzZWxlY3RzdGFydCBzZWxlY3RlbmQgJyAgICAgICAgICAgICsgLy8gbW91c2UgbW92ZW1lbnRcbiAgICAgICAgJ2tleWRvd24ga2V5cHJlc3Mga2V5dXAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGtleWJvYXJkXG4gICAgICAgICdvcmllbnRhdGlvbmNoYW5nZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBtb2JpbGVcbiAgICAgICAgJ2ZvY3VzIGJsdXIgY2hhbmdlIHJlc2V0IHNlbGVjdCBzdWJtaXQgJyAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGZvcm0gZWxlbWVudHNcbiAgICAgICAgJ2xvYWQgdW5sb2FkIGJlZm9yZXVubG9hZCByZXNpemUgbW92ZSBET01Db250ZW50TG9hZGVkICcgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZSBtZXNzYWdlICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdlcnJvciBhYm9ydCBzY3JvbGwgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNjXG4gICAgICAvLyBlbGVtZW50LmZpcmVFdmVudCgnb25YWVonLi4uIGlzIG5vdCBmb3JnaXZpbmcgaWYgd2UgdHJ5IHRvIGZpcmUgYW4gZXZlbnRcbiAgICAgIC8vIHRoYXQgZG9lc24ndCBhY3R1YWxseSBleGlzdCwgc28gbWFrZSBzdXJlIHdlIG9ubHkgZG8gdGhlc2Ugb24gbmV3ZXIgYnJvd3NlcnNcbiAgICAsIHczY05hdGl2ZUV2ZW50cyA9XG4gICAgICAgICdzaG93ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBtb3VzZSBidXR0b25zXG4gICAgICAgICdpbnB1dCBpbnZhbGlkICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBmb3JtIGVsZW1lbnRzXG4gICAgICAgICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCAnICAgICAgICAgICAgICAgICAgICAgKyAvLyB0b3VjaFxuICAgICAgICAnZ2VzdHVyZXN0YXJ0IGdlc3R1cmVjaGFuZ2UgZ2VzdHVyZWVuZCAnICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZ2VzdHVyZVxuICAgICAgICAndGV4dGlucHV0ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gVGV4dEV2ZW50XG4gICAgICAgICdyZWFkeXN0YXRlY2hhbmdlIHBhZ2VzaG93IHBhZ2VoaWRlIHBvcHN0YXRlICcgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2hhc2hjaGFuZ2Ugb2ZmbGluZSBvbmxpbmUgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnYWZ0ZXJwcmludCBiZWZvcmVwcmludCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gcHJpbnRpbmdcbiAgICAgICAgJ2RyYWdzdGFydCBkcmFnZW50ZXIgZHJhZ292ZXIgZHJhZ2xlYXZlIGRyYWcgZHJvcCBkcmFnZW5kICcgICAgICArIC8vIGRuZFxuICAgICAgICAnbG9hZHN0YXJ0IHByb2dyZXNzIHN1c3BlbmQgZW1wdGllZCBzdGFsbGVkIGxvYWRtZXRhZGF0YSAnICAgICAgICsgLy8gbWVkaWFcbiAgICAgICAgJ2xvYWRlZGRhdGEgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBwbGF5aW5nIHdhaXRpbmcgc2Vla2luZyAnICAgICArIC8vIG1lZGlhXG4gICAgICAgICdzZWVrZWQgZW5kZWQgZHVyYXRpb25jaGFuZ2UgdGltZXVwZGF0ZSBwbGF5IHBhdXNlIHJhdGVjaGFuZ2UgJyAgKyAvLyBtZWRpYVxuICAgICAgICAndm9sdW1lY2hhbmdlIGN1ZWNoYW5nZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbWVkaWFcbiAgICAgICAgJ2NoZWNraW5nIG5vdXBkYXRlIGRvd25sb2FkaW5nIGNhY2hlZCB1cGRhdGVyZWFkeSBvYnNvbGV0ZSAnICAgICAgIC8vIGFwcGNhY2hlXG5cbiAgICAgIC8vIGNvbnZlcnQgdG8gYSBoYXNoIGZvciBxdWljayBsb29rdXBzXG4gICAgLCBuYXRpdmVFdmVudHMgPSAoZnVuY3Rpb24gKGhhc2gsIGV2ZW50cywgaSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSBldmVudHNbaV0gJiYgKGhhc2hbZXZlbnRzW2ldXSA9IDEpXG4gICAgICAgIHJldHVybiBoYXNoXG4gICAgICB9KHt9LCBzdHIyYXJyKHN0YW5kYXJkTmF0aXZlRXZlbnRzICsgKFczQ19NT0RFTCA/IHczY05hdGl2ZUV2ZW50cyA6ICcnKSkpKVxuXG4gICAgICAvLyBjdXN0b20gZXZlbnRzIGFyZSBldmVudHMgdGhhdCB3ZSAqZmFrZSosIHRoZXkgYXJlIG5vdCBwcm92aWRlZCBuYXRpdmVseSBidXRcbiAgICAgIC8vIHdlIGNhbiB1c2UgbmF0aXZlIGV2ZW50cyB0byBnZW5lcmF0ZSB0aGVtXG4gICAgLCBjdXN0b21FdmVudHMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNBbmNlc3RvciA9ICdjb21wYXJlRG9jdW1lbnRQb3NpdGlvbicgaW4gcm9vdFxuICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgKGNvbnRhaW5lci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50KSAmIDE2KSA9PT0gMTZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogJ2NvbnRhaW5zJyBpbiByb290XG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gOSB8fCBjb250YWluZXIgPT09IHdpbmRvdyA/IHJvb3QgOiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lciAhPT0gZWxlbWVudCAmJiBjb250YWluZXIuY29udGFpbnMoZWxlbWVudClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIGlmIChlbGVtZW50ID09PSBjb250YWluZXIpIHJldHVybiAxXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgLCBjaGVjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICB2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICAgICAgICAgICAgcmV0dXJuICFyZWxhdGVkXG4gICAgICAgICAgICAgICAgPyByZWxhdGVkID09IG51bGxcbiAgICAgICAgICAgICAgICA6IChyZWxhdGVkICE9PSB0aGlzICYmIHJlbGF0ZWQucHJlZml4ICE9PSAneHVsJyAmJiAhL2RvY3VtZW50Ly50ZXN0KHRoaXMudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIWlzQW5jZXN0b3IocmVsYXRlZCwgdGhpcykpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vdXNlZW50ZXI6IHsgYmFzZTogJ21vdXNlb3ZlcicsIGNvbmRpdGlvbjogY2hlY2sgfVxuICAgICAgICAgICwgbW91c2VsZWF2ZTogeyBiYXNlOiAnbW91c2VvdXQnLCBjb25kaXRpb246IGNoZWNrIH1cbiAgICAgICAgICAsIG1vdXNld2hlZWw6IHsgYmFzZTogL0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgPyAnRE9NTW91c2VTY3JvbGwnIDogJ21vdXNld2hlZWwnIH1cbiAgICAgICAgfVxuICAgICAgfSgpKVxuXG4gICAgICAvLyB3ZSBwcm92aWRlIGEgY29uc2lzdGVudCBFdmVudCBvYmplY3QgYWNyb3NzIGJyb3dzZXJzIGJ5IHRha2luZyB0aGUgYWN0dWFsIERPTVxuICAgICAgLy8gZXZlbnQgb2JqZWN0IGFuZCBnZW5lcmF0aW5nIGEgbmV3IG9uZSBmcm9tIGl0cyBwcm9wZXJ0aWVzLlxuICAgICwgRXZlbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gYSB3aGl0ZWxpc3Qgb2YgcHJvcGVydGllcyAoZm9yIGRpZmZlcmVudCBldmVudCB0eXBlcykgdGVsbHMgdXMgd2hhdCB0byBjaGVjayBmb3IgYW5kIGNvcHlcbiAgICAgICAgdmFyIGNvbW1vblByb3BzICA9IHN0cjJhcnIoJ2FsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgJyArXG4gICAgICAgICAgICAgICdkZXRhaWwgZXZlbnRQaGFzZSBnZXRNb2RpZmllclN0YXRlIGlzVHJ1c3RlZCBtZXRhS2V5IHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgJyAgK1xuICAgICAgICAgICAgICAnc3JjRWxlbWVudCB0YXJnZXQgdGltZVN0YW1wIHR5cGUgdmlldyB3aGljaCBwcm9wZXJ0eU5hbWUgcGF0aCcpXG4gICAgICAgICAgLCBtb3VzZVByb3BzICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGRhdGFUcmFuc2ZlciAnICAgICAgK1xuICAgICAgICAgICAgICAnZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQgbW92ZW1lbnRYIG1vdmVtZW50WSByZWdpb24nKSlcbiAgICAgICAgICAsIG1vdXNlV2hlZWxQcm9wcyA9IG1vdXNlUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3doZWVsRGVsdGEgd2hlZWxEZWx0YVggd2hlZWxEZWx0YVkgd2hlZWxEZWx0YVogJyArXG4gICAgICAgICAgICAgICdheGlzJykpIC8vICdheGlzJyBpcyBGRiBzcGVjaWZpY1xuICAgICAgICAgICwga2V5UHJvcHMgICAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2NoYXIgY2hhckNvZGUga2V5IGtleUNvZGUga2V5SWRlbnRpZmllciAnICAgICAgICAgICtcbiAgICAgICAgICAgICAgJ2tleUxvY2F0aW9uIGxvY2F0aW9uIGlzQ29tcG9zaW5nIGNvZGUnKSlcbiAgICAgICAgICAsIHRleHRQcm9wcyAgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdkYXRhJykpXG4gICAgICAgICAgLCB0b3VjaFByb3BzICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycigndG91Y2hlcyB0YXJnZXRUb3VjaGVzIGNoYW5nZWRUb3VjaGVzIHNjYWxlIHJvdGF0aW9uJykpXG4gICAgICAgICAgLCBtZXNzYWdlUHJvcHMgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignZGF0YSBvcmlnaW4gc291cmNlJykpXG4gICAgICAgICAgLCBzdGF0ZVByb3BzICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignc3RhdGUnKSlcbiAgICAgICAgICAsIG92ZXJPdXRSZWdleCA9IC9vdmVyfG91dC9cbiAgICAgICAgICAgIC8vIHNvbWUgZXZlbnQgdHlwZXMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGFuZCBzb21lIG5lZWQgc3BlY2lhbCBwcm9wZXJ0aWVzLCBkbyB0aGF0IGFsbCBoZXJlXG4gICAgICAgICAgLCB0eXBlRml4ZXJzICAgPSBbXG4gICAgICAgICAgICAgICAgeyAvLyBrZXkgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL2tleS9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKGV2ZW50LCBuZXdFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmtleUNvZGUgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleVByb3BzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtb3VzZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvY2xpY2t8bW91c2UoPyEoLip3aGVlbHxzY3JvbGwpKXxtZW51fGRyYWd8ZHJvcC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKGV2ZW50LCBuZXdFdmVudCwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnJpZ2h0Q2xpY2sgPSBldmVudC53aGljaCA9PT0gMyB8fCBldmVudC5idXR0b24gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5wb3MgPSB7IHg6IDAsIHk6IDAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5wYWdlWCB8fCBldmVudC5wYWdlWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WCA9IGV2ZW50LnBhZ2VYXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRZID0gZXZlbnQucGFnZVlcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNsaWVudFggfHwgZXZlbnQuY2xpZW50WSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WCA9IGV2ZW50LmNsaWVudFggKyBkb2MuYm9keS5zY3JvbGxMZWZ0ICsgcm9vdC5zY3JvbGxMZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5jbGllbnRZID0gZXZlbnQuY2xpZW50WSArIGRvYy5ib2R5LnNjcm9sbFRvcCArIHJvb3Quc2Nyb2xsVG9wXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVyT3V0UmVnZXgudGVzdCh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRbKHR5cGUgPT0gJ21vdXNlb3ZlcicgPyAnZnJvbScgOiAndG8nKSArICdFbGVtZW50J11cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdXNlUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIG1vdXNlIHdoZWVsIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9tb3VzZS4qKHdoZWVsfHNjcm9sbCkvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vdXNlV2hlZWxQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gVGV4dEV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHJlZzogL150ZXh0L2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0ZXh0UHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIHRvdWNoIGFuZCBnZXN0dXJlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9edG91Y2h8Xmdlc3R1cmUvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRvdWNoUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIG1lc3NhZ2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL15tZXNzYWdlJC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBwb3BzdGF0ZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnBvcHN0YXRlJC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RhdGVQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlZzogLy4qL1xuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbW1vblByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgLCB0eXBlRml4ZXJNYXAgPSB7fSAvLyB1c2VkIHRvIG1hcCBldmVudCB0eXBlcyB0byBmaXhlciBmdW5jdGlvbnMgKGFib3ZlKSwgYSBiYXNpYyBjYWNoZSBtZWNoYW5pc21cblxuICAgICAgICAgICwgRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGVsZW1lbnQsIGlzTmF0aXZlKSB7XG4gICAgICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuXG4gICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgKChlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50KS5wYXJlbnRXaW5kb3cgfHwgd2luKS5ldmVudFxuICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudFxuICAgICAgICAgICAgICB0aGlzLmlzTmF0aXZlICAgICAgID0gaXNOYXRpdmVcbiAgICAgICAgICAgICAgdGhpcy5pc0JlYW4gICAgICAgICA9IHRydWVcblxuICAgICAgICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm5cblxuICAgICAgICAgICAgICB2YXIgdHlwZSAgID0gZXZlbnQudHlwZVxuICAgICAgICAgICAgICAgICwgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnRcbiAgICAgICAgICAgICAgICAsIGksIGwsIHAsIHByb3BzLCBmaXhlclxuXG4gICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0ICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMyA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0XG5cbiAgICAgICAgICAgICAgaWYgKGlzTmF0aXZlKSB7IC8vIHdlIG9ubHkgbmVlZCBiYXNpYyBhdWdtZW50YXRpb24gb24gY3VzdG9tIGV2ZW50cywgdGhlIHJlc3QgZXhwZW5zaXZlICYgcG9pbnRsZXNzXG4gICAgICAgICAgICAgICAgZml4ZXIgPSB0eXBlRml4ZXJNYXBbdHlwZV1cbiAgICAgICAgICAgICAgICBpZiAoIWZpeGVyKSB7IC8vIGhhdmVuJ3QgZW5jb3VudGVyZWQgdGhpcyBldmVudCB0eXBlIGJlZm9yZSwgbWFwIGEgZml4ZXIgZnVuY3Rpb24gZm9yIGl0XG4gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gdHlwZUZpeGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVGaXhlcnNbaV0ucmVnLnRlc3QodHlwZSkpIHsgLy8gZ3VhcmFudGVlZCB0byBtYXRjaCBhdCBsZWFzdCBvbmUsIGxhc3QgaXMgLipcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlRml4ZXJNYXBbdHlwZV0gPSBmaXhlciA9IHR5cGVGaXhlcnNbaV0uZml4XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByb3BzID0gZml4ZXIoZXZlbnQsIHRoaXMsIHR5cGUpXG4gICAgICAgICAgICAgICAgZm9yIChpID0gcHJvcHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoISgocCA9IHByb3BzW2ldKSBpbiB0aGlzKSAmJiBwIGluIGV2ZW50KSB0aGlzW3BdID0gZXZlbnRbcF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBwcmV2ZW50RGVmYXVsdCgpIGFuZCBzdG9wUHJvcGFnYXRpb24oKSBhcmUgYSBjb25zaXN0ZW50IGludGVyZmFjZSB0byB0aG9zZSBmdW5jdGlvbnNcbiAgICAgICAgLy8gb24gdGhlIERPTSwgc3RvcCgpIGlzIGFuIGFsaWFzIGZvciBib3RoIG9mIHRoZW0gdG9nZXRoZXJcbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQpIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgZWxzZSB0aGlzLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24pIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIGVsc2UgdGhpcy5vcmlnaW5hbEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgdGhpcy5zdG9wcGVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIC8vIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIGhhcyB0byBiZSBoYW5kbGVkIGludGVybmFsbHkgYmVjYXVzZSB3ZSBtYW5hZ2UgdGhlIGV2ZW50IGxpc3QgZm9yXG4gICAgICAgIC8vIGVhY2ggZWxlbWVudFxuICAgICAgICAvLyBub3RlIHRoYXQgb3JpZ2luYWxFbGVtZW50IG1heSBiZSBhIEJlYW4jRXZlbnQgb2JqZWN0IGluIHNvbWUgc2l0dWF0aW9uc1xuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgJiYgdGhpcy5vcmlnaW5hbEV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIC8vVE9ETzogdGhpcyBpcyByaXBlIGZvciBvcHRpbWlzYXRpb24sIG5ldyBldmVudHMgYXJlICpleHBlbnNpdmUqXG4gICAgICAgICAgLy8gaW1wcm92aW5nIHRoaXMgd2lsbCBzcGVlZCB1cCBkZWxlZ2F0ZWQgZXZlbnRzXG4gICAgICAgICAgdmFyIG5lID0gbmV3IEV2ZW50KHRoaXMsIHRoaXMuZWxlbWVudCwgdGhpcy5pc05hdGl2ZSlcbiAgICAgICAgICBuZS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldFxuICAgICAgICAgIHJldHVybiBuZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIGlmIHdlJ3JlIGluIG9sZCBJRSB3ZSBjYW4ndCBkbyBvbnByb3BlcnR5Y2hhbmdlIG9uIGRvYyBvciB3aW4gc28gd2UgdXNlIGRvYy5kb2N1bWVudEVsZW1lbnQgZm9yIGJvdGhcbiAgICAsIHRhcmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgaXNOYXRpdmUpIHtcbiAgICAgICAgcmV0dXJuICFXM0NfTU9ERUwgJiYgIWlzTmF0aXZlICYmIChlbGVtZW50ID09PSBkb2MgfHwgZWxlbWVudCA9PT0gd2luKSA/IHJvb3QgOiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIEJlYW4gbWFpbnRhaW5zIGFuIGludGVybmFsIHJlZ2lzdHJ5IGZvciBldmVudCBsaXN0ZW5lcnMuIFdlIGRvbid0IHRvdWNoIGVsZW1lbnRzLCBvYmplY3RzXG4gICAgICAgICogb3IgZnVuY3Rpb25zIHRvIGlkZW50aWZ5IHRoZW0sIGluc3RlYWQgd2Ugc3RvcmUgZXZlcnl0aGluZyBpbiB0aGUgcmVnaXN0cnkuXG4gICAgICAgICogRWFjaCBldmVudCBsaXN0ZW5lciBoYXMgYSBSZWdFbnRyeSBvYmplY3QsIHdlIGhhdmUgb25lICdyZWdpc3RyeScgZm9yIHRoZSB3aG9sZSBpbnN0YW5jZS5cbiAgICAgICAgKi9cbiAgICAsIFJlZ0VudHJ5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZWFjaCBoYW5kbGVyIGlzIHdyYXBwZWQgc28gd2UgY2FuIGhhbmRsZSBkZWxlZ2F0aW9uIGFuZCBjdXN0b20gZXZlbnRzXG4gICAgICAgIHZhciB3cmFwcGVkSGFuZGxlciA9IGZ1bmN0aW9uIChlbGVtZW50LCBmbiwgY29uZGl0aW9uLCBhcmdzKSB7XG4gICAgICAgICAgICB2YXIgY2FsbCA9IGZ1bmN0aW9uIChldmVudCwgZWFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBhcmdzID8gc2xpY2UuY2FsbChlYXJncywgZXZlbnQgPyAwIDogMSkuY29uY2F0KGFyZ3MpIDogZWFyZ3MpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIGZpbmRUYXJnZXQgPSBmdW5jdGlvbiAoZXZlbnQsIGV2ZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLl9fYmVhbkRlbCA/IGZuLl9fYmVhbkRlbC5mdChldmVudC50YXJnZXQsIGVsZW1lbnQpIDogZXZlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIGhhbmRsZXIgPSBjb25kaXRpb25cbiAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGZpbmRUYXJnZXQoZXZlbnQsIHRoaXMpIC8vIGRlbGVhdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkgZXZlbnQuY3VycmVudFRhcmdldCA9IHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGwoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZuLl9fYmVhbkRlbCkgZXZlbnQgPSBldmVudC5jbG9uZShmaW5kVGFyZ2V0KGV2ZW50KSkgLy8gZGVsZWdhdGVkIGV2ZW50LCBmaXggdGhlIGZpeFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXIuX19iZWFuRGVsID0gZm4uX19iZWFuRGVsXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgICAgICAgIH1cblxuICAgICAgICAsIFJlZ0VudHJ5ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9yaWdpbmFsLCBuYW1lc3BhY2VzLCBhcmdzLCByb290KSB7XG4gICAgICAgICAgICB2YXIgY3VzdG9tVHlwZSAgICAgPSBjdXN0b21FdmVudHNbdHlwZV1cbiAgICAgICAgICAgICAgLCBpc05hdGl2ZVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAndW5sb2FkJykge1xuICAgICAgICAgICAgICAvLyBzZWxmIGNsZWFuLXVwXG4gICAgICAgICAgICAgIGhhbmRsZXIgPSBvbmNlKHJlbW92ZUxpc3RlbmVyLCBlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcmlnaW5hbClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1c3RvbVR5cGUpIHtcbiAgICAgICAgICAgICAgaWYgKGN1c3RvbVR5cGUuY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlciA9IHdyYXBwZWRIYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGN1c3RvbVR5cGUuY29uZGl0aW9uLCBhcmdzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHR5cGUgPSBjdXN0b21UeXBlLmJhc2UgfHwgdHlwZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlzTmF0aXZlICAgICAgPSBpc05hdGl2ZSA9IG5hdGl2ZUV2ZW50c1t0eXBlXSAmJiAhIWVsZW1lbnRbZXZlbnRTdXBwb3J0XVxuICAgICAgICAgICAgdGhpcy5jdXN0b21UeXBlICAgID0gIVczQ19NT0RFTCAmJiAhaXNOYXRpdmUgJiYgdHlwZVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50ICAgICAgID0gZWxlbWVudFxuICAgICAgICAgICAgdGhpcy50eXBlICAgICAgICAgID0gdHlwZVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCAgICAgID0gb3JpZ2luYWxcbiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlcyAgICA9IG5hbWVzcGFjZXNcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUeXBlICAgICA9IFczQ19NT0RFTCB8fCBpc05hdGl2ZSA/IHR5cGUgOiAncHJvcGVydHljaGFuZ2UnXG4gICAgICAgICAgICB0aGlzLnRhcmdldCAgICAgICAgPSB0YXJnZXRFbGVtZW50KGVsZW1lbnQsIGlzTmF0aXZlKVxuICAgICAgICAgICAgdGhpc1tldmVudFN1cHBvcnRdID0gISF0aGlzLnRhcmdldFtldmVudFN1cHBvcnRdXG4gICAgICAgICAgICB0aGlzLnJvb3QgICAgICAgICAgPSByb290XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgICAgICAgPSB3cmFwcGVkSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBudWxsLCBhcmdzKVxuICAgICAgICAgIH1cblxuICAgICAgICAvLyBnaXZlbiBhIGxpc3Qgb2YgbmFtZXNwYWNlcywgaXMgb3VyIGVudHJ5IGluIGFueSBvZiB0aGVtP1xuICAgICAgICBSZWdFbnRyeS5wcm90b3R5cGUuaW5OYW1lc3BhY2VzID0gZnVuY3Rpb24gKGNoZWNrTmFtZXNwYWNlcykge1xuICAgICAgICAgIHZhciBpLCBqLCBjID0gMFxuICAgICAgICAgIGlmICghY2hlY2tOYW1lc3BhY2VzKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIGlmICghdGhpcy5uYW1lc3BhY2VzKSByZXR1cm4gZmFsc2VcbiAgICAgICAgICBmb3IgKGkgPSBjaGVja05hbWVzcGFjZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICBmb3IgKGogPSB0aGlzLm5hbWVzcGFjZXMubGVuZ3RoOyBqLS07KSB7XG4gICAgICAgICAgICAgIGlmIChjaGVja05hbWVzcGFjZXNbaV0gPT0gdGhpcy5uYW1lc3BhY2VzW2pdKSBjKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoZWNrTmFtZXNwYWNlcy5sZW5ndGggPT09IGNcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1hdGNoIGJ5IGVsZW1lbnQsIG9yaWdpbmFsIGZuIChvcHQpLCBoYW5kbGVyIGZuIChvcHQpXG4gICAgICAgIFJlZ0VudHJ5LnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gKGNoZWNrRWxlbWVudCwgY2hlY2tPcmlnaW5hbCwgY2hlY2tIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudCA9PT0gY2hlY2tFbGVtZW50ICYmXG4gICAgICAgICAgICAoIWNoZWNrT3JpZ2luYWwgfHwgdGhpcy5vcmlnaW5hbCA9PT0gY2hlY2tPcmlnaW5hbCkgJiZcbiAgICAgICAgICAgICghY2hlY2tIYW5kbGVyIHx8IHRoaXMuaGFuZGxlciA9PT0gY2hlY2tIYW5kbGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZ0VudHJ5XG4gICAgICB9KCkpXG5cbiAgICAsIHJlZ2lzdHJ5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gb3VyIG1hcCBzdG9yZXMgYXJyYXlzIGJ5IGV2ZW50IHR5cGUsIGp1c3QgYmVjYXVzZSBpdCdzIGJldHRlciB0aGFuIHN0b3JpbmdcbiAgICAgICAgLy8gZXZlcnl0aGluZyBpbiBhIHNpbmdsZSBhcnJheS5cbiAgICAgICAgLy8gdXNlcyAnJCcgYXMgYSBwcmVmaXggZm9yIHRoZSBrZXlzIGZvciBzYWZldHkgYW5kICdyJyBhcyBhIHNwZWNpYWwgcHJlZml4IGZvclxuICAgICAgICAvLyByb290TGlzdGVuZXJzIHNvIHdlIGNhbiBsb29rIHRoZW0gdXAgZmFzdFxuICAgICAgICB2YXIgbWFwID0ge31cblxuICAgICAgICAgIC8vIGdlbmVyaWMgZnVuY3Rpb25hbCBzZWFyY2ggb2Ygb3VyIHJlZ2lzdHJ5IGZvciBtYXRjaGluZyBsaXN0ZW5lcnMsXG4gICAgICAgICAgLy8gYGZuYCByZXR1cm5zIGZhbHNlIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcFxuICAgICAgICAgICwgZm9yQWxsID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCBoYW5kbGVyLCByb290LCBmbikge1xuICAgICAgICAgICAgICB2YXIgcGZ4ID0gcm9vdCA/ICdyJyA6ICckJ1xuICAgICAgICAgICAgICBpZiAoIXR5cGUgfHwgdHlwZSA9PSAnKicpIHtcbiAgICAgICAgICAgICAgICAvLyBzZWFyY2ggdGhlIHdob2xlIHJlZ2lzdHJ5XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0LmNoYXJBdCgwKSA9PSBwZngpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yQWxsKGVsZW1lbnQsIHQuc3Vic3RyKDEpLCBvcmlnaW5hbCwgaGFuZGxlciwgcm9vdCwgZm4pXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpID0gMCwgbCwgbGlzdCA9IG1hcFtwZnggKyB0eXBlXSwgYWxsID0gZWxlbWVudCA9PSAnKidcbiAgICAgICAgICAgICAgICBpZiAoIWxpc3QpIHJldHVyblxuICAgICAgICAgICAgICAgIGZvciAobCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKGFsbCB8fCBsaXN0W2ldLm1hdGNoZXMoZWxlbWVudCwgb3JpZ2luYWwsIGhhbmRsZXIpKSAmJiAhZm4obGlzdFtpXSwgbGlzdCwgaSwgdHlwZSkpIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBoYXMgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIHJvb3QpIHtcbiAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHVzaW5nIGZvckFsbCBoZXJlIHNpbXBseSBiZWNhdXNlIGl0J3MgYSBiaXQgc2xvd2VyIGFuZCB0aGlzXG4gICAgICAgICAgICAgIC8vIG5lZWRzIHRvIGJlIGZhc3RcbiAgICAgICAgICAgICAgdmFyIGksIGxpc3QgPSBtYXBbKHJvb3QgPyAncicgOiAnJCcpICsgdHlwZV1cbiAgICAgICAgICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0W2ldLnJvb3QgJiYgbGlzdFtpXS5tYXRjaGVzKGVsZW1lbnQsIG9yaWdpbmFsLCBudWxsKSkgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIGdldCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgcm9vdCkge1xuICAgICAgICAgICAgICB2YXIgZW50cmllcyA9IFtdXG4gICAgICAgICAgICAgIGZvckFsbChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgbnVsbCwgcm9vdCwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgcHV0ID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIHZhciBoYXMgPSAhZW50cnkucm9vdCAmJiAhdGhpcy5oYXMoZW50cnkuZWxlbWVudCwgZW50cnkudHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLCBrZXkgPSAoZW50cnkucm9vdCA/ICdyJyA6ICckJykgKyBlbnRyeS50eXBlXG4gICAgICAgICAgICAgIDsobWFwW2tleV0gfHwgKG1hcFtrZXldID0gW10pKS5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgICByZXR1cm4gaGFzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIGRlbCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICBmb3JBbGwoZW50cnkuZWxlbWVudCwgZW50cnkudHlwZSwgbnVsbCwgZW50cnkuaGFuZGxlciwgZW50cnkucm9vdCwgZnVuY3Rpb24gKGVudHJ5LCBsaXN0LCBpKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoaSwgMSlcbiAgICAgICAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgZGVsZXRlIG1hcFsoZW50cnkucm9vdCA/ICdyJyA6ICckJykgKyBlbnRyeS50eXBlXVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkdW1wIGFsbCBlbnRyaWVzLCB1c2VkIGZvciBvbnVubG9hZFxuICAgICAgICAgICwgZW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIHQsIGVudHJpZXMgPSBbXVxuICAgICAgICAgICAgICBmb3IgKHQgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuY2hhckF0KDApID09ICckJykgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KG1hcFt0XSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGhhczogaGFzLCBnZXQ6IGdldCwgcHV0OiBwdXQsIGRlbDogZGVsLCBlbnRyaWVzOiBlbnRyaWVzIH1cbiAgICAgIH0oKSlcblxuICAgICAgLy8gd2UgbmVlZCBhIHNlbGVjdG9yIGVuZ2luZSBmb3IgZGVsZWdhdGVkIGV2ZW50cywgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgaWYgaXQgZXhpc3RzXG4gICAgICAvLyBidXQgZm9yIG9sZGVyIGJyb3dzZXJzIHdlIG5lZWQgUXdlcnksIFNpenpsZSBvciBzaW1pbGFyXG4gICAgLCBzZWxlY3RvckVuZ2luZVxuICAgICwgc2V0U2VsZWN0b3JFbmdpbmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBzZWxlY3RvckVuZ2luZSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChzLCByKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIucXVlcnlTZWxlY3RvckFsbChzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JlYW46IE5vIHNlbGVjdG9yIGVuZ2luZSBpbnN0YWxsZWQnKSAvLyBlZWVrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RvckVuZ2luZSA9IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB3ZSBhdHRhY2ggdGhpcyBsaXN0ZW5lciB0byBlYWNoIERPTSBldmVudCB0aGF0IHdlIG5lZWQgdG8gbGlzdGVuIHRvLCBvbmx5IG9uY2VcbiAgICAgIC8vIHBlciBldmVudCB0eXBlIHBlciBET00gZWxlbWVudFxuICAgICwgcm9vdExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50LCB0eXBlKSB7XG4gICAgICAgIGlmICghVzNDX01PREVMICYmIHR5cGUgJiYgZXZlbnQgJiYgZXZlbnQucHJvcGVydHlOYW1lICE9ICdfb24nICsgdHlwZSkgcmV0dXJuXG5cbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHJlZ2lzdHJ5LmdldCh0aGlzLCB0eXBlIHx8IGV2ZW50LnR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICwgbCA9IGxpc3RlbmVycy5sZW5ndGhcbiAgICAgICAgICAsIGkgPSAwXG5cbiAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHRoaXMsIHRydWUpXG4gICAgICAgIGlmICh0eXBlKSBldmVudC50eXBlID0gdHlwZVxuXG4gICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCBjYWxsaW5nIHRoZW0gdW5sZXNzIHRoZXkgaGF2ZVxuICAgICAgICAvLyBiZWVuIHJlbW92ZWQgYnkgYSBwcmV2aW91cyBoYW5kbGVyIG9yIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIGhhcyBiZWVuIGNhbGxlZFxuICAgICAgICBmb3IgKDsgaSA8IGwgJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7IGkrKykge1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzW2ldLnJlbW92ZWQpIGxpc3RlbmVyc1tpXS5oYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYWRkIGFuZCByZW1vdmUgbGlzdGVuZXJzIHRvIERPTSBlbGVtZW50c1xuICAgICwgbGlzdGVuZXIgPSBXM0NfTU9ERUxcbiAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYWRkLCBjdXN0b20sIHVzZUNhcHR1cmUpIHtcbiAgICAgICAgICAgIC8vIG5ldyBicm93c2Vyc1xuICAgICAgICAgICAgZWxlbWVudFthZGQgPyBhZGRFdmVudCA6IHJlbW92ZUV2ZW50XSh0eXBlLCByb290TGlzdGVuZXIsIHVzZUNhcHR1cmUpXG4gICAgICAgICAgfVxuICAgICAgICA6IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBhZGQsIGN1c3RvbSAvKiwgdXNlQ2FwdHVyZSAqLykge1xuICAgICAgICAgICAgLy8gSUU4IGFuZCBiZWxvdywgdXNlIGF0dGFjaEV2ZW50L2RldGFjaEV2ZW50IGFuZCB3ZSBoYXZlIHRvIHBpZ2d5LWJhY2sgcHJvcGVydHljaGFuZ2UgZXZlbnRzXG4gICAgICAgICAgICAvLyB0byBzaW11bGF0ZSBldmVudCBidWJibGluZyBldGMuXG4gICAgICAgICAgICB2YXIgZW50cnlcbiAgICAgICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgICAgcmVnaXN0cnkucHV0KGVudHJ5ID0gbmV3IFJlZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICAgICAgICwgY3VzdG9tIHx8IHR5cGVcbiAgICAgICAgICAgICAgICAsIGZ1bmN0aW9uIChldmVudCkgeyAvLyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RMaXN0ZW5lci5jYWxsKGVsZW1lbnQsIGV2ZW50LCBjdXN0b20pXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLCByb290TGlzdGVuZXJcbiAgICAgICAgICAgICAgICAsIG51bGxcbiAgICAgICAgICAgICAgICAsIG51bGxcbiAgICAgICAgICAgICAgICAsIHRydWUgLy8gaXMgcm9vdFxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICBpZiAoY3VzdG9tICYmIGVsZW1lbnRbJ19vbicgKyBjdXN0b21dID09IG51bGwpIGVsZW1lbnRbJ19vbicgKyBjdXN0b21dID0gMFxuICAgICAgICAgICAgICBlbnRyeS50YXJnZXQuYXR0YWNoRXZlbnQoJ29uJyArIGVudHJ5LmV2ZW50VHlwZSwgZW50cnkuaGFuZGxlcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVudHJ5ID0gcmVnaXN0cnkuZ2V0KGVsZW1lbnQsIGN1c3RvbSB8fCB0eXBlLCByb290TGlzdGVuZXIsIHRydWUpWzBdXG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZW50cnkuZXZlbnRUeXBlLCBlbnRyeS5oYW5kbGVyKVxuICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LmRlbChlbnRyeSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICwgb25jZSA9IGZ1bmN0aW9uIChybSwgZWxlbWVudCwgdHlwZSwgZm4sIG9yaWdpbmFsRm4pIHtcbiAgICAgICAgLy8gd3JhcCB0aGUgaGFuZGxlciBpbiBhIGhhbmRsZXIgdGhhdCBkb2VzIGEgcmVtb3ZlIGFzIHdlbGxcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgcm0oZWxlbWVudCwgdHlwZSwgb3JpZ2luYWxGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgLCByZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcmdUeXBlLCBoYW5kbGVyLCBuYW1lc3BhY2VzLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgIHZhciB0eXBlICAgICA9IG9yZ1R5cGUgJiYgb3JnVHlwZS5yZXBsYWNlKG5hbWVSZWdleCwgJycpXG4gICAgICAgICAgLCBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIHJlbW92ZWQgID0ge31cbiAgICAgICAgICAsIGksIGxcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCghaGFuZGxlciB8fCBoYW5kbGVyc1tpXS5vcmlnaW5hbCA9PT0gaGFuZGxlcikgJiYgaGFuZGxlcnNbaV0uaW5OYW1lc3BhY2VzKG5hbWVzcGFjZXMpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIHByb2JsZW1hdGljLCB3ZSBoYXZlIGEgcmVnaXN0cnkuZ2V0KCkgYW5kIHJlZ2lzdHJ5LmRlbCgpIHRoYXRcbiAgICAgICAgICAgIC8vIGJvdGggZG8gcmVnaXN0cnkgc2VhcmNoZXMgc28gd2Ugd2FzdGUgY3ljbGVzIGRvaW5nIHRoaXMuIE5lZWRzIHRvIGJlIHJvbGxlZCBpbnRvXG4gICAgICAgICAgICAvLyBhIHNpbmdsZSByZWdpc3RyeS5mb3JBbGwoZm4pIHRoYXQgcmVtb3ZlcyB3aGlsZSBmaW5kaW5nLCBidXQgdGhlIGNhdGNoIGlzIHRoYXRcbiAgICAgICAgICAgIC8vIHdlJ2xsIGJlIHNwbGljaW5nIHRoZSBhcnJheXMgdGhhdCB3ZSdyZSBpdGVyYXRpbmcgb3Zlci4gTmVlZHMgZXh0cmEgdGVzdHMgdG9cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBzY3JldyBpdCB1cC4gQHJ2YWdnXG4gICAgICAgICAgICByZWdpc3RyeS5kZWwoaGFuZGxlcnNbaV0pXG4gICAgICAgICAgICBpZiAoIXJlbW92ZWRbaGFuZGxlcnNbaV0uZXZlbnRUeXBlXSAmJiBoYW5kbGVyc1tpXVtldmVudFN1cHBvcnRdKVxuICAgICAgICAgICAgICByZW1vdmVkW2hhbmRsZXJzW2ldLmV2ZW50VHlwZV0gPSB7IHQ6IGhhbmRsZXJzW2ldLmV2ZW50VHlwZSwgYzogaGFuZGxlcnNbaV0udHlwZSB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGVhY2ggdHlwZS9lbGVtZW50IGZvciByZW1vdmVkIGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZSByb290TGlzdGVuZXIgd2hlcmUgaXQncyBubyBsb25nZXIgbmVlZGVkXG4gICAgICAgIGZvciAoaSBpbiByZW1vdmVkKSB7XG4gICAgICAgICAgaWYgKCFyZWdpc3RyeS5oYXMoZWxlbWVudCwgcmVtb3ZlZFtpXS50LCBudWxsLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIC8vIGxhc3QgbGlzdGVuZXIgb2YgdGhpcyB0eXBlLCByZW1vdmUgdGhlIHJvb3RMaXN0ZW5lclxuICAgICAgICAgICAgbGlzdGVuZXIoZWxlbWVudCwgcmVtb3ZlZFtpXS50LCBmYWxzZSwgcmVtb3ZlZFtpXS5jLCB1c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdXAgYSBkZWxlZ2F0ZSBoZWxwZXIgdXNpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLCB3cmFwIHRoZSBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgLCBkZWxlZ2F0ZSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgZm4pIHtcbiAgICAgICAgLy9UT0RPOiBmaW5kVGFyZ2V0ICh0aGVyZWZvcmUgJCkgaXMgY2FsbGVkIHR3aWNlLCBvbmNlIGZvciBtYXRjaCBhbmQgb25jZSBmb3JcbiAgICAgICAgLy8gc2V0dGluZyBlLmN1cnJlbnRUYXJnZXQsIGZpeCB0aGlzIHNvIGl0J3Mgb25seSBuZWVkZWQgb25jZVxuICAgICAgICB2YXIgZmluZFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHJvb3QpIHtcbiAgICAgICAgICAgICAgdmFyIGksIGFycmF5ID0gaXNTdHJpbmcoc2VsZWN0b3IpID8gc2VsZWN0b3JFbmdpbmUoc2VsZWN0b3IsIHJvb3QpIDogc2VsZWN0b3JcbiAgICAgICAgICAgICAgZm9yICg7IHRhcmdldCAmJiB0YXJnZXQgIT09IHJvb3Q7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gYXJyYXkubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IHRhcmdldCkgcmV0dXJuIHRhcmdldFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICwgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHZhciBtYXRjaCA9IGZpbmRUYXJnZXQoZS50YXJnZXQsIHRoaXMpXG4gICAgICAgICAgICAgIGlmIChtYXRjaCkgZm4uYXBwbHkobWF0Y2gsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBfX2JlYW5EZWwgaXNuJ3QgcGxlYXNhbnQgYnV0IGl0J3MgYSBwcml2YXRlIGZ1bmN0aW9uLCBub3QgZXhwb3NlZCBvdXRzaWRlIG9mIEJlYW5cbiAgICAgICAgaGFuZGxlci5fX2JlYW5EZWwgPSB7XG4gICAgICAgICAgICBmdCAgICAgICA6IGZpbmRUYXJnZXQgLy8gYXR0YWNoIGl0IGhlcmUgZm9yIGN1c3RvbUV2ZW50cyB0byB1c2UgdG9vXG4gICAgICAgICAgLCBzZWxlY3RvciA6IHNlbGVjdG9yXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICAgIH1cblxuICAgICwgZmlyZUxpc3RlbmVyID0gVzNDX01PREVMID8gZnVuY3Rpb24gKGlzTmF0aXZlLCB0eXBlLCBlbGVtZW50KSB7XG4gICAgICAgIC8vIG1vZGVybiBicm93c2VycywgZG8gYSBwcm9wZXIgZGlzcGF0Y2hFdmVudCgpXG4gICAgICAgIHZhciBldnQgPSBkb2MuY3JlYXRlRXZlbnQoaXNOYXRpdmUgPyAnSFRNTEV2ZW50cycgOiAnVUlFdmVudHMnKVxuICAgICAgICBldnRbaXNOYXRpdmUgPyAnaW5pdEV2ZW50JyA6ICdpbml0VUlFdmVudCddKHR5cGUsIHRydWUsIHRydWUsIHdpbiwgMSlcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2dClcbiAgICAgIH0gOiBmdW5jdGlvbiAoaXNOYXRpdmUsIHR5cGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy8gb2xkIGJyb3dzZXIgdXNlIG9ucHJvcGVydHljaGFuZ2UsIGp1c3QgaW5jcmVtZW50IGEgY3VzdG9tIHByb3BlcnR5IHRvIHRyaWdnZXIgdGhlIGV2ZW50XG4gICAgICAgIGVsZW1lbnQgPSB0YXJnZXRFbGVtZW50KGVsZW1lbnQsIGlzTmF0aXZlKVxuICAgICAgICBpc05hdGl2ZSA/IGVsZW1lbnQuZmlyZUV2ZW50KCdvbicgKyB0eXBlLCBkb2MuY3JlYXRlRXZlbnRPYmplY3QoKSkgOiBlbGVtZW50Wydfb24nICsgdHlwZV0rK1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBQdWJsaWMgQVBJOiBvZmYoKSwgb24oKSwgYWRkKCksIChyZW1vdmUoKSksIG9uZSgpLCBmaXJlKCksIGNsb25lKClcbiAgICAgICAgKi9cblxuICAgICAgLyoqXG4gICAgICAgICogb2ZmKGVsZW1lbnRbLCBldmVudFR5cGUocylbLCBoYW5kbGVyIF0sIG9wdGlvbnNdKVxuICAgICAgICAqL1xuICAgICwgb2ZmID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGVTcGVjLCBmbikge1xuICAgICAgICB2YXIgaXNUeXBlU3RyID0gaXNTdHJpbmcodHlwZVNwZWMpLFxuICAgICAgICAgIGRlZmF1bHRPcHRzID0ge1xuICAgICAgICAgICAgdXNlQ2FwdHVyZTogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgLCBvcHRzID0gYnVpbGRPcHRpb25zKGRlZmF1bHRPcHRzLCBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdKVxuICAgICAgICAgICwgaywgdHlwZSwgbmFtZXNwYWNlcywgaVxuXG4gICAgICAgIGlmIChpc1R5cGVTdHIgJiYgdHlwZVNwZWMuaW5kZXhPZignICcpID4gMCkge1xuICAgICAgICAgIC8vIG9mZihlbCwgJ3QxIHQyIHQzJywgZm4pIG9yIG9mZihlbCwgJ3QxIHQyIHQzJylcbiAgICAgICAgICB0eXBlU3BlYyA9IHN0cjJhcnIodHlwZVNwZWMpXG4gICAgICAgICAgZm9yIChpID0gdHlwZVNwZWMubGVuZ3RoOyBpLS07KVxuICAgICAgICAgICAgb2ZmKGVsZW1lbnQsIHR5cGVTcGVjW2ldLCBmbilcbiAgICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgdHlwZSA9IGlzVHlwZVN0ciAmJiB0eXBlU3BlYy5yZXBsYWNlKG5hbWVSZWdleCwgJycpXG4gICAgICAgIGlmICh0eXBlICYmIGN1c3RvbUV2ZW50c1t0eXBlXSkgdHlwZSA9IGN1c3RvbUV2ZW50c1t0eXBlXS5iYXNlXG5cbiAgICAgICAgaWYgKCF0eXBlU3BlYyB8fCBpc1R5cGVTdHIpIHtcbiAgICAgICAgICAvLyBvZmYoZWwpIG9yIG9mZihlbCwgdDEubnMpIG9yIG9mZihlbCwgLm5zKSBvciBvZmYoZWwsIC5uczEubnMyLm5zMylcbiAgICAgICAgICBpZiAobmFtZXNwYWNlcyA9IGlzVHlwZVN0ciAmJiB0eXBlU3BlYy5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpIG5hbWVzcGFjZXMgPSBzdHIyYXJyKG5hbWVzcGFjZXMsICcuJylcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcihlbGVtZW50LCB0eXBlLCBmbiwgbmFtZXNwYWNlcywgb3B0cy51c2VDYXB0dXJlKVxuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odHlwZVNwZWMpKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsLCBmbilcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcihlbGVtZW50LCBudWxsLCB0eXBlU3BlYywgbnVsbCwgb3B0cy51c2VDYXB0dXJlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG9mZihlbCwgeyB0MTogZm4xLCB0MiwgZm4yIH0pXG4gICAgICAgICAgZm9yIChrIGluIHR5cGVTcGVjKSB7XG4gICAgICAgICAgICBpZiAodHlwZVNwZWMuaGFzT3duUHJvcGVydHkoaykpIG9mZihlbGVtZW50LCBrLCB0eXBlU3BlY1trXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBvbihlbGVtZW50LCBldmVudFR5cGUocylbLCBzZWxlY3Rvcl0sIGhhbmRsZXJbLCBhcmdzIF0sIFtvcHRpb25zXSlcbiAgICAgICAgKi9cbiAgICAsIG9uID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnRzLCBzZWxlY3RvciwgZm4pIHtcbiAgICAgICAgdmFyIGRlZmF1bHRPcHRzID0ge1xuICAgICAgICAgICAgdXNlQ2FwdHVyZTogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yaWdpbmFsRm4sIHR5cGUsIHR5cGVzLCBpLCBhcmdzLCBlbnRyeSwgZmlyc3QsIG9wdHNcblxuICAgICAgICAvL1RPRE86IHRoZSB1bmRlZmluZWQgY2hlY2sgbWVhbnMgeW91IGNhbid0IHBhc3MgYW4gJ2FyZ3MnIGFyZ3VtZW50LCBmaXggdGhpcyBwZXJoYXBzP1xuICAgICAgICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXZlbnRzID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy9UT0RPOiB0aGlzIGNhbid0IGhhbmRsZSBkZWxlZ2F0ZWQgZXZlbnRzXG4gICAgICAgICAgZm9yICh0eXBlIGluIGV2ZW50cykge1xuICAgICAgICAgICAgaWYgKGV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkge1xuICAgICAgICAgICAgICBvbi5jYWxsKHRoaXMsIGVsZW1lbnQsIHR5cGUsIGV2ZW50c1t0eXBlXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICAgICAgLy8gZGVsZWdhdGVkIGV2ZW50XG4gICAgICAgICAgb3JpZ2luYWxGbiA9IGZuXG4gICAgICAgICAgYXJncyAgICAgICA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCA0KVxuICAgICAgICAgIGZuICAgICAgICAgPSBkZWxlZ2F0ZShzZWxlY3Rvciwgb3JpZ2luYWxGbiwgc2VsZWN0b3JFbmdpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJncyAgICAgICA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKVxuICAgICAgICAgIGZuICAgICAgICAgPSBvcmlnaW5hbEZuID0gc2VsZWN0b3JcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdHMgPSBidWlsZE9wdGlvbnMoZGVmYXVsdE9wdHMsIGFyZ3NbYXJncy5sZW5ndGggLSAxXSlcbiAgICAgICAgdHlwZXMgPSBzdHIyYXJyKGV2ZW50cylcblxuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG9uZSgpLCB3cmFwIGluIGEgc2VsZi1yZW1vdmluZyBoYW5kbGVyXG4gICAgICAgIGlmICh0aGlzID09PSBPTkUpIHtcbiAgICAgICAgICBmbiA9IG9uY2Uob2ZmLCBlbGVtZW50LCBldmVudHMsIGZuLCBvcmlnaW5hbEZuKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gdHlwZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgLy8gYWRkIG5ldyBoYW5kbGVyIHRvIHRoZSByZWdpc3RyeSBhbmQgY2hlY2sgaWYgaXQncyB0aGUgZmlyc3QgZm9yIHRoaXMgZWxlbWVudC90eXBlXG4gICAgICAgICAgZmlyc3QgPSByZWdpc3RyeS5wdXQoZW50cnkgPSBuZXcgUmVnRW50cnkoXG4gICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICwgdHlwZXNbaV0ucmVwbGFjZShuYW1lUmVnZXgsICcnKSAvLyBldmVudCB0eXBlXG4gICAgICAgICAgICAsIGZuXG4gICAgICAgICAgICAsIG9yaWdpbmFsRm5cbiAgICAgICAgICAgICwgc3RyMmFycih0eXBlc1tpXS5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJyksICcuJykgLy8gbmFtZXNwYWNlc1xuICAgICAgICAgICAgLCBhcmdzXG4gICAgICAgICAgICAsIGZhbHNlIC8vIG5vdCByb290XG4gICAgICAgICAgKSlcbiAgICAgICAgICBpZiAoZW50cnlbZXZlbnRTdXBwb3J0XSAmJiBmaXJzdCkge1xuICAgICAgICAgICAgLy8gZmlyc3QgZXZlbnQgb2YgdGhpcyB0eXBlIG9uIHRoaXMgZWxlbWVudCwgYWRkIHJvb3QgbGlzdGVuZXJcbiAgICAgICAgICAgIGxpc3RlbmVyKGVsZW1lbnQsIGVudHJ5LmV2ZW50VHlwZSwgdHJ1ZSwgZW50cnkuY3VzdG9tVHlwZSwgb3B0cy51c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIGFkZChlbGVtZW50Wywgc2VsZWN0b3JdLCBldmVudFR5cGUocyksIGhhbmRsZXJbLCBhcmdzIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBEZXByZWNhdGVkOiBrZXB0IChmb3Igbm93KSBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eVxuICAgICAgICAqL1xuICAgICwgYWRkID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50cywgZm4sIGRlbGZuLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBvbi5hcHBseShcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAsICFpc1N0cmluZyhmbilcbiAgICAgICAgICAgICAgPyBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgOiBbIGVsZW1lbnQsIGZuLCBldmVudHMsIGRlbGZuIF0uY29uY2F0KGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDQpIDogW10pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogb25lKGVsZW1lbnQsIGV2ZW50VHlwZShzKVssIHNlbGVjdG9yXSwgaGFuZGxlclssIGFyZ3MgXSlcbiAgICAgICAgKi9cbiAgICAsIG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9uLmFwcGx5KE9ORSwgYXJndW1lbnRzKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBmaXJlKGVsZW1lbnQsIGV2ZW50VHlwZShzKVssIGFyZ3MgXSlcbiAgICAgICAgKlxuICAgICAgICAqIFRoZSBvcHRpb25hbCAnYXJncycgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSwgaWYgbm8gJ2FyZ3MnIGFyZ3VtZW50IGlzIHByb3ZpZGVkXG4gICAgICAgICogdGhlbiB3ZSBjYW4gdXNlIHRoZSBicm93c2VyJ3MgRE9NIGV2ZW50IHN5c3RlbSwgb3RoZXJ3aXNlIHdlIHRyaWdnZXIgaGFuZGxlcnMgbWFudWFsbHlcbiAgICAgICAgKi9cbiAgICAsIGZpcmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYXJncykge1xuICAgICAgICB2YXIgdHlwZXMgPSBzdHIyYXJyKHR5cGUpXG4gICAgICAgICAgLCBpLCBqLCBsLCBuYW1lcywgaGFuZGxlcnNcblxuICAgICAgICBmb3IgKGkgPSB0eXBlcy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICB0eXBlID0gdHlwZXNbaV0ucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICAgIGlmIChuYW1lcyA9IHR5cGVzW2ldLnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSkgbmFtZXMgPSBzdHIyYXJyKG5hbWVzLCAnLicpXG4gICAgICAgICAgaWYgKCFuYW1lcyAmJiAhYXJncyAmJiBlbGVtZW50W2V2ZW50U3VwcG9ydF0pIHtcbiAgICAgICAgICAgIGZpcmVMaXN0ZW5lcihuYXRpdmVFdmVudHNbdHlwZV0sIHR5cGUsIGVsZW1lbnQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vbi1uYXRpdmUgZXZlbnQsIGVpdGhlciBiZWNhdXNlIG9mIGEgbmFtZXNwYWNlLCBhcmd1bWVudHMgb3IgYSBub24gRE9NIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgbGlzdGVuZXJzIGFuZCBtYW51YWxseSAnZmlyZSdcbiAgICAgICAgICAgIGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KGVsZW1lbnQsIHR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICAgYXJncyA9IFtmYWxzZV0uY29uY2F0KGFyZ3MpXG4gICAgICAgICAgICBmb3IgKGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChoYW5kbGVyc1tqXS5pbk5hbWVzcGFjZXMobmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbal0uaGFuZGxlci5hcHBseShlbGVtZW50LCBhcmdzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIGNsb25lKGRzdEVsZW1lbnQsIHNyY0VsZW1lbnRbLCBldmVudFR5cGUgXSlcbiAgICAgICAgKlxuICAgICAgICAqIFRPRE86IHBlcmhhcHMgZm9yIGNvbnNpc3RlbmN5IHdlIHNob3VsZCBhbGxvdyB0aGUgc2FtZSBmbGV4aWJpbGl0eSBpbiB0eXBlIHNwZWNpZmllcnM/XG4gICAgICAgICovXG4gICAgLCBjbG9uZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBmcm9tLCB0eXBlKSB7XG4gICAgICAgIHZhciBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChmcm9tLCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIGwgPSBoYW5kbGVycy5sZW5ndGhcbiAgICAgICAgICAsIGkgPSAwXG4gICAgICAgICAgLCBhcmdzLCBiZWFuRGVsXG5cbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoaGFuZGxlcnNbaV0ub3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBbIGVsZW1lbnQsIGhhbmRsZXJzW2ldLnR5cGUgXVxuICAgICAgICAgICAgaWYgKGJlYW5EZWwgPSBoYW5kbGVyc1tpXS5oYW5kbGVyLl9fYmVhbkRlbCkgYXJncy5wdXNoKGJlYW5EZWwuc2VsZWN0b3IpXG4gICAgICAgICAgICBhcmdzLnB1c2goaGFuZGxlcnNbaV0ub3JpZ2luYWwpXG4gICAgICAgICAgICBvbi5hcHBseShudWxsLCBhcmdzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgLCBiZWFuID0ge1xuICAgICAgICAgICdvbicgICAgICAgICAgICAgICAgOiBvblxuICAgICAgICAsICdhZGQnICAgICAgICAgICAgICAgOiBhZGRcbiAgICAgICAgLCAnb25lJyAgICAgICAgICAgICAgIDogb25lXG4gICAgICAgICwgJ29mZicgICAgICAgICAgICAgICA6IG9mZlxuICAgICAgICAsICdyZW1vdmUnICAgICAgICAgICAgOiBvZmZcbiAgICAgICAgLCAnY2xvbmUnICAgICAgICAgICAgIDogY2xvbmVcbiAgICAgICAgLCAnZmlyZScgICAgICAgICAgICAgIDogZmlyZVxuICAgICAgICAsICdFdmVudCcgICAgICAgICAgICAgOiBFdmVudFxuICAgICAgICAsICdzZXRTZWxlY3RvckVuZ2luZScgOiBzZXRTZWxlY3RvckVuZ2luZVxuICAgICAgICAsICdub0NvbmZsaWN0JyAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb250ZXh0W25hbWVdID0gb2xkXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAvLyBmb3IgSUUsIGNsZWFuIHVwIG9uIHVubG9hZCB0byBhdm9pZCBsZWFrc1xuICBpZiAod2luLmF0dGFjaEV2ZW50KSB7XG4gICAgdmFyIGNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaSwgZW50cmllcyA9IHJlZ2lzdHJ5LmVudHJpZXMoKVxuICAgICAgZm9yIChpIGluIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJpZXNbaV0udHlwZSAmJiBlbnRyaWVzW2ldLnR5cGUgIT09ICd1bmxvYWQnKSBvZmYoZW50cmllc1tpXS5lbGVtZW50LCBlbnRyaWVzW2ldLnR5cGUpXG4gICAgICB9XG4gICAgICB3aW4uZGV0YWNoRXZlbnQoJ29udW5sb2FkJywgY2xlYW51cClcbiAgICAgIHdpbi5Db2xsZWN0R2FyYmFnZSAmJiB3aW4uQ29sbGVjdEdhcmJhZ2UoKVxuICAgIH1cbiAgICB3aW4uYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgY2xlYW51cClcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgc2VsZWN0b3IgZW5naW5lIHRvIGludGVybmFsIGRlZmF1bHQgKHFTQSBvciB0aHJvdyBFcnJvcilcbiAgc2V0U2VsZWN0b3JFbmdpbmUoKVxuXG4gIHJldHVybiBiZWFuXG59KTtcbiIsIlxyXG4vKipcclxuICogRXhwb3NlIGBFbWl0dGVyYC5cclxuICovXHJcblxyXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICBtb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cclxuICpcclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5mdW5jdGlvbiBFbWl0dGVyKG9iaikge1xyXG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcclxuICogQHJldHVybiB7T2JqZWN0fVxyXG4gKiBAYXBpIHByaXZhdGVcclxuICovXHJcblxyXG5mdW5jdGlvbiBtaXhpbihvYmopIHtcclxuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcclxuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcclxuICB9XHJcbiAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuLyoqXHJcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cclxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gICh0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXSlcclxuICAgIC5wdXNoKGZuKTtcclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcclxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgZnVuY3Rpb24gb24oKSB7XHJcbiAgICB0aGlzLm9mZihldmVudCwgb24pO1xyXG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICB9XHJcblxyXG4gIG9uLmZuID0gZm47XHJcbiAgdGhpcy5vbihldmVudCwgb24pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXHJcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuXHJcbiAgLy8gYWxsXHJcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgdGhpcy5fY2FsbGJhY2tzID0ge307XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vIHNwZWNpZmljIGV2ZW50XHJcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcbiAgaWYgKCFjYWxsYmFja3MpIHJldHVybiB0aGlzO1xyXG5cclxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXHJcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXHJcbiAgdmFyIGNiO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcclxuICAgIGlmIChjYiA9PT0gZm4gfHwgY2IuZm4gPT09IGZuKSB7XHJcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBFbWl0IGBldmVudGAgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7TWl4ZWR9IC4uLlxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXHJcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XHJcblxyXG4gIGlmIChjYWxsYmFja3MpIHtcclxuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcclxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcclxuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJuIGFycmF5IG9mIGNhbGxiYWNrcyBmb3IgYGV2ZW50YC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0FycmF5fVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gfHwgW107XHJcbn07XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHJldHVybiB7Qm9vbGVhbn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgcmV0dXJuICEhIHRoaXMubGlzdGVuZXJzKGV2ZW50KS5sZW5ndGg7XHJcbn07XHJcbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSgnY29tcG9zZS10b29sYm94JyksXG4gICAgRXZlbnQgICA9IHRvb2xib3guZXZlbnQsXG4gICAgb3B0aW9ucyA9IHt9LFxuICAgIHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICBkaWFsb2dFbCxcbiAgICBmb2N1c2VkRWwsXG4gICAgZGVmYXVsdHMgPSB7XG4gICAgICBvblNob3c6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIGJ1dHRvblRlbXBsYXRlOiAnPGJ1dHRvbiByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b25cIj48L2J1dHRvbj4nLFxuICAgICAgZGlhbG9nVGVtcGxhdGU6ICc8ZGl2IHJvbGU9XCJkaWFsb2dcIiBjbGFzcz1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cImRpYWxvZy10aXRsZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJkaWFsb2ctZGVzY3JpcHRpb25cIj5cXFxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNhcmRcIj5cXFxuICAgIDxoZWFkZXIgY2xhc3M9XCJkaWFsb2ctaGVhZGVyXCI+XFxcbiAgICAgIDxoMiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIGlkPVwiZGlhbG9nLXRpdGxlXCI+PC9oMj5cXFxuICAgIDwvaGVhZGVyPlxcXG4gICAgPHAgY2xhc3M9XCJkaWFsb2ctZGVzY3JpcHRpb25cIiBpZD1cImRpYWxvZy1kZXNjcmlwdGlvblwiPjwvcD5cXFxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctcmVzcG9uc2VcIj5cXFxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1hY3Rpb25zXCI+PC9kaXY+XFxcbiAgICA8L2Rpdj5cXFxuICA8L2Rpdj5cXFxuPC9kaXY+J31cblxuZnVuY3Rpb24gc2hvdyggb3B0cyApIHtcbiAgaWYgKCB0eXBlb2Ygb3B0cyAhPSAnb2JqZWN0JyApIHsgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgb3B0aW9ucyBwYXNzZWQgZm9yIERpYWxvZycsIG9wdHMpIH1cblxuICBpZiAoICFvcHRzLnRpdGxlICkgeyByZXR1cm4gY29uc29sZS5lcnJvcignRGlhbG9nIG11c3QgaGF2ZSBhIHRpdGxlJywgb3B0cykgfVxuXG4gIGZvY3VzZWRFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgb3B0aW9ucyA9IG9wdHNcbiAgZGlhbG9nRWwgPSB0ZW1wbGF0ZSggZGVmYXVsdHMuZGlhbG9nVGVtcGxhdGUgKVxuXG4gIGFkZFRleHQoKVxuICBhZGRCdXR0b25zKClcblxuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCggJ2FmdGVyYmVnaW4nLCBkaWFsb2dFbCApXG5cbiAgbGlzdGVuKClcblxuICBkZWZhdWx0cy5vblNob3coKVxufVxuXG5mdW5jdGlvbiBsaXN0ZW4oKSB7XG5cbiAgRXZlbnQub24oIGRpYWxvZ0VsLCAnY2xpY2snLCAnLmRpYWxvZy1jb250aW51ZScsIGNvbnRpbnVlQWN0aW9uIClcbiAgRXZlbnQub24oIGRpYWxvZ0VsLCAnY2xpY2snLCAnLmRpYWxvZy1jYW5jZWwnLCBjYW5jZWxBY3Rpb24gKVxuICBFdmVudC5hZnRlckFuaW1hdGlvbiggZGlhbG9nRWwsIHRhYiwgdHJ1ZSApXG5cbiAgRXZlbnQua2V5T24oICAndGFiJywgICAnZGlhbG9nJywgdGFiIClcbiAgRXZlbnQua2V5T25lKCAnZW50ZXInLCAnZGlhbG9nJywgY29udGludWVBY3Rpb24gKVxuICBFdmVudC5rZXlPbmUoICdlc2MnLCAgICdkaWFsb2cnLCBjYW5jZWxBY3Rpb24gKVxuXG4gIEV2ZW50LmtleS5zZXRTY29wZSggJ2RpYWxvZycgKVxufVxuXG4vLyBBZGQgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGZyb20gb3B0aW9uc1xuZnVuY3Rpb24gYWRkVGV4dCgpIHtcblxuICAvLyBBZGQgdGl0bGVcbiAgZGlhbG9nRWwucXVlcnlTZWxlY3RvciggJyNkaWFsb2ctdGl0bGUnICkuaW5uZXJIVE1MID0gb3B0aW9ucy50aXRsZVxuXG4gIC8vIEFkZCBvcHRpb25hbCBkZXNjcmlwdGlvblxuICB2YXIgZGVzY3JpcHRpb25FbCA9IGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3IoICcjZGlhbG9nLWRlc2NyaXB0aW9uJyApXG5cbiAgaWYgKCBvcHRpb25zLmRlc2NyaXB0aW9uICkge1xuICAgIGRlc2NyaXB0aW9uRWwuaW5uZXJIVE1MID0gb3B0aW9ucy5kZXNjcmlwdGlvblxuICB9IGVsc2Uge1xuICAgIGRlc2NyaXB0aW9uRWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCggZGVzY3JpcHRpb25FbCApXG4gICAgZGlhbG9nRWwucmVtb3ZlQXR0cmlidXRlKCAnYXJpYS1sYWJlbGxlZGJ5JyApXG4gIH1cblxufVxuXG4vLyBBZGQgQ2FuY2VsIGFuZCBDb250aW51ZSBidXR0b25zIChpZiBuZWNlc3NhcnkpXG5mdW5jdGlvbiBhZGRCdXR0b25zKCkge1xuXG4gIGlmICggb3B0aW9ucy5jb250aW51ZSB8fCBvcHRpb25zLmZvbGxvdyB8fCBvcHRpb25zLnN1Ym1pdCApIHtcblxuICAgIHZhciBjb250aW51ZUJ1dHRvbiA9IHRlbXBsYXRlKCBkZWZhdWx0cy5idXR0b25UZW1wbGF0ZSApXG4gICAgY29udGludWVCdXR0b24uY2xhc3NMaXN0LmFkZCggJ2RpYWxvZy1jb250aW51ZScgKVxuICAgIGlmICggb3B0aW9ucy5kZXN0cnVjdGl2ZSApIHsgY29udGludWVCdXR0b24uY2xhc3NMaXN0LmFkZCggJ2Rlc3RydWN0aXZlJyApIH1cbiAgICBjb250aW51ZUJ1dHRvbi5pbm5lckhUTUwgPSBvcHRpb25zLmNvbnRpbnVlIHx8ICdDb250aW51ZSdcblxuICAgIGRpYWxvZ0VsLnF1ZXJ5U2VsZWN0b3IoJy5kaWFsb2ctYWN0aW9ucycpLmFwcGVuZENoaWxkKCBjb250aW51ZUJ1dHRvbiApXG5cbiAgICBvcHRpb25zLmNhbmNlbCA9IG9wdGlvbnMuY2FuY2VsIHx8ICdDYW5jZWwnXG4gIH1cblxuICB2YXIgY2FuY2VsQnV0dG9uID0gdGVtcGxhdGUoIGRlZmF1bHRzLmJ1dHRvblRlbXBsYXRlIClcblxuICBjYW5jZWxCdXR0b24uY2xhc3NMaXN0LmFkZCggJ2RpYWxvZy1jYW5jZWwnIClcbiAgY2FuY2VsQnV0dG9uLmlubmVySFRNTCA9IG9wdGlvbnMuY2FuY2VsIHx8ICggb3B0aW9ucy5jb250aW51ZSA/ICdDYW5jZWwnIDogJ09LJyApXG5cbiAgZGlhbG9nRWwucXVlcnlTZWxlY3RvcignLmRpYWxvZy1hY3Rpb25zJykuYXBwZW5kQ2hpbGQoIGNhbmNlbEJ1dHRvbiApXG5cbn1cblxuLy8gSW4gYSBtb2RhbCB3aW5kb3csIGB0YWJgIG11c3QgY3ljbGUgYmV0d2VlbiBlbGVtZW50cyBpbiB0aGUgbW9kYWwuXG5mdW5jdGlvbiB0YWIoIGV2ZW50ICkge1xuXG4gIC8vIEZpbmQgYWxsIGZvY3VzYWJsZSBlbGVtZW50cyBpbiB0aGUgZGlhbG9nIGNhcmRcbiAgdmFyIGZvY3VzYWJsZSAgID0gZGlhbG9nRWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pLCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSxcbiAgICAgIGxhc3QgICAgICAgID0gZm9jdXNhYmxlW2ZvY3VzYWJsZS5sZW5ndGggLSAxXSxcbiAgICAgIGZvY3VzZWQgICAgID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuXG4gIC8vIElmIGZvY3VzZWQgb24gdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsIHRhYiB0byB0aGUgZmlyc3QgZWxlbWVudC5cbiAgaWYgKCBmb2N1c2VkID09IGxhc3QgKSB7XG4gICAgaWYgKCBldmVudCApeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cbiAgICBmb2N1c2FibGVbMF0uZm9jdXMoKVxuICB9XG5cbiAgLy8gRm9jdXMgb24gdGhlIGxhc3QgZWxlbWVudCBpZiB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBkaWFsb2dcbiAgaWYgKCAhZm9jdXNlZCB8fCAhdG9vbGJveC5jaGlsZE9mKCBmb2N1c2VkLCBkaWFsb2dFbCApICkge1xuICAgIGxhc3QuZm9jdXMoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJCdXR0b24oIHNlbGVjdG9yICkge1xuICB2YXIgYnV0dG9uID0gZGlhbG9nRWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKVxuXG4gIGJ1dHRvbi5mb2N1cygpXG4gIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlJyApXG59XG5cbmZ1bmN0aW9uIGNhbmNlbEFjdGlvbiAoZXZlbnQpIHtcbiAgaWYgKGV2ZW50KXsgZXZlbnQucHJldmVudERlZmF1bHQoKSB9XG5cbiAgdHJpZ2dlckJ1dHRvbiggJy5kaWFsb2ctY2FuY2VsJyApXG5cbiAgY2xvc2UoIG9wdGlvbnMub25EaXNtaXNzIClcbn1cblxuZnVuY3Rpb24gY29udGludWVBY3Rpb24gKCBldmVudCApIHtcbiAgaWYgKCBldmVudCApeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cblxuICB0cmlnZ2VyQnV0dG9uKCAnLmRpYWxvZy1jb250aW51ZScgKVxuXG4gIGNsb3NlKCBmdW5jdGlvbigpIHtcbiAgICBpZiAoIG9wdGlvbnMuc3VibWl0ICkge1xuXG4gICAgICAvLyBJcyBpdCBhbiBlbGVtZW50IG9yIGEgc3RyaW5nXG4gICAgICB2YXIgZm9ybSA9ICggb3B0aW9ucy5zdWJtaXQubm9kZVR5cGUgPyBvcHRpb25zLnN1Ym1pdCA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy5zdWJtaXQpIClcblxuICAgICAgRXZlbnQuc3VibWl0KCBmb3JtIClcblxuICAgIH0gZWxzZSBpZiAoIG9wdGlvbnMuZm9sbG93ICkge1xuICAgICAgaWYoIG9wdGlvbnMuZm9sbG93Lm1hdGNoKC9eaHR0cHM/OlxcL1xcLy8pIClcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gb3B0aW9ucy5mb2xsb3dcbiAgICAgIGVsc2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zLmZvbGxvd1xuICAgIH1cblxuICAgIGlmICggb3B0aW9ucy5vbkNvbmZpcm0gKSBvcHRpb25zLm9uQ29uZmlybSgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNsb3NlKCBjYWxsYmFjayApe1xuICBkaWFsb2dFbC5jbGFzc0xpc3QuYWRkKCAnZGlzbWlzcycgKVxuXG4gIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBkaWFsb2dFbCwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGlmICggY2FsbGJhY2sgKSB7IGNhbGxiYWNrKCkgfVxuICAgIHJlbW92ZSgpXG4gIH0sIHRydWUpXG59XG5cblxuZnVuY3Rpb24gcmVtb3ZlKCl7XG5cbiAgLy8gUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgRXZlbnQua2V5LmRlbGV0ZVNjb3BlKCAnZGlhbG9nJyApXG4gIEV2ZW50Lm9mZiggZGlhbG9nRWwsICdjbGljaycgKVxuXG4gIC8vIFJlbW92ZSB0aGUgZWxlbWVudFxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBkaWFsb2dFbCApXG5cbiAgLy8gRmlyZSBvbiBjbG9zZSBjYWxsYmFja1xuICBkZWZhdWx0cy5vbkNsb3NlKClcblxuICAvLyBSZXR1cm4gZm9jdXMgdG8gdGhlIGZvY3VzZWQgZWxlbWVudCBiZWZvcmUgdGhlIGRpYWxvZyB3YXMgc2hvd25cbiAgZm9jdXNlZEVsLmZvY3VzKClcbn1cblxuZnVuY3Rpb24gdGVtcGxhdGUoIGh0bWwgKSB7XG4gIHdyYXAuaW5uZXJIVE1MID0gaHRtbFxuICB2YXIgZWwgPSB3cmFwLmZpcnN0Q2hpbGRcbiAgd3JhcC5yZW1vdmVDaGlsZCggZWwgKVxuICByZXR1cm4gZWxcbn1cblxuLy8gR2V0IGFsbCBvcHRpb25zIGZyb20gZGF0YS1kaWFsb2ctKlxuZnVuY3Rpb24gZXh0cmFjdE9wdGlvbnMoIGVsICkge1xuICB2YXIgb3B0cyA9IHtcbiAgICBpZjogICAgICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nSWYsXG4gICAgZm9sbG93OiAgICAgICBlbC5kYXRhc2V0LmRpYWxvZ0ZvbGxvdyxcbiAgICB0aXRsZTogICAgICAgIGVsLmRhdGFzZXQuZGlhbG9nVGl0bGUsXG4gICAgZGVzY3JpcHRpb246ICBlbC5kYXRhc2V0LmRpYWxvZ0Rlc2NyaXB0aW9uLFxuICAgIHN1Ym1pdDogICAgICAgZWwuZGF0YXNldC5kaWFsb2dTdWJtaXQsXG4gICAgY29udGludWU6ICAgICBlbC5kYXRhc2V0LmRpYWxvZ0NvbnRpbnVlLFxuICAgIGNhbmNlbDogICAgICAgZWwuZGF0YXNldC5kaWFsb2dDYW5jZWwsXG4gICAgY29uZmlybTogICAgICBlbC5kYXRhc2V0LmRpYWxvZ0NvbmZpcm0sXG4gICAgZGVzdHJ1Y3RpdmU6ICBlbC5kYXRhc2V0LmRpYWxvZ0Rlc3RydWN0aXZlXG4gIH1cblxuICBpZiAoIG9wdHMuY29uZmlybSApIHtcbiAgICBvcHRzLmNvbnRpbnVlID0gb3B0cy5jb250aW51ZSB8fCBlbC5pbm5lckhUTUxcbiAgICBvcHRzLnN1Ym1pdCAgID0gb3B0cy5zdWJtaXQgICB8fCB0b29sYm94LmdldENsb3Nlc3QoIGVsLCAnZm9ybScgKVxuICB9XG5cbiAgcmV0dXJuIG9wdHNcbn1cblxuRXZlbnQucmVhZHkoZnVuY3Rpb24oKSB7XG5cbiAgLy8gVHJpZ2dlciBpcyBjYWxsZWQgd2hlbiBhIERPTSBlbGVtZW50IHdpdGggZGF0YS10cmlnZ2VyPWRpYWxvZyBpcyBjbGlja2VkXG4gIC8vIFRoZSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHVzZWQgYXMgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSBkaWFsb2dcbiAgLy9cbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtZGlhbG9nLXRpdGxlXScsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICB2YXIgb3B0cyA9IGV4dHJhY3RPcHRpb25zKCBldmVudC5jdXJyZW50VGFyZ2V0IClcbiAgICBpZiAoICFvcHRzLmlmIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0cy5pZikgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgc2hvdyggb3B0cyApXG4gICAgfVxuICB9KVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNob3c6IHNob3csXG4gIGNhbmNlbDogY2FuY2VsQWN0aW9uLFxuICBjb250aW51ZTogY29udGludWVBY3Rpb24sXG4gIGRlZmF1bHRzOiBkZWZhdWx0c1xufVxuIiwiLy8gU2hpbXNcbnJlcXVpcmUoICcuL2xpYi9zaGltcy9fY2xhc3NsaXN0JyApXG52YXIgbWVyZ2UgICAgPSByZXF1aXJlKCAnLi9saWIvc2hpbXMvX29iamVjdC5hc3NpZ24nICksXG4gICAgZXZlbnQgICAgPSByZXF1aXJlKCAnY29tcG9zZS1ldmVudCcgKSxcbiAgICBsdXhvbiAgICA9IHJlcXVpcmUoICdsdXhvbicgKSxcbiAgICB0aW1lICAgICA9IG1lcmdlKHJlcXVpcmUoICcuL2xpYi90aW1lJyApLCBsdXhvbiksXG4gICAgc2Nyb2xsVG8gPSByZXF1aXJlKCAnLi9saWIvc2Nyb2xsdG8nICksXG4gICAgZnJvbVRvcCAgPSByZXF1aXJlKCAnLi9saWIvZnJvbXRvcCcgKSxcbiAgICBlYXNlICAgICA9IHJlcXVpcmUoICcuL2xpYi9lYXNlJyApXG5cbnZhciB0b29sYm94ID0ge1xuXG4gIGV2ZW50OiBldmVudCxcbiAgc2Nyb2xsVG86IHNjcm9sbFRvLFxuICBmcm9tVG9wOiBmcm9tVG9wLFxuICBtZXJnZTogbWVyZ2UsXG4gIGVhc2U6IGVhc2UsXG4gIHRpbWU6IHRpbWUsXG5cbiAgLy8gR2V0IGNsb3Nlc3QgRE9NIGVsZW1lbnQgdXAgdGhlIHRyZWUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0Q2xvc2VzdDogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBlbCwgc2VsZWN0b3IgKSApIHJldHVybiBlbFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSxcblxuICBjaGlsZE9mOiBmdW5jdGlvbiAoIGVsLCBwYXJlbnQgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwgPT0gcGFyZW50ICkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIC8vIEdldCBuZXh0IERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yXG4gIGdldE5leHQ6IGZ1bmN0aW9uKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgZm9yICggOyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSApIHtcbiAgICAgIGlmICggZWwucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKSApIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gTWF0Y2hlcyBzZWxlY3RvciBmdW5jdGlvblxuICAvLyBAcmVmZXJlbmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAgbWF0Y2hlczogZnVuY3Rpb24gKCBlbCwgc2VsZWN0b3IgKSB7XG4gICAgcmV0dXJuICggZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbC5vTWF0Y2hlc1NlbGVjdG9yICkuY2FsbCggZWwsIHNlbGVjdG9yICk7XG4gIH0sXG5cbiAgd29yZENvdW50OiBmdW5jdGlvbiggc3RyICkge1xuICAgIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKCAvXFxTKy9nICk7XG4gICAgcmV0dXJuIG1hdGNoZXMgPyBtYXRjaGVzLmxlbmd0aCA6IDA7XG4gIH0sXG5cbiAgLy8gRWFzeSBhY2Nlc3MgdG8gc2xpY2UgZm9yIGNvbnZlcnRpbmcgb2JqZWN0cyBpbnRvIGFycmF5cyBvZiB2YWx1ZXMuXG4gIHNsaWNlOiBmdW5jdGlvbiggb2JqLCBjb3VudCApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIG9iaiwgY291bnQgKVxuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sbGVjdGlvbiwgY2FsbGJhY2sgKVxuICB9LFxuXG4gIGZvcm1EYXRhOiBmdW5jdGlvbiggcm9vdEVsICkge1xuICAgIHZhciBmb3JtRGF0YSAgPSBuZXcgRm9ybURhdGEoKSxcbiAgICAgICAgZmllbGRzID0gcm9vdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoICdpbnB1dFtuYW1lXScgKVxuXG4gICAgLy8gTG9vcCBvdmVyIGZpZWxkc1xuICAgIHRvb2xib3guZWFjaCggZmllbGRzLCBmdW5jdGlvbiggZmllbGQgKSB7XG4gICAgICAvLyBBcHBlbmQgY3VycmVudCBmaWVsZOKAmXMgbmFtZS92YWx1ZSB0byBuZXcgZm9ybURhdGEgb2JqZWN0XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoIGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlICk7XG4gICAgfSlcblxuICAgIC8vIFRoZW4gcmV0dXJuIHNhaWQgZm9ybURhdGEgb2JqZWN0XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xuICB9XG5cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvb2xib3hcbiIsIi8vIGVhc2luZyBmdW5jdGlvbnMgaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG52YXIgZWFzZSA9IHtcblxuICBpbk91dFF1YWQ6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG4gICAgdCAvPSBkLzJcbiAgICBpZiAodCA8IDEpIHsgcmV0dXJuIGMvMip0KnQgKyBiIH1cbiAgICB0LS1cbiAgICByZXR1cm4gLWMvMiAqICh0Kih0LTIpIC0gMSkgKyBiXG4gIH0sXG5cbiAgaW5PdXRDdWJpYzogZnVuY3Rpb24gKHQsIGIsIGMsIGQpIHtcblx0dCAvPSBkLzI7XG5cdGlmICh0IDwgMSkgcmV0dXJuIGMvMip0KnQqdCArIGI7XG5cdHQgLT0gMjtcblx0cmV0dXJuIGMvMioodCp0KnQgKyAyKSArIGI7XG4gIH0sXG5cbiAgaW5PdXRRdWludDogZnVuY3Rpb24odCwgYiwgYywgZCkge1xuICAgIHZhciB0cyA9ICh0Lz1kKSp0LFxuICAgIHRjID0gdHMqdDtcbiAgICByZXR1cm4gYitjKig2KnRjKnRzICsgLTE1KnRzKnRzICsgMTAqdGMpO1xuICB9LFxuXG4gIGluT3V0Q2lyYzogZnVuY3Rpb24gKHQsIGIsIGMsIGQpIHtcbiAgICB0IC89IGQvMjtcbiAgICBpZiAodCA8IDEpIHJldHVybiAtYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSAtIDEpICsgYjtcbiAgICB0IC09IDI7XG4gICAgcmV0dXJuIGMvMiAqIChNYXRoLnNxcnQoMSAtIHQqdCkgKyAxKSArIGI7XG4gIH1cblxufVxuXG5lYXNlLmRlZmF1bHQgPSBlYXNlLmluT3V0UXVhZFxuXG5tb2R1bGUuZXhwb3J0cyA9IGVhc2VcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oIGVsICkge1xuICByZXR1cm4gTWF0aC5yb3VuZCggZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0ICk7XG59XG4iLCJ2YXIgZWFzZSAgICA9IHJlcXVpcmUoICcuL2Vhc2UnIClcbnZhciBmcm9tVG9wID0gcmVxdWlyZSggJy4vZnJvbXRvcCcgKVxuXG5mdW5jdGlvbiBtb3ZlKGFtb3VudCkge1xuXG4gIC8vIFNjcm9sbCBhbGwgYmVjYXVzZSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IGlzIHN0aWxsIGV4cGlyZW1lbnRhbFxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gYW1vdW50O1xuICBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsVG9wID0gYW1vdW50O1xuICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IGFtb3VudDtcblxufVxuXG5mdW5jdGlvbiBwb3NpdGlvbigpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsVG8odG8sIGNhbGxiYWNrLCBkdXJhdGlvbikge1xuXG4gIC8vIE1ha2luZyBhcmdzIGZsZXhpYmxlXG4gIC8vXG4gIC8vIEFsbG93IGZvciBlbGVtZW50IG9yIHktY29vcmRpbmF0ZXNcbiAgaWYoIHR5cGVvZiggdG8gKSA9PT0gJ29iamVjdCcgKSB7IHRvID0gZnJvbVRvcCggdG8gKSB9XG5cbiAgLy8gQWNjZXB0IGR1cmF0aW9uIGFzIHRoZSBzZWNvbmQgYXJndW1lbnRcbiAgaWYoIHR5cGVvZiggY2FsbGJhY2sgKSA9PT0gJ251bWJlcicgKSB7IGR1cmF0aW9uID0gY2FsbGJhY2s7IGNhbGxiYWNrID0gbnVsbCB9XG5cbiAgLy8gRGVmYXVsdCBkdXJhdGlvbiA9IDUwMFxuICBkdXJhdGlvbiA9ICggdHlwZW9mKCBkdXJhdGlvbiApID09PSAndW5kZWZpbmVkJyApID8gNTAwIDogZHVyYXRpb25cblxuICB2YXIgc3RhcnQgPSBwb3NpdGlvbigpLFxuICAgIGNoYW5nZSA9IHRvIC0gc3RhcnQsXG4gICAgY3VycmVudFRpbWUgPSAwLFxuICAgIGluY3JlbWVudCA9IDIwO1xuXG5cbiAgdmFyIGFuaW1hdGVTY3JvbGwgPSBmdW5jdGlvbigpIHtcblxuICAgIC8vIGluY3JlbWVudCB0aGUgdGltZVxuICAgIGN1cnJlbnRUaW1lICs9IGluY3JlbWVudFxuXG4gICAgLy8gZmluZCB0aGUgdmFsdWUgd2l0aCB0aGUgcXVhZHJhdGljIGluLW91dCBlYXNpbmcgZnVuY3Rpb25cbiAgICB2YXIgdmFsID0gZWFzZS5kZWZhdWx0KGN1cnJlbnRUaW1lLCBzdGFydCwgY2hhbmdlLCBkdXJhdGlvbilcblxuICAgIC8vIG1vdmUgdGhlIGRvY3VtZW50LmJvZHlcbiAgICBtb3ZlKHZhbCk7XG5cbiAgICAvLyBkbyB0aGUgYW5pbWF0aW9uIHVubGVzcyBpdHMgb3ZlclxuICAgIGlmICggY3VycmVudFRpbWUgPCBkdXJhdGlvbiApIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0ZVNjcm9sbCApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICggY2FsbGJhY2sgJiYgdHlwZW9mKCBjYWxsYmFjayApID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhbmltYXRlU2Nyb2xsKClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzY3JvbGxUb1xuIiwiLyoqXG4gKiBDbGFzc0xpc3QgcG9seWZpbGxcbiAqIENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvblxuICogQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qc1xuICogQGF1dGhvciBFbGkgR3JleSAtIGh0dHA6Ly9lbGlncmV5LmNvbVxuICogQGxpY2Vuc2UgTUlUXG4gKiovXG5cbmlmICggJ2RvY3VtZW50JyBpbiBzZWxmICkge1xuXG4gIC8vIEZ1bGwgcG9seWZpbGwgZm9yIGJyb3dzZXJzIHdpdGggbm8gY2xhc3NMaXN0IHN1cHBvcnRcbiAgaWYgKCAhKCAnY2xhc3NMaXN0JyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnXycgKSApICkge1xuXG4gICAgKCBmdW5jdGlvbiggdmlldyApIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGlmICggISggJ0VsZW1lbnQnIGluIHZpZXcgKSApIHJldHVybjtcblxuICAgIHZhclxuICAgICAgY2xhc3NMaXN0UHJvcCA9ICdjbGFzc0xpc3QnLFxuICAgICAgcHJvdG9Qcm9wICAgICA9ICdwcm90b3R5cGUnLFxuICAgICAgZWxlbUN0clByb3RvICA9IHZpZXcuRWxlbWVudFsgcHJvdG9Qcm9wIF0sXG4gICAgICBvYmpDdHIgICAgICAgID0gT2JqZWN0LFxuXG4gICAgICBzdHJUcmltID0gU3RyaW5nWyBwcm90b1Byb3AgXS50cmltIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKCAvXlxccyt8XFxzKyQvZywgJycgKTtcbiAgICAgIH0sXG5cbiAgICAgIGFyckluZGV4T2YgPSBBcnJheVsgcHJvdG9Qcm9wIF0uaW5kZXhPZiB8fCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICBpZiAoIGkgaW4gdGhpcyAmJiB0aGlzWyBpIF0gPT09IGl0ZW0gKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSxcblxuICAgICAgRE9NRXggPSBmdW5jdGlvbiggdHlwZSwgbWVzc2FnZSApIHtcbiAgICAgICAgdGhpcy5uYW1lICAgID0gdHlwZTtcbiAgICAgICAgdGhpcy5jb2RlICAgID0gRE9NRXhjZXB0aW9uWyB0eXBlIF07XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICB9LFxuXG4gICAgICBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiggY2xhc3NMaXN0LCB0b2tlbiApIHtcbiAgICAgICAgaWYgKCB0b2tlbiA9PT0gJycgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFxuICAgICAgICAgICAgJ1NZTlRBWF9FUlInLFxuICAgICAgICAgICAgJ0FuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICggL1xccy8udGVzdCggdG9rZW4gKSApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXG4gICAgICAgICAgICAnSU5WQUxJRF9DSEFSQUNURVJfRVJSJyxcbiAgICAgICAgICAgICdTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXInXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJySW5kZXhPZi5jYWxsKCBjbGFzc0xpc3QsIHRva2VuICk7XG4gICAgICB9LFxuXG4gICAgICBDbGFzc0xpc3QgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgdmFyIHRyaW1tZWRDbGFzc2VzID0gc3RyVHJpbS5jYWxsKCBlbGVtLmdldEF0dHJpYnV0ZSggJ2NsYXNzJyApIHx8ICcnICksXG4gICAgICAgICAgICBjbGFzc2VzID0gdHJpbW1lZENsYXNzZXMgPyB0cmltbWVkQ2xhc3Nlcy5zcGxpdCggL1xccysvICkgOiBbXTtcblxuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICAgIHRoaXMucHVzaCggY2xhc3Nlc1sgaSBdICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgdGhpcy50b1N0cmluZygpICk7XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICBjbGFzc0xpc3RQcm90byA9IENsYXNzTGlzdFsgcHJvdG9Qcm9wIF0gPSBbXSxcblxuICAgICAgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xhc3NMaXN0KCB0aGlzICk7XG4gICAgICB9O1xuXG4gICAgRE9NRXhbIHByb3RvUHJvcCBdID0gRXJyb3JbIHByb3RvUHJvcCBdO1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uaXRlbSA9IGZ1bmN0aW9uKCBpICkge1xuICAgICAgcmV0dXJuIHRoaXNbIGkgXSB8fCBudWxsO1xuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5jb250YWlucyA9IGZ1bmN0aW9uKCB0b2tlbiApIHtcbiAgICAgIHRva2VuICs9ICcnO1xuICAgICAgcmV0dXJuIGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKSAhPT0gLTE7XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLmFkZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyXG4gICAgICAgIHRva2VucyAgPSBhcmd1bWVudHMsXG4gICAgICAgIGl0ZXIgICAgPSAwLFxuICAgICAgICBsZW4gICAgID0gdG9rZW5zLmxlbmd0aCxcbiAgICAgICAgdXBkYXRlZCA9IGZhbHNlLFxuICAgICAgICB0b2tlbjtcblxuICAgICAgZG8ge1xuICAgICAgICB0b2tlbiA9IHRva2Vuc1sgaXRlciBdICsgJyc7XG4gICAgICAgIGlmICggY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApID09PSAtMSApIHtcbiAgICAgICAgICB0aGlzLnB1c2goIHRva2VuICk7XG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCArK2l0ZXIgPCBsZW4gKTtcblxuICAgICAgaWYgKCB1cGRhdGVkICkge1xuICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXJcbiAgICAgICAgdG9rZW5zICA9IGFyZ3VtZW50cyxcbiAgICAgICAgaXRlciAgICA9IDAsXG4gICAgICAgIGxlbiAgICAgPSB0b2tlbnMubGVuZ3RoLFxuICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBpbmRleDtcblxuICAgICAgZG8ge1xuICAgICAgICB0b2tlbiA9IHRva2Vuc1sgaXRlciBdICsgJyc7XG4gICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApO1xuXG4gICAgICAgIHdoaWxlICggaW5kZXggIT09IC0xICkge1xuICAgICAgICAgIHRoaXMuc3BsaWNlKCBpbmRleCwgMSApO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KCB0aGlzLCB0b2tlbiApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICggKytpdGVyIDwgbGVuICk7XG5cbiAgICAgIGlmICggdXBkYXRlZCApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uKCB0b2tlbiwgZm9yY2UgKSB7XG4gICAgICB0b2tlbiArPSAnJztcblxuICAgICAgdmFyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY29udGFpbnMoIHRva2VuICksXG4gICAgICAgIG1ldGhvZCA9IHJlc3VsdCA/IGZvcmNlICE9PSB0cnVlICYmICdyZW1vdmUnIDogZm9yY2UgIT09IGZhbHNlICYmICdhZGQnO1xuXG4gICAgICBpZiAoIG1ldGhvZCApIHtcbiAgICAgICAgdGhpc1sgbWV0aG9kIF0oIHRva2VuICk7XG4gICAgICB9XG5cbiAgICAgIGlmICggZm9yY2UgPT09IHRydWUgfHwgZm9yY2UgPT09IGZhbHNlICkge1xuICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gIXJlc3VsdDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmpvaW4oICcgJyApO1xuICAgIH07XG5cbiAgICBpZiAoIG9iakN0ci5kZWZpbmVQcm9wZXJ0eSApIHtcbiAgICAgIHZhciBjbGFzc0xpc3RQcm9wRGVzYyA9IHtcbiAgICAgICAgICBnZXQgICAgICAgICAgOiBjbGFzc0xpc3RHZXR0ZXIsXG4gICAgICAgICAgZW51bWVyYWJsZSAgIDogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGUgOiB0cnVlXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoIGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MgKTtcbiAgICAgIH1cblxuICAgICAgY2F0Y2ggKCBleCApIHtcbiAgICAgICAgaWYgKCBleC5udW1iZXIgPT09IC0weDdGRjVFQzU0ICkge1xuICAgICAgICAgIGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICBvYmpDdHIuZGVmaW5lUHJvcGVydHkoIGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICggb2JqQ3RyWyBwcm90b1Byb3AgXS5fX2RlZmluZUdldHRlcl9fICkge1xuICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdEdldHRlciApO1xuICAgIH1cblxuICAgIH0oIHNlbGYgKSk7XG5cbiAgfSBlbHNlIHtcblxuICAgICggZnVuY3Rpb24oKSB7XG5cbiAgICAgICd1c2Ugc3RyaWN0JztcblxuICAgICAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ18nICk7XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoICdjMScsICdjMicgKTtcblxuICAgICAgaWYgKCAhdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnYzInICkgKSB7XG4gICAgICAgIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiggbWV0aG9kICkge1xuICAgICAgICAgIHZhciBvcmlnaW5hbCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGVbIG1ldGhvZCBdO1xuXG4gICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdG9rZW4gKSB7XG4gICAgICAgICAgICB2YXIgaSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcbiAgICAgICAgICAgICAgdG9rZW4gPSBhcmd1bWVudHNbIGkgXTtcbiAgICAgICAgICAgICAgb3JpZ2luYWwuY2FsbCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBjcmVhdGVNZXRob2QoICdhZGQnICk7XG4gICAgICAgIGNyZWF0ZU1ldGhvZCggJ3JlbW92ZScgKTtcbiAgICAgIH1cblxuICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSggJ2MzJywgZmFsc2UgKTtcblxuICAgICAgaWYgKCB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoICdjMycgKSApIHtcbiAgICAgICAgdmFyIF90b2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtcblxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKCB0b2tlbiwgZm9yY2UgKSB7XG4gICAgICAgICAgaWYgKCAxIGluIGFyZ3VtZW50cyAmJiAhdGhpcy5jb250YWlucyggdG9rZW4gKSA9PT0gIWZvcmNlICkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX3RvZ2dsZS5jYWxsKCB0aGlzLCB0b2tlbiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgfVxuXG4gICAgICB0ZXN0RWxlbWVudCA9IG51bGw7XG5cbiAgICB9KCkpO1xuXG4gIH1cbn1cbiIsIi8qKlxuICogT2JqZWN0LmFzc2lnbiBwb2x5ZmlsbFxuICogQ3Jvc3MtYnJvd3NlciBmdWxsIE9iamVjdC5hc3NpZ24gaW1wbGVtZW50YXRpb25cbiAqIEBzb3VyY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbiNQb2x5ZmlsbFxuICogQGxpY2Vuc2UgTUlUXG4gKiovXG5cbmlmICggdHlwZW9mIE9iamVjdC5hc3NpZ24gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgKCBmdW5jdGlvbigpIHtcbiAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24oIHRhcmdldCApIHtcbiAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCAnQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0JyApO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcbiAgICAgIGZvciAoIHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKyApIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1sgaW5kZXggXTtcbiAgICAgICAgaWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7XG4gICAgICAgICAgZm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuICAgICAgICAgICAgaWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwgbmV4dEtleSApICkge1xuICAgICAgICAgICAgICBvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xuICB9KSgpO1xufVxuXG4vLyBNYWtlIGl0IGVhc3kgdG8gbWVyZ2Ugb2JqZWN0cyB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZSBvcmlnaW5hbCBvYmplY3RzXG52YXIgbWVyZ2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFyZ3MgPSBbe31dLmNvbmNhdCggQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoIHRoaXMsIGFyZ3MgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlXG4iLCJ2YXIgRGF0ZVRpbWUgPSByZXF1aXJlKCAnbHV4b24nICkuRGF0ZVRpbWVcblxuZnVuY3Rpb24gaXNCZWZvcmUoIGRhdGUsIGVuZCApIHtcbiAgZW5kID0gcGFyc2UoIGVuZCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1pbiggZW5kLCBkYXRlIClcbn1cblxuZnVuY3Rpb24gaXNBZnRlciggZGF0ZSwgc3RhcnQgKSB7XG4gIHN0YXJ0ID0gcGFyc2UoIHN0YXJ0IClcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgcmV0dXJuIGRhdGUgPT0gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQmV0d2VlbiggZGF0ZSwgZGF0ZTEsIGRhdGUyICkge1xuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICBkYXRlMSA9IHBhcnNlKCBkYXRlMSApXG4gIGRhdGUyID0gcGFyc2UoIGRhdGUyIClcblxuICBpZiAoIGRhdGUuaXNWYWxpZCAmJiBkYXRlMS5pc1ZhbGlkICYmIGRhdGUyLmlzVmFsaWQgKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgKHRvIGFsbG93IGFueSBvcmRlciBpbiBhcmdzKVxuICAgIHZhciBzdGFydCA9IERhdGVUaW1lLm1pbiggZGF0ZTEsIGRhdGUyIClcbiAgICB2YXIgZW5kID0gRGF0ZVRpbWUubWF4KCBkYXRlMSwgZGF0ZTIgKVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKSA9PSBEYXRlVGltZS5taW4oIGRhdGUsIGVuZCApXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2UoIGRhdGUsIG9wdGlvbnMgKSB7XG4gIHZhciBmb3JtYXRzID0gWyBcIklTT1wiLCBcIlNRTFwiLCBcIkhUVFBcIiwgXCJSRkMyODIyXCIgXSxcbiAgICAgIHBhcnNlZERhdGVcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmICggb3B0aW9ucy5taWxsaXMgJiYgIWlzTmFOKCBkYXRlICkgKSB7XG4gICAgZGF0ZSA9IE51bWJlciggZGF0ZSApXG4gICAgZm9ybWF0cy51bnNoaWZ0KCdNaWxsaXMnKVxuICB9XG5cbiAgaWYgKCB0eXBlb2YgZGF0ZSA9PSAnb2JqZWN0JyApIHtcbiAgICBcbiAgICAvLyBJcyBhbHJlYWR5IGEgRGF0ZVRpbWUgb2JqZWN0XG4gICAgaWYgKCBkYXRlLnRvSVNPICkgcmV0dXJuIGRhdGVcbiAgICBlbHNlIGZvcm1hdHMudW5zaGlmdCggJ09iamVjdCcgKVxuXG4gIC8vIFBhcnNlIHN0cmluZyBmb3JtYXRzXG4gIH1cblxuICBmb3JtYXRzLmZvckVhY2goIGZ1bmN0aW9uKCBmb3JtYXQgKSB7XG4gICAgaWYgKCggIXBhcnNlZERhdGUgfHwgIXBhcnNlZERhdGUuaXNWYWxpZCApICYmIERhdGVUaW1lWydmcm9tJytmb3JtYXRdICkge1xuICAgICAgcGFyc2VkRGF0ZSA9IERhdGVUaW1lWydmcm9tJytmb3JtYXRdKCBkYXRlLCBvcHRpb25zIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHBhcnNlZERhdGUuaXNWYWxpZCA/IHBhcnNlZERhdGUgOiBmYWxzZVxufVxuXG4vLyBSZW1vdmUgaW5zaWduaWZpY2FudCBkaWdpdHNcbmZ1bmN0aW9uIHByZXR0eVByaW50KCBkYXRlLCBvcHRpb25zICkge1xuICBkYXRlID0gcGFyc2UoIGRhdGUsIG9wdGlvbnMgKVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuem9uZSkgZGF0ZSA9IGRhdGUuc2V0Wm9uZShvcHRpb25zLnpvbmUpXG5cbiAgaWYgKCBkYXRlICkge1xuICAgIHJldHVybiBkYXRlLnRvSVNPKCkucmVwbGFjZSgnVCcsICcgJykucmVwbGFjZSgnLjAwMCcsJyAnKS5yZXBsYWNlKCc6MDAgJywnICcpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiVW5wYXJzZWFibGUgZGF0ZSBzdHJpbmdcIiBcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCZWZvcmU6IGlzQmVmb3JlLFxuICBpc0FmdGVyOiBpc0FmdGVyLFxuICBpc0JldHdlZW46IGlzQmV0d2VlbixcbiAgcGFyc2U6IHBhcnNlLFxuICBwcmV0dHlQcmludDogcHJldHR5UHJpbnRcbn1cbiIsInJlcXVpcmUoICcuL2xpYi9zaGltcy9jdXN0b20tZXZlbnQnIClcblxudmFyIGJlYW4gPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGtleSAgPSByZXF1aXJlKCAna2V5bWFzdGVyJyApIFxudmFyIGFuaW1hdGlvbkV2ZW50ICAgID0gcmVxdWlyZSggJy4vbGliL2FuaW1hdGlvbi1ldmVudHMnIClcbnZhciBwYWdlICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9wYWdlJyApXG52YXIgdGFwICAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvdGFwLWV2ZW50cycgKVxudmFyIGRlYm91bmNlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlYm91bmNlJyApXG52YXIgdGhyb3R0bGUgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvdGhyb3R0bGUnIClcbnZhciBkZWxheSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9kZWxheScgKVxudmFyIHJlcGVhdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3JlcGVhdCcgKVxudmFyIGJ1YmJsZUZvcm1FdmVudHMgID0gcmVxdWlyZSggJy4vbGliL2J1YmJsZS1mb3JtLWV2ZW50cycgKVxudmFyIHN1Ym1pdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3N1Ym1pdCcgKVxudmFyIHNjcm9sbCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Njcm9sbCcgKVxudmFyIHJlc2l6ZSAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Jlc2l6ZScgKVxudmFyIGNhbGxiYWNrTWFuYWdlciAgID0gcmVxdWlyZSggJy4vbGliL2NhbGxiYWNrLW1hbmFnZXInIClcbnZhciBtZWRpYSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9tZWRpYScgKVxuXG52YXIgc2xpY2UgICAgICAgICAgICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2VcbnZhciBmb3JtQnViYmxpbmcgICAgICA9IGZhbHNlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8vIERPTSBldmVudHNcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgb25lOiBvbmUsXG4gIGZpcmU6IGZpcmUsXG4gIGNsb25lOiBiZWFuLmNsb25lLFxuICByZWFkeTogcGFnZS5yZWFkeSxcbiAgY2hhbmdlOiBwYWdlLmNoYW5nZSxcbiAgYWZ0ZXJBbmltYXRpb246IGFmdGVyQW5pbWF0aW9uLFxuXG4gIC8vIE1lZGlhIHF1ZXJ5IGV2ZW50c1xuICBtZWRpYTogbWVkaWEsXG5cbiAgLy8gS2V5Ym9hcmQgZXZlbnRzXG4gIGtleToga2V5LFxuICBrZXlPbjoga2V5LFxuICBrZXlPZmY6IGtleS51bmJpbmQsXG4gIGtleU9uZToga2V5T25lLFxuXG4gIC8vIFRpbWluZyB1dGlsaXRpZXNcbiAgZGVib3VuY2U6IGRlYm91bmNlLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGRlbGF5OiAgICBkZWxheSxcbiAgcmVwZWF0OiAgIHJlcGVhdCxcblxuICAvLyBPcHRpbWl6ZWQgRXZlbnQgTWFuYWdlcnNcbiAgc2Nyb2xsOiAgICAgIHNjcm9sbCxcbiAgcmVzaXplOiAgICAgIHJlc2l6ZSxcblxuICBjYWxsYmFja01hbmFnZXI6IGNhbGxiYWNrTWFuYWdlcixcbiAgY2FsbGJhY2s6IGNhbGxiYWNrTWFuYWdlci5jYWxsYmFjayxcblxuICAvLyBCdWJibGluZyBmaXhcbiAgYnViYmxlRm9ybUV2ZW50czogYnViYmxlRm9ybUV2ZW50cyxcblxuICBzdWJtaXQ6IHN1Ym1pdFxufVxuXG4vLyBCZWFuIGRvZXNuJ3QgYWNjb3VudCBmb3IgY3Jvc3MtYnJvd3NlciBzdXBwb3J0IG9uIGFuaW1hdGlvbiBldmVudHNcbi8vIFNvIHJhdGhlciB0aGFuIHBhc3MgdGhyb3VnaCBldmVudHMgdG8gYmVhbiwgd2UgcHJvY2VzcyB0aGVtIHRvIGFkZFxuLy8gdmVuZG9yIHByZWZpeGVzIG9yIHJlbW92ZSBldmVudHMgaWYgYnJvd3NlcnMgZG8gbm90IHN1cHBvciB0aGVtXG4vL1xuZnVuY3Rpb24gb24gKCkge1xuICBzZXRFdmVudCggJ29uJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBvZmYgKCkge1xuICBzZXRFdmVudCggJ29mZicsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gb25lICgpIHtcbiAgc2V0RXZlbnQoICdvbmUnLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIGZpcmUgKCkge1xuXG4gIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKVxuICB2YXIgZWwgPSBhcmdzWzBdXG4gIHZhciBldmVudHMgPSBbXVxuXG4gIGFyZ3NbMV0uc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cbiAgICB2YXIgZXZlbnQgPSBhbmltYXRpb25FdmVudC50cmFuc2Zvcm0oIGV2ZW50IClcbiAgICBpZiAoICFpc0VtcHR5KCBldmVudCApICkgZXZlbnRzLnB1c2goIGV2ZW50IClcblxuICB9KVxuXG4gIGlmICggIWlzRW1wdHkoIGV2ZW50cyApICkge1xuXG4gICAgYXJnc1sxXSA9IGV2ZW50cy5qb2luKCAnICcgKVxuICAgIGJlYW4uZmlyZS5hcHBseSggdGhpcywgYXJncyApXG5cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRFdmVudCggcmVnaXN0ZXJUeXBlLCBhcmdzICkge1xuXG4gIHRyYW5zZm9ybUFyZ3MoIGFyZ3MgKS5mb3JFYWNoKCBmdW5jdGlvbiggYXJnICkge1xuICAgIGJlYW5bIHJlZ2lzdGVyVHlwZSBdLmFwcGx5KCBudWxsLCBhcmcgKVxuICB9KVxuXG59XG5cbi8vIEFkZCBzdXBwb3J0IGZvciB1bmJpbmRpbmcgYSBrZXkgZXZlbnQgYWZ0ZXIgaXQgaXMgY2FsbGVkXG4vL1xuZnVuY3Rpb24ga2V5T25lICgga2V5cywgc2NvcGUsIGZuICkge1xuXG4gIGlmICggdHlwZW9mIHNjb3BlID09ICdmdW5jdGlvbicgKSB7XG4gICAgZm4gPSBzY29wZVxuICAgIHNjb3BlID0gJ2FsbCdcbiAgfVxuXG4gIGtleSgga2V5cywgc2NvcGUsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBrZXkudW5iaW5kKCBrZXlzLCBzY29wZSApXG4gICAgZm4oIGV2ZW50IClcbiAgfSlcbn1cblxuZnVuY3Rpb24gYWZ0ZXJBbmltYXRpb24oIGVsLCBjYWxsYmFjaywgY2hlY2tTdGFydCApIHtcbiAgdmFyIGhhc0FuaW1hdGlvbiA9ICEhd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsICkuZ2V0UHJvcGVydHlWYWx1ZSggJ2FuaW1hdGlvbi1kdXJhdGlvbicgKVxuXG4gIGlmICggaGFzQW5pbWF0aW9uICkge1xuICAgIFxuICAgIC8vIElmIGVsZW1lbnQgaXMgbm90IGFuaW1hdGluZyBhZnRlciBkZWxheSwgZmlyZSBjYWxsYmFja1xuICAgIGlmICggY2hlY2tTdGFydCApIHtcblxuICAgICAgdmFyIHRpbWUgPSAoKHR5cGVvZiBjaGVja1N0YXJ0ID09IFwibnVtYmVyXCIpID8gY2hlY2tTdGFydCA6IDIwKSxcbiAgICAgICAgICBkZWxheWVkRXZlbnQgPSBkZWxheSggY2FsbGJhY2ssIHRpbWUgKVxuXG4gICAgICAvLyBEZWxheSB3aXRoIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBmaXJlIGNhbGxiYWNrIG9ubHkgYWZ0ZXIgXG4gICAgICAvLyBhdCBsZWFzdCBvbmUgYW5pbWF0aW9uIGZyYW1lIGhhcyBwYXNzZWRcblxuICAgICAgb25lKCBlbCwgJ2FuaW1hdGlvbnN0YXJ0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gY2FuY2VsIGRlbGF5ZWQgZmlyZVxuICAgICAgICBkZWxheWVkRXZlbnQuc3RvcCgpXG5cbiAgICAgICAgLy8gd2F0Y2ggZm9yIGFuaW1hdGlvbiB0byBmaW5pc2hcbiAgICAgICAgb25lKCBlbCwgJ2FuaW1hdGlvbmVuZCcsIGNhbGxiYWNrIClcbiAgICAgIH0pXG5cblxuICAgIH0gZWxzZSB7XG4gICAgICBvbmUoIGVsLCAnYW5pbWF0aW9uZW5kJywgY2FsbGJhY2sgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuLy8gVHJhbnNmb3JtIGV2ZW50IGFyZ3VtZW50cyB0byBoYW5kbGUgdGFwIGV2ZW50IGFuZCBjcm9zcy1icm93c2VyIGFuaW1hdGlvbiBldmVudHNcbi8vIFJldHVybnMgYW4gYXJyYXkgb2YgZXZlbnRzIHRvIGJlIHJlZ2lzdGVyZWQgaW5kaXZpZHVhbGx5XG4vL1xuZnVuY3Rpb24gdHJhbnNmb3JtQXJncyggYXJncyApIHtcblxuICB2YXIgdHJhbnNmb3JtZWRBcmdzID0gW11cbiAgdmFyIG5ld0V2ZW50cyA9IHt9XG4gIHZhciBlbGVtZW50ID0gYXJncy5zaGlmdCgpIC8vIHJldHJpZXZlIGVsZW1lbnRcbiAgdmFyIGV2ZW50cyA9IGFyZ3Muc2hpZnQoKVxuXG4gIC8vIGRldGVjdCBldmVudCBkZWxlZ2F0ZSBzZWxlY3RvclxuICBpZiAoIHR5cGVvZiBhcmdzWzBdICE9ICdmdW5jdGlvbicgKSB7XG4gICAgdmFyIGRlbGVnYXRlID0gYXJncy5zaGlmdCgpXG4gIH1cblxuICAvLyBjb252ZXJ0IGV2ZW50IHN0cmluZ3MgdG8gb2JqZWN0IGJhc2VkIGV2ZW50cyBmb3IgY29kZSBzaW1wbGlmaWNhdGlvblxuICAvLyBleGFtcGxlOiBhcmd1bWVudHMgKCdob3ZlciBmb2N1cycsIGZ1bmN0aW9uKSB3b3VsZCBiZWNvbWUgKHsgJ2hvdmVyIGZvY3VzJzogZnVuY3Rpb24gfSlcbiAgaWYgKCB0eXBlb2YgZXZlbnRzID09ICdzdHJpbmcnICkge1xuICAgIHZhciBvYmpFdmVudHMgPSB7fVxuICAgIG9iakV2ZW50c1tldmVudHNdID0gYXJncy5zaGlmdCgpXG4gICAgZXZlbnRzID0gb2JqRXZlbnRzXG4gIH1cblxuICAvLyBXYWxrIHRocm91Z2ggZWFjaCBrZXkgaW4gdGhlIGV2ZW50cyBvYmplY3QgYW5kIGFkZCB2ZW5kb3IgcHJlZml4ZXMgdG8gJ2FuaW1hdGlvbicgZXZlbnRzXG4gIC8vIGFuZCB3cmFwIGNhbGxiYWNrIGluIHRoZSB0YXAgZnVuY3Rpb24gZm9yIGFsbCAndGFwJyBldmVudHMuXG4gIC8vXG4gIGZvciAoIGV2ZW50IGluIGV2ZW50cyApIHtcblxuICAgIGlmICggZXZlbnRzLmhhc093blByb3BlcnR5KCBldmVudCApICkge1xuICAgICAgdmFyIGNhbGxiYWNrID0gZXZlbnRzW2V2ZW50XVxuXG4gICAgICAvLyBFdmVudHMgY2FuIGJlIHJlZ2lzdGVyZWQgYXMgc3BhY2Ugc2VwYXJhdGVkIGdyb3VwcyBsaWtlIFwiaG92ZXIgZm9jdXNcIlxuICAgICAgLy8gVGhpcyBoYW5kbGVzIGVhY2ggZXZlbnQgaW5kZXBlbmRhbnRseVxuICAgICAgLy9cbiAgICAgIGV2ZW50LnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGUgKXtcblxuICAgICAgICAvLyBJZiBpdCBpcyBhbiBhbmltYXRpb24gZXZlbnQsIHZlbmRvciBwcmVmaXggaXQsIG9yIGZpcmUgdGhlIGNhbGxiYWNrIGFjY29yZGluZyB0byBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgZSA9IGFuaW1hdGlvbkV2ZW50LnRyYW5zZm9ybSggZSApXG5cbiAgICAgICAgaWYgKCBpc0VtcHR5KCBlICkgKSB7XG4gICAgICAgICAgLy8gSWYgaXQncyBlbXB0eSwgaXQgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBhbmltYXRpb24gZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgdHJpZ2dlciB0aGUgZXZlbnQgaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjaygpXG5cbiAgICAgICAgfSBlbHNlIGlmICggZS5tYXRjaCggL3RhcC8gKSApIHtcblxuICAgICAgICAgIC8vIElmIGl0J3MgYSB0YXAgZXZlbnQsIHdyYXAgdGhlIGNhbGxiYWNrIGFuZCBzZXQgdGhlIGV2ZW50IHRvICd0b3VjaHN0YXJ0J1xuICAgICAgICAgIC8vIFRhcCBpc24ndCBhIHJlYWwgbmF0aXZlIGV2ZW50LCBidXQgdGhpcyB3cmFwcGVyIGxldHMgdXMgc2ltdWxhdGUgd2hhdCBhXG4gICAgICAgICAgLy8gbmF0aXZlIHRhcCBldmVudCB3b3VsZCBiZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ld0V2ZW50cy50b3VjaHN0YXJ0ID0gdGFwKCBjYWxsYmFjayApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3RXZlbnRzWyBlIF0gPSBjYWxsYmFja1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoIGV2ZW50IGluIG5ld0V2ZW50cyApIHtcbiAgICB2YXIgYSA9IFtdXG4gICAgYS5wdXNoKCBlbGVtZW50LCBldmVudCApXG5cbiAgICBpZiAoIGRlbGVnYXRlICkgYS5wdXNoKCBkZWxlZ2F0ZSApXG5cbiAgICBhLnB1c2goIG5ld0V2ZW50c1sgZXZlbnQgXSApXG4gICAgdHJhbnNmb3JtZWRBcmdzLnB1c2goIGEuY29uY2F0KCBhcmdzICkgKVxuICB9XG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQXJnc1xufVxuXG5cbmZ1bmN0aW9uIGlzRW1wdHkoIG9iaiApIHtcblxuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbiAgaWYgKCBvYmogPT0gbnVsbCB8fCBvYmoubGVuZ3RoID09PSAwICkgcmV0dXJuIHRydWVcblxuICBpZiAoIDAgPCBvYmoubGVuZ3RoICkgcmV0dXJuIGZhbHNlXG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmICggaGFzT3duUHJvcGVydHkuY2FsbCggb2JqLCBrZXkgKSApIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgY3NzQW5pbUV2ZW50VHlwZXMgPSBnZXRBbmltYXRpb25FdmVudFR5cGVzKClcbnZhciBzdXBwb3J0ZWQgPSBjc3NBbmltRXZlbnRUeXBlcy5hbmltYXRpb25zdGFydCAhPT0gdW5kZWZpbmVkXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50c1xufVxuXG5mdW5jdGlvbiBjYW1lbENhc2VFdmVudFR5cGVzKHByZWZpeCkge1xuICBwcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBhbmltYXRpb25zdGFydDogcHJlZml4ICsgJ0FuaW1hdGlvblN0YXJ0JyxcbiAgICBhbmltYXRpb25lbmQ6IHByZWZpeCArICdBbmltYXRpb25FbmQnLFxuICAgIGFuaW1hdGlvbml0ZXJhdGlvbjogcHJlZml4ICsgJ0FuaW1hdGlvbkl0ZXJhdGlvbidcbiAgfTtcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlRXZlbnRUeXBlcyhwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgYW5pbWF0aW9uc3RhcnQ6IHByZWZpeCArICdhbmltYXRpb25zdGFydCcsXG4gICAgYW5pbWF0aW9uZW5kOiBwcmVmaXggKyAnYW5pbWF0aW9uZW5kJyxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IHByZWZpeCArICdhbmltYXRpb25pdGVyYXRpb24nXG4gIH07XG59XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSBBbmltYXRpb24gZXZlbnQgdHlwZXMge2FuaW1hdGlvbnN0YXJ0LCBhbmltYXRpb25lbmQsIGFuaW1hdGlvbml0ZXJhdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiBnZXRBbmltYXRpb25FdmVudFR5cGVzKCkge1xuICB2YXIgcHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdNb3onLCAnTycsICcnXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8vIGJyb3dzZXIgY29tcGxpYW50XG4gIGlmICh1bmRlZmluZWQgIT09IHN0eWxlLmFuaW1hdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByZWZpeGVzLmxlbmd0aCwgcHJlZml4OyBpIDwgbGVuOyBpKyspIHtcbiAgICBwcmVmaXggPSBwcmVmaXhlc1tpXTtcblxuICAgIGlmICh1bmRlZmluZWQgIT09IHN0eWxlW3ByZWZpeCArICdBbmltYXRpb25OYW1lJ10pIHtcbiAgICAgIC8vIFdlYmtpdFxuICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZWxzZSBpZiAoMSA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICAgICAgfVxuICAgICAgLy8gT3BlcmFcbiAgICAgIGVsc2UgaWYgKDIgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuXG4vLyBBZGRzIG5lY2Vzc2FyeSBhZGQgdmVuZG9yIHByZWZpeGVzIG9yIGNhbWVsQ2FzZWQgZXZlbnQgbmFtZXNcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHMgKGV2ZW50KSB7XG4gIGlmICghZXZlbnQubWF0Y2goL2FuaW1hdGlvbi9pKSkge1xuICAgIHJldHVybiBldmVudFxuICB9IGVsc2Uge1xuICAgIGlmIChjc3NBbmltRXZlbnRUeXBlc1tldmVudF0pIHtcbiAgICAgIHJldHVybiBjc3NBbmltRXZlbnRUeXBlc1tldmVudF1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYod2luZG93LmVudiAhPSAndGVzdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignXCInICsgZXZlbnQgKyAnXCIgaXMgbm90IGEgc3VwcG9ydGVkIGFuaW1hdGlvbiBldmVudCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdiZWFuJyApLFxuICAgIHBhZ2UgID0gcmVxdWlyZSggJy4vcGFnZScgKSxcbiAgICBmb3JtRWxzO1xuXG52YXIgZm9ybUJ1YmJsaW5nID0gZmFsc2VcblxudmFyIGZpcmVCdWJibGUgPSBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LmRldGFpbCAmJiBldmVudC5kZXRhaWwudHJpZ2dlcmVkICkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggZXZlbnQudHlwZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG5cbiAgLy8gU3RvcCBvbmx5ICdzdWJtaXQnIGV2ZW50cy4gU3RvcHBpbmcgYmx1ciBvciBmb3VjcyBldmVudHMgc2VlbXMgdG8gYnJlYWsgRmlyZUZveCBpbnB1dCBpbnRlcmFjdGlvbnMuXG4gIGlmICggZXZlbnQudHlwZSA9PSAnc3VibWl0JyApIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBQcmV2ZW50IGRlZmF1bHQgb24gb3JpZ2luYWwgZXZlbnQgaWYgY3VzdG9tIGV2ZW50IGlzIHByZXZlbnRlZFxuICBpZiAoIGV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxufVxuXG4vLyBTaW1wbGlmeSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIGJhc2VkIG9uIHRoZSBlbGVtZW50XG52YXIgZXZlbnRUeXBlID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgcmV0dXJuICggZWwudGFnTmFtZSA9PSAnRk9STScgKSA/ICdzdWJtaXQnIDogJ2ZvY3VzIGJsdXInXG59XG5cbi8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPbiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9uKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9mZiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9mZiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIEFkZC9SZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlRm9ybUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCBmb3JtQnViYmxpbmcgKSB7IHJldHVybiB9IFxuICBwYWdlLmNoYW5nZSggZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gcHJldmlvdXMgcGFnZVxuICAgIGlmICggZm9ybUVscyApIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9mZiApXG5cbiAgICAvLyBBZGQgbmV3IGxpc3RlbmVycyB0byB0aGlzIHBhZ2VcbiAgICBmb3JtRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm0sIGlucHV0JyApXG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPbiApXG4gIH0pXG5cbiAgdmFyIGZvcm1CdWJibGluZyA9IHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWJibGVGb3JtRXZlbnRzXG4iLCJ2YXIgTWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFuYWdlciA9IHtcblxuICAgICAgY2FsbGJhY2tzOiBbXSxcblxuICAgICAgYWRkOiBmdW5jdGlvbiggZm4gKSB7XG5cbiAgICAgICAgdmFyIGNiID0gTWFuYWdlci5jYWxsYmFjay5uZXcoIGZuIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MucHVzaCggY2IgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNiXG5cbiAgICAgIH0sXG5cbiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0b3AoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdGFydCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi50b2dnbGUoIGJvb2wgKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzID0gW11cbiAgICAgIH0sXG5cbiAgICAgIGZpcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuLmFwcGx5KCB0aGlzLCBhcmdzICkgfSApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbmFnZXJcbiAgfSxcblxuICBjYWxsYmFjazoge1xuICAgIG5ldzogZnVuY3Rpb24oIGZuICkge1xuICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggY2IuZW5hYmxlZCApIHsgZm4uYXBwbHkoIGZuLCBhcmd1bWVudHMgKSB9XG4gICAgICB9XG5cbiAgICAgIGNiLnN0b3AgICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gZmFsc2UgfVxuICAgICAgY2Iuc3RhcnQgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSB0cnVlIH1cbiAgICAgIGNiLnRvZ2dsZSA9IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBjYi5lbmFibGVkID0gKCAwIGluIGFyZ3VtZW50cyApID8gYm9vbCA6ICFjYi5lbmFibGVkXG4gICAgICB9XG4gICAgICBjYi5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICByZXR1cm4gY2JcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYW5hZ2VyXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBwaWNrRnVuY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZvdW5kXG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGNhbmRpZGF0ZSApIHtcbiAgICBpZiAoIHR5cGVvZiggY2FuZGlkYXRlICkgPT0gJ2Z1bmN0aW9uJyAmJiAhZm91bmQgKSB7IGZvdW5kID0gY2FuZGlkYXRlIH1cbiAgfSlcblxuICByZXR1cm4gZm91bmRcbn1cblxudmFyIGRlYm91bmNlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIC8vIEFsbG93IG9wdGlvbnMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudFxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuIH0gXG5cbiAgLy8gT3B0aW9ucyB3b24ndCBiZSBudWxsXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgd2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcblxuICB2YXIgbWF4ICAgICAgICAgICAgPSBvcHRpb25zLm1heCB8fCBmYWxzZSxcbiAgICAgIGxlYWRpbmcgICAgICAgID0gKCAoICdsZWFkaW5nJyAgaW4gb3B0aW9ucyApID8gb3B0aW9ucy5sZWFkaW5nICA6IGZhbHNlICksXG4gICAgICB0cmFpbGluZyAgICAgICA9ICggKCAndHJhaWxpbmcnIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cnVlICksXG4gICAgICBcbiAgICAgIC8vIEdyYWIgZnVuY3Rpb25zIGZyb20gb3B0aW9ucyBvciBkZWZhdWx0IHRvIGZpcnN0IGFyZ3VtZW50XG4gICAgICBsZWFkaW5nRm4gICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuICAgICAgdHJhaWxpbmdGbiAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcblxuICAgICAgLy8gU3RhdGUgdHJhY2tpbmcgdmFyc1xuICAgICAgYXJncywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVib3VuY2VkIGNhbGxiYWNrXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlLCAgLy8gSGFzIGEgY2FsbGJhY2sgYmVlbiBhZGRlZCB0byB0aGUgYW5pbWF0aW9uIGxvb3A/XG4gICAgICBoYW5kbGUgICAgICAgICA9IHt9LCAgICAgLy8gT2JqZWN0IGZvciB0cmFja2luZyBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrc1xuICAgICAgbGFzdENhbGxlZCAgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgZGVib3VuY2luZ1xuICAgICAgbGFzdEludm9rZWQgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgbWF4XG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlOyAgLy8gVHJhY2sgbGVhZGluZywgdGhyb3R0bGluZyBzdWJzZXF1ZW50IGxlYWRpbmcgY2FsbHNcblxuICAvLyBRdWV1ZSB0aGUgZnVuY3Rpb24gd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgdmFyIGludm9rZSA9IGZ1bmN0aW9uKCBjYWxsVHlwZSApIHtcblxuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGxhc3RJbnZva2VkID0gbm93KClcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIGxlYWRpbmdCbG9ja2VkID0gdHJ1ZVxuXG4gICAgaWYgKCBjYWxsVHlwZSA9PT0gJ2xlYWRpbmcnICkge1xuICAgICAgbGVhZGluZ0ZuLmFwcGx5KCBsZWFkaW5nRm4sIGFyZ3MgKSB9XG4gICAgZWxzZSB7XG4gICAgICB0cmFpbGluZ0ZuLmFwcGx5KCB0cmFpbGluZ0ZuLCBhcmdzICkgfVxuXG4gIH1cblxuICAvLyBMb2FkIHRoZSBsb29wIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICB2YXIgYWRkVG9RdWV1ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXF1ZXVlZCApIHtcbiAgICAgIHF1ZXVlZCA9IHRydWVcbiAgICAgIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggbG9vcCApICAvLyBBZGQgdG8gYnJvd3NlcidzIGFuaW1hdGlvbiBxdWV1ZVxuICAgIH1cblxuICB9XG5cbiAgLy8gUmVtb3ZlIGZyb20gYW5pbWF0aW9uIHF1ZXVlIGFuZCByZXNldCBkZWJvdW5jZSBcbiAgdmFyIHJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDBcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIC8vIHByZXZlbnQgaW5maW5pdGUgZGVib3VuY2luZyAoIGlmIG9wdGlvbnMubWF4IGlzIHNldCApXG4gIHZhciBtYXhQYXNzZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBtYXggJiYgbm93KCkgLSBsYXN0SW52b2tlZCA+PSBtYXggKVxuICB9XG5cbiAgdmFyIHdhaXRSZWFjaGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbm93KCkgLSBsYXN0Q2FsbGVkICkgPj0gd2FpdFxuICB9XG5cbiAgLy8gVGhpcyBnZXRzIGxvYWRlZCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWUgYW5kIGRldGVybWluZXMgd2hldGhlciB0byBpdm9rZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCkge1xuICBcbiAgICAvLyBMb29wIHdhcyBleGVjdXRlZCBzbyBpdCdzIG5vIGxvbmdlciBpbiB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBcbiAgICBpZiAoIGxlYWRpbmcgJiYgIWxlYWRpbmdCbG9ja2VkICkge1xuICAgICAgaW52b2tlKCAnbGVhZGluZycgKVxuICAgIH1cblxuICAgIC8vIElmIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0byBmcmVxdWVudGx5IHRvIGV4ZWN1dGVcbiAgICBlbHNlIGlmICggbWF4UGFzc2VkKCkgKSB7XG5cbiAgICAgIGlmICggbGVhZGluZyApIHsgaW52b2tlKCAnbGVhZGluZycgKSAgfVxuICAgICAgZWxzZSAgICAgICAgICAgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICB9IFxuICAgIFxuICAgIC8vIElmIGZ1bmN0aW9uIGhhc24ndCBiZWVuIGNhbGxlZCBzaW5jZSBsYXN0IHdhaXRcbiAgICBlbHNlIGlmICggd2FpdFJlYWNoZWQoKSApIHtcblxuICAgICAgLy8gSWYgdHJhaWxpbmcgaXQncyBzYWZlIHRvIGludm9rZVxuICAgICAgaWYgKCB0cmFpbGluZyApIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgICAvLyBJZiBsZWFkaW5nLCBpdCdzIHNhZmUgdG8gcmVtb3ZlIGJsb2NrXG4gICAgICBpZiAoIGxlYWRpbmcgKSAgeyBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlIH1cbiAgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFRvUXVldWUoKVxuICAgIH1cblxuICB9XG5cbiAgLy8gQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBxdWV1ZWluZyB1cCBmdW5jdGlvbiBjYWxsc1xuICAvL1xuICB2YXIgZGVib3VuY2VkID0gZnVuY3Rpb24oKSB7XG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgYXJncyA9IGFyZ3VtZW50c1xuICAgIGFkZFRvUXVldWUoKVxuICB9XG5cbiAgZGVib3VuY2VkLnN0b3AgPSByZW1vdmVGcm9tUXVldWVcblxuICByZXR1cm4gZGVib3VuY2VkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2VcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gKCBmbiwgd2FpdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gKCB3YWl0ICE9IG51bGwgKSA/IDIgOiAxO1xuICB2YXIgaGFuZGxlID0ge31cblxuICBoYW5kbGUuYXJncyAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUud2FpdCAgPSB3YWl0IHx8IDBcbiAgaGFuZGxlLnN0YXJ0ID0gbm93KClcblxuICBoYW5kbGUuc3RvcCAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZS5sb29wICA9IGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIElmIHdhaXQgbGltaXQgaGFzIGJlZW4gcmVhY2hlZFxuICAgIGlmICggbm93KCkgLSBoYW5kbGUuc3RhcnQgPj0gaGFuZGxlLndhaXQgKSB7XG4gICAgICBmbi5hcHBseSggZm4sIGhhbmRsZS5hcmdzIClcblxuICAgICAgLy8gSWYgcmVwZWF0IGlzIHNldCBhbmQgaXMgbm90IDBcbiAgICAgIGlmICggISFoYW5kbGUucmVwZWF0ICkge1xuICAgICAgICBoYW5kbGUucmVwZWF0ID0gaGFuZGxlLnJlcGVhdCAtIDFcbiAgICAgICAgaGFuZGxlLnN0YXJ0ID0gbm93KClcbiAgICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICAgIH0gZWxzZSBpZiAoIGhhbmRsZS5yZXBlYXQgPT09IDAgJiYgaGFuZGxlLmNvbXBsZXRlICkge1xuICAgICAgICBoYW5kbGUuY29tcGxldGUoKVxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgfVxuXG4gIH1cblxuXG4gIHJldHVybiBxdWV1ZURlbGF5KCBoYW5kbGUgKVxufVxuXG52YXIgcXVldWVEZWxheSA9IGZ1bmN0aW9uICggaGFuZGxlICkge1xuICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGhhbmRsZS5sb29wIClcbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGF5XG4iLCIvLyBUaGlzIHNpbXBsaWZpZXMgY29tbW9uIHVzZXMgZm9yIHdpbmRvdy5tYXRjaE1lZGlhIFxuLy8gbmFtZWx5LCBhZGRpbmcgbGlzdGVuZXJzIGZvciB3aWR0aCBhbmQgaGVpZ2h0IHF1ZXJpZXNcblxuZnVuY3Rpb24gcGFyc2VRdWVyeSggcXVlcnksIGRpbWVuc2lvbiApIHtcbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgaWYgKCB0eXBlb2YoIHF1ZXJ5ICkgPT09ICdzdHJpbmcnICkgeyByZXR1cm4gcXVlcnkgfVxuXG4gIHJlc3VsdC5taW4gPSBzaXplKCBxdWVyeS5taW4sICdtaW4tJyArIGRpbWVuc2lvbiApXG4gIHJlc3VsdC5tYXggPSBzaXplKCBxdWVyeS5tYXgsICdtYXgtJyArIGRpbWVuc2lvbiApXG5cbiAgaWYgKCByZXN1bHQubWluICYmIHJlc3VsdC5tYXggKVxuICAgIHJlc3VsdC5xdWVyeSA9IHJlc3VsdC5taW4gKyAnIGFuZCAnICsgcmVzdWx0Lm1heFxuXG4gIHJldHVybiByZXN1bHQucXVlcnkgfHwgcmVzdWx0Lm1pbiB8fCByZXN1bHQubWF4XG59XG5cbmZ1bmN0aW9uIHNpemUoIG51bSwgbGltaXQgKSB7XG4gIHJldHVybiAoIG51bSApID8gJygnK2xpbWl0Kyc6ICcgKyB0b1B4KCBudW0gKSArICcpJyA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9QeCggd2lkdGggKSB7XG4gIGlmICggdHlwZW9mKCB3aWR0aCApID09PSAnbnVtYmVyJyApIHsgcmV0dXJuIHdpZHRoICsgJ3B4J31cbiAgcmV0dXJuIHdpZHRoXG59XG5cbnZhciBtZWRpYSA9IHtcblxuICB3aWR0aDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ3dpZHRoJyApLCBmbiApXG4gIH0sXG5cbiAgbWluV2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heFdpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGhlaWdodDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ2hlaWdodCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbkhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heEhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgbGlzdGVuOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5tYXRjaE1lZGlhKCBxdWVyeSApXG5cbiAgICBpZiAoIGZuICkge1xuICAgICAgZm4oIG1hdGNoIClcbiAgICAgIG1hdGNoLmFkZExpc3RlbmVyKCBmbiApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gbWVkaWFcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcbnZhciB0aHJvdHRsZSAgICAgICAgPSByZXF1aXJlKCAnLi90aHJvdHRsZScgKVxudmFyIGRlYm91bmNlICAgICAgICA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciBvcHRpbWl6ZWRFdmVudE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oIG5hbWUgKSB7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY2FsbGJhY2sgbWFuYWdlclxuICAgIHZhciBtYW5hZ2VyID0ge1xuICAgICAgcnVuOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdGFydDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RvcDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpXG4gICAgfVxuXG4gICAgLy8gcnVuIGNhbGxiYWNrcyB3aGVuIGV2ZW50IGhhcHBlbnMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgcnVubmluZyA9IHRocm90dGxlKCBtYW5hZ2VyLnJ1bi5maXJlIClcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0YXJ0ZWQgPSBkZWJvdW5jZSh7XG4gICAgICBsZWFkaW5nOiBtYW5hZ2VyLnN0YXJ0LmZpcmUsXG4gICAgICB0cmFpbGluZzogZmFsc2UsXG4gICAgICB3YWl0OiAxNTBcbiAgICB9KVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RvcHBlZCA9IGRlYm91bmNlKCBtYW5hZ2VyLnN0b3AuZmlyZSwgMTUwIClcblxuICAgIEV2ZW50Lm9uKCB3aW5kb3csIG5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgcnVubmluZygpXG4gICAgICBzdGFydGVkKClcbiAgICAgIHN0b3BwZWQoKVxuICAgIH0pXG5cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgdmFyIHJ1biAgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIucnVuLmFkZCggZm4gKSB9XG4gICAgcnVuLnN0YXJ0ID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RhcnQuYWRkKCBmbiApIH1cbiAgICBydW4uc3RvcCAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdG9wLmFkZCggZm4gKSB9XG5cbiAgICAvLyBBZGQgY3VzdG9tIGV2ZW50cyBmb3IgdG8gcnVuIG9wdGltaXplZCBsaXN0ZW5lcnMuICggbmFtZSAtPiBOYW1lIClcbiAgICBydW4oIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csICdvcHRpbWl6ZWQnICsgIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpICkgfSApXG4gICAgcnVuLnN0YXJ0KCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0YXJ0JyApIH0gKVxuICAgIHJ1bi5zdG9wKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0b3AnICkgfSApXG5cbiAgICByZXR1cm4gcnVuXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpbWl6ZWRFdmVudE1hbmFnZXJcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcblxuLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgZXZlbnQgbWFuYWdlclxudmFyIG1hbmFnZXIgPSB7XG4gIHJlYWR5OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIGNoYW5nZTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICByZWFkeUFscmVhZHk6IGZhbHNlLFxuICBjaGFuZ2VkOiBmYWxzZSxcbn1cblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7XG4gIG1hbmFnZXIucmVhZHlBbHJlYWR5ID0gdHJ1ZSBcbn0pXG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpeyBcbiAgaWYgKCAhd2luZG93LlR1cmJvbGlua3MgJiYgIW1hbmFnZXIuY2hhbmdlZCApIHsgXG4gICAgbWFuYWdlci5jaGFuZ2VkID0gdHJ1ZSBcbiAgICBtYW5hZ2VyLmNoYW5nZS5maXJlKClcbiAgfVxufSlcblxudmFyIHJlYWR5ID0gZnVuY3Rpb24gKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLnJlYWR5QWxyZWFkeSApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLnJlYWR5LmFkZCggZm4gKSB9XG5cbnZhciBjaGFuZ2UgPSBmdW5jdGlvbiggZm4gKSB7XG4gIGlmICggbWFuYWdlci5jaGFuZ2VkICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIuY2hhbmdlLmFkZCggZm4gKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIHJlYWR5IGNhbGxiYWNrc1xucmVhZHkuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5yZWFkeS5maXJlKClcbiAgLy8gQmUgc3VyZSByZWFkeSBjYW4gb25seSBiZSBmaXJlZCBvbmNlXG4gIG1hbmFnZXIucmVhZHkuc3RvcCgpIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgY2hhbmdlIGNhbGxiYWNrc1xuY2hhbmdlLmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIuY2hhbmdlLmZpcmUoKSB9XG5cbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ0RPTUNvbnRlbnRMb2FkZWQnLCByZWFkeS5maXJlIClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ3BhZ2U6Y2hhbmdlIHR1cmJvbGlua3M6bG9hZCcsIGNoYW5nZS5maXJlICkgLy8gU3VwcG9ydCBjdXN0b20gYW5kIHJhaWxzIHR1cmJvbGlua3MgcGFnZSBsb2FkIGV2ZW50c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVhZHk6IHJlYWR5LFxuICBjaGFuZ2U6IGNoYW5nZVxufVxuIiwidmFyIGRlbGF5ID0gcmVxdWlyZSggJy4vZGVsYXknIClcblxudmFyIHJlcGVhdCA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgbGltaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9IDEsXG4gICAgICBoYW5kbGUgPSBkZWxheSAoIGZuLCB3YWl0ICk7XG5cbiAgaWYgICAgICAoIGxpbWl0ICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDMgfVxuICBlbHNlIGlmICggd2FpdCAgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMiB9XG5cbiAgLy8gRW5hYmxlIHJlcGVhdCAoIC0xIHdpbGwgcmVwZWF0IGZvcmV2ZXIgKVxuICBoYW5kbGUucmVwZWF0ID0gbGltaXQgfHwgLTFcbiAgaGFuZGxlLmFyZ3MgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS5zdG9wICAgPSBoYW5kbGUuY2FuY2VsXG5cbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGVhdFxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHJlc2l6ZSAgPSBtYW5hZ2VyLm5ldyggJ3Jlc2l6ZScgKVxuXG4vLyBQYXVzZSBhbmltYXRpb25zIGR1cmluZyByZXNpemluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG5yZXNpemUuZGlzYWJsZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSAnPHN0eWxlIGlkPVwiZnVsbHN0b3BcIj4ubm8tYW5pbWF0aW9uICosIC5uby1hbmltYXRpb24gKjphZnRlciwgLm5vLWFuaW1hdGlvbiAqOmJlZm9yZSB7XFxcbiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IGFuaW1hdGlvbjogbm9uZSAhaW1wb3J0YW50XFxcbiAgfTwvc3R5bGU+J1xuXG4gIC8vIEluamVjdCBzdHlsZSBmb3IgZWFzeSBjbGFzc25hbWUgbWFuaXB1bGF0aW9uXG4gIGlmICggIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlI2Z1bGxzdG9wJykgKSB7IFxuICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzdHlsZSlcbiAgfVxuXG4gIHJlc2l6ZS5zdGFydCggZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ25vLWFuaW1hdGlvbicgKSB9IClcbiAgcmVzaXplLnN0b3AoIGZ1bmN0aW9uKCkgeyAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc2l6ZVxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHNjcm9sbCAgPSBtYW5hZ2VyLm5ldyggJ3Njcm9sbCcgKVxuXG5zY3JvbGwuZGlzYWJsZVBvaW50ZXIgPSBmdW5jdGlvbigpIHtcblxuICAvLyBEaXNhYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0YXJ0KCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICB9KVxuXG4gIC8vIEVuYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdG9wKCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsXG4iLCIvLyBDdXN0b20gRXZlbnQgUG9seWZpbGxcbihmdW5jdGlvbiAoKSB7XG5cbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKVxuIiwiLy8gTWFudWFsbHkgdHJpZ2dlciBhIGNhbmNlbGFibGUgZm9ybSBzdWJtaXQgZXZlbnQuXG5mdW5jdGlvbiBzdWJtaXQoIGZvcm0gKSB7XG4gIGlmICggIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUgIT0gJ0ZPUk0nICkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKCAnVHJpZ2dlciB0aGlzIGV2ZW50IG9uIGEgZm9ybSBlbGVtZW50JyApXG4gIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoICdzdWJtaXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcbiAgZm9ybS5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gU3VibWl0IGZvcm0gdW5sZXNzIGV2ZW50IGRlZmF1bHQgaXMgcHJldmVudGVkXG4gIGlmICggIWV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBmb3JtLnN1Ym1pdCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3VibWl0XG4iLCJ2YXIgZW5kRXZlbnRzID0gW1xuICAndG91Y2hlbmQnXG5dXG5cbm1vZHVsZS5leHBvcnRzID0gVGFwXG5cbi8vIGRlZmF1bHQgdGFwIHRpbWVvdXQgaW4gbXNcblRhcC50aW1lb3V0ID0gMjAwXG5cbmZ1bmN0aW9uIFRhcChjYWxsYmFjaywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAvLyBpZiB0aGUgdXNlciBob2xkcyBoaXMvaGVyIGZpbmdlciBkb3duIGZvciBtb3JlIHRoYW4gMjAwbXMsXG4gIC8vIHRoZW4gaXQncyBub3QgcmVhbGx5IGNvbnNpZGVyZWQgYSB0YXAuXG4gIC8vIGhvd2V2ZXIsIHlvdSBjYW4gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgVGFwLnRpbWVvdXRcblxuICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lclxuICBsaXN0ZW5lci5oYW5kbGVyID0gY2FsbGJhY2tcblxuICByZXR1cm4gbGlzdGVuZXJcblxuICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgbGlzdGVuZXIpXG4gIGZ1bmN0aW9uIGxpc3RlbmVyKGUxKSB7XG4gICAgLy8gdGFwIHNob3VsZCBvbmx5IGhhcHBlbiB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIGlmICghZTEudG91Y2hlcyB8fCBlMS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVyblxuXG4gICAgdmFyIGVsID0gZTEudGFyZ2V0XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgdGltZW91dF9pZCA9IHNldFRpbWVvdXQoY2xlYW51cCwgdGltZW91dClcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGRvbmUoZTIpIHtcbiAgICAgIC8vIHNpbmNlIHRvdWNoc3RhcnQgaXMgYWRkZWQgb24gdGhlIHNhbWUgdGlja1xuICAgICAgLy8gYW5kIGJlY2F1c2Ugb2YgYnViYmxpbmcsXG4gICAgICAvLyBpdCdsbCBleGVjdXRlIHRoaXMgb24gdGhlIHNhbWUgdG91Y2hzdGFydC5cbiAgICAgIC8vIHRoaXMgZmlsdGVycyBvdXQgdGhlIHNhbWUgdG91Y2hzdGFydCBldmVudC5cbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhbnVwKClcblxuICAgICAgLy8gYWxyZWFkeSBoYW5kbGVkXG4gICAgICBpZiAoZTIuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSB0aGVzZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IGFsbCB0byBib3RoIHN0YXJ0IGFuZCBldmVudHMuXG4gICAgICB2YXIgcHJldmVudERlZmF1bHQgPSBlMS5wcmV2ZW50RGVmYXVsdFxuICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGUxLnN0b3BQcm9wYWdhdGlvblxuXG4gICAgICBlMS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUxKVxuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgZTEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTEpXG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGxzIHRoZSBoYW5kbGVyIHdpdGggdGhlIGBlbmRgIGV2ZW50LFxuICAgICAgLy8gYnV0IGkgZG9uJ3QgdGhpbmsgaXQgbWF0dGVycy5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuXG4gICAgLy8gY2xlYW51cCBlbmQgZXZlbnRzXG4gICAgLy8gdG8gY2FuY2VsIHRoZSB0YXAsIGp1c3QgcnVuIHRoaXMgZWFybHlcbiAgICBmdW5jdGlvbiBjbGVhbnVwKGUyKSB7XG4gICAgICAvLyBpZiBpdCdzIHRoZSBzYW1lIGV2ZW50IGFzIHRoZSBvcmlnaW4sXG4gICAgICAvLyB0aGVuIGRvbid0IGFjdHVhbGx5IGNsZWFudXAuXG4gICAgICAvLyBoaXQgaXNzdWVzIHdpdGggdGhpcyAtIGRvbid0IHJlbWVtYmVyXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRfaWQpXG5cbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuOyBmbiA9IHVuZGVmaW5lZCB9IFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIG9wdGlvbnMud2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcbiAgb3B0aW9ucy5tYXggID0gb3B0aW9ucy5tYXggfHwgb3B0aW9ucy53YWl0XG4gIG9wdGlvbnMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZuXG4gIG9wdGlvbnMubGVhZGluZyAgPSB0cnVlXG4gIG9wdGlvbnMudHJhaWxpbmcgPSB0cnVlXG5cbiAgcmV0dXJuIGRlYm91bmNlKG9wdGlvbnMpXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZVxuIiwidmFyIHZhbGlkYXRpb24gPSByZXF1aXJlKCAnLi9saWIvdmFsaWRhdGlvbicgKVxudmFyIHByb2dyZXNzaXZlID0gcmVxdWlyZSggJy4vbGliL3Byb2dyZXNzaXZlJyApXG52YXIgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9saWIvZ2V0LWxhYmVsJyApXG52YXIgZGlmZiA9IHJlcXVpcmUoICcuL2xpYi9kaWZmJyApXG52YXIgaW5wdXRDaGFuZ2UgPSByZXF1aXJlKCAnLi9saWIvaW5wdXQtY2hhbmdlJyApXG5yZXF1aXJlKCAnLi9saWIvcmVzZXQnIClcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgdmFsaWRhdGU6IHZhbGlkYXRpb24udmFsaWRhdGUsXG4gIGludmFsaWRhdGVGaWVsZDogdmFsaWRhdGlvbi5pbnZhbGlkYXRlRmllbGQsXG4gIG5leHQ6IHByb2dyZXNzaXZlLm5leHQsXG4gIGdldExhYmVsOiBnZXRMYWJlbCxcbiAgZGlmZjogZGlmZixcbiAgaW5wdXRDaGFuZ2U6IGlucHV0Q2hhbmdlXG5cbn1cbiIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCA9IHRvb2xib3guZXZlbnQsXG4gICAgZ2V0TGFiZWwgPSByZXF1aXJlKCAnLi9nZXQtbGFiZWwnKSxcbiAgICBpbnB1dENoYW5nZSA9IHJlcXVpcmUoICcuL2lucHV0LWNoYW5nZScgKSxcbiAgICBTZWxlY3RvciA9IHJlcXVpcmUoICcuL3NlbGVjdG9yJyApXG5cbmZ1bmN0aW9uIGRpZmZGb3JtKCBldmVudCApIHtcbiAgdmFyIGZvcm0gPSBldmVudC5jdXJyZW50VGFyZ2V0XG5cbiAgdmFyIGRpZmZzID0gW10sXG4gICAgICBkaWZmRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBmb3JtLmRhdGFzZXQuZGlmZlRhcmdldCApXG5cbiAgaWYgKCBkaWZmRWwgPT0gbnVsbCApIHsgcmV0dXJuIH1cblxuICBpbml0RGlmZklkcyggZm9ybSApXG5cbiAgdG9vbGJveC5lYWNoKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoICcuY2hhbmdlZC12YWx1ZScgKSwgZnVuY3Rpb24oIGVsICkge1xuICAgIHZhciBkaWZmID0gZGlmZklucHV0KCBlbCApXG5cbiAgICAvLyBPbmx5IHNob3cgb25lIGlucHV0IGRpZmYgcGVyIGxhYmVsXG4gICAgLy8gSWYgZGlmZnMgYWxyZWFkeSBjb250YWlucyB0aGlzIGxhYmVsLCBkbyBub3QgYWRkIGl0LlxuICAgIGlmICggIWRpZmZzLmZpbmQoIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQubGFiZWwgPT0gZGlmZi5sYWJlbCB9ICkgKSBkaWZmcy5wdXNoKCBkaWZmIClcbiAgfSlcblxuICBpZiAoIGRpZmZzLmxlbmd0aCA9PSAwICkgXG4gICAgZGlmZkVsLmlubmVySFRNTCA9ICcnXG4gIGVsc2UgXG4gICAgZGlmZkVsLmlubmVySFRNTCA9IGA8dGFibGUgY2xhc3M9J2lucHV0LWRpZmZzJz4keyBkaWZmcy5tYXAoIGRpZmZSb3cgKS5qb2luKCcnKSB9PC90YWJsZT5gXG5cbiAgdG9nZ2xlRGlmZkVscyggZm9ybSApXG59XG5cbmZ1bmN0aW9uIHRvZ2dsZURpZmZFbHMoIGZvcm0gKSB7XG4gIHZhciBkaWZmRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBmb3JtLmRhdGFzZXQuZGlmZlRhcmdldCApXG4gIGlmICggZGlmZkVsICkge1xuXG4gICAgdmFyIGVsZW1lbnRzVG9Ub2dnbGUgPSB0b29sYm94LnNsaWNlKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBkaWZmRWwuZGF0YXNldC5oaWRlV2hlbkVtcHR5ICkpXG4gICAgZWxlbWVudHNUb1RvZ2dsZS5wdXNoKCBkaWZmRWwgKVxuXG4gICAgdG9vbGJveC5lYWNoKCBlbGVtZW50c1RvVG9nZ2xlLCBmdW5jdGlvbiggZWwpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoICdmb3JtLWRpZmYtaGlkZGVuJywgZGlmZkVsLmNoaWxkcmVuLmxlbmd0aCA9PSAwIClcbiAgICB9KVxuICB9XG59XG5cbi8vIENyZWF0ZSBhIGRpZmYgdGFibGUgcm93XG5mdW5jdGlvbiBkaWZmUm93ICggZGlmZiApIHtcblxuICB2YXIgcm93ID0gYDx0ciBjbGFzcz0naW5wdXQtZGlmZiAke2RpZmZbJ2NsYXNzJ10gfHwgJyd9JyBkYXRhLWRpZmYtbmFtZT0nJHtkaWZmLm5hbWV9Jz5gXG5cbiAgICAvLyBBZGQgbGFiZWwgYW5kIGRpZmYgbm90ZVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLWxhYmVsJz48c3Bhbj4ke2RpZmYubGFiZWx9PC9zcGFuPmBcbiAgICBpZiAoZGlmZi5ub3RlKSByb3cgKz0gYCA8c3BhbiBjbGFzcz0nZGlmZi1ub3RlJz4ke2RpZmYubm90ZX08L3NwYW4+YFxuICAgIHJvdyArPSBcIjwvdGQ+XCJcblxuICAgIC8vIEFkZCBpbml0aWFsIHZhbHVlIGNvZGUgY2VsbFxuICAgIHJvdyArPSBkaWZmQ2VsbCggZGlmZi5pbml0aWFsLCAnaW5pdGlhbCcgKVxuXG4gICAgLy8gQWRkIGFycm93IG1hcmtlclxuICAgIHJvdyArPSBcIjx0ZCBjbGFzcz0naW5wdXQtZGlmZi1tYXJrZXInPjxzcGFuPuKGkjwvc3Bhbj48L3RkPlwiXG5cbiAgICAvLyBBZGQgY3VycmVudCB2YWx1ZSBjb2RlIGNlbGxcbiAgICByb3cgKz0gZGlmZkNlbGwoIGRpZmYudmFsdWUsICd2YWx1ZScgKVxuICAgIHJvdyArPSBgPHRkIGNsYXNzPSdpbnB1dC1kaWZmLXVuZG8nPjxzcGFuPjxidXR0b24gY2xhc3M9J2Zvcm0tZGlmZi1idXR0b24nIHR5cGU9J2J1dHRvbicgYXJpYS1sYWJlbD0nUmVzZXQgaW5wdXQnIGRhdGEtcmVzZXQtaW5wdXQ9JyR7ZGlmZi5zZWxlY3Rvcn0nPuKclTwvYnV0dG9uPjwvc3Bhbj48L3RkPmBcblxuICByZXR1cm4gcm93ICsgXCI8L3RyPlwiXG59XG5cbmZ1bmN0aW9uIGRpZmZDZWxsICh2YWx1ZSwgbmFtZSkge1xuICB2YXIgdGRDbGFzcyA9IGBpbnB1dC1kaWZmLSR7bmFtZX1gXG4gIGlmICggIXZhbHVlIHx8IHZhbHVlID09ICdubyBzZWxlY3Rpb24nICkgdGRDbGFzcyArPSAnIG51bGwtdmFsdWUnXG5cbiAgcmV0dXJuIGA8dGQgY2xhc3M9JyR7dGRDbGFzc30nPjxjb2RlPiR7KCB2YWx1ZSB8fCAnbnVsbCcgKX08L2NvZGU+PC90ZD5gXG59XG5cbi8vIEFkZCB1bmlxdWUgaWRzIGZvciBlYWNoIGlucHV0IGluIGEgZm9ybVxuZnVuY3Rpb24gaW5pdERpZmZJZHMoIGZvcm0gKSB7XG4gIGlmICggZm9ybS5kYXRhc2V0LmRpZmZJZHMgKSByZXR1cm5cblxuICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggU2VsZWN0b3IgKSwgZnVuY3Rpb24gKCBlbCwgaW5kZXggKSB7XG4gICAgZWwuZGF0YXNldC5mb3JtRGlmZklkID0gYGZvcm0tZGlmZi0ke3JhbmRJRCgpfS0ke2luZGV4fWBcbiAgfSlcblxuICBmb3JtLmRhdGFzZXQuZGlmZklkcyA9IHRydWVcbn1cblxuZnVuY3Rpb24gcmFuZElEICgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygzKVxufVxuXG4vLyBSZXR1cm5zOiB7IGlucHV0OiBpbnB1dCBlbGVtZW50LCBpbml0aWFsOiAnb2xkIHZhbHVlJywgdmFsdWU6ICduZXcgdmFsdWUnIH1cbmZ1bmN0aW9uIGRpZmZJbnB1dCggaW5wdXQgKSB7XG4gIHZhciBkaWZmID0ge1xuICAgIGluaXRpYWw6IFtdLFxuICAgIHZhbHVlOiBbXSxcbiAgICBuYW1lOiBbXSxcbiAgICBzZWxlY3RvcjogW11cbiAgfSxcbiAgICBpbnB1dHNcblxuICB2YXIgbGFiZWwgPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnIClcbiAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgLy8gR2V0IHRleHQgbGFiZWwgZnJvbSB0aGUgZmlyc3QgaW5wdXQgaW4gYSBsYWJlbFxuICAgIGRpZmYubGFiZWwgPSBnZXRMYWJlbC50ZXh0KCBsYWJlbC5xdWVyeVNlbGVjdG9yKCBTZWxlY3RvciApIClcblxuICAgIC8vIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGlucHV0cyB1bmRlciBhIHNpbmdsZSBsYWJlbFxuICAgIC8vIEdyb3VwIHRob3NlIGlucHV0IHZhbHVlcyBpbiB0aGUgZm9ybSBkaWZmIGFuZCB0cmVhdFxuICAgIC8vIHRoZW0gYXMgYSBzaW5nbGUgdmFsdWVcbiAgICB2YXIgbGFiZWxJbnB1dHMgPSB0b29sYm94LnNsaWNlKCBsYWJlbC5xdWVyeVNlbGVjdG9yQWxsKCBTZWxlY3RvciApIClcblxuICAgIC8vIElmIG11bHRpcGxlIGlucHV0cyBhcmUgdW5kZXIgYSBzaW5nbGUgbGFiZWwsIHVzZSB0aG9zZVxuICAgIC8vIG90aGVyd2lzZSB1c2UgaW5wdXQgYXMgYW4gYXJyYXkgKHRvIHNpbXBsaWZ5IHRoaXMpXG4gICAgaW5wdXRzID0gKCBsYWJlbElucHV0cy5sZW5ndGggPiAwICkgPyBsYWJlbElucHV0cyA6IFsgaW5wdXQgXVxuICB9IGVsc2Uge1xuICAgIGlucHV0cyA9IFsgaW5wdXQgXVxuICB9XG5cbiAgZGlmZi5sYWJlbCA9IGRpZmYubGFiZWwgfHwgZ2V0TGFiZWwudGV4dCggaW5wdXQgKSB8fCBpbnB1dC5nZXRBdHRyaWJ1dGUoICduYW1lJyApXG5cbiAgdG9vbGJveC5lYWNoKCBpbnB1dHMsIGZ1bmN0aW9uICggaW5wdXQgKSB7XG5cbiAgICBpZiAoIGlucHV0LnR5cGUgPT0gJ3JhbmdlJyAmJiBpbnB1dC5kYXRhc2V0LnZhbHVlcyApIHtcbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBpbnB1dC5kYXRhc2V0LnZhbHVlcy5zcGxpdCgnLCcpW2lucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlXSApXG4gICAgICBkaWZmLnZhbHVlLnB1c2goIGlucHV0LmRhdGFzZXQudmFsdWVzLnNwbGl0KCcsJylbaW5wdXQudmFsdWVdIClcblxuICAgIC8vIEdldCBzZWxlY3QgbGFiZWwgbmFtZXMgKHJhdGhlciB0aGFuIHZhbHVlcykgaWYgcHJlc2VudFxuICAgIH0gZWxzZSBpZiAoIGlucHV0LnRhZ05hbWUgPT0gJ1NFTEVDVCcgKSB7XG5cbiAgICAgIC8vIFNob3cgb3B0aW9uIGxhYmVscyBpbnN0ZWFkIG9mIHZhbHVlcyBpZiBwcmVzZW50XG4gICAgICB2YXIgb3B0aW9ucyA9IHt9XG4gICAgICB0b29sYm94LmVhY2goaW5wdXQuY2hpbGRyZW4sIGZ1bmN0aW9uICggbyApIHtcbiAgICAgICAgb3B0aW9uc1tvLnZhbHVlXSA9IG8udmFsdWUgPyBvLnRleHQgOiAnbm8gc2VsZWN0aW9uJ1xuICAgICAgfSlcblxuICAgICAgZGlmZi5pbml0aWFsLnB1c2goIG9wdGlvbnNbIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlIF0gfHwgaW5wdXQuZGF0YXNldC5pbml0aWFsVmFsdWUgKVxuICAgICAgZGlmZi52YWx1ZS5wdXNoKCBvcHRpb25zWyBpbnB1dC52YWx1ZSBdIHx8IGlucHV0LnZhbHVlIClcblxuICAgIC8vIEdldCByYWRpbyBsYWJlbCBuYW1lcyAocmF0aGVyIHRoYW4gdmFsdWVzKSBpZiBwcmVzZW50XG4gICAgfSBlbHNlIGlmICggaW5wdXQudHlwZSA9PSAncmFkaW8nICkge1xuXG4gICAgICBkaWZmLmxhYmVsID0gZ2V0TGFiZWwubGVnZW5kKCBpbnB1dCApIHx8IGRpZmYubGFiZWxcblxuICAgICAgdmFyIHJhZGlvSW5wdXRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCBgaW5wdXRbbmFtZT1cIiR7aW5wdXQubmFtZX1cIl1gIClcbiAgICAgIHZhciByYWRpb0luaXRpYWwsIHJhZGlvVmFsdWVcblxuICAgICAgcmFkaW9JbnB1dHMuZm9yRWFjaCggZnVuY3Rpb24oIHJhZGlvICkge1xuICAgICAgICBpZiAoIHJhZGlvLmRhdGFzZXQuaW5pdGlhbFZhbHVlID09ICd0cnVlJyApIHJhZGlvSW5pdGlhbCA9IGdldExhYmVsLnRleHQoIHJhZGlvIClcbiAgICAgICAgaWYgKCByYWRpby5jaGVja2VkICkgZGlmZi52YWx1ZS5wdXNoKCBnZXRMYWJlbC50ZXh0KCByYWRpbyApIClcbiAgICAgIH0pXG5cbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCByYWRpb0luaXRpYWwgfHwgJ25vIHNlbGVjdGlvbicgKVxuXG4gICAgLy8gVHJhY2sgY2hlY2tlZCBzdGF0ZSBmb3IgY2hlY2tib3hlcyAocmF0aGVyIHRoYW4gdmFsdWUpXG4gICAgfSBlbHNlIGlmICggaW5wdXQudHlwZSA9PSAnY2hlY2tib3gnICkge1xuICAgICAgZGlmZi5pbml0aWFsLnB1c2goIGlucHV0LmRhdGFzZXQuaW5pdGlhbFZhbHVlIClcbiAgICAgIGRpZmYudmFsdWUucHVzaCggaW5wdXQuY2hlY2tlZCApXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZmYuaW5pdGlhbC5wdXNoKCBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSApXG4gICAgICBkaWZmLnZhbHVlLnB1c2goIGlucHV0LnZhbHVlIClcbiAgICB9XG5cbiAgICBkaWZmLm5vdGUgPSBpbnB1dC5kYXRhc2V0LmRpZmZOb3RlXG4gICAgZGlmZlsnY2xhc3MnXSA9IGlucHV0LmRhdGFzZXQuZGlmZkNsYXNzXG4gICAgZGlmZi5uYW1lLnB1c2goIGlucHV0Lm5hbWUgKVxuICAgIGRpZmYuc2VsZWN0b3IucHVzaCggaW5wdXQuZGF0YXNldC5mb3JtRGlmZklkIClcbiAgfSlcblxuICBkaWZmLmluaXRpYWwgPSBkaWZmLmluaXRpYWwuam9pbignICcpXG4gIGRpZmYudmFsdWUgPSBkaWZmLnZhbHVlLmpvaW4oJyAnKVxuICBkaWZmLm5hbWUgPSBkaWZmLm5hbWUuam9pbignICcpXG4gIGRpZmYuc2VsZWN0b3IgPSBkaWZmLnNlbGVjdG9yLm1hcCggZnVuY3Rpb24gKCBzICkgeyByZXR1cm4gYFtkYXRhLWZvcm0tZGlmZi1pZD1cIiR7c31cIl1gIH0gKS5qb2luKCcsICcpXG5cbiAgcmV0dXJuIGRpZmZcbn1cblxuXG5mdW5jdGlvbiB3YXRjaCAoKSB7XG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgaW5wdXRDaGFuZ2Uud2F0Y2goKVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NoYW5nZScsICdmb3JtJywgRXZlbnQuZGVib3VuY2UoIGRpZmZGb3JtLCAxMDAgKSApXG5cbiAgICAvLyBIaWRlIGVtcHR5IGZvcm0tZGlmZnNcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdmb3JtW2RhdGEtZGlmZi10YXJnZXRdJyApLCB0b2dnbGVEaWZmRWxzIClcblxuICAgIGlmICggIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjZm9ybS1kaWZmLWhpZGRlbicgKSApXG4gICAgICBkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgJzxzdHlsZSBpZD1cImZvcm0tZGlmZi1oaWRkZW5cIj4uZm9ybS1kaWZmLWhpZGRlbnsgZGlzcGxheTogbm9uZSB9PC9zdHlsZT4nKVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2F0Y2g6IHdhdGNoXG59XG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnIClcbnZhciBTZWxlY3RvciA9IHJlcXVpcmUoICcuL3NlbGVjdG9yJyApXG5cbmZ1bmN0aW9uIGdldElucHV0ICggaW5wdXQgKSB7XG4gIGlmICggdHlwZW9mIGlucHV0ID09ICdzdHJpbmcnICkgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBpbnB1dCApXG4gIHJldHVybiBpbnB1dFxufVxuXG5mdW5jdGlvbiBnZXRMYWJlbCAoIGlucHV0ICkge1xuXG4gIGlucHV0ID0gZ2V0SW5wdXQoIGlucHV0IClcbiAgaWYgKCFpbnB1dCkgcmV0dXJuXG5cbiAgLy8gTGFiZWwgd3JhcHMgaW5wdXRcbiAgdmFyIGxhYmVsID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2xhYmVsJyApIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGBsYWJlbFtmb3I9XCIke2lucHV0LmlkfVwiXWAgKVxuXG4gIHJldHVybiBsYWJlbFxufVxuXG5mdW5jdGlvbiBnZXRBcmlhTGFiZWwoIGlucHV0ICkge1xuICBpbnB1dCA9IGdldElucHV0KCBpbnB1dCApOyBpZiAoIWlucHV0KSByZXR1cm5cbiAgdmFyIGxhYmVsID0gaW5wdXQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJylcbiAgdmFyIGxhYmVsbGVkQnkgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICdhcmlhLWxhYmVsbGVkYnknIClcblxuICBpZiAoICFsYWJlbCAmJiBsYWJlbGxlZEJ5ICkge1xuXG4gICAgLy8gYXJpYS1sYWJlbGxlZGJ5PSdzb21lSUQgYW5vdGhlcklEJyBtdXN0IHJlYWQgbXVsdGlwbGUgZWxlbWVudHMgdGV4dCBjb250ZW50LlxuICAgIC8vIFRoaXMgY3JlYXRlcyBhIHNlbGVjdG9yIChwcmVwZW5kaW5nIHRoZSAnIycgYmVmb3JlIGVhY2gpIHRvIGZpbmQgdGhlIGxhYmVscy5cbiAgICAvL1xuICAgIHZhciBzZWxlY3RvciA9IGxhYmVsbGVkQnkuc3BsaXQoJyAnKS5tYXAoIGZ1bmN0aW9uICggbmFtZSApIHsgcmV0dXJuICcjJytuYW1lIH0gKVxuXG4gICAgdmFyIGxhYmVsVGV4dCA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCggc2VsZWN0b3IsIGZ1bmN0aW9uKCBzICkgeyBcbiAgICAgIHZhciBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHMgKVxuICAgICAgaWYgKCBlbCApIHJldHVybiBlbC50ZXh0Q29udGVudFxuICAgICAgZWxzZSByZXR1cm4gZmFsc2VcbiAgICB9KS5maWx0ZXIoIGZ1bmN0aW9uICggZSApIHsgcmV0dXJuIGUgIT0gZmFsc2UgfSApXG5cbiAgICBpZiAoIGxhYmVsVGV4dCApIGxhYmVsID0gbGFiZWxUZXh0LmpvaW4oJyAnKVxuICB9XG5cbiAgcmV0dXJuIGxhYmVsXG59XG5cbi8vIEFyZSBpbnB1dHMgaW4gYSBmaWVsZHNldCB3aXRoIGEgbGVnZW5kP1xuLy8gVXNlIHRoYXQgYXMgdGhlIGxhYmVsIHRleHRcbmZ1bmN0aW9uIGdldExlZ2VuZFRleHQgKCBpbnB1dCApIHtcbiAgaW5wdXQgPSBnZXRJbnB1dCggaW5wdXQgKTsgaWYgKCFpbnB1dCkgcmV0dXJuXG4gIHZhciBsZWdlbmRUZXh0XG5cbiAgdmFyIGZpZWxkc2V0ID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2ZpZWxkc2V0JyApXG5cbiAgaWYgKCBmaWVsZHNldCApIHtcbiAgICB2YXIgbGVnZW5kID0gZmllbGRzZXQucXVlcnlTZWxlY3RvciggJ2xlZ2VuZCcgKVxuICAgIGlmICggbGVnZW5kICkgbGVnZW5kVGV4dCA9IGxlZ2VuZC50ZXh0Q29udGVudC50cmltKClcbiAgfVxuXG4gIHJldHVybiBsZWdlbmRUZXh0XG59XG5cblxuZnVuY3Rpb24gZ2V0TGFiZWxUZXh0ICggaW5wdXQgKSB7XG4gIGlucHV0ID0gZ2V0SW5wdXQoIGlucHV0ICk7IGlmICghaW5wdXQpIHJldHVyblxuXG4gIHZhciBsYWJlbCA9IGdldExhYmVsKCBpbnB1dCApXG5cbiAgLy8gR3JhYiB0ZXh0IGZyb20gaW5wdXQgYXJpYS1sYWJlbCwgYXJpYS1sYWJlbGxlZGJ5XG4gIHZhciBsYWJlbFRleHQgPSBnZXRBcmlhTGFiZWwoIGlucHV0IClcblxuICAvLyBVc2Ugb3IgbGFiZWwudGV4dENvbnRlbnQsIG9yIGlucHV0IHBsYWNlaG9sZGVyPVwiXCJcbiAgaWYgKCAhbGFiZWxUZXh0ICkge1xuICAgIGlmIChsYWJlbCkgbGFiZWxUZXh0ID0gbGFiZWwudGV4dENvbnRlbnRcblxuICAgIGVsc2UgbGFiZWxUZXh0ID0gaW5wdXQuZ2V0QXR0cmlidXRlKCAncGxhY2Vob2xkZXInIClcbiAgfVxuXG4gIGlmICggbGFiZWxUZXh0ICkgcmV0dXJuIGxhYmVsVGV4dC50cmltKClcbn1cblxuZ2V0TGFiZWwudGV4dCA9IGdldExhYmVsVGV4dFxuZ2V0TGFiZWwubGVnZW5kID0gZ2V0TGVnZW5kVGV4dFxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldExhYmVsXG4iLCJ2YXIgdG9vbGJveCA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgRXZlbnQgPSB0b29sYm94LmV2ZW50LFxuICAgIGdldExhYmVsID0gcmVxdWlyZSggJy4vZ2V0LWxhYmVsJyApLFxuICAgIGlucHV0U2VsZWN0b3JzID0gcmVxdWlyZSggJy4vc2VsZWN0b3InICksXG4gICAgd2F0Y2hpbmcgPSBmYWxzZVxuXG5mdW5jdGlvbiBpbnB1dEluaXQoIGlucHV0ICkge1xuICBpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCAnZW1wdHknLCAhaW5wdXQudmFsdWUudHJpbSgpLmxlbmd0aCApXG4gIGlmICggaW5wdXQudHlwZSA9PSAncmFkaW8nIHx8IGlucHV0LnR5cGUgPT0gJ2NoZWNrYm94JyApIHtcbiAgICBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSA9IGlucHV0LmNoZWNrZWRcbiAgfSBlbHNlIHtcbiAgICBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZSA9IGlucHV0LnZhbHVlXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5wdXRDaGFuZ2UoIGlucHV0ICkge1xuICAvLyBBbGxvdyBjYWxsaW5nIGZyb20gZXZlbnQgaGFuZGxlclxuICB2YXIgaW5wdXQgPSAoIGlucHV0LnRhcmdldCB8fCBpbnB1dCApXG5cbiAgLy8gSWYgZWxlbWVudCBpcyBlbXB0eSAob3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlKVxuICAvLyBBZGQgZW1wdHkgY2xhc3NcbiAgaW5wdXQuY2xhc3NMaXN0LnRvZ2dsZSggJ2VtcHR5JywgIWlucHV0LnZhbHVlLnRyaW0oKS5sZW5ndGggKVxuXG4gIGNoYW5nZUNsYXNzZXMoIGlucHV0IClcblxuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdCggaW5wdXQsICdmb3JtJyApXG4gIGlmICggZm9ybSApIHtcbiAgICBFdmVudC5maXJlKCBmb3JtLCAnY2hhbmdlJyApXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlQ2xhc3NlcyggaW5wdXQsIHJlY3Vyc2l2ZSApIHtcbiAgdmFyIGNoYW5nZWRcbiAgdmFyIGRlZmF1bHRlZFxuXG4gIGlmICggaW5wdXQudHlwZSA9PSAncmFkaW8nICYmICFyZWN1cnNpdmUgKSB7XG4gICAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGlucHV0LCAnZm9ybScgKVxuICAgIGlmICggZm9ybSApIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoIGBbbmFtZT0nJHtpbnB1dC5uYW1lfSddYCApLCBmdW5jdGlvbiAoIGUgKSB7XG4gICAgICAgIGNoYW5nZUNsYXNzZXMoIGUsIHRydWUgKVxuICAgICAgfSlcbiAgICB9IFxuICB9IGVsc2UgaWYgKCBpbnB1dC50eXBlID09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgIGNoYW5nZWQgPSBTdHJpbmcoIGlucHV0LmNoZWNrZWQgKSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9IGVsc2Uge1xuICAgIGNoYW5nZWQgPSBpbnB1dC52YWx1ZSAhPSBpbnB1dC5kYXRhc2V0LmluaXRpYWxWYWx1ZVxuICB9XG5cbiAgaW5wdXQuY2xhc3NMaXN0LnRvZ2dsZSggJ2NoYW5nZWQtdmFsdWUnLCBjaGFuZ2VkIClcbiAgXG4gIC8vIFJlbW92ZSBhbGwgZGVmYXVsdGVkIHZhbHVlIGNsYXNzbmFtZXMgb24gYW4gaW5wdXQgY2hhbmdlXG4gIGlucHV0LmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnIClcblxuICB2YXIgbGFiZWwgPSBnZXRMYWJlbCggaW5wdXQgKVxuXG4gIGlmICggbGFiZWwgKSB7XG4gICAgdmFyIGhhc0NoYW5nZWRJbnB1dHMgPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCAnLmNoYW5nZWQtdmFsdWUnICkgfHwgaW5wdXQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnY2hhbmdlZC12YWx1ZScgKVxuICAgIGxhYmVsLmNsYXNzTGlzdC50b2dnbGUoICdpbnB1dC1jaGFuZ2VkLXZhbHVlJywgaGFzQ2hhbmdlZElucHV0cyApXG5cbiAgICAvLyBSZW1vdmUgYWxsIGRlZmF1bHRlZCB2YWx1ZSBjbGFzc25hbWVzIG9uIGFuIGlucHV0IGNoYW5nZVxuICAgIHRvb2xib3guZWFjaCggbGFiZWwucXVlcnlTZWxlY3RvckFsbCggJy5kZWZhdWx0ZWQtdmFsdWUnICksIGZ1bmN0aW9uICggZWwgKSB7IGVsLmNsYXNzTGlzdC5yZW1vdmUoICdkZWZhdWx0ZWQtdmFsdWUnICkgfSApXG4gICAgbGFiZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2lucHV0LWRlZmF1bHRlZC12YWx1ZScgKVxuICB9XG59XG5cblxuZnVuY3Rpb24gd2F0Y2ggKCkge1xuICBpZiAoIHdhdGNoaW5nICkgeyByZXR1cm4gfVxuICAvLyBJbml0aWFsaXplIGlucHV0IHN0YXRlXG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBpbnB1dFNlbGVjdG9ycyApLCBpbnB1dEluaXQgKVxuICB9KVxuXG4gIC8vIFNldCBpbnB1dCBzdGF0ZSBvbiBpbnB1dFxuICBFdmVudC5vbiggZG9jdW1lbnQsICdpbnB1dCcsIGlucHV0U2VsZWN0b3JzLCBpbnB1dENoYW5nZSApXG5cbiAgLy8gRm9ybS5yZXNldCgpIGRvZXNuJ3QgZmlyZSBpbnB1dCBldmVudHMuIFRoaXMgZW5zdXJlcyB0aG9zZSBldmVudHMgYXJlIGZpcmVkLlxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbdHlwZT1yZXNldF0nLCByZXNldEZvcm0gKVxuXG4gIHdhdGNoaW5nID0gdHJ1ZVxufVxuXG5cbmZ1bmN0aW9uIHJlc2V0Rm9ybShldmVudCkge1xuICB2YXIgZm9ybSA9IHRvb2xib3guZ2V0Q2xvc2VzdChldmVudC50YXJnZXQsICdmb3JtJylcblxuICBFdmVudC5kZWxheSggZnVuY3Rpb24oKSB7XG4gICAgdG9vbGJveC5lYWNoKGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQuaW5wdXQtY2hhbmdlZCwgc2VsZWN0LmlucHV0LWNoYW5nZWQsIHRleHRhcmVhLmlucHV0LWNoYW5nZWQgJyksIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgIEV2ZW50LmZpcmUoIGVsLCAnaW5wdXQnIClcbiAgICB9KVxuICB9LCAxMDAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2F0Y2g6IHdhdGNoXG59XG4iLCJ2YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgID0gdG9vbGJveC5ldmVudCxcbiAgICBDYWxsYmFjayA9IHRvb2xib3guZXZlbnQuY2FsbGJhY2ssXG4gICAgZm9ybVNlbGVjdG9yID0gJ2Zvcm0ucHJvZ3Jlc3NpdmUnLFxuICAgIHdhdGNoaW5nID0gZmFsc2UsXG4gICAgZm9ybUNhbGxiYWNrcyxcbiAgICByZWdpc3RlcmVkRm9ybXNcblxuLy8gUmVtb3ZlIGFueSBleGlzdGluZyBjYWxsYmFja3MgYW5kIHJlZ2lzdGVyZWQgZm9ybXNcbmZ1bmN0aW9uIHJlc2V0ICgpIHtcblxuICBmb3JtQ2FsbGJhY2tzID0geyBuZXh0OiBbXSB9XG4gIHJlZ2lzdGVyZWRGb3JtcyA9IFtdXG5cbn1cblxuZnVuY3Rpb24gbmV3Rm9ybSggZm9ybSApIHtcblxuICBpZiAoICFmb3JtICkgcmV0dXJuXG5cbiAgdmFyIHN0ZXBzICAgICA9IHRvb2xib3guc2xpY2UoIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJy5mb3JtLXN0ZXAnICkgKSxcbiAgICAgIHN0ZXBJbmRleCA9IDAsXG4gICAgICBuYXZJdGVtcyAgPSAnJ1xuXG4gIGlmICggc3RlcHMubGVuZ3RoID09IDAgKSByZXR1cm5cblxuXG4gIHN0ZXBzLmZvckVhY2goIGZ1bmN0aW9uKCBzdGVwLCBpbmRleCApIHsgXG5cbiAgICAvLyBkaXNhYmxlIGFsbCBzdGVwcyBidXQgdGhlIGN1cnJlbnQgc3RlcFxuICAgIHN0ZXAuZGlzYWJsZWQgICAgID0gc3RlcCAhPSBjdXJyZW50U3RlcCgpXG4gICAgc3RlcC5kYXRhc2V0LnN0ZXAgPSBpbmRleFxuXG4gIH0pXG5cbiAgaWYgKCBmb3JtLmRhdGFzZXQubmF2ICkge1xuICAgIHZhciBuYXYgPSAnPG5hdiBjbGFzcz1cInByb2dyZXNzaXZlLWZvcm0tbmF2XCI+J1xuXG4gICAgc3RlcHMuZm9yRWFjaCggZnVuY3Rpb24oIHN0ZXAsIGluZGV4ICkge1xuICAgICAgbmF2ICs9ICc8YSBocmVmPVwiI1wiIGNsYXNzPVwicHJvZ3Jlc3NpdmUtZm9ybS1uYXYtaXRlbVwiIGRhdGEtc3RlcD1cIicrKCBpbmRleCArIDEgKSsnXCI+J1xuICAgICAgbmF2ICs9IHN0ZXAuZGF0YXNldC5uYXYgfHwgXCJTdGVwIFwiICsgKCBpbmRleCArIDEgKVxuICAgICAgbmF2ICs9ICc8L2E+ICdcbiAgICB9KVxuXG4gICAgbmF2ICs9ICc8L25hdj4nXG5cbiAgICBmb3JtLmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyYmVnaW4nLCBuYXYgKVxuICB9XG5cbiAgc2hvdygpXG5cbiAgZnVuY3Rpb24gcHJldmlvdXNTdGVwICgpICB7IHJldHVybiBzdGVwc1sgc3RlcEluZGV4IC0gMV0gfVxuICBmdW5jdGlvbiBjdXJyZW50U3RlcCAoKSAgIHsgcmV0dXJuIHN0ZXBzWyBzdGVwSW5kZXggXSB9XG4gIGZ1bmN0aW9uIG5leHRTdGVwICgpICAgICAgeyByZXR1cm4gc3RlcHNbIHN0ZXBJbmRleCArIDFdIH1cbiAgZnVuY3Rpb24gYWN0aXZlICgpICAgICAgICB7IHJldHVybiBjdXJyZW50U3RlcCgpICYmICFjdXJyZW50U3RlcCgpLmRpc2FibGVkIH1cbiBcbiAgLy8gTW92ZSB0byBuZXh0IGZpZWxkc2V0XG4gIGZ1bmN0aW9uIGZvcndhcmQgKCkge1xuICAgIHNob3dTdGVwKCBzdGVwSW5kZXggKyAxIClcbiAgfVxuXG4gIC8vIE1vdmUgdG8gbmV4dCBmaWVsZHNldFxuICBmdW5jdGlvbiBiYWNrICgpIHtcbiAgICBzaG93U3RlcCggc3RlcEluZGV4IC0gMSApXG4gIH1cblxuICAvLyBBY2NlcHRzIGEgc3RlcCBpbmRleFxuICBmdW5jdGlvbiBzaG93U3RlcCAoIGluZGV4ICkge1xuXG4gICAgaW5kZXggPSBOdW1iZXIoIGluZGV4IClcblxuICAgIC8vIEdldCB0aGUgc3RlcCBmcm9tIHRoZSBpbmRleFxuICAgIHZhciBzdGVwID0gc3RlcHNbIGluZGV4IF1cblxuICAgIC8vIERvbid0IGdvIHRvIGEgbm9uLWV4aXN0YW50IHN0ZXAsIG9yIHRoZSBjdXJyZW50IHN0ZXBcbiAgICBpZiAoIHN0ZXAgJiYgc3RlcCAhPSBjdXJyZW50U3RlcCgpICkge1xuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gKCBzdGVwSW5kZXggPCBpbmRleCApID8gJ2ZvcndhcmQnIDogJ3JldmVyc2UnXG5cbiAgICAgIC8vIElmIGEgc3RlcCBpcyBjdXJyZW50bHkgYWN0aXZlXG4gICAgICAvLyBkaXNtaXNzIGl0IGJlZm9yZSBnb2luZyB0byB0aGUgc3BlY2lmaWVkIHN0ZXBcbiAgICAgIGlmICggYWN0aXZlKCkgKSB7XG4gICAgICAgIHJldHVybiBkaXNtaXNzKCBmdW5jdGlvbigpIHsgc2hvd1N0ZXAoIGluZGV4ICkgfSwgZGlyZWN0aW9uIClcbiAgICAgIH1cblxuICAgICAgc3RlcEluZGV4ID0gaW5kZXhcblxuICAgICAgc2hvdyggZGlyZWN0aW9uIClcblxuICAgIH1cbiAgfVxuICBcbiAgLy8gSGlkZSBhIGNvbXBsZXRlZCBzdGVwIGFuZCBtb3ZlIHRvIHRoZSBuZXh0XG4gIGZ1bmN0aW9uIGRpc21pc3MgKCBjYWxsYmFjaywgZGlyZWN0aW9uICkge1xuICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCAnZm9yd2FyZCdcblxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LnJlbW92ZSggJ2FjdGl2ZScsICdlbnRlcicgKVxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LmFkZCggJ2V4aXQnIClcbiAgICBjdXJyZW50U3RlcCgpLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggY3VycmVudFN0ZXAoKSwgZnVuY3Rpb24oKSB7XG4gICAgICBkaXNhYmxlKClcblxuICAgICAgaWYgKCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgKSBjYWxsYmFjaygpXG5cbiAgICB9LCAyMClcblxuICB9XG5cbiAgZnVuY3Rpb24gcmV2aXNpdCAoIGNhbGxiYWNrLCBkaXJlY3Rpb24gKSB7XG5cbiAgICBpZiAoICFhY3RpdmUoKSApIHtcbiAgICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCAncmV2ZXJzZSdcblxuICAgICAgY3VycmVudFN0ZXAoKS5jbGFzc0xpc3QucmVtb3ZlKCAnZXhpdCcsICdjb21wbGV0ZWQnIClcbiAgICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LmFkZCggJ2FjdGl2ZScsICdlbnRlcicgKVxuICAgICAgY3VycmVudFN0ZXAoKS5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuXG4gICAgICBkaXNhYmxlT3RoZXJGaWVsZHNldHMoKVxuXG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggY3VycmVudFN0ZXAoKSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nICkgY2FsbGJhY2soKVxuICAgICAgfSwgMjApXG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyB0aGUgZm9ybS1zdGVwXG4gIGZ1bmN0aW9uIHNob3cgKCBkaXJlY3Rpb24gKSB7XG5cbiAgICBkaXNhYmxlT3RoZXJGaWVsZHNldHMoKVxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LnJlbW92ZSggJ2NvbXBsZXRlZCcgKVxuICAgIGN1cnJlbnRTdGVwKCkuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICBjdXJyZW50U3RlcCgpLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnLCAnZW50ZXInIClcblxuICAgIC8vIGZvY3VzIG9uIHRoZSBmaXJzdCBpbnB1dFxuICAgIHZhciBmaXJzdElucHV0ID0gY3VycmVudFN0ZXAoKS5xdWVyeVNlbGVjdG9yKCAnaW5wdXQ6bm90KFtoaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCcgKVxuICAgIGlmICggZmlyc3RJbnB1dCApIGZpcnN0SW5wdXQuZm9jdXMoKVxuXG4gICAgc2V0TmF2KClcblxuICB9XG5cbiAgLy8gRGlzYWJsZSBhIGZvcm0gc3RlcCBhZnRlciBpdCBoYXMgYmVlbiBoaWRkZW5cbiAgZnVuY3Rpb24gZGlzYWJsZSAoKSB7XG5cbiAgICBjdXJyZW50U3RlcCgpLmRpc2FibGVkID0gdHJ1ZVxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LmFkZCggJ2NvbXBsZXRlZCcgKVxuICAgIGN1cnJlbnRTdGVwKCkuY2xhc3NMaXN0LnJlbW92ZSggJ2VudGVyJywgJ2V4aXQnIClcblxuICB9XG5cbiAgZnVuY3Rpb24gc2V0TmF2ICgpIHtcbiAgICB0b29sYm94LmVhY2goIGZvcm0ucXVlcnlTZWxlY3RvckFsbCggJ25hdiBbZGF0YS1zdGVwXScgKSwgZnVuY3Rpb24gKCBuYXYgKSB7XG5cbiAgICAgIGlmICggbmF2LmRhdGFzZXQuc3RlcCA8IHN0ZXBJbmRleCArIDEgKSB7XG4gICAgICAgIG5hdi5jbGFzc0xpc3QucmVtb3ZlKCAnaGVyZScsICduZXh0JyApXG4gICAgICAgIG5hdi5jbGFzc0xpc3QuYWRkKCAncHJldmlvdXMnLCAnY29tcGxldGVkJyApXG4gICAgICB9XG5cbiAgICAgIGlmICggbmF2LmRhdGFzZXQuc3RlcCA9PSBzdGVwSW5kZXggKyAxICkge1xuICAgICAgICBuYXYuY2xhc3NMaXN0LnJlbW92ZSggJ3ByZXZpb3VzJywgJ25leHQnIClcbiAgICAgICAgbmF2LmNsYXNzTGlzdC5hZGQoICdoZXJlJyApXG4gICAgICB9XG5cbiAgICAgIGlmICggbmF2LmRhdGFzZXQuc3RlcCA+IHN0ZXBJbmRleCArIDEgKSB7XG4gICAgICAgIG5hdi5jbGFzc0xpc3QucmVtb3ZlKCAncHJldmlvdXMnLCAnaGVyZScgKVxuICAgICAgICBuYXYuY2xhc3NMaXN0LmFkZCggJ25leHQnIClcbiAgICAgIH1cblxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBlbmFibGVGaWVsZHNldHMgKCBmb3JtICkge1xuICAgIHRvb2xib3guZWFjaCggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnZmllbGRzZXQuZm9ybS1zdGVwW2Rpc2FibGVkXScgKSwgZnVuY3Rpb24oIGZpZWxkc2V0ICkge1xuICAgICAgZmllbGRzZXQuZGlzYWJsZWQgPSBmYWxzZSBcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZU90aGVyRmllbGRzZXRzICggKSB7XG4gICAgc3RlcHMuZm9yRWFjaCggZnVuY3Rpb24oIGZpZWxkc2V0ICkge1xuICAgICAgZmllbGRzZXQuZGlzYWJsZWQgPSBmaWVsZHNldCAhPSBjdXJyZW50U3RlcCgpIFxuICAgIH0pXG4gIH1cblxuICByZWdpc3RlcmVkRm9ybXMucHVzaCggZnVuY3Rpb24oIGV2ZW50LCB0cmlnZ2VyICkge1xuICAgIHZhciB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0XG5cbiAgICBpZiAoIHRyaWdnZXIgPT09ICdzaG93LXN0ZXAnICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICBpZiAoIHRvb2xib3gubWF0Y2hlcyggdGFyZ2V0LCAnLnByZXZpb3VzLCAuY29tcGxldGVkLCAuY29tcGxldGVkICsgYScgKSApXG4gICAgICAgIHNob3dTdGVwKCB0YXJnZXQuZGF0YXNldC5zdGVwIC0gMSApXG5cbiAgICB9IGVsc2UgaWYgKCB0cmlnZ2VyID09PSAnbmV4dCcgKSB7XG5cbiAgICAgIC8vIENvbnRpbnVlIGlmIHN1Ym1pdCB3YXMgdHJpZ2dlcmVkIG9uIHRoaXMgZm9ybVxuICAgICAgLy8gYW5kIG5vIGludmFsaWQgZmllbGRzIGFyZSBmb3VuZFxuXG4gICAgICB2YXIgZm9ybUVsID0gKCB0YXJnZXQudGFnTmFtZSA9PSBcIkZPUk1cIiApID8gdGFyZ2V0IDogdG9vbGJveC5nZXRDbG9zZXN0KCB0YXJnZXQsICdmb3JtJylcblxuICAgICAgaWYgKCBmb3JtID09IGZvcm1FbCAmJiAhY3VycmVudFN0ZXAoKS5xdWVyeVNlbGVjdG9yKCAnOmludmFsaWQnICkgKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiB3aGljaCB0cmlnZ2VycyBjYWxsYmFja3NcbiAgICAgICAgdmFyIGZpcmVDYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoIGZvcm0gKVxuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhc3Qgc3RvcCwgYmUgc3VyZSBhbGwgZmllbGRzZXRzIGFyZSBlbmFibGVkIVxuICAgICAgICBpZiAoICFuZXh0U3RlcCgpICkgZW5hYmxlRmllbGRzZXRzKCBmb3JtIClcbiAgICAgICAgZWxzZSBkaXNhYmxlT3RoZXJGaWVsZHNldHMoIGZvcm0gKVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBjYWxsYmFja3MsIGxldCB0aGVtIGhhbmRsZSB0aGlzIVxuICAgICAgICBpZiAoIGZpcmVDYWxsYmFja3MgKSB7XG5cbiAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgY2FsbGJhY2tzLCBzdG9wIHRoZSBzdWJtaXNzaW9uIGV2ZW50XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgICAgZmlyZUNhbGxiYWNrcyggZXZlbnQsIHtcbiAgICAgICAgICAgIGZpZWxkc2V0OiBjdXJyZW50U3RlcCgpLCAgLy8gVmFsaWQgZmllbGRzZXQgZWxlbWVudFxuICAgICAgICAgICAgZm9ybTogICAgIGZvcm0sICAgICAgICAgICAvLyBQYXJlbnQgZm9ybSBlbGVtZW50XG4gICAgICAgICAgICBmb3J3YXJkOiAgZm9yd2FyZCwgICAgICAgIC8vIENhbGwgZm9yd2FyZCgpIHRvIG1vdmUgdG8gdGhlIG5leHQgZmllbGRzZXRcbiAgICAgICAgICAgIGRpc21pc3M6ICBkaXNtaXNzLCAgICAgICAgLy8gSGlkZSBhbmQgZGlzYWJsZSBjdXJyZW50IHN0ZXBcbiAgICAgICAgICAgIHJldmlzaXQ6ICByZXZpc2l0LCAgICAgICAgLy8gUmV2aXNpdCBjdXJyZW50IGRpc2FibGVkIHN0ZXBcbiAgICAgICAgICAgIHNob3dTdGVwOiBzaG93U3RlcCwgICAgICAgLy8gU2hvdyBhIHNwZWNpZmljIHN0ZXAgYnkgaW5kZXggKDAgYmFzZWQpXG4gICAgICAgICAgICBjb21wbGV0ZTogIW5leHRTdGVwKCksICAgIC8vIGlzIHRoaXMgaXMgdGhlIGZpbmFsIGZvcm0gc3RlcD9cbiAgICAgICAgICAgIGZvcm1EYXRhOiB0b29sYm94LmZvcm1EYXRhKCBjdXJyZW50U3RlcCgpICkgLy8gcGFzcyBGb3JtRGF0YSBmb3IgY3VycmVudCBmaWVsZHNldFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjYWxsYmFja3M/IElmIHRoZXJlJ3MgYSBuZXh0IHN0ZXAsIHN0b3Agc3VibWlzc2lvbiBhbmQgcHJvY2VlZFxuICAgICAgICBlbHNlIGlmICggbmV4dFN0ZXAoKSApIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxuICAgICAgICAgIGZvcndhcmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBmaXJlICggZXZlbnQsIHR5cGUgKSB7XG4gIHJlZ2lzdGVyZWRGb3Jtcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuKCBldmVudCwgdHlwZSApIH0pXG59XG5cblxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIHRyaWdnZXJzIGNhbGxiYWNrc1xuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tzICggZm9ybSwgdHlwZSApIHtcblxuICB0eXBlID0gdHlwZSB8fCAnbmV4dCdcbiAgdmFyIGNhbGxiYWNrcyA9IFtdLCBjYjtcblxuICBmb3JtQ2FsbGJhY2tzWyB0eXBlIF0uZm9yRWFjaCggZnVuY3Rpb24oIHRlc3QgKSB7XG4gICAgIGlmICggY2IgPSB0ZXN0KCBmb3JtICkgKSB7XG4gICAgICAgY2FsbGJhY2tzLnB1c2goIGNiIClcbiAgICAgfVxuICB9KVxuXG4gIC8vIFJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIGNhbiB0cmlnZ2VyIGFsbCBjYWxsYmFja3NcbiAgLy8gb3IgcmV0dXJucyBmYWxsc2UgaWYgbm9uZSBhcmUgY2FsbGVkXG5cbiAgaWYgKCBjYWxsYmFja3MubGVuZ3RoIClcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IHRvb2xib3guc2xpY2UoIGFyZ3VtZW50cyApXG5cbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KCBjYWxsYmFjaywgYXJncyApIH0pIH1cblxuICBlbHNlIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBuZXh0ICggZWwsIGNhbGxiYWNrICkge1xuICBvbiggZWwsICduZXh0JywgY2FsbGJhY2sgKVxufVxuXG5mdW5jdGlvbiBvbiAoIGVsLCBldmVudCwgY2FsbGJhY2sgKSB7XG5cbiAgLy8gQWNjZXB0IGV2ZW50cyBsaXN0IGFzIGFuIG9iamVjdCBlLmcuIHsgbmV4dDogY2FsbGJhY2sgfVxuICBpZiAoIHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgKSB7XG4gICAgZm9yICggdHlwZSBpbiBldmVudCApIHtcbiAgICAgIG9uKCBlbCwgdHlwZSwgZXZlbnRbIHR5cGUgXSApXG4gICAgfVxuICB9XG5cbiAgZWxzZSBpZiAoIGZvcm1DYWxsYmFja3NbIGV2ZW50IF0gKSB7XG5cbiAgICAvLyBPbmx5IGFsbG93IGFjY2VzcyB0byBhIGNhbGxiYWNrIGlmIHRoZSBmb3JtIG1hdGNoZXNcbiAgICB2YXIgZmlsdGVyID0gZnVuY3Rpb24oIGZvcm0gKSB7XG4gICAgICBpZiAoIGZvcm0gPT0gZWwgKSByZXR1cm4gY2FsbGJhY2tcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHRlc3Qgd3JhcHBlciBmdW5jdGlvbiB0byB0aGUgY2FsbGJhY2sgbGlzdFxuICAgIGZvcm1DYWxsYmFja3NbIGV2ZW50IF0ucHVzaCggZmlsdGVyIClcbiAgfVxufVxuXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKXtcbiAgcmVzZXQoKVxuXG4gIC8vIEFkZCBidWJibGluZyBzbyB3ZSBjYW4gbGlzdGVuIGZvciBzdWJtaXNzaW9uXG4gIEV2ZW50LmJ1YmJsZUZvcm1FdmVudHMoKVxuXG4gIHZhciBuZXh0U2VsZWN0b3IgPSBmb3JtU2VsZWN0b3IgKyAnIFt0eXBlPXN1Ym1pdF0sICcgKyBmb3JtU2VsZWN0b3IgKyAnIC5uZXh0LXN0ZXAnXG4gIHZhciBiYWNrU2VsZWN0b3IgPSBmb3JtU2VsZWN0b3IgKyAnIC5iYWNrLXN0ZXAnXG4gIHZhciBuYXZTZWxlY3RvciAgPSAnLnByb2dyZXNzaXZlLWZvcm0tbmF2LWl0ZW1bZGF0YS1zdGVwXSdcblxuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsIG5leHRTZWxlY3RvciAsIGZpcmUsICduZXh0JyApXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgYmFja1NlbGVjdG9yICwgZmlyZSwgJ2JhY2snIClcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCBuYXZTZWxlY3RvciAgLCBmaXJlLCAnc2hvdy1zdGVwJyApXG4vLyBpbnNlcnQgY29yZSBzdHlsaW5nIGZvciBoaWRpbmcgZGlzYWJsZWQgYW5kIGNvbXBsZXRlZCBmb3JtLXN0ZXBzXG4gIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYmVmb3JlZW5kJywgXCI8c3R5bGU+XFxcbi5mb3JtLXN0ZXBbZGlzYWJsZWRdLCAuZm9ybS1zdGVwLmNvbXBsZXRlZCB7XFxcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XFxcbiAgdG9wOiAgICAgIC05OTk5cHggICFpbXBvcnRhbnQ7XFxcbiAgbGVmdDogICAgIC05OTk5cHggICFpbXBvcnRhbnQ7XFxcbiAgbGVmdDogICAgIDAgICAgICAgICFpbXBvcnRhbnQ7XFxcbiAgcmlnaHQ6ICAgIDAgICAgICAgICFpbXBvcnRhbnQ7IH1cXFxuPC9zdHlsZT5cIiApXG5cbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICByZXNldCgpXG5cbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGZvcm1TZWxlY3RvciApLCBmdW5jdGlvbiggZWwgKSB7XG4gICAgICBuZXdGb3JtKCBlbCApXG4gICAgfSlcbiAgfSlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuZXh0OiBuZXh0LFxuICBuZXc6IG5ld0Zvcm1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGdldExhYmVsID0gcmVxdWlyZSggJy4vZ2V0LWxhYmVsJyApXG5cbmZ1bmN0aW9uIHJlc2V0VmFsdWUoIGV2ZW50ICkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgdmFyIGlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5yZXNldElucHV0IClcblxuICB0b29sYm94LmVhY2goIGlucHV0cywgZnVuY3Rpb24gKCBpICkge1xuICAgIHNldFZhbHVlKCBpLCBpLmRhdGFzZXQuaW5pdGlhbFZhbHVlIClcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUoaW5wdXQsIHZhbHVlKSB7XG4gIC8vIFRyaWdnZXIgZXZlbnQgd2F0Y2hlcnMgdGhhdCB0aGUgaW5wdXQgd2FzIGNoYW5nZWQuXG4gIGlmICggaW5wdXQudmFsdWUgIT0gdmFsdWUgKSB7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZVxuICAgIEV2ZW50LmZpcmUoIGlucHV0LCAnaW5wdXQnIClcblxuICAgIHZhciBmb3JtID0gdG9vbGJveC5nZXRDbG9zZXN0KCBpbnB1dCwgJ2Zvcm0nIClcbiAgICBFdmVudC5maXJlKCBmb3JtLCAnY2hhbmdlJyApXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZURlZmF1bHQoIGV2ZW50ICkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgdmFyIHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQucmVzdG9yZURlZmF1bHQgKVxuXG4gIHRvb2xib3guZWFjaCggdGFyZ2V0cywgZnVuY3Rpb24gKCBlbCApIHtcblxuICAgIC8vIFJlc3RvcmUgdG8gZGVmYXVsdCBhIHNpbmdsZSBlbGVtZW50XG4gICAgaWYgKCBlbC5kYXRhc2V0LmRlZmF1bHQgKSB7XG4gICAgICBzZXREZWZhdWx0KCBlbCApXG4gICAgfSBlbHNlIGlmICggZWwuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuICAgICAgLy8gUmVzdG9yZSBhbGwgaW5wdXRzIHRvIGRlZmF1bHQgd2hlblxuICAgICAgLy8gZGF0YS1yZXN0b3JlLWRlZmF1bHQgcG9pbnRzIHRvIGEgcGFyZW50IGVsZW1lbnRcbiAgICAgIHRvb2xib3guZWFjaCggZWwucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLWRlZmF1bHRdJyApLCBzZXREZWZhdWx0IClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHQoIGVsICkge1xuICBpZiAoIGVsLnR5cGUgPT0gJ3JhZGlvJyB8fCBlbC50eXBlID09ICdjaGVja2JveCcgKSB7XG4gICAgZWwuY2hlY2tlZCA9IHRydWVcbiAgICBFdmVudC5maXJlKCBlbCwgJ2lucHV0JyApXG4gIH0gZWxzZSB7XG4gICAgc2V0VmFsdWUoIGVsLCBlbC5kYXRhc2V0LmRlZmF1bHQgKVxuICB9XG5cbiAgZWwuY2xhc3NMaXN0LmFkZCggJ2RlZmF1bHRlZC12YWx1ZScgKVxuXG4gIHZhciBsYWJlbCA9IGdldExhYmVsKCBlbCApXG4gIGlmIChsYWJlbCkgbGFiZWwuY2xhc3NMaXN0LmFkZCggJ2lucHV0LWRlZmF1bHRlZC12YWx1ZScgKVxufVxuXG5mdW5jdGlvbiByZXNldEZvcm0oZXZlbnQpIHtcbiAgdmFyIGZvcm0gPSB0b29sYm94LmdldENsb3Nlc3QoIGV2ZW50LnRhcmdldCwgJ2Zvcm0nIClcbiAgRXZlbnQuZGVsYXkoIGZ1bmN0aW9uKCkge1xuICAgIHRvb2xib3guZWFjaCggZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnLmNoYW5nZWQtdmFsdWUnICksIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgIEV2ZW50LmZpcmUoIGVsLCAnaW5wdXQnIClcbiAgICB9KVxuICB9LCAxMDApXG59XG5cbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1tkYXRhLXJlc2V0LWlucHV0XScsIHJlc2V0VmFsdWUgKVxuRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnW2RhdGEtcmVzdG9yZS1kZWZhdWx0XScsIHJlc3RvcmVEZWZhdWx0IClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ1t0eXBlPXJlc2V0XScsIHJlc2V0Rm9ybSApXG4iLCJtb2R1bGUuZXhwb3J0cyA9ICdpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksIHNlbGVjdCwgdGV4dGFyZWEnXG4iLCIvLyBEZXBlbmRlbmNpZXNcbnZhciB0b29sYm94ICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgID0gdG9vbGJveC5ldmVudCxcbiAgICB0VGltZSAgICAgID0gdG9vbGJveC50aW1lLFxuICAgIGdldENsb3Nlc3QgPSB0b29sYm94LmdldENsb3Nlc3QsXG4gICAgd29yZENvdW50ICA9IHRvb2xib3gud29yZENvdW50LFxuICAgIHRleHRTZWxlY3RvcnMgPSAnW3JlcXVpcmVkXSc7XG5cbi8vIERvZXMgdGhpcyBicm93c2VyIHN1cHBvcnQgSFRNTDUgdmFsaWRhdGlvbj9cbmZ1bmN0aW9uIHN1cHBvcnRlZCAoKSB7XG5cbiAgcmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnaW5wdXQnICkuY2hlY2tWYWxpZGl0eSA9PT0gJ2Z1bmN0aW9uJ1xuXG59XG5cbnZhciBpbnZhbGlkSGFuZGxlciA9IEV2ZW50LmNhbGxiYWNrLm5ldyggZnVuY3Rpb24oIGV2ZW50ICkgeyBcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKSBcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgXG59KVxuXG4vLyBXYXRjaCBmb3IgZXZlbnRzICggaWYgdmFsaWRhdGlvbiBpcyBzdXBvcnRlZCApXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKXtcblxuICBpZiAoIHN1cHBvcnRlZCgpICkgeyBcblxuICAgIEV2ZW50LmJ1YmJsZUZvcm1FdmVudHMoKVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2ludmFsaWQnLCBpbnZhbGlkSGFuZGxlciwgdHJ1ZSApXG5cbiAgICBFdmVudC5vbiggZG9jdW1lbnQuYm9keSwgJ2NsaWNrJywgJ1t0eXBlPXN1Ym1pdF0nLCBzdWJtaXQgKVxuXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAndmFsaWRhdGUnLCAnZm9ybScsIGZ1bmN0aW9uKCBldmVudCApIHsgXG4gICAgICB2YWxpZGF0ZUZvcm0oIGV2ZW50LnRhcmdldCApXG4gICAgfSlcblxuICAgIC8vIEVuc3VyZSBhbGwgcmVxdWlyZWQgaW5wdXRzIGhhdmUgYXJpYS1yZXF1cmlyZWQgYXR0cmlidXRlc1xuICAgIHRvb2xib3guc2xpY2UoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbcmVxdWlyZWRdJyApICkuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW1lbnQgKSB7IFxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdhcmlhLXJlcXVpcmVkJywgdHJ1ZSApXG4gICAgfSlcblxuICAgIC8vIFdhdGNoIGlucHV0IGV2ZW50c1xuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2JsdXInLCAnW3JlcXVpcmVkXScsIGNoZWNrVmFsaWRhdGlvbiApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAna2V5ZG93bicsICdbcmVxdWlyZWRdJywgRXZlbnQuZGVib3VuY2UoIGNoZWNrVmFsaWRhdGlvbiwgMjAwICkgKVxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2lucHV0JywgJ3NlbGVjdFtyZXF1aXJlZF0nLCBFdmVudC5kZWJvdW5jZSggY2hlY2tWYWxpZGF0aW9uLCAyMDAgKSApXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2hhbmdlJywgJ1t0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF0nLCBjaGVja1ZhbGlkYXRpb24gKVxuXG4gIH1cbn0pXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRm9ybSAoIGZvcm0gKSB7XG5cbiAgLy8gU2NvcGVkIHZhcmlhYmxlc1xuICB2YXIgaW5wdXRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCAnW3JlcXVpcmVkXScgKSxcbiAgICAgIGludmFsaWRJbnB1dDtcblxuICB0b29sYm94LnNsaWNlKCBpbnB1dHMgKS5zb21lKCBmdW5jdGlvbiggaW5wdXQgKSB7XG5cbiAgICAvLyBpZiBpbnZhbGlkXG4gICAgaWYgKCAhZ2V0Q2xvc2VzdCggaW5wdXQsICdbZGlzYWJsZWRdJyApICYmICFjaGVja0lucHV0KCBpbnB1dCApICkge1xuICAgICAgaW52YWxpZElucHV0ID0gaW5wdXRcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9KVxuXG4gIGlmICggaW52YWxpZElucHV0ICkgeyBcblxuICAgIC8vIFNob3cgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgZm9jdXMoIGludmFsaWRJbnB1dCApXG4gICAgc2hvd01lc3NhZ2UoIGludmFsaWRJbnB1dCApXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRoZSBmb3JtIGlzIHZhbGlkLCBza2lwIGl0XG4gIGVsc2UgeyBcbiAgICByZXR1cm4gdHJ1ZSBcbiAgfVxuXG59XG5cbi8vIEhhbmRsZXIgZm9yIHZhbGlkYXRpb24gZXZlbnRzXG52YXIgY2hlY2tWYWxpZGF0aW9uID0gRXZlbnQuY2FsbGJhY2submV3KCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cbiAgaWYgKCBjaGVja0lucHV0KCBldmVudC50YXJnZXQsIGV2ZW50LnR5cGUgKSApIHtcblxuICAgIC8vIFJlbW92ZSBhbnkgcHJlLWV4aXN0aW5nIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgIGhpZGVNZXNzYWdlKCBldmVudC50YXJnZXQgKVxuICB9XG5cbn0pXG5cblxuZnVuY3Rpb24gY2hlY2tJbnB1dCAoIGlucHV0LCBldmVudCApIHtcblxuICB2YXIgZWwgICAgICAgPSBzdGF0dXNFbCggaW5wdXQgKSxcbiAgICAgIHZhbGlkICAgID0gaXNWYWxpZCggaW5wdXQgKSxcbiAgICAgIG5ldXRyYWwgID0gZXZlbnQgPT0gJ2tleWRvd24nICYmICF2YWxpZDtcblxuICAvLyBEb24ndCB0cmlnZ2VyIGludmFsaWQgc3R5bGUgd2hpbGUgdHlwaW5nXG4gIGlmICggbmV1dHJhbCAmJiBpbnB1dCA9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICkge1xuXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2ludmFsaWQnLCAndmFsaWQnIClcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWludmFsaWQnLCBmYWxzZSApXG5cbiAgfSBlbHNlIHtcblxuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoICdpbnZhbGlkJywgIXZhbGlkIClcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCAndmFsaWQnLCB2YWxpZCApXG4gICAgaW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1pbnZhbGlkJywgdmFsaWQgKVxuXG4gIH1cblxuICByZXR1cm4gdmFsaWRcblxufVxuXG4vLyBJcyBhbiBpbnB1dCB2YWxpZD9cbmZ1bmN0aW9uIGlzVmFsaWQgKCBpbnB1dCApIHtcblxuICAvLyBJZiBlbGVtZW50IG9ubHkgY29udGFpbnMgd2hpdGVzcGFjZSwgc3RyaXAgdmFsdWVcbiAgaWYgKCAhaW5wdXQudmFsdWUucmVwbGFjZSggL1xccy9nLCAnJyApLmxlbmd0aCApXG4gICAgaW5wdXQudmFsdWUgPSAnJ1xuXG4gIC8vIFNldCBhIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHdvcmQgY291bnRcbiAgdmFyIG1lc3NhZ2UgPSBjaGVja1ZhbHVlKCBpbnB1dCApIHx8IGNoZWNrTGVuZ3RoKCBpbnB1dCApIHx8IGNoZWNrVGltZSggaW5wdXQgKSB8fCAnJ1xuICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSggbWVzc2FnZSApXG5cbiAgdmFyIHZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpXG5cbiAgcmV0dXJuIHZhbGlkXG5cbn1cblxuXG5mdW5jdGlvbiBjaGVja1ZhbHVlKCBpbnB1dCApIHtcbiAgaWYgKCBpbnB1dC5kYXRhc2V0LmludmFsaWRWYWx1ZSApIHtcblxuICAgIC8vIERvZXMgaW5wdXQgdmFsdWUgPT0gaW52YWxpZCB2YWx1ZT8gKGNhc2UgaW5zZW5zaXRpdmUpXG4gICAgdmFyIHJlZ2V4cCA9IGVzY2FwZWRSZWdleCggaW5wdXQuZGF0YXNldC5pbnZhbGlkVmFsdWUsICdpJyApXG5cbiAgICBpZiAoIGlucHV0LnZhbHVlLm1hdGNoKCByZWdleHAgKSApIHtcblxuICAgICAgLy8gUmVtb3ZlIGFueSBzdGFuZGFyZCBjdXN0b20gbWVzc2FnZVxuICAgICAgaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlID0gaW5wdXQuZGF0YXNldC5tZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0Lm1lc3NhZ2UgPSAnJ1xuXG4gICAgICByZXR1cm4gaW5wdXQuZGF0YXNldC5pbnZhbGlkVmFsdWVNZXNzYWdlIHx8IFwiVmFsdWUgJ1wiK2lucHV0LnZhbHVlK1wiJyBpcyBub3QgcGVybWl0dGVkXCJcblxuICAgIC8vIElmIG5vdCBpbnZhbGlkIHZhbHVlIHJlc2V0IHN0YW5kYXJkIHZhbGlkYXRpb24gbWVzc2FnZVxuICAgIH0gZWxzZSBpZiAoIGlucHV0LmRhdGFzZXQuY2FjaGVkTWVzc2FnZSApIHtcblxuICAgICAgaW5wdXQuZGF0YXNldC5tZXNzYWdlID0gaW5wdXQuZGF0YXNldC5jYWNoZWRNZXNzYWdlXG4gICAgICBpbnB1dC5kYXRhc2V0LmNhY2hlZE1lc3NhZ2UgPSAnJ1xuXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRSZWdleCggaW5wdXQsIG9wdGlvbnMgKSB7XG4gIHZhciBzdHIgPSBpbnB1dC5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKVxuICByZXR1cm4gbmV3IFJlZ0V4cCggXCJeXCIgKyBzdHIgKyAnJCcsIG9wdGlvbnMgKVxufVxuXG5mdW5jdGlvbiBjaGVja0xlbmd0aCAoIGlucHV0ICkge1xuICByZXR1cm4gY2hlY2tDb3VudCggaW5wdXQsICdtaW4nIClcbiAgICAgIHx8IGNoZWNrQ291bnQoIGlucHV0LCAnbWF4JyApXG59XG5cbi8vIFRlc3QgY3VzdG9tIHZhbGlkYXRpb24gZm9yIG1heGltdW0gb3IgbWluaW11bSB3b3JkcyBwcmVzZW50XG5mdW5jdGlvbiBjaGVja0NvdW50ICggaW5wdXQsIGxpbWl0ICkge1xuXG4gIHZhciBnb2FsID0gaW5wdXQuZGF0YXNldFsgbGltaXQgKyAnV29yZHMnIF1cblxuICBpZiAoIGdvYWwgKSB7XG4gICAgdmFyIHBocmFzaW5nICAgPSAoIGxpbWl0ID09ICdtaW4nICkgPyAnYXQgbGVhc3QgJyA6ICdubyBtb3JlIHRoYW4gJyxcbiAgICAgICAgdmFsaWQgICAgICA9ICggbGltaXQgPT0gJ21pbicgKSA/ICggZ29hbCA8PSB3b3JkQ291bnQoaW5wdXQudmFsdWUpICkgOiAoIHdvcmRDb3VudChpbnB1dC52YWx1ZSkgPD0gZ29hbCApXG5cbiAgICAvLyBSZXR1cm4gYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgIGlmICggaW5wdXQudmFsdWUgJiYgIXZhbGlkIClcbiAgICAgIHJldHVybiAnUGxlYXNlIHdyaXRlICcgKyBwaHJhc2luZyArIGdvYWwgKyAnIHdvcmRzLidcbiAgfVxuXG5cbn1cblxuLy8gVGVzdCBjdXN0b20gdmFsaWRhdGlvbiBmb3IgbWF4aW11bSBhbmQgbWluaW11bSB0aW1lXG5mdW5jdGlvbiBjaGVja1RpbWUgKCBpbnB1dCApIHtcbiAgdmFyIGJlZm9yZSA9IGlucHV0LmRhdGFzZXQuYmVmb3JlVGltZSxcbiAgICAgIGFmdGVyID0gaW5wdXQuZGF0YXNldC5hZnRlclRpbWVcblxuICBpZiAoIGJlZm9yZSB8fCBhZnRlciB8fCBpbnB1dC5kYXRhc2V0LnZhbGlkYXRlVGltZSApIHtcbiAgICB2YXIgem9uZSA9IGlucHV0LmRhdGFzZXQuem9uZSB8fCAndXRjJyxcbiAgICAgICAgb3B0aW9ucyA9IHsgem9uZTogem9uZSB9LFxuICAgICAgICB0aW1lVmFsdWUgPSB0VGltZS5wYXJzZSggaW5wdXQudmFsdWUsIG9wdGlvbnMgKSxcbiAgICAgICAgZXJyID0gJycsXG4gICAgICAgIGlzQWZ0ZXIsIGFmdGVyVGltZSwgaXNCZWZvcmUsIGJlZm9yZVRpbWVcblxuICAgIC8vIEVudXJlIHRoYXQgdGhlIHRpbWUgdmFsdWUgaXMgYWN0dWFsbHkgXG4gICAgaWYgKCAhdGltZVZhbHVlICkgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSBzdHJpbmc6IFlZWVktTU0tREQgSEg6TU06U1NcIlxuXG4gICAgaWYgKCBiZWZvcmUgKSB7XG4gICAgICBiZWZvcmVUaW1lID0gdFRpbWUucGFyc2UoIGJlZm9yZSApXG5cbiAgICAgIGlmICggIWJlZm9yZVRpbWUgKSB7XG4gICAgICAgIGVyciA9IGBkYXRhLWJlZm9yZS10aW1lPScke2JlZm9yZX0nIGlzIG5vdCBhIHZhbGlkIGRhdGUgc3RyaW5nYFxuICAgICAgICBjb25zb2xlLmVycm9yKCBlcnIgKVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBhZnRlciApIHtcbiAgICAgIGFmdGVyVGltZSA9IHRUaW1lLnBhcnNlKCBhZnRlciApXG5cbiAgICAgIGlmICggIWFmdGVyVGltZSApIHtcbiAgICAgICAgZXJyID0gYGRhdGEtYWZ0ZXItdGltZT0nJHthZnRlcn0nIGlzIG5vdCBhIHZhbGlkIGRhdGUgc3RyaW5nYFxuICAgICAgICBjb25zb2xlLmVycm9yKCBlcnIgKVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBiZWZvcmVUaW1lICYmIGFmdGVyVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQmV0d2VlbiggdGltZVZhbHVlLCBhZnRlclRpbWUsIGJlZm9yZVRpbWUgKSApIHtcbiAgICAgICAgcmV0dXJuIFwiUGxlYXNlIGVudGVyIGEgdGltZSBiZXR3ZWVuIFwiK2Zvcm1hdERhdGUoIGFmdGVyVGltZSwgb3B0aW9ucyApK1wiIGFuZCBcIitmb3JtYXREYXRlKCBiZWZvcmVUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9IFxuXG4gICAgZWxzZSBpZiAoIGFmdGVyVGltZSApIHtcbiAgICAgIGlmICggIXRUaW1lLmlzQWZ0ZXIoIHRpbWVWYWx1ZSwgYWZ0ZXJUaW1lICkgKSB7IFxuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGFmdGVyIFwiK2Zvcm1hdERhdGUoIGFmdGVyVGltZSwgb3B0aW9ucyApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxzZSBpZiAoIGJlZm9yZVRpbWUgKSB7XG4gICAgICBpZiAoICF0VGltZS5pc0JlZm9yZSggdGltZVZhbHVlLCBiZWZvcmVUaW1lICkgKSB7IFxuICAgICAgICByZXR1cm4gXCJQbGVhc2UgZW50ZXIgYSB0aW1lIGJlZm9yZSBcIitmb3JtYXREYXRlKCBiZWZvcmVUaW1lLCBvcHRpb25zIClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZSggZGF0ZSwgb3B0aW9ucyApIHtcbiAgcmV0dXJuIHRUaW1lLnByZXR0eVByaW50KCBkYXRlLCBvcHRpb25zICkucmVwbGFjZSggJyBaJywgJycpXG59XG5cblxuLy8gSWYgaW5wdXQgaXMgbmVzdGVkIGluIGEgbGFiZWwsIHRyZWF0IHRoZSBsYWJlbCBhcyB0aGVcbi8vIHRhcmdldCBmb3IgYXNzaWduaW5nIHN0YXR1cyAoY2xhc3MgbmFtZXMgYW5kIG1lc3NhZ2VzKS5cbmZ1bmN0aW9uIHN0YXR1c0VsICggaW5wdXQgKSB7XG5cbiAgcmV0dXJuIGdldENsb3Nlc3QoIGlucHV0LCAnbGFiZWwnICkgfHwgaW5wdXRcblxufVxuXG4vLyBGb2N1cygpIGlmIGludmFsaWQgZWxlbWVudCBpcyBub3QgaGlkZGVuXG4vLyBvciBGb2N1cyBpdHMgaW1tZWRpYXRlIHNpYmxpbmcgKG1vc3RseSB1c2VkIGZvciB1cGxvYWQgYnV0dG9ucylcbmZ1bmN0aW9uIGZvY3VzICggZWwgKSB7XG5cbiAgZWwgPSAoIGVsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyApID8gZWwgOiBlbC5uZXh0U2libGluZ1xuICBlbC5mb2N1cygpXG5cbn1cblxuLy8gU3VibWlzc2lvbiB2YWxpZGF0aW9uIGhhbmRsZXIgZnVuY3Rpb25cbmZ1bmN0aW9uIHN1Ym1pdCAoIGV2ZW50ICkge1xuXG4gIHZhciBmb3JtID0gKCBldmVudC50YXJnZXQudGFnTmFtZSA9PSBcIkZPUk1cIiApID8gZXZlbnQudGFyZ2V0IDogZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnZm9ybScpXG5cbiAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIG5vIGludmFsaWQgaW5wdXRzIGZvdW5kXG4gIGlmICggIXZhbGlkYXRlRm9ybSggZm9ybSApICkge1xuXG4gICAgLy8gUGF1c2Uga2V5ZG93bi9ibHVyIHRyaWdnZXJzIGZvciB0aGUgbmV4dCBzZWNvbmQgdG8gYXZvaWQgbmV1dHJhbCBlbXB0eSBzdHlsZVxuICAgIGNoZWNrVmFsaWRhdGlvbi5zdG9wKClcbiAgICBFdmVudC5kZWxheSggY2hlY2tWYWxpZGF0aW9uLnN0YXJ0LCA1MDAgKVxuXG4gICAgLy8gU3RvcCB0aGUgc3VibWlzc2lvbiBldmVudFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gIH1cblxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlRmllbGQgKCBlbCwgbWVzc2FnZSApIHtcbiAgaWYgKCBlbCAmJiBlbC52YWx1ZSApIHtcbiAgICBlbC5kYXRhc2V0LmludmFsaWRWYWx1ZSA9IGVsLnZhbHVlXG4gICAgaWYgKCBtZXNzYWdlIClcbiAgICAgIGVsLmRhdGFzZXQuaW52YWxpZFZhbHVlTWVzc2FnZSA9IG1lc3NhZ2VcbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlTWVzc2FnZSAoIGVsICkge1xuXG4gIHZhciBmb3JtID0gZ2V0Q2xvc2VzdCggZWwsICdmb3JtJyApLFxuICAgICAgbXNnID0gZm9ybS5xdWVyeVNlbGVjdG9yKCAnLnZhbGlkYXRpb24tbWVzc2FnZScgKVxuXG4gIGlmICggbXNnICkgbXNnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG1zZyApXG5cbn1cblxuXG4vLyBWYWxpZGF0aW9uIG1lc3NhZ2UgaGFuZGxlciBmdW5jdGlvblxuZnVuY3Rpb24gc2hvd01lc3NhZ2UgKCBlbCApIHtcblxuICAvL2hpZGVNZXNzYWdlKCBlbCApXG5cbiAgdmFyIGxhYmVsID0gZ2V0Q2xvc2VzdCggZWwsICdsYWJlbCcgKSxcbiAgICAgIG1lc3NhZ2UgPSBlbC5kYXRhc2V0Lm1lc3NhZ2UgfHwgZWwudmFsaWRhdGlvbk1lc3NhZ2VcblxuICBpZiAoIGxhYmVsICkge1xuICAgIHZhciBleGlzdGluZ01lc3NhZ2UgPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCAnLnZhbGlkYXRpb24tbWVzc2FnZS10ZXh0JyApXG5cbiAgICBpZiAoICFleGlzdGluZ01lc3NhZ2UgKSB7XG4gICAgICBsYWJlbC5pbnNlcnRBZGphY2VudEhUTUwoICdiZWZvcmVlbmQnLCAgJzxzcGFuIGNsYXNzPVwidmFsaWRhdGlvbi1tZXNzYWdlXCI+PHNwYW4gY2xhc3M9XCJ2YWxpZGF0aW9uLW1lc3NhZ2UtdGV4dFwiIHJvbGU9XCJhbGVydFwiPicgKyBtZXNzYWdlICsgJzwvc3Bhbj48L3NwYW4+JyApXG5cbiAgICB9IGVsc2UgaWYgKCBleGlzdGluZ01lc3NhZ2UudGV4dENvbnRlbnQgIT0gbWVzc2FnZSApIHtcbiAgICAgIGV4aXN0aW5nTWVzc2FnZS5pbm5lckhUTUwgPSBtZXNzYWdlXG4gICAgfVxuICB9XG5cbn1cblxuLy8gUHVibGljIEFQSVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlOiB2YWxpZGF0ZUZvcm0sXG4gIGludmFsaWRhdGVGaWVsZDogaW52YWxpZGF0ZUZpZWxkXG59XG4iLCJyZXF1aXJlICgnLi9saWIvb2JqZWN0LmFzc2lnbicpXG5cbnZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuLy8gSW1wcm92ZXMgdGhlIHV0aWxpdHkgYW5kIHVzZXIgaW50ZXJmYWNlIGZvciByYW5nZSBpbnB1dHNcblxudmFyIHNsaWRlcnMgPSBbXVxudmFyIGxpc3RlbmluZ1xuXG52YXIgU2xpZGVyID0ge1xuICAvLyBXaGVuIGEgc2xpZGVyIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgYXNzb2NpYXRlZCBsYWJlbCBhbmQgaW5wdXQuXG4gIGNoYW5nZTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBzZWxmLnJlZnJlc2goZXZlbnQuY3VycmVudFRhcmdldClcbiAgfSxcblxuICAvLyBVcGRhdGUgbGFiZWxzIGFuZCBpbnB1dHNcbiAgcmVmcmVzaDogZnVuY3Rpb24gKHNsaWRlcikge1xuICAgIHNlbGYuc2V0TGFiZWxzKHNsaWRlcilcbiAgICBzZWxmLnNldElucHV0KHNsaWRlcilcbiAgICBzZWxmLnNldEZpbGwoc2xpZGVyKVxuICAgIHNlbGYuc2V0U3RhdGUoc2xpZGVyKVxuICB9LFxuICBcbiAgLy8gU29tZSBicm93c2VycyBkb24ndCBmb2N1cyB3aGVuIGEgc2xpZGVyIGlucHV0IGlzIGNoYW5nZWQsIHRoaXMgbGV0cyB1cyBmb3JjZSBmb2N1cy5cbiAgZm9jdXM6IGZ1bmN0aW9uKGV2ZW50KXtcbiAgICBpZiAoIGV2ZW50LmlzVHJ1c3RlZCApIHsgLy8gRG8gbm90IGZvY3VzIG9uIFwiYXJ0aWZpY2lhbGx5IHRyaWdnZXJlZFwiIGV2ZW50c1xuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5mb2N1cygpXG4gICAgfVxuICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIC8vIEluamVjdCBzbGlkZXIgdGVtcGxhdGVzIGludG8gdGhlIERPTVxuICBzZXR1cDogZnVuY3Rpb24oKXtcblxuICAgIGlmICghbGlzdGVuaW5nKSB7XG4gICAgICBFdmVudC5vbihkb2N1bWVudCwgXCJpbnB1dCB0b2dnbGVyOnNob3dcIiwgXCJbdHlwZT1yYW5nZV1cIiwgc2VsZi5jaGFuZ2UsIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlIGlucHV0XCIsIFwiW3R5cGU9cmFuZ2VdXCIsIHNlbGYuZm9jdXMsIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgbGlzdGVuaW5nID0gdHJ1ZVxuICAgIH1cblxuICAgIHZhciByYW5nZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYW5nZV06bm90KC5zbGlkZXItaW5wdXQpJylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocmFuZ2VzLCBmdW5jdGlvbihzbGlkZXIpe1xuXG4gICAgICB2YXIgZGF0YSA9IHNlbGYuZGF0YShzbGlkZXIpXG4gICAgICBzbGlkZXJzLnB1c2goZGF0YSlcblxuICAgICAgc2xpZGVyLmRhdGFzZXQuaWQgPSBkYXRhLmlkXG4gICAgICBzbGlkZXIuZGF0YXNldC5pbml0aWFsVmFsdWUgPSBzbGlkZXIudmFsdWVcblxuICAgICAgLy8gSW5qZWN0IHRlbXBsYXRlIGFuZCBzZXQgaW5wdXRzXG4gICAgICBzbGlkZXIgPSBzZWxmLnRlbXBsYXRlKHNsaWRlcilcbiAgICAgIHNlbGYucmVmcmVzaChzbGlkZXIpXG5cbiAgICB9KVxuICB9LFxuXG4gIGRhdGE6IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAvLyBBc3NpZ24gYW4gaW5jcmVtZW50YWwgSUQgdG8gdHJhY2sgdGhpcyBzbGlkZXIgd2l0aCBpdHMgZGF0YVxuICAgICAgaWQ6IHNsaWRlcnMubGVuZ3RoLFxuICAgICAgbWluOiBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdtaW4nKSkgfHwgMCxcbiAgICAgIG1heDogTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnbWF4JykpIHx8IDEwMCxcbiAgICAgIGxhYmVsczoge30sXG4gICAgICBleHRlcm5hbExhYmVsczoge31cbiAgICB9XG5cbiAgICAvLyBHZXRzIGRhdGFzZXQgYXMgYSBoYXNoXG4gICAgT2JqZWN0LmFzc2lnbihkYXRhLCBzZWxmLmV4dHJhY3REYXRhKGVsKSlcblxuICAgIGRhdGEgPSBzZWxmLmV4dHJhY3RWYWx1ZXMoZGF0YSlcbiAgICBkYXRhID0gc2VsZi5nZXRMYWJlbHMoZGF0YSlcblxuICAgIGlmIChkYXRhLnZhbHVlcylcbiAgICAgIGRhdGEubWF4ID0gKGRhdGEubWluICsgZGF0YS52YWx1ZXMubGVuZ3RoIC0gMSlcblxuICAgIGRhdGEuc2VnbWVudHMgPSBkYXRhLm1heCAtIGRhdGEubWluICsgMVxuXG4gICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmKGtleS5tYXRjaCgvLS8pKXtcbiAgICAgICAgZGF0YVt0aGlzLmNhbWVsQ2FzZShrZXkpXSA9IGRhdGFba2V5XVxuICAgICAgICBkZWxldGUgZGF0YVtrZXldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgZGF0YS1pbnB1dCBvciBuYW1lIGF0dHJpYnV0ZSB0byBzZXQgdmFsdWUgZm9yIGhpZGRlbiBpbnB1dC5cbiAgICAvL1xuICAgIGlmICghZGF0YS5pbnB1dCAmJiBlbC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSkge1xuICAgICAgZGF0YS5pbnB1dCA9IGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKVxuICAgIH1cblxuICAgIGlmIChkYXRhLmlucHV0KSB7XG4gICAgICAvLyBHZW5lcmF0ZSBhIGNsYXNzIG5hbWUgZm9yIHF1ZXJ5aW5nIGxhdGVyIChiZWNhdXNlIHNvbWUgbmFtZSBhdHRyaWJ1dGVzIGNvbnRhaW4gaWxsZWdhbCBjaGFyYWN0ZXJzIGZvciBxdWVyaWVzKVxuICAgICAgZGF0YS5pbnB1dENsYXNzID0gZGF0YS5pbnB1dC5yZXBsYWNlKC9cXFcvZywnLScpXG4gICAgICBkYXRhLmlucHV0RXhpc3RzID0gc2VsZi5pbnB1dEV4aXN0cyhlbCwgZGF0YSlcbiAgICB9XG5cbiAgICBkYXRhID0gc2VsZi5nZXRMaW5lTGFiZWxzKGRhdGEpXG5cbiAgICBpZiAoZGF0YS5tYXJrKSB7IFxuICAgICAgZGF0YS5tYXJrID0gZGF0YS5tYXJrLnNwbGl0KCcsJykubWFwKE51bWJlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVxuICB9LFxuXG4gIGdldERhdGE6IGZ1bmN0aW9uKHNsaWRlcikge1xuICAgIGlmICh0eXBlb2Ygc2xpZGVyICE9ICdzdHJpbmcnICYmIHNsaWRlci5kYXRhc2V0KSB7XG4gICAgICBzbGlkZXIgPSBzbGlkZXIuZGF0YXNldC5pZFxuICAgIH1cbiAgICByZXR1cm4gc2xpZGVyc1tzbGlkZXJdXG4gIH0sXG5cbiAgZXh0cmFjdFZhbHVlczogZnVuY3Rpb24oZGF0YSkge1xuICAgIGlmIChkYXRhLnZhbHVlcykgeyBcbiAgICAgIGRhdGEudmFsdWVzID0gZGF0YS52YWx1ZXMuc3BsaXQoJywnKS5tYXAoc2VsZi50cmltKVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLnZhbHVlcyA9IFtdXG4gICAgICBmb3IgKHZhciBpID0gZGF0YS5taW47IGkgPD0gZGF0YS5tYXg7IGkrKyApIHtcbiAgICAgICAgZGF0YS52YWx1ZXMucHVzaChpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gIH0sXG5cbiAgLy8gQ29udmVydCBkYXRhc2V0IHN0cmluZ3MgaW50byBoYXNoZXMgb2YgYXJyYXlzXG4gIC8vIGV4YW1wbGVzOlxuICAvLyAgLSBkYXRhLWxhYmVsPSdvbmUsdHdvLHRocmVlJyA9PiBkYXRhLmxhYmVscy5kZWZhdWx0ID0gWydvbmUnLCd0d28nLCd0aHJlZSddXG4gIC8vICAtIGRhdGEuZXh0ZXJuYWwtbGFiZWwtYXdlc29tZT0nb25lO3R3bzt0aHJlZScgPT4gZGF0YS5leHRlcm5hbExhYmVscy5hd2Vzb21lID0gWydvbmUnLCd0d28nLCd0aHJlZSddXG4gIC8vXG4gIC8vICBJZiBsYWJlbHMgaGF2ZSBub3QgYmVlbiBkaXNhYmxlZCAoZGF0YS1sYWJlbD0nZmFsc2UnKSBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgbGFiZWxzLFxuICAvLyAgYW4gYXJyYXkgb2YgdmFsdWVzIGlzIHNldCB0byBkYXRhLmxhYmVscy5kZWZhdWx0XG4gIC8vXG4gIGdldExhYmVsczogZnVuY3Rpb24oZGF0YSkge1xuICAgIGlmIChkYXRhLmxhYmVsICYmIGRhdGEubGFiZWwubWF0Y2goL2ZhbHNlfG5vbmUvKSlcbiAgICAgIGRhdGEubGFiZWwgPSBmYWxzZVxuXG4gICAgLy8gVW5sZXNzIGxhYmVscyBoYXZlIGJlZW4gZGlzYWJlZCB3aXRoIGRhdGEtbGFiZWw9J2ZhbHNlJ1xuICAgIGZvciAodmFyIHZhbCBpbiBkYXRhKSB7XG4gICAgICAvLyBJZ25vcmUgbm9uLW5hdGl2ZSBtZXRob2RzIGluamVjdGVkIGJ5IHNvbWUgd2F5d2FyZCBsaWJcbiAgICAgIGlmICghZGF0YS5oYXNPd25Qcm9wZXJ0eSh2YWwpKSB7IGNvbnRpbnVlIH1cbiAgICAgIC8vIERvbid0IGJvdGhlciBwcm9jZXNzaW5nIGRpc2FibGVkIGxhYmVsc1xuICAgICAgaWYgKGRhdGFbdmFsXSA9PT0gZmFsc2UpIHsgY29udGludWUgfVxuXG4gICAgICAvLyBNYXRjaCBwcm9wZXJ0aWVzOiBsYWJlbCwgbGFiZWwtaWQsIGV4dGVybmFsLWxhYmVsLWlkXG4gICAgICB2YXIgbWF0Y2ggPSB2YWwubWF0Y2goL14oZXh0ZXJuYWwtKT9sYWJlbC0oLispfF5sYWJlbCQvKVxuXG4gICAgICBpZihtYXRjaCkge1xuICAgICAgICAvLyBTb21lIGxhYmVscyBtYXkgaW5jbHVkZSBjb21tYXMsIGFsbG93IHNlbWljb2xvbnMgYXMgYW4gYWx0ZXJuYXRlIHNlcGFyYXRvclxuICAgICAgICAvL1xuICAgICAgICB2YXIgZGVsaW1pdGVyID0gZGF0YVt2YWxdLm1hdGNoKC87LykgPyAnOycgOiAnLCdcbiAgICAgICAgdmFyIGxhYmVscyAgICA9IGRhdGFbdmFsXS5zcGxpdChkZWxpbWl0ZXIpLm1hcChzZWxmLnRyaW0pXG4gICAgICAgIHZhciBleHRlcm5hbCAgPSBtYXRjaFsxXVxuICAgICAgICB2YXIgbmFtZSAgICAgID0gbWF0Y2hbMl1cblxuICAgICAgICBpZihleHRlcm5hbCl7XG4gICAgICAgICAgZGF0YS5leHRlcm5hbExhYmVsc1tuYW1lXSA9IGxhYmVsc1xuICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PSAnbGFiZWwnKSB7XG4gICAgICAgICAgZGF0YS5sYWJlbHMuZGVmYXVsdCA9IGxhYmVsc1xuICAgICAgICAgIGRlbGV0ZSBkYXRhLmxhYmVsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YS5sYWJlbHNbbmFtZV0gPSBsYWJlbHNcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBkYXRhW3ZhbF1cbiAgICAgIH1cblxuICAgICAgdmFyIGxhYmVsQ291bnQgPSBzZWxmLm9iamVjdFNpemUoZGF0YS5sYWJlbHMpXG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBsYWJlbHMsIHVzZSB2YWx1ZXMgZm9yIGEgbGFiZWxcbiAgICAgIGlmIChsYWJlbENvdW50ID09IDApXG4gICAgICAgIGRhdGEubGFiZWxzLmRlZmF1bHQgPSBkYXRhLnZhbHVlc1xuXG4gICAgICBpZiAobGFiZWxDb3VudCA+IDEpXG4gICAgICAgIGRlbGV0ZSBkYXRhLmxhYmVscy5kZWZhdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfSxcblxuICBnZXRMaW5lTGFiZWxzOiBmdW5jdGlvbihkYXRhKXtcbiAgICB2YXIgbGluZUxhYmVscyA9IHt9XG5cbiAgICAvLyBMaW5lIGxhYmVscyBtYXkgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzOlxuICAgIC8vIC0gMTpzdGFydCwxMTplbmQgICAgICAgICAgICAgIC0gaW5kZXggc3BlY2lmaWVkLCBjb21tYSBzZXBhcmF0ZWRcbiAgICAvLyAtIGZpcnN0LHNlY29uZCx0aGlyZCwxMTpsYXN0ICAtIGRlZmF1bHQgdG8gaW5kZXggZm9yIHNvbWUgbGFiZWxzXG4gICAgLy8gLSAxMCwwMDA7MjAsMDAwOzMwLDAwMCAgICAgICAgLSBzZW1pY29sb24gc2VwYXJhdGVkXG4gICAgLy9cbiAgICBpZihkYXRhLmxpbmVMYWJlbHMpIHtcbiAgICAgIHZhciBkZWxpbWl0ZXIgPSBkYXRhLmxpbmVMYWJlbHMubWF0Y2goLzsvKSA/ICc7JyA6ICcsJ1xuICAgICAgZGF0YS5saW5lTGFiZWxzLnNwbGl0KGRlbGltaXRlcikubWFwKGZ1bmN0aW9uKGxhYmVscywgaW5kZXgpe1xuICAgICAgICB2YXIgbCA9IGxhYmVscy5zcGxpdCgnOicpXG4gICAgICAgIGxhYmVsID0gKCFsWzFdID8gbFswXSA6IGxbMV0pXG4gICAgICAgIGluZGV4ID0gKCFsWzFdID8gaW5kZXggKyAxIDogbFswXSlcbiAgICAgICAgbGluZUxhYmVsc1tpbmRleF0gPSBsYWJlbFxuICAgICAgfSlcbiAgICAgIGRhdGEubGluZUxhYmVscyA9IGxpbmVMYWJlbHNcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVxuICB9LFxuXG4gIC8vIFxuICB0ZW1wbGF0ZTogZnVuY3Rpb24oc2xpZGVyKXtcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0RGF0YShzbGlkZXIpXG5cbiAgICBzbGlkZXIuc2V0QXR0cmlidXRlKCdtaW4nLCBkYXRhLm1pbilcbiAgICBzbGlkZXIuc2V0QXR0cmlidXRlKCdtYXgnLCBkYXRhLm1heClcblxuICAgIHNsaWRlci5jbGFzc0xpc3QuYWRkKCdzbGlkZXItaW5wdXQnKVxuXG4gICAgaWYoc2xpZGVyLmNsYXNzTGlzdC5jb250YWlucygnbGVmdC1sYWJlbCcpKVxuICAgICAgc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xlZnQtbGFiZWwnKVxuXG4gICAgdmFyIGNvbnRhaW5lckhUTUwgPSBzZWxmLnRlbXBsYXRlSFRNTChkYXRhKVxuXG4gICAgdmFyIGNsYXNzZXMgPSBbJ3NsaWRlci1jb250YWluZXInXVxuXG4gICAgaWYgKGNvbnRhaW5lckhUTUwubWF0Y2goJ3NsaWRlci1saW5lLWxhYmVsJykpXG4gICAgICBjbGFzc2VzLnB1c2goJ2xpbmUtbGFiZWxzJylcblxuICAgIGlmIChjb250YWluZXJIVE1MLm1hdGNoKCdzbGlkZXItbGFiZWwnKSlcbiAgICAgIGNsYXNzZXMucHVzaChcIndpdGgtbGFiZWxcIilcbiAgICBlbHNlXG4gICAgICBjbGFzc2VzLnB1c2goXCJ3aXRob3V0LWxhYmVsXCIpXG5cbiAgICBjb250YWluZXJIVE1MID0gJzxkaXYgY2xhc3M9XCInK2NsYXNzZXMuam9pbignICcpKydcIiBpZD1cInNsaWRlcicrZGF0YS5pZCsnXCI+J1xuICAgICAgKyBjb250YWluZXJIVE1MXG4gICAgICArJzwvZGl2PidcblxuICAgIHNsaWRlci5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJywgY29udGFpbmVySFRNTClcbiAgICB2YXIgY29udGFpbmVyID0gc2xpZGVyLnByZXZpb3VzU2libGluZ1xuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyLWlucHV0LWNvbnRhaW5lcicpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsIHNsaWRlci5vdXRlckhUTUwpXG4gICAgc2xpZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2xpZGVyKVxuXG4gICAgc2xpZGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXItaW5wdXQnKVxuICAgIFxuICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGZyb20gcHJvY2Vzc2VkIGRhdGFcbiAgICAvL1xuICAgIGlmKCFzbGlkZXIuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICAgICAgc2xpZGVyLnZhbHVlID0gZGF0YS52YWx1ZSB8fCBkYXRhLm1pblxuICAgIHJldHVybiBzbGlkZXJcbiAgfSxcbiAgXG4gIHRlbXBsYXRlSFRNTDogZnVuY3Rpb24oZGF0YSl7XG4gICAgdmFyIGh0bWwgPSBcIlwiXG4gICAgdmFyIGZpbGxzID0gXCJcIlxuICAgIFxuICAgIGlmIChkYXRhLm1hcmsgfHwgZGF0YS5saW5lTGFiZWxzKSB7XG4gICAgICBmb3IodmFyIGkgPSAxOyBpIDw9IGRhdGEuc2VnbWVudHM7IGkrKykge1xuICAgICAgICBcbiAgICAgICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9J3NsaWRlci1zZWdtZW50Jz48c3BhbiBjbGFzcz0nc2xpZGVyLXNlZ21lbnQtY29udGVudCc+XCJcblxuICAgICAgICBpZiAoZGF0YS5tYXJrICYmIGRhdGEubWFyay5pbmRleE9mKGkpICE9IC0xKVxuICAgICAgICAgIGh0bWwgKz0gXCI8c3BhbiBjbGFzcz0nc2xpZGVyLXNlZ21lbnQtbWFyaycgZGF0YS1pbmRleD0nXCIraStcIic+PC9zcGFuPlwiXG5cbiAgICAgICAgaWYgKGRhdGEubGluZUxhYmVscyAmJiBkYXRhLmxpbmVMYWJlbHNbaV0pIFxuICAgICAgICAgIGh0bWwgKz0gXCI8c3BhbiBjbGFzcz0nc2xpZGVyLWxpbmUtbGFiZWwnPlwiK2RhdGEubGluZUxhYmVsc1tpXStcIjwvc3Bhbj5cIlxuXG4gICAgICAgIGh0bWwgKz0gXCI8L3NwYW4+PC9kaXY+XCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbmUgbGVzc1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBkYXRhLnNlZ21lbnRzOyBpKyspIHtcbiAgICAgIGZpbGxzICs9IFwiPHNwYW4gY2xhc3M9J3NsaWRlci1maWxsJyBkYXRhLWluZGV4PSdcIitpK1wiJz48L3NwYW4+XCJcbiAgICB9XG5cbiAgICBodG1sID0gXCI8ZGl2IGNsYXNzPSdzbGlkZXItaW5wdXQtY29udGFpbmVyJz5cIlxuICAgICAgKyBcIjxkaXYgY2xhc3M9J3NsaWRlci10cmFjayc+XCIgKyBodG1sICsgXCI8L2Rpdj5cIlxuICAgICAgKyBcIjxkaXYgY2xhc3M9J3NsaWRlci1maWxscyc+XCIgKyBmaWxscyArIFwiPC9kaXY+XCJcbiAgICAgICsgXCI8L2Rpdj5cIlxuICAgICAgKyBzZWxmLmxhYmVsVGVtcGxhdGUoZGF0YSlcblxuICAgIGlmICghZGF0YS5pbnB1dEV4aXN0cyAmJiBkYXRhLmlucHV0Q2xhc3MpIHtcbiAgICAgIGh0bWwgKz0gXCI8aW5wdXQgY2xhc3M9J1wiK2RhdGEuaW5wdXRDbGFzcytcIicgdHlwZT0naGlkZGVuJyBuYW1lPSdcIitkYXRhLmlucHV0K1wiJyB2YWx1ZT0nJz5cIlxuICAgIH1cblxuICAgIHJldHVybiBodG1sXG4gICAgXG4gIH0sXG5cbiAgbGFiZWxUZW1wbGF0ZTogZnVuY3Rpb24oZGF0YSl7XG4gICAgdmFyIGh0bWwgPSBcIlwiXG5cbiAgICBpZiAoZGF0YS5sYWJlbCA9PSBmYWxzZSkgeyByZXR1cm4gaHRtbCB9XG5cbiAgICBmb3IodmFyIGtleSBpbiBkYXRhLmxhYmVscyl7XG4gICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cInNsaWRlci1sYWJlbC0nK2tleSsnIGludGVybmFsLWxhYmVsXCIgZGF0YS1zbGlkZXItbGFiZWw9XCInK2tleSsnXCI+J1xuICAgICAgaHRtbCArPSBzZWxmLmxhYmVsSFRNTChkYXRhLCBrZXksICcnKVxuICAgICAgaHRtbCArPSAnPC9zcGFuPjwvc3Bhbj4gJ1xuICAgIH1cblxuICAgIGlmIChodG1sLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgPSBcIjxkaXYgY2xhc3M9J3NsaWRlci1sYWJlbCBhbGlnbi1cIisoZGF0YS5wb3NpdGlvbkxhYmVsIHx8ICdyaWdodCcpK1wiJz5cIiArIGh0bWwgKyBcIjwvZGl2PlwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxcbiAgfSxcblxuICBsYWJlbEhUTUw6IGZ1bmN0aW9uKGRhdGEsIGtleSwgbGFiZWwpIHtcbiAgICByZXR1cm4gc2VsZi5sYWJlbE1ldGEoZGF0YSwga2V5LCAnYmVmb3JlJylcbiAgICArIFwiPHNwYW4gY2xhc3M9J2xhYmVsLWNvbnRlbnQnPlwiICsgbGFiZWwgKyBcIjwvc3Bhbj5cIlxuICAgICsgc2VsZi5sYWJlbE1ldGEoZGF0YSwga2V5LCAnYWZ0ZXInKVxuICB9LFxuXG4gIC8vIEdyYWIgYWxsIHByZWZpeGVzIG9yIHN1ZmZpeGVzLCBmb3IgZXhhbXBsZTpcbiAgLy8gLSBkYXRhLWJlZm9yZS1sYWJlbD0nJCdcbiAgLy8gLSBkYXRhLWFmdGVyLWxhYmVsPScvbW8nXG4gIC8vIC0gZGF0YS1hZnRlci1sYWJlbC1zaXplPSdHQidcbiAgLy9cbiAgbGFiZWxNZXRhOiBmdW5jdGlvbihkYXRhLCBrZXksIHBvc2l0aW9uKSB7XG4gICAgdmFyIGFsdEtleSA9IHNlbGYuY2FtZWxDYXNlKCctbGFiZWwtJytrZXkpXG4gICAgdmFyIG1ldGEgPSBkYXRhW3Bvc2l0aW9uK2FsdEtleV0gfHwgZGF0YVtwb3NpdGlvbisnTGFiZWwnXVxuICAgIGlmIChtZXRhKVxuICAgICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J1wiK3Bvc2l0aW9uK1wiLWxhYmVsJz5cIittZXRhK1wiPC9zcGFuPlwiXG4gICAgZWxzZVxuICAgICAgcmV0dXJuICcnXG4gIH0sXG5cbiAgLy8gSXMgdGhlcmUgYWxyZWFkeSBhbiBpbnB1dCBtYXRjaGluZyB0aGlzIG5hbWU/XG4gIGlucHV0RXhpc3RzOiBmdW5jdGlvbihzbGlkZXIsIGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbnB1dENsYXNzKSB7XG4gICAgICB2YXIgaW5wdXQgPSBzZWxmLnNjb3BlKHNsaWRlcikucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIicrZGF0YS5pbnB1dCsnXCJdJylcblxuICAgICAgaWYoaW5wdXQpIHtcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChkYXRhLmlucHV0Q2xhc3MpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGV4dHJhY3REYXRhOiBmdW5jdGlvbihlbCkge1xuICAgIHZhciBwYXR0ZXJuID0gJ2RhdGEtJ1xuICAgIHZhciBkYXRhID0ge31cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWwuYXR0cmlidXRlcy5sZW5ndGg7IGkrKyl7XG4gICAgICB2YXIgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWVcblxuICAgICAgaWYobmV3IFJlZ0V4cChcIl5cIitwYXR0ZXJuKS50ZXN0KG5hbWUpKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UocGF0dGVybiwgJycpXG4gICAgICAgIGRhdGFbbmFtZV0gPSBlbC5hdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9LFxuXG4gIGdldENoYW5nZTogZnVuY3Rpb24oIHNsaWRlciApIHtcbiAgICB2YXIgaW5pdGlhbCA9IE51bWJlcihzbGlkZXIuZGF0YXNldC5pbml0aWFsVmFsdWUpXG5cbiAgICBpZiAoIGluaXRpYWwgPCBzbGlkZXIudmFsdWUgKSB7XG4gICAgICByZXR1cm4gXCJpbmNyZWFzZWRcIlxuICAgIH0gZWxzZSBpZiAoIHNsaWRlci52YWx1ZSA8IGluaXRpYWwgKSB7XG4gICAgICByZXR1cm4gXCJkZWNyZWFzZWRcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJpbml0aWFsXCJcbiAgICB9XG4gIH0sXG5cbiAgbGFiZWxFbGVtZW50czogZnVuY3Rpb24oaWQsIGtleSwgZXh0ZXJuYWwpIHtcbiAgICB2YXIgc2VsZWN0b3IgPSAnW2RhdGEtc2xpZGVyLWxhYmVsPScra2V5KyddJ1xuICAgIHZhciBpbnRlcm5hbFNlbGVjdG9yID0gXCIjc2xpZGVyXCIraWQgKyAnICcgKyBzZWxlY3RvclxuICAgIHZhciBleHRlcm5hbFNlbGVjdG9yID0gc2VsZWN0b3IgKz0gJzpub3QoLmludGVybmFsLWxhYmVsKScgXG4gICAgaWYgKGV4dGVybmFsKSB7IFxuICAgICAgc2VsZWN0b3IgPSBleHRlcm5hbFNlbGVjdG9yXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdG9yID0gaW50ZXJuYWxTZWxlY3RvciArICcsICcgKyBleHRlcm5hbFNlbGVjdG9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gIH0sXG5cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uKCBzbGlkZXIgKSB7XG4gICAgdmFyIGRhdGEgPSBzZWxmLmdldERhdGEoIHNsaWRlciApLFxuICAgICAgICBzdGF0ZUVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXRyYWNrLXNsaWRlci1zdGF0ZT1cIiMnK3NsaWRlci5pZCsnXCJdJyApLFxuICAgICAgICBjaGFuZ2UgPSBzZWxmLmdldENoYW5nZSggc2xpZGVyIClcblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzbGlkZXInK2RhdGEuaWQpLmRhdGFzZXQuc2xpZGVyU3RhdGUgPSBjaGFuZ2VcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIHN0YXRlRWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICBlbC5kYXRhc2V0LnNsaWRlclN0YXRlID0gY2hhbmdlXG4gICAgfSlcbiAgfSxcblxuICBzZXRGaWxsOiBmdW5jdGlvbihzbGlkZXIpIHtcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0RGF0YShzbGlkZXIpXG4gICAgdmFyIHNlZ21lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NsaWRlcicrZGF0YS5pZCsnIC5zbGlkZXItc2VnbWVudCcpXG4gICAgdmFyIGZpbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NsaWRlcicrZGF0YS5pZCsnIC5zbGlkZXItZmlsbCcpXG4gICAgdmFyIHNsaWRlckluZGV4ID0gc2VsZi5zbGlkZXJJbmRleChzbGlkZXIpXG4gICAgXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChmaWxscywgZnVuY3Rpb24oZmlsbCwgaW5kZXgpe1xuICAgICAgaWYgKGZpbGwuZGF0YXNldC5pbmRleCA8PSBzbGlkZXJJbmRleCkge1xuICAgICAgICBmaWxsLmNsYXNzTGlzdC5hZGQoJ2ZpbGxlZCcpXG4gICAgICAgIGlmKHNlZ21lbnRzW2luZGV4XSkge1xuICAgICAgICAgIHNlZ21lbnRzW2luZGV4XS5jbGFzc0xpc3QuYWRkKCdmaWxsZWQnKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcpXG4gICAgICAgIGlmKHNlZ21lbnRzW2luZGV4XSkge1xuICAgICAgICAgIHNlZ21lbnRzW2luZGV4XS5jbGFzc0xpc3QucmVtb3ZlKCdmaWxsZWQnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBcbiAgfSxcblxuICBzZXRJbnB1dDogZnVuY3Rpb24oc2xpZGVyKSB7XG4gICAgdmFyIGRhdGEgPSBzZWxmLmdldERhdGEoc2xpZGVyKVxuXG4gICAgLy8gRG9uJ3QgdXBkYXRlIGhpZGRlbiBzbGlkZXJzXG4gICAgaWYgKHNsaWRlci5vZmZzZXRQYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIH1cblxuICAgIGlmIChkYXRhLmlucHV0ICYmIGRhdGEudmFsdWVzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkYXRhLnZhbHVlc1tzZWxmLnNsaWRlckluZGV4KHNsaWRlcildXG4gICAgICB2YXIgc2VsZWN0b3IgPSBcIi5cIitkYXRhLmlucHV0LnJlcGxhY2UoL1xcVy9nLCctJylcbiAgICAgIHZhciBpbnB1dHMgPSBzZWxmLnNjb3BlKHNsaWRlcikucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpbnB1dHMsIGZ1bmN0aW9uKGlucHV0KXtcbiAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgc2V0TGFiZWxzOiBmdW5jdGlvbihzbGlkZXIpIHtcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0RGF0YShzbGlkZXIpXG4gICAgdmFyIGluZGV4ID0gc2VsZi5zbGlkZXJJbmRleChzbGlkZXIpXG5cbiAgICBpZiAoc2xpZGVyLm9mZnNldFBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChbJ2xhYmVscycsICdleHRlcm5hbExhYmVscyddLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZXh0ZXJuYWwgPSAodHlwZSA9PSAnZXh0ZXJuYWxMYWJlbHMnKVxuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YVt0eXBlXSkge1xuICAgICAgICB2YXIgbGFiZWxFbHMgPSBzZWxmLmxhYmVsRWxlbWVudHMoZGF0YS5pZCwga2V5LCBleHRlcm5hbClcbiAgICAgICAgdmFyIGxhYmVscyA9IHNlbGYubGFiZWxBdEluZGV4KGRhdGFbdHlwZV0sIGluZGV4KVxuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGFiZWxFbHMsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5sYWJlbC1jb250ZW50JylcblxuICAgICAgICAgIGlmICggY29udGFpbmVyICkgeyBjb250YWluZXIuaW5uZXJIVE1MID0gbGFiZWxzW2tleV0gfVxuICAgICAgICAgIGVsc2UgeyBlbC5pbm5lckhUTUwgPSBzZWxmLmxhYmVsSFRNTChkYXRhLCBrZXksIGxhYmVsc1trZXldKSB9XG5cbiAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdlbXB0eS1sYWJlbCcsIGxhYmVsc1trZXldID09PSAnJylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIC8vIEdldCBhbGwgbGFiZWxzIGZvciB0aGUgY3VycmVudCBzbGlkZXIgcG9zaXRpb25cbiAgbGFiZWxBdEluZGV4OiBmdW5jdGlvbihsYWJlbHMsIGluZGV4KXtcbiAgICB2YXIgc2V0ID0ge31cbiAgICBmb3IgKHZhciBrZXkgaW4gbGFiZWxzKSB7XG4gICAgICBzZXRba2V5XSA9IGxhYmVsc1trZXldW2luZGV4XVxuICAgIH1cbiAgICByZXR1cm4gc2V0XG4gIH0sIFxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2xpZGVyIHZhbHVlIGJ5IHRoZSBtaW5pbXVtIHZhbHVlXG4gIHNsaWRlckluZGV4OiBmdW5jdGlvbihzbGlkZXIpe1xuICAgIHJldHVybiBOdW1iZXIoc2xpZGVyLnZhbHVlKSAtIE51bWJlcihzbGlkZXIuZ2V0QXR0cmlidXRlKCdtaW4nKSlcbiAgfSxcblxuICAvLyBJZiBzbGlkZXIgaXMgaW4gYSBmb3JtLCByZXR1cm4gdGhhdCBmb3JtLlxuICAvLyBUaGlzIGFsb3dzIHVzIHRvIGJlIHN1cmUgdGhhdCBzbGlkZXJzIGluIG9uZVxuICAvLyBmb3JtIGRvIG5vdCB1cGRhdGUgbGFiZWxzIHdpdGggdGhlIHNhbWUgbmFtZVxuICAvLyBpbiBhbm90aGVyIGZvcm0uXG4gIC8vXG4gIHNjb3BlOiBmdW5jdGlvbihzbGlkZXIpIHtcbiAgICB2YXIgZWwgPSBzbGlkZXJcblxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudE5vZGVcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbiAgfSxcblxuICAvLyBGdW5jdGlvbiBmb3IgZWFzeSBtYXBpbmcsIGFzIGluOiBzb21lQXJyYXkubWFwKHNlbGYudHJpbSlcbiAgdHJpbTogZnVuY3Rpb24obmFtZSl7IFxuICAgIHJldHVybiBuYW1lLnRyaW0oKVxuICB9LFxuXG4gIG9iamVjdFNpemU6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBsZW5ndGggPSAwOyBmb3IodmFyIGkgaW4gb2JqZWN0KSB7IGxlbmd0aCsrIH1cbiAgICByZXR1cm4gbGVuZ3RoXG4gIH0sXG5cbiAgY2FtZWxDYXNlOiBmdW5jdGlvbihpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLy0oLikvZywgZnVuY3Rpb24obWF0Y2gsIGdyb3VwKSB7XG4gICAgICByZXR1cm4gZ3JvdXAudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgc2VsZiA9IFNsaWRlclxuXG5FdmVudC5jaGFuZ2UoU2xpZGVyLnNldHVwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNsaWRlclxuIiwiaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicpIHtcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSkoKTtcbn1cbiIsInZhciBUaW1lVG9nZ2xlID0gcmVxdWlyZSgnLi9saWIvdG9nZ2xlLmpzJylcbnZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG5UaW1lVG9nZ2xlLnRpbWVhZ28gPSByZXF1aXJlKCcuL2xpYi90aW1lYWdvLmpzJylcblRpbWVUb2dnbGUuZGF0ZVRvSFRNTCA9IHJlcXVpcmUoJy4vbGliL2RhdGUtdG8taHRtbC5qcycpXG5cbkV2ZW50LnJlYWR5KFRpbWVUb2dnbGUubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRpbWVUb2dnbGUuc2V0dXApXG5cbm1vZHVsZS5leHBvcnRzID0gVGltZVRvZ2dsZVxuIiwiLy8gQ29udmVydHMgYSBzaW1wbGUgZGF0ZSBzdHJpbmcgaW50byBEYXRlICsgVGltZSArIFRpbWV6b25lIHdyYXBwZWQgaW4gSFRNTFxuLy9cbi8vIElucHV0OlxuLy8gLSBTdHJpbmcsIGNvbXBhdGlibGUgd2l0aCBKUyBkYXRlIHBhcnNpbmcgZS5nLiBcIjIwMTQtMTAtMjBcIiBvciBcIjIwMTQtMDUtMjEgMTA6NjNcIlxuLy8gLSBTdHJpbmcsIHRpbWV6b25lOiBcIlVUQ1wiLCBcIkNTVFwiLCBldGMuXG4vL1xuLy8gUmV0dXJuczogSFRNTCB3aGljaCBpcyBcIjIwMTQtMDEtMjggMTg6MDA6MDAgQ1NUXCIsIHNlcGFyYXRlZCBhbmQgd3JhcHBlZCB3aXRoIHNwYW5zXG4vLyB3aXRoIGNsYXNzbmFtZXM6IGRhdGUsIHRpbWUgYW5kIHRpbWV6b25lXG4vL1xudmFyIERhdGVUb0hUTUwgPSB7XG4gIHN1cHBvcnRlZDogZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKFwiMjAxNC0wMS0yOVQxODoxNDoyOSswMDowMFwiKS5nZXREYXRlKCkpXG4gIH0sXG5cbiAgbG9jYWw6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCBmYWxzZSlcbiAgfSxcblxuICB1dGM6IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gRGF0ZVRvSFRNTC5wYXJzZShkYXRlU3RyaW5nLCB0cnVlKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiBkYXRlVG9IdG1sKGRhdGVTdHJpbmcsIHV0Yykge1xuICAgIGlmKCFEYXRlVG9IVE1MLnN1cHBvcnRlZCgpKXsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHZhciBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZylcblxuICAgIC8vIElmIGRhdGUgaXMgaW52YWxpZCwgYmFpbFxuICAgIGlmKGlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZih1dGMpIHtcbiAgICAgIHZhciB5ICA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICAgICAgdmFyIG1vID0gcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpXG4gICAgICB2YXIgZCAgPSBwYWQoZGF0ZS5nZXRVVENEYXRlKCkpXG4gICAgICB2YXIgaCAgPSBwYWQoZGF0ZS5nZXRVVENIb3VycygpKVxuICAgICAgdmFyIG0gID0gcGFkKGRhdGUuZ2V0VVRDTWludXRlcygpKVxuICAgICAgdmFyIHMgID0gcGFkKGRhdGUuZ2V0VVRDU2Vjb25kcygpKVxuICAgICAgdmFyIHpvbmUgPSAnVVRDJ1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeSAgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgIHZhciBtbyA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICAgICAgdmFyIGQgID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgICAgdmFyIGggID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICAgIHZhciBtICA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgICAgIHZhciBzICA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICAgIHZhciB6b25lID0gRGF0ZVRvSFRNTC50aW1lem9uZShkYXRlKVxuICAgIH1cblxuICAgIHZhciBzdHIgPSAnPHNwYW4gY2xhc3M9XCJkYXRlXCI+Jyt5KyctJyttbysnLScrZCsnPC9zcGFuPidcbiAgICBzdHIgKz0gJyA8c3BhbiBjbGFzcz1cInRpbWVcIj4nK2grJzonK20rJzonK3MrJzwvc3Bhbj4nXG4gICAgc3RyICs9ICcgPHNwYW4gY2xhc3M9XCJ0aW1lem9uZVwiPicrem9uZSsnPC9zcGFuPidcbiAgICByZXR1cm4gc3RyXG4gIH0sXG5cbiAgLy8gRXh0cmFjdCB0aW1lem9uZSBsYWJlbFxuICB0aW1lem9uZTogZnVuY3Rpb24oZGF0ZSl7XG4gICAgdmFyIHpvbmUgPSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpLy02MClcbiAgICB2YXIgdHogPSBTdHJpbmcoZGF0ZSkubWF0Y2goL1xcKCguKylcXCkkLylcblxuICAgIGlmKHR6KSB7XG4gICAgICAvLyBCcm93c2VyIGhhcyBmcmllbmRseSB0aW1lem9uZSBsYWJlbCBsaWtlICdFU1QnXG4gICAgICB2YXIgem9uZSA9IHR6WzFdXG4gICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnJvd3NlciB1c2VzIGEgR01UIG9mZnNldCArLy1cbiAgICAgIHZhciB6b25lID0gXCJHTVQgXCIgXG4gICAgICAgICAgem9uZSArPSAoKHpvbmUgPiAwKSA/ICcrJyA6ICcnKVxuICAgICAgICAgIHpvbmUgKz0gXCIgXCIrIHBhZCh6b25lKjEwMCwgNClcbiAgICB9XG5cbiAgICByZXR1cm4gem9uZVxuICB9XG59XG5cbnZhciBwYWQgPSBmdW5jdGlvbiBkYXRlUGFkKG51bSwgcGFkKXtcbiAgcGFkID0gcGFkIHx8IDJcbiAgd2hpbGUoU3RyaW5nKG51bSkubGVuZ3RoIDwgcGFkKSB7XG4gICAgbnVtID0gJzAnICsgbnVtXG4gIH1cbiAgcmV0dXJuIG51bVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGVUb0hUTUxcbiIsIi8vIFRpbWVhZ28gYnkgQnJhbmRvbiBNYXRoaXMsIGJhc2VkIG9uIEphdmFTY3JpcHQgUHJldHR5IERhdGUgQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gUmVzaWdcbi8vIFJldHVybnMgcmVsYXRpdmUgdGltZVxuXG52YXIgVGltZWFnbyA9IHtcbiAgLy8gc2V0dXAgSFRNTCB0ZW1wbGF0ZXNcbiAgc2V0dXA6IGZ1bmN0aW9uIHRpbWVhZ29TZXR1cCgpIHtcblxuICAgIHZhciB0aW1lRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpbWVhZ29bZGF0ZXRpbWVdJylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGltZUVscywgZnVuY3Rpb24oZWwpIHtcbiAgICAgIHZhciBkYXRldGltZSA9IGVsLmF0dHJpYnV0ZXMuZGF0ZXRpbWUudmFsdWVcbiAgICAgIHZhciBzdHlsZSA9IGVsLmRhdGFzZXQudGltZWFnb1N0eWxlXG4gICAgICBlbC5pbm5lckhUTUwgPSBUaW1lYWdvLnBhcnNlKGRhdGV0aW1lLCBzdHlsZSlcbiAgICB9KVxuICB9LFxuXG4gIC8vIElmIGEgYnJvd3NlciBjYW4ndCBoYW5kbGUgZGF0ZXMsIGJhaWwuXG4gIGJyb3dzZXJTdXBwb3J0OiBmdW5jdGlvbiB0aW1lYWdvQnJvd3NlclN1cHBvcnQoKSB7XG4gICAgcmV0dXJuICFpc05hTihuZXcgRGF0ZShcIjIwMTQtMDEtMjlUMTg6MTQ6MjkrMDA6MDBcIikuZ2V0RGF0ZSgpKVxuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbiB0aW1lYWdvUGFyc2UodGltZSwgc3R5bGUpIHtcblxuICAgIGlmICh0eXBlb2YodGltZSkgPT0gJ3N0cmluZycpIHtcbiAgICAgIHRpbWUgPSBuZXcgRGF0ZSh0aW1lKVxuICAgIH1cblxuICAgIGlmIChzdHlsZSA9PT0gJ3Nob3J0JylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwibm93XCIsXG4gICAgICBtaW51dGVfYWdvOiAgXCIxbVwiLFxuICAgICAgbWludXRlc19hZ286IFwibVwiLFxuICAgICAgaG91cl9hZ286ICAgIFwiMWhcIixcbiAgICAgIGhvdXJzX2FnbzogICBcImhcIixcbiAgICAgIHllc3RlcmRheTogICBcIjFkXCIsXG4gICAgICBkYXlzX2FnbzogICAgXCJkXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxd1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwid1wiXG4gICAgfVxuXG4gICAgZWxzZSBpZiAoc3R5bGUgPT09ICdsb25nJylcbiAgICB2YXIgc2F5ID0ge1xuICAgICAganVzdF9ub3c6ICAgIFwianVzdCBub3dcIixcbiAgICAgIG1pbnV0ZV9hZ286ICBcIjEgbWludXRlIGFnb1wiLFxuICAgICAgbWludXRlc19hZ286IFwiIG1pbnV0ZXMgYWdvXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXIgYWdvXCIsXG4gICAgICBob3Vyc19hZ286ICAgXCIgaG91cnMgYWdvXCIsXG4gICAgICB5ZXN0ZXJkYXk6ICAgXCIxIGRheSBhZ29cIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzIGFnb1wiLFxuICAgICAgbGFzdF93ZWVrOiAgIFwiMSB3ZWVrIGFnb1wiLFxuICAgICAgd2Vla3NfYWdvOiAgIFwiIHdlZWtzIGFnb1wiXG4gICAgfVxuXG4gICAgZWxzZVxuICAgIHZhciBzYXkgPSB7XG4gICAgICBqdXN0X25vdzogICAgXCJqdXN0IG5vd1wiLFxuICAgICAgbWludXRlX2FnbzogIFwiMSBtaW51dGVcIixcbiAgICAgIG1pbnV0ZXNfYWdvOiBcIiBtaW51dGVzXCIsXG4gICAgICBob3VyX2FnbzogICAgXCIxIGhvdXJcIixcbiAgICAgIGhvdXJzX2FnbzogICBcIiBob3Vyc1wiLFxuICAgICAgeWVzdGVyZGF5OiAgIFwiMSBkYXlcIixcbiAgICAgIGRheXNfYWdvOiAgICBcIiBkYXlzXCIsXG4gICAgICBsYXN0X3dlZWs6ICAgXCIxIHdlZWtcIixcbiAgICAgIHdlZWtzX2FnbzogICBcIiB3ZWVrc1wiXG4gICAgfVxuXG4gICAgdmFyIHNlY3MgICA9ICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0aW1lKS5nZXRUaW1lKCkpIC8gMTAwMClcbiAgICB2YXIgbWlucyAgID0gTWF0aC5mbG9vcihzZWNzIC8gNjApXG4gICAgdmFyIGhvdXJzICA9IE1hdGguZmxvb3Ioc2VjcyAvIDM2MDApXG4gICAgdmFyIGRheXMgICA9IE1hdGguZmxvb3Ioc2VjcyAvIDg2NDAwKVxuICAgIHZhciB3ZWVrcyAgPSBNYXRoLmZsb29yKGRheXMgLyA3KVxuICAgIHZhciBtb250aHMgPSBNYXRoLmZsb29yKGRheXMgLyAzMClcblxuICAgIGlmKGlzTmFOKHNlY3MpIHx8IGRheXMgPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZihkYXlzID09PSAwKSB7XG4gICAgICBpZiAgICAgKHNlY3MgPCA2MCkgICByZXR1cm4gc2F5Lmp1c3Rfbm93XG4gICAgICBlbHNlIGlmKHNlY3MgPCAxMjApICByZXR1cm4gc2F5Lm1pbnV0ZV9hZ28gXG4gICAgICBlbHNlIGlmKHNlY3MgPCAzNjAwKSByZXR1cm4gbWlucyArIHNheS5taW51dGVzX2FnbyBcbiAgICAgIGVsc2UgaWYoc2VjcyA8IDcyMDApIHJldHVybiBzYXkuaG91cl9hZ29cbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHJldHVybiBob3VycyArIHNheS5ob3Vyc19hZ29cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZGF5cyA9PT0gMSkgICAgICAgcmV0dXJuIHNheS55ZXN0ZXJkYXlcbiAgICAgIGVsc2UgaWYoZGF5cyA8IDcpICAgIHJldHVybiBkYXlzICsgc2F5LmRheXNfYWdvXG4gICAgICBlbHNlIGlmKHdlZWtzID09PSAxKSByZXR1cm4gc2F5Lmxhc3Rfd2Vla1xuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgcmV0dXJuIHdlZWtzICsgc2F5LndlZWtzX2Fnb1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbWVhZ29cbiIsInZhciBUaW1lYWdvID0gcmVxdWlyZSgnLi90aW1lYWdvJylcbnZhciBEYXRlVG9IVE1MID0gcmVxdWlyZSgnLi9kYXRlLXRvLWh0bWwnKVxudmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGUgPSB7XG4gIHRpbWVFbHM6IGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aW1lLXRvZ2dsZVtkYXRldGltZV0nKVxuICB9LFxuXG4gIC8vIFRoZSBrZXkgaXMgdGhlIGN1cnJlbnQgdGltZSwgdGhlIHZhbHVlIGlzIHRoZSBuZXh0IHRpbWUgdHlwZSB0byBiZSBkaXNwbGF5ZWRcbiAgbmV4dFRpbWU6IHtcbiAgICAndGltZWFnbyc6ICdsb2NhbCcsXG4gICAgJ2xvY2FsJzogJ3V0YycsXG4gICAgJ3V0Yyc6ICd0aW1lYWdvJ1xuICB9LFxuXG4gIC8vIEF0dGFjaCBsaXN0ZW5lcnMsIHNldHVwIEhUTUwgdGVtcGxhdGVzXG4gIHNldHVwOiBmdW5jdGlvbigpIHtcbiAgICBpZighVGltZWFnby5icm93c2VyU3VwcG9ydCgpKSByZXR1cm4gZmFsc2VcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgVG9nZ2xlLmluaXQpXG4gIH0sXG5cbiAgLy8gQXR0YWNoIGxpc3RlbmVycyB0byB0b2dnbGUgdGltZSB6b25lcyB3aGluZSBjbGlja2VkXG4gIGxpc3RlbjogZnVuY3Rpb24oKSB7XG4gICAgaWYoIVRpbWVhZ28uYnJvd3NlclN1cHBvcnQoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGlja1wiLCBcIi50aW1lLXRvZ2dsZVwiLCBUb2dnbGUudG9nZ2xlKVxuICB9LFxuXG4gIC8vIFRvZ2dsZSBhbGwgdGltZXMgb24gcGFnZVxuICB0b2dnbGU6IGZ1bmN0aW9uKCBldmVudCApe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoVG9nZ2xlLnRpbWVFbHMoKSwgZnVuY3Rpb24oZWwpIHtcbiAgICAgIFRvZ2dsZS50b2dnbGVFbChlbClcbiAgICB9KVxuXG4gICAgaWYgKCBldmVudCAmJiBldmVudC50YXJnZXQgKSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIH1cbiAgfSxcblxuICAvLyBTd2l0Y2ggYmV0d2VlbiB0aW1lIGFnbywgVVRDLCBhbmQgbG9jYWwgdGltZVxuICB0b2dnbGVFbDogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgZGF0ZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBuZXh0ID0gVG9nZ2xlLm5leHRUaW1lW2VsLmRhdGFzZXQubW9kZSB8fCAndGltZWFnbycgXVxuXG4gICAgVG9nZ2xlLnNldENvbnRlbnQoZWwsIFRvZ2dsZS5kYXRlSFRNTChkYXRlLCBuZXh0LCBlbCksIG5leHQpXG5cbiAgICByZXR1cm4gZWxcbiAgfSxcblxuICAvLyBTdXBwbHkgSFRNTCBmb3IgVVRDIGFuZCBsb2NhbCBkYXRldGltZVxuICAvL1xuICBpbml0OiBmdW5jdGlvbihlbCkge1xuICAgIHZhciBkYXRldGltZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKVxuICAgIHZhciBtb2RlID0gZWwuZGF0YXNldC5tb2RlIHx8ICd0aW1lYWdvJ1xuICAgIHZhciBodG1sID0gVG9nZ2xlLmRhdGVIVE1MKGRhdGV0aW1lLCBtb2RlLCBlbClcblxuICAgIGlmIChodG1sKXsgXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ3RvZ2dsZSB0aW1lJylcbiAgICAgIFRvZ2dsZS5zZXRDb250ZW50KGVsLCBodG1sLCBtb2RlKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0aW1lLXRvZ2dsZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsXG4gIH0sXG5cbiAgc2V0Q29udGVudDogZnVuY3Rpb24oIGVsLCBodG1sLCBtb2RlICkge1xuICAgIHZhciBkYXRlVGV4dE5vZGUgPSBlbC5xdWVyeVNlbGVjdG9yKCAnLmRhdGUtdGV4dCcgKVxuXG4gICAgaWYgKCBkYXRlVGV4dE5vZGUgKSB7XG4gICAgICBkYXRlVGV4dE5vZGUuaW5uZXJIVE1MID0gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj4nK2h0bWwrJzwvc3BhbidcbiAgICB9XG5cbiAgICBlbC5kYXRhc2V0Lm1vZGUgPSBtb2RlXG4gIH0sXG5cbiAgZGF0ZUhUTUw6IGZ1bmN0aW9uKGRhdGUsIHR5cGUsIGVsKSB7XG4gICAgaWYgKHR5cGUgPT0gJ3RpbWVhZ28nKVxuICAgICAgdmFyIHQgPSBUaW1lYWdvLnBhcnNlKGRhdGUsIGVsLmRhdGFzZXQudGltZWFnbylcbiAgICBlbHNlIGlmIChEYXRlVG9IVE1MW3R5cGVdKVxuICAgICAgdmFyIHQgPSBEYXRlVG9IVE1MW3R5cGVdKGRhdGUpXG5cbiAgICBpZiAodCkge1xuICAgICAgcmV0dXJuIFwiPHNwYW4gY2xhc3M9J3RpbWUtdG9nZ2xlLWRhdGUgXCIrdHlwZStcIic+XCIgKyB0ICsgXCI8L3NwYW4+XCJcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVcbiIsInZhciBFdmVudCA9IHJlcXVpcmUoJ2NvbXBvc2UtZXZlbnQnKVxuXG52YXIgVG9nZ2xlciA9IHtcbiAgY2hlY2tib3hTZWxlY3RvcjogXCJbdHlwZT1jaGVja2JveF1bZGF0YS10b2dnbGVdLCBbdHlwZT1jaGVja2JveF1bZGF0YS1zaG93XSwgW3R5cGU9Y2hlY2tib3hdW2RhdGEtaGlkZV1cIixcbiAgcmFkaW9TZWxlY3RvcjogXCJpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLXNob3ddLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWhpZGVdLCBpbnB1dFt0eXBlPXJhZGlvXVtkYXRhLWFkZC1jbGFzc10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtcmVtb3ZlLWNsYXNzXVwiLFxuICBzZWxlY3RTZWxlY3RvcjogXCJvcHRpb25bZGF0YS1oaWRlXSwgb3B0aW9uW2RhdGEtc2hvd11cIixcblxuICBsaXN0ZW46IGZ1bmN0aW9uKCl7XG4gICAgRXZlbnQub24oZG9jdW1lbnQsIFwiY2xpY2sgY2hhbmdlXCIsIFwiW2RhdGEtdG9nZ2xlXSwgW2RhdGEtc2hvd10sIFtkYXRhLWhpZGVdLCBbZGF0YS10b2dnbGUtY2xhc3NdLCBbZGF0YS1hZGQtY2xhc3NdLCBbZGF0YS1yZW1vdmUtY2xhc3NdXCIsIFRvZ2dsZXIudHJpZ2dlcilcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjaGFuZ2VcIiwgXCIuc2VsZWN0LXRvZ2dsZXJcIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKHdpbmRvdywgJ2hhc2hjaGFuZ2UnLCBUb2dnbGVyLmhhc2hDaGFuZ2UpXG4gIH0sXG5cbiAgaGFzaENoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCApIHtcblxuICAgICAgdmFyIGFuY2hvciA9ICdbZGF0YS1hbmNob3I9XCInK3dpbmRvdy5sb2NhdGlvbi5oYXNoKydcIl0nXG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJ2lucHV0JythbmNob3IrICcsIG9wdGlvbicrYW5jaG9yIClcblxuICAgICAgaWYgKCB0YXJnZXQgKSB7XG4gICAgICAgIGlmICggdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJyApIHtcbiAgICAgICAgICB0YXJnZXQuY2hlY2tlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHRhcmdldClcbiAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IHRhcmdldC5pbmRleFxuICAgICAgICAgIHRhcmdldCA9IHNlbGVjdFxuICAgICAgICB9XG4gICAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKCB0YXJnZXQgKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZWZyZXNoOiBmdW5jdGlvbigpe1xuICAgIFRvZ2dsZXIudG9nZ2xlQ2hlY2tib3hlcygpXG4gICAgVG9nZ2xlci5zZXR1cFNlbGVjdHMoKVxuICAgIFRvZ2dsZXIuc2V0dXBSYWRpb3MoKVxuICB9LFxuXG4gIHRyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gU3RvcCBldmVudCBhbmQgYnViYmxpbmcgaWYgbGluayBpcyBvbmx5IGJlaW5nIHVzZWQgYXMgYSB0b2dnbGVyXG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT0gXCIjXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3AoKVxuICAgIH0gXG5cbiAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudClcbiAgfSxcblxuICB0cmlnZ2VyVG9nZ2xpbmc6IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICB2YXIgYWN0aW9ucyA9IFsnaGlkZScsICd0b2dnbGUnLCAnc2hvdycsICdyZW1vdmVDbGFzcycsICd0b2dnbGVDbGFzcycsICdhZGRDbGFzcyddXG4gICAgdmFyIHNlbGVjdFxuXG4gICAgLy8gU3RvcmUgdGhlIHNlbGVjdCwgYW5kIHNldCB0aGUgdGFyZ2V0IHRvIHRoZSBjdXJyZW50IG9wdGlvblxuICAgIC8vIEV2ZW50cyBmaXJlIG9uIHRoZSBzZWxlY3QsIGJ1dCB0aGUgb3B0aW9ucyBoYXZlIHRvZ2dsaW5nIGF0dHJpYnV0ZXNcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUubWF0Y2goL3NlbGVjdC9pKSkge1xuICAgICAgc2VsZWN0ID0gdGFyZ2V0XG4gICAgICB0YXJnZXQgPSBzZWxlY3Quc2VsZWN0ZWRPcHRpb25zWzBdXG4gICAgfVxuXG4gICAgLy8gUmFkaW8gaW5wdXRzIGFuZCBzZWxlY3RzIGRvIG5vdCBzdXBwb3J0IHRvZ2dsaW5nLCBzbyByZW1vdmUgdGhlbVxuICAgIGFjdGlvbnMgPSBhY3Rpb25zLmZpbHRlcihmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3QgfHwgdGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gIWFjdGlvbi5tYXRjaCgvdG9nZ2xlLylcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQuZGF0YXNldFthY3Rpb25dICE9IG51bGxcbiAgICB9KVxuICAgIFxuICAgIC8vIERpc3BhdGNoIGFsbCBhY3Rpb25zXG4gICAgYWN0aW9ucy5mb3JFYWNoKCBmdW5jdGlvbiggYWN0aW9uICkge1xuICAgICAgVG9nZ2xlci5kaXNwYXRjaCggdGFyZ2V0LCBhY3Rpb24gKVxuICAgIH0pXG4gIH0sXG5cbiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGVsLCB0eXBlKSB7XG4gICAgdmFyIGFjdGlvbiA9IHR5cGVcbiAgICB2YXIgZGF0YSA9IGVsLmRhdGFzZXRbdHlwZV1cblxuICAgIC8vIEFib3J0IGlmIGVsZW1lbnQgZG9lc24ndCBoYXZlIGRhdGEgZm9yIHRoZSBhY3Rpb25cbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcgfHwgZGF0YSA9PSAnJykgcmV0dXJuXG5cbiAgICAvLyBUb2dnbGUgYW5kIHNob3cgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIGNoZWNrYm94ZXNcbiAgICBpZiAoZWwudHlwZSA9PSAnY2hlY2tib3gnKVxuICAgICAgYWN0aW9uID0gKHR5cGUubWF0Y2goL2hpZGV8cmVtb3ZlL2kpID8gIWVsLmNoZWNrZWQgOiBlbC5jaGVja2VkKVxuXG4gICAgaWYgKGRhdGEpe1xuICAgICAgaWYgKHR5cGUubWF0Y2goL2NsYXNzL2kpKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhkYXRhLCBhY3Rpb24sIGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZShkYXRhLCBhY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEFkZCwgcmVtb3ZlLCBvciB0b2dnbGUgY2xhc3NuYW1lcywgdHJpZ2dlcmVkIGJ5IGVsZW1lbnRzIHdpdGg6XG4gIC8vICBkYXRhLWhpZGUtY2xhc3MsIGRhdGEtc2hvdy1jbGFzcywgYW5kIGRhdGEtdG9nZ2xlLWNsYXNzIHZhbHVlc1xuICAvL1xuICAvLyAgRGF0YSB2YWx1ZSBleGFtcGxlczpcbiAgLy8gICAtIFwiY2xhc3NuYW1lXCIgLSBhZGQvcmVtb3ZlL3RvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50XG4gIC8vICAgLSBcImZvbyBiYXJcIiAgIC0gbXVsdGlwbGUgY2xhc3NuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcyAobGlrZSBodG1sIGNsYXNzIHByb3BlcnR5KVxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3RvclwiIC0gY2hhbmdlIGNsYXNzbmFtZXMgb24gZWxlbWVudHMgbWF0Y2hlZCBieSBzZWxlY3RvclxuICAvLyAgIC0gXCJmb28gYmFyOyBzZWxlY3Rvciwgc2VsZWN0b3JcIiAtIG1hdGNoIG11bHRpcGxlIHNlbGVjdG9yc1xuICAvL1xuICAvLyAgWW91IGNhbiBwZXJmb3JtIG11bHRpcGxlIGFkZC9yZW1vdmUgY2xhc3NlcyBieSBqb2luaW5nIHZhbHVlcyB3aXRoIGFuIGAmYFxuICAvLyAgRm9yIGV4YW1wbGU6IFwiY2xhc3NuYW1lICYgZm9vIGJhcjsgc2VsZWN0b3JcIlxuICAvLyAgVGhpcyB3b3VsZCB0b2dnbGUgY2xhc3NuYW1lIG9uIGN1cnJlbnQgZWxlbWVudCBhbmQgdG9nZ2xlIGBmb28gYmFyYCBjbGFzc25hbWVzXG4gIC8vICBvbiBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAvL1xuXG4gIHNldENsYXNzOiBmdW5jdGlvbiAoc2VsZWN0b3JzLCBhY3Rpb24sIGVsKXtcbiAgICBpZih0eXBlb2Ygc2VsZWN0b3JzID09ICd1bmRlZmluZWQnIHx8IHNlbGVjdG9ycyA9PSAnJykgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mKGFjdGlvbikgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhY3Rpb24gPSAoYWN0aW9uID8gJ2FkZCcgOiAncmVtb3ZlJylcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0b3JzLm1hdGNoKC8mLykpIHtcbiAgICAgIHNlbGVjdG9ycy5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24oc2VsKXtcbiAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyhzZWwudHJpbSgpLCBhY3Rpb24sIGVsKSBcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0b3IgYW5kIGNsYXNzbmFtZXMsIGZvcm1hdDogXCJjbGFzc25hbWUgY2xhc3NuYW1lOyBzZWxlY3RvcixzZWxlY3RvclwiXG4gICAgdmFyIHNldHRpbmdzID0gc2VsZWN0b3JzLnNwbGl0KCc7JylcbiAgICB2YXIgY2xhc3NuYW1lcyA9IHNldHRpbmdzWzBdLnRyaW0oKVxuICAgIHZhciBtYXRjaGVzID0gW11cbiAgICBzZWxlY3RvcnMgPSBzZXR0aW5nc1sxXVxuXG4gICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIGFuZCBlbCBpcyBhbiBPUFRJT04sIHVzZSBpdHMgU0VMRUNUIGFzIHRoZSBtYXRjaGVkIGVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKGVsICYmIGVsLnRhZ05hbWUubWF0Y2goL29wdGlvbi9pKSkge1xuICAgICAgbWF0Y2hlcyA9IFtUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24oZWwpXVxuICAgICAgXG4gICAgLy8gSWYgbm8gc2xlY3RvcnMgYXJlIHByZXNlbnQsIHVzZSB0aGUgY3VycmVudCBlbCBmb3IgY2xhc3NuYW1lc1xuICAgIH0gZWxzZSBpZiAoZWwpIHtcbiAgICAgIG1hdGNoZXMgPSBbZWxdXG4gICAgfVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGNsYXNzbmFtZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NuYW1lKSB7XG4gICAgICAgIHZhciBtZXRob2QgPSBhY3Rpb24ucmVwbGFjZSgvQ2xhc3MvLCcnKVxuICAgICAgICBtYXRjaC5jbGFzc0xpc3RbbWV0aG9kXShjbGFzc25hbWUpXG4gICAgICB9KVxuXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgJ2NsYXNzJylcbiAgICB9KVxuICB9LFxuXG4gIHNldFN0YXRlOiBmdW5jdGlvbihzZWxlY3RvcnMsIHN0YXRlKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycylcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobWF0Y2hlcywgZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgdmFyIGFjdGlvbiA9IFRvZ2dsZXIudG9nZ2xlQWN0aW9uKG1hdGNoLCBzdGF0ZSlcblxuICAgICAgVG9nZ2xlclthY3Rpb25dKG1hdGNoKVxuICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xlckV2ZW50c09uQ2hpbGRyZW4obWF0Y2gsIGFjdGlvbilcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUFjdGlvbjogZnVuY3Rpb24oIGVsLCBhY3Rpb24gKSB7XG5cbiAgICBpZiAoIHR5cGVvZiBhY3Rpb24gPT0gJ2Jvb2xlYW4nICkge1xuICAgICAgYWN0aW9uID0gKCBhY3Rpb24gPyAnc2hvdycgOiAnaGlkZScgKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT0gJ3RvZ2dsZScpIHtcbiAgICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGluZycpICkge1xuICAgICAgICBhY3Rpb24gPSAnc2hvdydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbiA9ICdoaWRlJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25cbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAndmlzaWJsZScgKSB8fCBcbiAgICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3Nob3dpbmcnICkgfHxcbiAgICAgICAgIGVsLm9mZnNldFBhcmVudCAhPSBudWxsICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nLCAnaGlkaW5nJyApXG5cbiAgICB2YXIgZnVsbHlTaG93ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBSZW1vdmUgaGlkZGVuIGJlY2F1c2UgaXQgbWlnaHQgYmUgYWRkZWQgYmVmb3JlIHRoaXMgZmlyZXNcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdzaG93aW5nJywgJ2hpZGRlbicgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ3Zpc2libGUnIClcblxuICAgICAgLy8gRW5hYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gc2hvd25cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRm9jdXMgb24ga2V5IGVsZW1lbnQgaWYgYW4gZWxlbWVudCBleHBlY3RzIGZvY3VzXG4gICAgICB2YXIgZm9jdXNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzXScpXG4gICAgICBpZiAoZm9jdXNFbCkgeyBmb2N1c0VsLmZvY3VzKCkgfVxuXG4gICAgICAvLyBUcmlnZ2VyIGlucHV0IGV2ZW50IG9uIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW5cbiAgICAgIHZhciByYW5nZXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYW5nZV0nKVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseVNob3csIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnc2hvd2luZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseVNob3coKVxuICAgIH1cbiAgfSxcblxuICBoaWRlOiBmdW5jdGlvbihlbCkge1xuICAgIGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkZGVuJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaGlkaW5nJyApICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHNob3dpbmcgYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICd2aXNpYmxlJywgJ3Nob3dpbmcnIClcblxuICAgIHZhciBmdWxseUhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRpbmcnLCAndmlzaWJsZScgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuXG4gICAgICAvLyBEaXNhYmxlIGlucHV0cywgZmllbGRzZXRzIG9yIGZvcm1zIHdoZW4gaGlkZGVuXG4gICAgICBpZiAoIHR5cGVvZiBlbC5kaXNhYmxlZCAhPSAndW5kZWZpbmVkJyApe1xuICAgICAgICBlbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGVsLmRhdGFzZXQuYW5pbWF0ZSApIHtcbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgZnVsbHlIaWRlLCB0cnVlKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGluZycgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmdWxseUhpZGUoKVxuICAgIH1cbiAgfSxcblxuICBnZXRMZWFmTm9kZXM6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAvLyBpcyB0aGUgcGFyZW50IGl0c2VsZiBhIGxlYWYgbm9kZT9cbiAgICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHJldHVybiBbcGFyZW50XVxuXG4gICAgdmFyIG5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSwgMClcblxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuIGVsZW0uY2hpbGRyZW4gJiYgZWxlbS5jaGlsZHJlbi5sZW5ndGggPT09IDBcbiAgICB9KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbjogZnVuY3Rpb24oZWwsIGV2ZW50TmFtZSl7XG4gICAgLy8gd2UgY2FyZSBhYm91dCBsZWFmIG5vZGVzIHNpbmNlIHRoZSBldmVudCB3aWxsIGJ1YmJsZSB0b1xuICAgIC8vIG5vbi1sZWFmIG5vZGVzIGZyb20gdGhlIGxlYWYgbm9kZXNcbiAgICB2YXIgbGVhZkNoaWxkTm9kZXMgPSBUb2dnbGVyLmdldExlYWZOb2RlcyhlbClcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGVhZkNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIC8vICd0b2dnbGVyOnNob3cnLCAndG9nZ2xlcjpoaWRlJywgZXRjXG4gICAgICBFdmVudC5maXJlKG5vZGUsIFwidG9nZ2xlcjpcIiArIGV2ZW50TmFtZSlcbiAgICB9KVxuICB9LFxuXG4gIHRvZ2dsZUNoZWNrYm94ZXM6IGZ1bmN0aW9uKGNoZWNrYm94ZXMpIHtcbiAgICBjaGVja2JveGVzID0gY2hlY2tib3hlcyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIuY2hlY2tib3hTZWxlY3RvcilcblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2hlY2tib3hlcywgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcpXG4gIH0sXG5cbiAgc2V0dXBSYWRpb3M6IGZ1bmN0aW9uKCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnJhZGlvU2VsZWN0b3IpLCBmdW5jdGlvbihyYWRpbywgaW5kZXgpe1xuICAgICAgaWYgKCFyYWRpby5kYXRhc2V0LnRvZ2dsZXJBY3RpdmUpIHtcblxuICAgICAgICB2YXIgcmFkaW9OYW1lICAgICAgICAgPSByYWRpby5nZXRBdHRyaWJ1dGUoJ25hbWUnKSxcbiAgICAgICAgICAgIHNpYmxpbmdzICAgICAgICAgID0gVG9nZ2xlci5wYXJlbnRGb3JtKHJhZGlvKS5xdWVyeVNlbGVjdG9yQWxsKCdbdHlwZT1yYWRpb11bbmFtZT1cIicrcmFkaW9OYW1lKydcIl0nKSxcbiAgICAgICAgICAgIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ3Nob3cnKSxcbiAgICAgICAgICAgIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhzaWJsaW5ncywgJ2FkZENsYXNzJyksXG4gICAgICAgICAgICBjaGVja2VkXG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzaWJsaW5ncywgZnVuY3Rpb24ocil7XG5cbiAgICAgICAgICBpZiAoci5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK3IuZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgci5jaGVja2VkID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgaGF2ZSBhIGRlZmF1bHQgZGF0YS1zaG93IHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtc2hvdyB2YWx1ZXMgd2lsbCB0b2dnbGUgb2ZmIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5zaG93ID0gci5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICByLmRhdGFzZXQuYWRkQ2xhc3MgPSByLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIHIuZGF0YXNldC5oaWRlICYmIHIuZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCByLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgci5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gci5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLWFkZC1jbGFzcyB2YWx1ZSBvZiAnJ1xuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB1bnNldCBkYXRhLWFkZC1jbGFzcyB2YWx1ZXMgYXJlIHRvZ2dsZSBvZmYgYWxsIGNsYXNzZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyByZW1vdmUgY2xhc3NlcyBhY2NvcmRpbmdcbiAgICAgICAgICAvLyB0byB0aGUgZGVzZWxlY3RlZCByYWRpbyBidXR0b25zXG4gICAgICAgICAgci5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyYnKVxuXG5cbiAgICAgICAgICByLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcblxuXG4gICAgICAgICAgaWYoIHIuY2hlY2tlZCApIGNoZWNrZWQgPSByXG5cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIGNoZWNrZWQgKSB7XG4gICAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIGNoZWNrZWQgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFRvZ2dsZXIuc2V0U3RhdGUoIHNob3dTZWxlY3RvcnMuam9pbignLCcpLCAnaGlkZScgKVxuICAgICAgICAgIFRvZ2dsZXIuc2V0Q2xhc3MoIGFkZENsYXNzU2VsZWN0b3JzLmpvaW4oJyAmICcpLCAncmVtb3ZlQ2xhc3MnIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgfSxcblxuICAvLyBBZGQgZGF0YS1oaWRlIHRvIGVhY2ggPG9wdGlvbj4gY29udGFpbmluZyB0aGUgc2VsZWN0b3JzIGZyb20gb3RoZXJcbiAgLy8gb3B0aW9uJ3MgZGF0YS1zaG93LiBUaGlzIG1ha2VzIHRoZSB0b2dnbGluZyBvZiBlbGVtZW50cyBleGNsdXNpdmUuXG4gIC8vXG4gIHNldHVwU2VsZWN0czogZnVuY3Rpb24oKXtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5zZWxlY3RTZWxlY3RvciksIGZ1bmN0aW9uKG9wdGlvbil7XG4gICAgICAvLyBQcmV2ZW50IGFuIG9wdGlvbiBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgdHdpY2VcbiAgICAgIGlmICghb3B0aW9uLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnNob3cgPSBvcHRpb24uZGF0YXNldC5zaG93IHx8ICcnXG5cbiAgICAgICAgdmFyIHNlbGVjdCA9IFRvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihvcHRpb24pXG4gICAgICAgIHNlbGVjdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3QtdG9nZ2xlcicpXG4gICAgICAgIHZhciBvcHRpb25zID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpXG5cbiAgICAgICAgdmFyIHNob3dTZWxlY3RvcnMgICAgID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnc2hvdycpXG4gICAgICAgIHZhciBhZGRDbGFzc1NlbGVjdG9ycyA9IFRvZ2dsZXIuZGF0YUF0dHJpYnV0ZXMob3B0aW9ucywgJ2FkZENsYXNzJylcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIGZ1bmN0aW9uKG8sIGluZGV4KSB7XG5cbiAgICAgICAgICBpZiAoby5kYXRhc2V0LmFuY2hvciAmJiB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAoJyMnK28uZGF0YXNldC5hbmNob3IucmVwbGFjZSgnIycsJycpKSkge1xuICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBpbmRleFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG8uZGF0YXNldC5zaG93ID0gby5kYXRhc2V0LnNob3cgfHwgJydcbiAgICAgICAgICBvLmRhdGFzZXQuYWRkQ2xhc3MgPSBvLmRhdGFzZXQuYWRkQ2xhc3MgfHwgJydcblxuICAgICAgICAgIC8vIEFwcGVuZCBlbGVtZW50J3MgZGF0YS1oaWRlIHRvIHNob3dTZWxlY3RvcnNcbiAgICAgICAgICBpZiAoIG8uZGF0YXNldC5oaWRlICYmIG8uZGF0YXNldC5oaWRlLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyA9IHNob3dTZWxlY3RvcnMuY29uY2F0KCBvLmRhdGFzZXQuaGlkZS5zcGxpdCggJywnICkgKVxuXG4gICAgICAgICAgLy8gSWYgc2hvdyBzZWxlY3RvcnMgYXJlIG5vdCBwcmVzZW50IGluIGVsZW1lbnQncyBkYXRhLXNob3dcbiAgICAgICAgICAvLyBBZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMgdG8gYmUgaGlkZGVuXG4gICAgICAgICAgby5kYXRhc2V0LmhpZGUgPSBzaG93U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbihzZWxlY3Rvcil7XG4gICAgICAgICAgICByZXR1cm4gby5kYXRhc2V0LnNob3cuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJywnKVxuXG4gICAgICAgICAgby5kYXRhc2V0LnJlbW92ZUNsYXNzID0gYWRkQ2xhc3NTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuYWRkQ2xhc3MuaW5kZXhPZiggc2VsZWN0b3IgKVxuICAgICAgICAgIH0pLmpvaW4oJyAmICcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSA9IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlzIHRvZ2dsZWQgcHJvcGVybHlcbiAgICAgICAgLy9cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoc2VsZWN0KVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgLy8gRmluZCBwYXJlbnQgPHNlbGVjdD4gZm9yIGFuIG9wdGlvbiAoYWNjb3VudHMgZm9yIG9wdGlvbiBncm91cHMpXG4gIC8vXG4gIGdldFNlbGVjdEZyb21PcHRpb246IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHAgPSBlbC5wYXJlbnRFbGVtZW50XG5cbiAgICBpZiAocC50YWdOYW1lID09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm4gcFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKHApXG4gICAgfVxuICB9LFxuXG5cbiAgLy8gRmluZCBwYXJlbnQgPGZvcm0+IG9yIGRvY3VtZW50IGlmIHRoZXJlIGlzIG5vIGZvcm1cbiAgLy9cbiAgcGFyZW50Rm9ybTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBlbCA9IGVsZW1lbnRcblxuICAgIHdoaWxlIChlbCAmJiBlbC50YWdOYW1lICE9IFwiRk9STVwiKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudE5vZGVcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgZG9jdW1lbnRcbiAgfSxcblxuICAvLyBSZXR1cm4gYSB1bmlxdWUgYXJyYXkgb2YgYWxsIGRhdGEgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGVsZW1lbnRzXG4gIC8vXG4gIGRhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbihlbGVtZW50cywgYXR0cikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uKGVsKSB7IFxuICAgICAgcmV0dXJuIGVsLmRhdGFzZXRbYXR0cl1cbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3JzLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGVjdG9ycyAhPSBcIlwiICYmIHR5cGVvZiBzZWxlY3RvcnMgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5pbmRleE9mKHNlbGVjdG9ycykgPT09IGluZGV4XG4gICAgfSlcbiAgfVxufVxuXG5FdmVudC5yZWFkeShUb2dnbGVyLmxpc3RlbilcbkV2ZW50LmNoYW5nZShUb2dnbGVyLnJlZnJlc2gpXG5cbm1vZHVsZS5leHBvcnRzID0gVG9nZ2xlclxuIiwidmFyIERhdGVUaW1lID0gcmVxdWlyZSggJ2x1eG9uJyApLkRhdGVUaW1lXG5cbmZ1bmN0aW9uIGlzQmVmb3JlKCBkYXRlLCBlbmQgKSB7XG4gIGVuZCA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5taW4oIGVuZCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXIoIGRhdGUsIHN0YXJ0ICkge1xuICBzdGFydCA9IHBhcnNlKCBzdGFydCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4oIGRhdGUsIHN0YXJ0LCBlbmQgKSB7XG4gIHN0YXJ0ID0gcGFyc2UoIHN0YXJ0IClcbiAgZW5kICA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gRGF0ZVRpbWUubWF4KCBzdGFydCwgZGF0ZSApID09IERhdGVUaW1lLm1pbiggZGF0ZSwgZW5kIClcbn1cblxuZnVuY3Rpb24gcGFyc2UoIGRhdGUgKSB7XG4gIHZhciBmb3JtYXRzID0gWyBcImZyb21JU09cIiwgXCJmcm9tU1FMXCIsIFwiZnJvbUhUVFBcIiwgXCJmcm9tUkZDMjgyMlwiLCBcImZyb21NaWxsaXNcIiBdLFxuICAgICAgcGFyc2VkRGF0ZVxuXG4gIGlmICggdHlwZW9mIGRhdGUgPT0gJ29iamVjdCcgKSB7XG4gICAgaWYgKCBkYXRlLnRvSVNPICkgcmV0dXJuIGRhdGVcbiAgICBwYXJzZWREYXRlID0gRGF0ZVRpbWUuZnJvbU9iamVjdCggZGF0ZSApXG5cbiAgfSBlbHNlIHtcbiAgICBkYXRlID0gU3RyaW5nKCBkYXRlIClcbiAgICBmb3JtYXRzLmZvckVhY2goIGZ1bmN0aW9uKCBmb3JtYXQgKSB7XG4gICAgICBpZiAoICFwYXJzZWREYXRlIHx8IHBhcnNlZERhdGUuaW52YWxpZCApIHtcbiAgICAgICAgcGFyc2VkRGF0ZSA9IERhdGVUaW1lW2Zvcm1hdF0oIGRhdGUsIHsgbG9jYWxlOiAnZW4tdXMnIH0gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpZiAoICFwYXJzZWREYXRlLmludmFsaWQgKVxuICAgIHJldHVybiBwYXJzZWREYXRlXG4gIGVsc2VcbiAgICByZXR1cm4gZmFsc2Vcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQmVmb3JlOiBpc0JlZm9yZSxcbiAgaXNBZnRlcjogaXNBZnRlcixcbiAgaXNCZXR3ZWVuOiBpc0JldHdlZW4sXG4gIHBhcnNlOiBwYXJzZVxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyAgICAga2V5bWFzdGVyLmpzXG4vLyAgICAgKGMpIDIwMTEtMjAxMyBUaG9tYXMgRnVjaHNcbi8vICAgICBrZXltYXN0ZXIuanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbjsoZnVuY3Rpb24oZ2xvYmFsKXtcbiAgdmFyIGssXG4gICAgX2hhbmRsZXJzID0ge30sXG4gICAgX21vZHMgPSB7IDE2OiBmYWxzZSwgMTg6IGZhbHNlLCAxNzogZmFsc2UsIDkxOiBmYWxzZSB9LFxuICAgIF9zY29wZSA9ICdhbGwnLFxuICAgIC8vIG1vZGlmaWVyIGtleXNcbiAgICBfTU9ESUZJRVJTID0ge1xuICAgICAgJ+KHpyc6IDE2LCBzaGlmdDogMTYsXG4gICAgICAn4oylJzogMTgsIGFsdDogMTgsIG9wdGlvbjogMTgsXG4gICAgICAn4oyDJzogMTcsIGN0cmw6IDE3LCBjb250cm9sOiAxNyxcbiAgICAgICfijJgnOiA5MSwgY29tbWFuZDogOTFcbiAgICB9LFxuICAgIC8vIHNwZWNpYWwga2V5c1xuICAgIF9NQVAgPSB7XG4gICAgICBiYWNrc3BhY2U6IDgsIHRhYjogOSwgY2xlYXI6IDEyLFxuICAgICAgZW50ZXI6IDEzLCAncmV0dXJuJzogMTMsXG4gICAgICBlc2M6IDI3LCBlc2NhcGU6IDI3LCBzcGFjZTogMzIsXG4gICAgICBsZWZ0OiAzNywgdXA6IDM4LFxuICAgICAgcmlnaHQ6IDM5LCBkb3duOiA0MCxcbiAgICAgIGRlbDogNDYsICdkZWxldGUnOiA0NixcbiAgICAgIGhvbWU6IDM2LCBlbmQ6IDM1LFxuICAgICAgcGFnZXVwOiAzMywgcGFnZWRvd246IDM0LFxuICAgICAgJywnOiAxODgsICcuJzogMTkwLCAnLyc6IDE5MSxcbiAgICAgICdgJzogMTkyLCAnLSc6IDE4OSwgJz0nOiAxODcsXG4gICAgICAnOyc6IDE4NiwgJ1xcJyc6IDIyMixcbiAgICAgICdbJzogMjE5LCAnXSc6IDIyMSwgJ1xcXFwnOiAyMjBcbiAgICB9LFxuICAgIGNvZGUgPSBmdW5jdGlvbih4KXtcbiAgICAgIHJldHVybiBfTUFQW3hdIHx8IHgudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApO1xuICAgIH0sXG4gICAgX2Rvd25LZXlzID0gW107XG5cbiAgZm9yKGs9MTtrPDIwO2srKykgX01BUFsnZicra10gPSAxMTEraztcblxuICAvLyBJRSBkb2Vzbid0IHN1cHBvcnQgQXJyYXkjaW5kZXhPZiwgc28gaGF2ZSBhIHNpbXBsZSByZXBsYWNlbWVudFxuICBmdW5jdGlvbiBpbmRleChhcnJheSwgaXRlbSl7XG4gICAgdmFyIGkgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUoaS0tKSBpZihhcnJheVtpXT09PWl0ZW0pIHJldHVybiBpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIGZvciBjb21wYXJpbmcgbW9kcyBiZWZvcmUgdW5hc3NpZ25tZW50XG4gIGZ1bmN0aW9uIGNvbXBhcmVBcnJheShhMSwgYTIpIHtcbiAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllck1hcCA9IHtcbiAgICAgIDE2OidzaGlmdEtleScsXG4gICAgICAxODonYWx0S2V5JyxcbiAgICAgIDE3OidjdHJsS2V5JyxcbiAgICAgIDkxOidtZXRhS2V5J1xuICB9O1xuICBmdW5jdGlvbiB1cGRhdGVNb2RpZmllcktleShldmVudCkge1xuICAgICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZXZlbnRbbW9kaWZpZXJNYXBba11dO1xuICB9O1xuXG4gIC8vIGhhbmRsZSBrZXlkb3duIGV2ZW50XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGV2ZW50KSB7XG4gICAgdmFyIGtleSwgaGFuZGxlciwgaywgaSwgbW9kaWZpZXJzTWF0Y2gsIHNjb3BlO1xuICAgIGtleSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICBpZiAoaW5kZXgoX2Rvd25LZXlzLCBrZXkpID09IC0xKSB7XG4gICAgICAgIF9kb3duS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBtb2RpZmllciBrZXksIHNldCB0aGUga2V5Ljxtb2RpZmllcmtleW5hbWU+IHByb3BlcnR5IHRvIHRydWUgYW5kIHJldHVyblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTsgLy8gcmlnaHQgY29tbWFuZCBvbiB3ZWJraXQsIGNvbW1hbmQgb24gR2Vja29cbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSB0cnVlO1xuICAgICAgLy8gJ2Fzc2lnbktleScgZnJvbSBpbnNpZGUgdGhpcyBjbG9zdXJlIGlzIGV4cG9ydGVkIHRvIHdpbmRvdy5rZXlcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGVNb2RpZmllcktleShldmVudCk7XG5cbiAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byBpZ25vcmUgdGhlIGtleXByZXNzIChmaWx0ZXIoKSBjYW4gY2FuIGJlIG92ZXJyaWRkZW4pXG4gICAgLy8gYnkgZGVmYXVsdCBpZ25vcmUga2V5IHByZXNzZXMgaWYgYSBzZWxlY3QsIHRleHRhcmVhLCBvciBpbnB1dCBpcyBmb2N1c2VkXG4gICAgaWYoIWFzc2lnbktleS5maWx0ZXIuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIC8vIGFib3J0IGlmIG5vIHBvdGVudGlhbGx5IG1hdGNoaW5nIHNob3J0Y3V0cyBmb3VuZFxuICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSByZXR1cm47XG5cbiAgICBzY29wZSA9IGdldFNjb3BlKCk7XG5cbiAgICAvLyBmb3IgZWFjaCBwb3RlbnRpYWwgc2hvcnRjdXRcbiAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXIgPSBfaGFuZGxlcnNba2V5XVtpXTtcblxuICAgICAgLy8gc2VlIGlmIGl0J3MgaW4gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIGlmKGhhbmRsZXIuc2NvcGUgPT0gc2NvcGUgfHwgaGFuZGxlci5zY29wZSA9PSAnYWxsJyl7XG4gICAgICAgIC8vIGNoZWNrIGlmIG1vZGlmaWVycyBtYXRjaCBpZiBhbnlcbiAgICAgICAgbW9kaWZpZXJzTWF0Y2ggPSBoYW5kbGVyLm1vZHMubGVuZ3RoID4gMDtcbiAgICAgICAgZm9yKGsgaW4gX21vZHMpXG4gICAgICAgICAgaWYoKCFfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA+IC0xKSB8fFxuICAgICAgICAgICAgKF9tb2RzW2tdICYmIGluZGV4KGhhbmRsZXIubW9kcywgK2spID09IC0xKSkgbW9kaWZpZXJzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlciBhbmQgc3RvcCB0aGUgZXZlbnQgaWYgbmVjY2Vzc2FyeVxuICAgICAgICBpZigoaGFuZGxlci5tb2RzLmxlbmd0aCA9PSAwICYmICFfbW9kc1sxNl0gJiYgIV9tb2RzWzE4XSAmJiAhX21vZHNbMTddICYmICFfbW9kc1s5MV0pIHx8IG1vZGlmaWVyc01hdGNoKXtcbiAgICAgICAgICBpZihoYW5kbGVyLm1ldGhvZChldmVudCwgaGFuZGxlcik9PT1mYWxzZSl7XG4gICAgICAgICAgICBpZihldmVudC5wcmV2ZW50RGVmYXVsdCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZWxzZSBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmKGV2ZW50LmNhbmNlbEJ1YmJsZSkgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gdW5zZXQgbW9kaWZpZXIga2V5cyBvbiBrZXl1cFxuICBmdW5jdGlvbiBjbGVhck1vZGlmaWVyKGV2ZW50KXtcbiAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSwgayxcbiAgICAgICAgaSA9IGluZGV4KF9kb3duS2V5cywga2V5KTtcblxuICAgIC8vIHJlbW92ZSBrZXkgZnJvbSBfZG93bktleXNcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgIF9kb3duS2V5cy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuXG4gICAgaWYoa2V5ID09IDkzIHx8IGtleSA9PSAyMjQpIGtleSA9IDkxO1xuICAgIGlmKGtleSBpbiBfbW9kcykge1xuICAgICAgX21vZHNba2V5XSA9IGZhbHNlO1xuICAgICAgZm9yKGsgaW4gX01PRElGSUVSUykgaWYoX01PRElGSUVSU1trXSA9PSBrZXkpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiByZXNldE1vZGlmaWVycygpIHtcbiAgICBmb3IoayBpbiBfbW9kcykgX21vZHNba10gPSBmYWxzZTtcbiAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgfTtcblxuICAvLyBwYXJzZSBhbmQgYXNzaWduIHNob3J0Y3V0XG4gIGZ1bmN0aW9uIGFzc2lnbktleShrZXksIHNjb3BlLCBtZXRob2Qpe1xuICAgIHZhciBrZXlzLCBtb2RzO1xuICAgIGtleXMgPSBnZXRLZXlzKGtleSk7XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRob2QgPSBzY29wZTtcbiAgICAgIHNjb3BlID0gJ2FsbCc7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggc2hvcnRjdXRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIHNldCBtb2RpZmllciBrZXlzIGlmIGFueVxuICAgICAgbW9kcyA9IFtdO1xuICAgICAga2V5ID0ga2V5c1tpXS5zcGxpdCgnKycpO1xuICAgICAgaWYgKGtleS5sZW5ndGggPiAxKXtcbiAgICAgICAgbW9kcyA9IGdldE1vZHMoa2V5KTtcbiAgICAgICAga2V5ID0gW2tleVtrZXkubGVuZ3RoLTFdXTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnZlcnQgdG8ga2V5Y29kZSBhbmQuLi5cbiAgICAgIGtleSA9IGtleVswXVxuICAgICAga2V5ID0gY29kZShrZXkpO1xuICAgICAgLy8gLi4uc3RvcmUgaGFuZGxlclxuICAgICAgaWYgKCEoa2V5IGluIF9oYW5kbGVycykpIF9oYW5kbGVyc1trZXldID0gW107XG4gICAgICBfaGFuZGxlcnNba2V5XS5wdXNoKHsgc2hvcnRjdXQ6IGtleXNbaV0sIHNjb3BlOiBzY29wZSwgbWV0aG9kOiBtZXRob2QsIGtleToga2V5c1tpXSwgbW9kczogbW9kcyB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gdW5iaW5kIGFsbCBoYW5kbGVycyBmb3IgZ2l2ZW4ga2V5IGluIGN1cnJlbnQgc2NvcGVcbiAgZnVuY3Rpb24gdW5iaW5kS2V5KGtleSwgc2NvcGUpIHtcbiAgICB2YXIgbXVsdGlwbGVLZXlzLCBrZXlzLFxuICAgICAgbW9kcyA9IFtdLFxuICAgICAgaSwgaiwgb2JqO1xuXG4gICAgbXVsdGlwbGVLZXlzID0gZ2V0S2V5cyhrZXkpO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IG11bHRpcGxlS2V5cy5sZW5ndGg7IGorKykge1xuICAgICAga2V5cyA9IG11bHRpcGxlS2V5c1tqXS5zcGxpdCgnKycpO1xuXG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleXMpO1xuICAgICAgICBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcblxuICAgICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCFfaGFuZGxlcnNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgX2hhbmRsZXJzW2tleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb2JqID0gX2hhbmRsZXJzW2tleV1baV07XG4gICAgICAgIC8vIG9ubHkgY2xlYXIgaGFuZGxlcnMgaWYgY29ycmVjdCBzY29wZSBhbmQgbW9kcyBtYXRjaFxuICAgICAgICBpZiAob2JqLnNjb3BlID09PSBzY29wZSAmJiBjb21wYXJlQXJyYXkob2JqLm1vZHMsIG1vZHMpKSB7XG4gICAgICAgICAgX2hhbmRsZXJzW2tleV1baV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3aXRoIGNvZGUgJ2tleUNvZGUnIGlzIGN1cnJlbnRseSBkb3duXG4gIC8vIENvbnZlcnRzIHN0cmluZ3MgaW50byBrZXkgY29kZXMuXG4gIGZ1bmN0aW9uIGlzUHJlc3NlZChrZXlDb2RlKSB7XG4gICAgICBpZiAodHlwZW9mKGtleUNvZGUpPT0nc3RyaW5nJykge1xuICAgICAgICBrZXlDb2RlID0gY29kZShrZXlDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleChfZG93bktleXMsIGtleUNvZGUpICE9IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJlc3NlZEtleUNvZGVzKCkge1xuICAgICAgcmV0dXJuIF9kb3duS2V5cy5zbGljZSgwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbHRlcihldmVudCl7XG4gICAgdmFyIHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWU7XG4gICAgLy8gaWdub3JlIGtleXByZXNzZWQgaW4gYW55IGVsZW1lbnRzIHRoYXQgc3VwcG9ydCBrZXlib2FyZCBkYXRhIGlucHV0XG4gICAgcmV0dXJuICEodGFnTmFtZSA9PSAnSU5QVVQnIHx8IHRhZ05hbWUgPT0gJ1NFTEVDVCcgfHwgdGFnTmFtZSA9PSAnVEVYVEFSRUEnKTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUga2V5Ljxtb2RpZmllcj4gdG8gZmFsc2VcbiAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG5cbiAgLy8gc2V0IGN1cnJlbnQgc2NvcGUgKGRlZmF1bHQgJ2FsbCcpXG4gIGZ1bmN0aW9uIHNldFNjb3BlKHNjb3BlKXsgX3Njb3BlID0gc2NvcGUgfHwgJ2FsbCcgfTtcbiAgZnVuY3Rpb24gZ2V0U2NvcGUoKXsgcmV0dXJuIF9zY29wZSB8fCAnYWxsJyB9O1xuXG4gIC8vIGRlbGV0ZSBhbGwgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gc2NvcGVcbiAgZnVuY3Rpb24gZGVsZXRlU2NvcGUoc2NvcGUpe1xuICAgIHZhciBrZXksIGhhbmRsZXJzLCBpO1xuXG4gICAgZm9yIChrZXkgaW4gX2hhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9oYW5kbGVyc1trZXldO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKSB7XG4gICAgICAgIGlmIChoYW5kbGVyc1tpXS5zY29wZSA9PT0gc2NvcGUpIGhhbmRsZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgZWxzZSBpKys7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGFic3RyYWN0IGtleSBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRLZXlzKGtleSkge1xuICAgIHZhciBrZXlzO1xuICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGtleXMgPSBrZXkuc3BsaXQoJywnKTtcbiAgICBpZiAoKGtleXNba2V5cy5sZW5ndGggLSAxXSkgPT0gJycpIHtcbiAgICAgIGtleXNba2V5cy5sZW5ndGggLSAyXSArPSAnLCc7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgLy8gYWJzdHJhY3QgbW9kcyBsb2dpYyBmb3IgYXNzaWduIGFuZCB1bmFzc2lnblxuICBmdW5jdGlvbiBnZXRNb2RzKGtleSkge1xuICAgIHZhciBtb2RzID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSAxKTtcbiAgICBmb3IgKHZhciBtaSA9IDA7IG1pIDwgbW9kcy5sZW5ndGg7IG1pKyspXG4gICAgbW9kc1ttaV0gPSBfTU9ESUZJRVJTW21vZHNbbWldXTtcbiAgICByZXR1cm4gbW9kcztcbiAgfVxuXG4gIC8vIGNyb3NzLWJyb3dzZXIgZXZlbnRzXG4gIGZ1bmN0aW9uIGFkZEV2ZW50KG9iamVjdCwgZXZlbnQsIG1ldGhvZCkge1xuICAgIGlmIChvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgIG9iamVjdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBtZXRob2QsIGZhbHNlKTtcbiAgICBlbHNlIGlmKG9iamVjdC5hdHRhY2hFdmVudClcbiAgICAgIG9iamVjdC5hdHRhY2hFdmVudCgnb24nK2V2ZW50LCBmdW5jdGlvbigpeyBtZXRob2Qod2luZG93LmV2ZW50KSB9KTtcbiAgfTtcblxuICAvLyBzZXQgdGhlIGhhbmRsZXJzIGdsb2JhbGx5IG9uIGRvY3VtZW50XG4gIGFkZEV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7IGRpc3BhdGNoKGV2ZW50KSB9KTsgLy8gUGFzc2luZyBfc2NvcGUgdG8gYSBjYWxsYmFjayB0byBlbnN1cmUgaXQgcmVtYWlucyB0aGUgc2FtZSBieSBleGVjdXRpb24uIEZpeGVzICM0OFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleXVwJywgY2xlYXJNb2RpZmllcik7XG5cbiAgLy8gcmVzZXQgbW9kaWZpZXJzIHRvIGZhbHNlIHdoZW5ldmVyIHRoZSB3aW5kb3cgaXMgKHJlKWZvY3VzZWQuXG4gIGFkZEV2ZW50KHdpbmRvdywgJ2ZvY3VzJywgcmVzZXRNb2RpZmllcnMpO1xuXG4gIC8vIHN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXlcbiAgdmFyIHByZXZpb3VzS2V5ID0gZ2xvYmFsLmtleTtcblxuICAvLyByZXN0b3JlIHByZXZpb3VzbHkgZGVmaW5lZCBrZXkgYW5kIHJldHVybiByZWZlcmVuY2UgdG8gb3VyIGtleSBvYmplY3RcbiAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICB2YXIgayA9IGdsb2JhbC5rZXk7XG4gICAgZ2xvYmFsLmtleSA9IHByZXZpb3VzS2V5O1xuICAgIHJldHVybiBrO1xuICB9XG5cbiAgLy8gc2V0IHdpbmRvdy5rZXkgYW5kIHdpbmRvdy5rZXkuc2V0L2dldC9kZWxldGVTY29wZSwgYW5kIHRoZSBkZWZhdWx0IGZpbHRlclxuICBnbG9iYWwua2V5ID0gYXNzaWduS2V5O1xuICBnbG9iYWwua2V5LnNldFNjb3BlID0gc2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZ2V0U2NvcGUgPSBnZXRTY29wZTtcbiAgZ2xvYmFsLmtleS5kZWxldGVTY29wZSA9IGRlbGV0ZVNjb3BlO1xuICBnbG9iYWwua2V5LmZpbHRlciA9IGZpbHRlcjtcbiAgZ2xvYmFsLmtleS5pc1ByZXNzZWQgPSBpc1ByZXNzZWQ7XG4gIGdsb2JhbC5rZXkuZ2V0UHJlc3NlZEtleUNvZGVzID0gZ2V0UHJlc3NlZEtleUNvZGVzO1xuICBnbG9iYWwua2V5Lm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICBnbG9iYWwua2V5LnVuYmluZCA9IHVuYmluZEtleTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgbW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25LZXk7XG5cbn0pKHRoaXMpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuLy8gVFlQRVNcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vLyBDQVBBQklMSVRJRVNcblxuZnVuY3Rpb24gaGFzSW50bCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJyAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuXG5mdW5jdGlvbiBoYXNGb3JtYXRUb1BhcnRzKCkge1xuICByZXR1cm4gIWlzVW5kZWZpbmVkKEludGwuRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFRvUGFydHMpO1xufVxuXG4vLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZnVuY3Rpb24gbWF5YmVBcnJheSh0aGluZykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGluZykgPyB0aGluZyA6IFt0aGluZ107XG59XG5cbmZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZShmdW5jdGlvbiAoYmVzdCwgbmV4dCkge1xuICAgIHZhciBwYWlyID0gW2J5KG5leHQpLCBuZXh0XTtcbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZS5hcHBseShudWxsLCBbYmVzdFswXSwgcGFpclswXV0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChhLCBrKSB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuXG4vLyBOVU1CRVJTIEFORCBTVFJJTkdTXG5cbmZ1bmN0aW9uIG51bWJlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc051bWJlcih0aGluZykgJiYgdGhpbmcgPj0gYm90dG9tICYmIHRoaW5nIDw9IHRvcDtcbn1cblxuLy8geCAlIG4gYnV0IHRha2VzIHRoZSBzaWduIG9mIG4gaW5zdGVhZCBvZiB4XG5mdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5mdW5jdGlvbiBwYWRTdGFydChpbnB1dCkge1xuICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcblxuICBpZiAoaW5wdXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmV0dXJuICgnMCcucmVwZWF0KG4pICsgaW5wdXQpLnNsaWNlKC1uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1pbGxpcyhmcmFjdGlvbikge1xuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoJzAuJyArIGZyYWN0aW9uKSAqIDEwMDA7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcm91bmRUbyhudW1iZXIsIGRpZ2l0cykge1xuICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRpZ2l0cyk7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cblxuZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgdmFyIG1vZE1vbnRoID0gZmxvb3JNb2QobW9udGggLSAxLCAxMikgKyAxLFxuICAgICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIHZhciBwMSA9ICh3ZWVrWWVhciArIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICUgNyxcbiAgICAgIGxhc3QgPSB3ZWVrWWVhciAtIDEsXG4gICAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufVxuXG4vLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlKSB7XG4gIHZhciB0aW1lWm9uZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgIGludGxPcHRzID0ge1xuICAgIGhvdXIxMjogZmFsc2UsXG4gICAgeWVhcjogJ251bWVyaWMnLFxuICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgaG91cjogJzItZGlnaXQnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oeyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCB9LCBpbnRsT3B0cyksXG4gICAgICBpbnRsID0gaGFzSW50bCgpO1xuXG4gIGlmIChpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSkge1xuICAgIHZhciBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXRUb1BhcnRzKGRhdGUpLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpbWV6b25lbmFtZSc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG4gIH0gZWxzZSBpZiAoaW50bCkge1xuICAgIC8vIHRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrIGZvciBhbGwgbG9jYWxlc1xuICAgIHZhciB3aXRob3V0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBpbnRsT3B0cykuZm9ybWF0KGRhdGUpLFxuICAgICAgICBpbmNsdWRlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgZGlmZmVkID0gaW5jbHVkZWQuc3Vic3RyaW5nKHdpdGhvdXQubGVuZ3RoKSxcbiAgICAgICAgdHJpbW1lZCA9IGRpZmZlZC5yZXBsYWNlKC9eWywgXSsvLCAnJyk7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gc2lnbmVkT2Zmc2V0KCctNScsICczMCcpIC0+IC0zMzBcbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59XG5cbi8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgdmFyIGlnbm9yZVVua25vd24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBub3JtYWxpemVkID0ge307XG4gIGZvciAodmFyIHUgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eSh1KSkge1xuICAgICAgdmFyIHYgPSBvYmpbdV07XG4gICAgICBpZiAodiAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodikgJiYgIU51bWJlci5pc05hTih2KSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gbm9ybWFsaXplcih1LCBpZ25vcmVVbmtub3duKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSk7XG59XG5cbnZhciBjdXN0b21JbnNwZWN0U3ltYm9sID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCd1dGlsJykuaW5zcGVjdC5jdXN0b207IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgfSBjYXRjaCAoX2Vycikge1xuICAgIHJldHVybiBTeW1ib2woJ3V0aWwuaW5zcGVjdC5jdXN0b20nKTtcbiAgfVxufSgpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG4gPSAnbnVtZXJpYycsXG4gICAgcyA9ICdzaG9ydCcsXG4gICAgbCA9ICdsb25nJyxcbiAgICBkMiA9ICcyLWRpZ2l0JztcblxudmFyIERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG5cbn07XG5cbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogblxufTtcblxudmFyIERBVEVfSFVHRSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbFxufTtcblxudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDJcbn07XG5cbnZhciBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxudmFyIFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2Vcbn07XG5cbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxuICovXG52YXIgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBzXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAqL1xudmFyIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgaG91cjEyOiBmYWxzZSxcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cbnZhciBEQVRFVElNRV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMlxufTtcblxuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICovXG52YXIgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xuXG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcblxudmFyIERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcblxudmFyIERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG5cbnZhciBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMixcbiAgdGltZVpvbmVOYW1lOiBsXG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBtb250aHNMb25nID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cbnZhciBtb250aHNTaG9ydCA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxudmFyIG1vbnRoc05hcnJvdyA9IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXTtcblxuZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgIHJldHVybiBtb250aHNTaG9ydDtcbiAgICBjYXNlICdsb25nJzpcbiAgICAgIHJldHVybiBtb250aHNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXTtcbiAgICBjYXNlICcyLWRpZ2l0JzpcbiAgICAgIHJldHVybiBbJzAxJywgJzAyJywgJzAzJywgJzA0JywgJzA1JywgJzA2JywgJzA3JywgJzA4JywgJzA5JywgJzEwJywgJzExJywgJzEyJ107XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciB3ZWVrZGF5c0xvbmcgPSBbJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknLCAnU3VuZGF5J107XG5cbnZhciB3ZWVrZGF5c1Nob3J0ID0gWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXTtcblxudmFyIHdlZWtkYXlzTmFycm93ID0gWydNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUycsICdTJ107XG5cbmZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG4gICAgY2FzZSAnc2hvcnQnOlxuICAgICAgcmV0dXJuIHdlZWtkYXlzU2hvcnQ7XG4gICAgY2FzZSAnbG9uZyc6XG4gICAgICByZXR1cm4gd2Vla2RheXNMb25nO1xuICAgIGNhc2UgJ251bWVyaWMnOlxuICAgICAgcmV0dXJuIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNyddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgbWVyaWRpZW1zID0gWydBTScsICdQTSddO1xuXG52YXIgZXJhc0xvbmcgPSBbJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknXTtcblxudmFyIGVyYXNTaG9ydCA9IFsnQkMnLCAnQUQnXTtcblxudmFyIGVyYXNOYXJyb3cgPSBbJ0InLCAnQSddO1xuXG5mdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgJ25hcnJvdyc6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcbiAgICBjYXNlICdzaG9ydCc6XG4gICAgICByZXR1cm4gZXJhc1Nob3J0O1xuICAgIGNhc2UgJ2xvbmcnOlxuICAgICAgcmV0dXJuIGVyYXNMb25nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSB7XG4gIHJldHVybiBtZXJpZGllbXNbZHQuaG91ciA8IDEyID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5cbmZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gZXJhRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gZXJhcyhsZW5ndGgpW2R0LnllYXIgPCAwID8gMCA6IDFdO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbJ3dlZWtkYXknLCAnZXJhJywgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICd0aW1lWm9uZU5hbWUnLCAnaG91cjEyJ10pLFxuICAgICAga2V5ID0gc3RyaW5naWZ5KGZpbHRlcmVkKSxcbiAgICAgIGRhdGVUaW1lSHVnZSA9ICdFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gJ00vZC95eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX01FRCk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5JztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFX0ZVTEwpOlxuICAgICAgcmV0dXJuICdMTExMIGQsIHl5eXknO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gJ0VFRUUsIExMTEwgZCwgeXl5eSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnaDptbTpzcyBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuICdoOm1tIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfU0lNUExFKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnSEg6bW06c3MnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuICdISDptbSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiAnSEg6bW0nO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiAnTExMIGQsIHl5eXksIGg6bW0gYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfRlVMTCk6XG4gICAgICByZXR1cm4gJ0xMTEwgZCwgeXl5eSwgaDptbSBhJztcbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTS9kL3l5eXksIGg6bW06c3MgYSc7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gJ0xMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiAnRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGEnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuLy8gdGhlc2UgYXJlbid0IHJlYWxseSBwcml2YXRlLCBidXQgbm9yIGFyZSB0aGV5IHJlYWxseSB1c2VmdWwgdG8gZG9jdW1lbnRcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgTHV4b25FcnJvciA9IGZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgaW5oZXJpdHMoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEx1eG9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBMdXhvbkVycm9yO1xufShFcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbnZhciBJbnZhbGlkRGF0ZVRpbWVFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcikge1xuICBpbmhlcml0cyhJbnZhbGlkRGF0ZVRpbWVFcnJvciwgX0x1eG9uRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWREYXRlVGltZUVycm9yKHJlYXNvbikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEludmFsaWREYXRlVGltZUVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvci5jYWxsKHRoaXMsICdJbnZhbGlkIERhdGVUaW1lOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZERhdGVUaW1lRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjIpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEludGVydmFsRXJyb3IsIF9MdXhvbkVycm9yMik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEludGVydmFsRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEludGVydmFsRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMi5jYWxsKHRoaXMsICdJbnZhbGlkIEludGVydmFsOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZEludGVydmFsRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkRHVyYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgaW5oZXJpdHMoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZER1cmF0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsICdJbnZhbGlkIER1cmF0aW9uOiAnICsgcmVhc29uKSk7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjQpIHtcbiAgaW5oZXJpdHMoQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IsIF9MdXhvbkVycm9yNCk7XG5cbiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIEludmFsaWRVbml0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I1KSB7XG4gIGluaGVyaXRzKEludmFsaWRVbml0RXJyb3IsIF9MdXhvbkVycm9yNSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFVuaXRFcnJvcih1bml0KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFVuaXRFcnJvcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgJ0ludmFsaWQgdW5pdCAnICsgdW5pdCkpO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJbnZhbGlkQXJndW1lbnRFcnJvciA9IGZ1bmN0aW9uIChfTHV4b25FcnJvcjYpIHtcbiAgaW5oZXJpdHMoSW52YWxpZEFyZ3VtZW50RXJyb3IsIF9MdXhvbkVycm9yNik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZEFyZ3VtZW50RXJyb3IoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZEFyZ3VtZW50RXJyb3IpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9MdXhvbkVycm9yNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xudmFyIFpvbmVJc0Fic3RyYWN0RXJyb3IgPSBmdW5jdGlvbiAoX0x1eG9uRXJyb3I3KSB7XG4gIGluaGVyaXRzKFpvbmVJc0Fic3RyYWN0RXJyb3IsIF9MdXhvbkVycm9yNyk7XG5cbiAgZnVuY3Rpb24gWm9uZUlzQWJzdHJhY3RFcnJvcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBab25lSXNBYnN0cmFjdEVycm9yKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCAnWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzcycpKTtcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5cbi8qKlxuICogQGludGVyZmFjZVxuKi9cblxudmFyIFpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgWm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIG9wdHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgWm9uZS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXG4gIFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhab25lLCBbe1xuICAgIGtleTogJ3R5cGUnLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBab25lO1xufSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcblxudmFyIExvY2FsWm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYWxab25lKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIExvY2FsWm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUodHMsIF9yZWYpIHtcbiAgICB2YXIgZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuXG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH07XG5cbiAgTG9jYWxab25lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSAnbG9jYWwnO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKExvY2FsWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnbG9jYWwnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKGhhc0ludGwoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAgIH0gZWxzZSByZXR1cm4gJ2xvY2FsJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdpbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzaW5nbGV0b247XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbFpvbmU7XG59KFpvbmUpO1xuXG52YXIgZHRmQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7XG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgdGltZVpvbmU6IHpvbmUsXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGR0ZkNhY2hlW3pvbmVdO1xufVxuXG52YXIgdHlwZVRvUG9zID0ge1xuICB5ZWFyOiAwLFxuICBtb250aDogMSxcbiAgZGF5OiAyLFxuICBob3VyOiAzLFxuICBtaW51dGU6IDQsXG4gIHNlY29uZDogNVxufTtcblxuZnVuY3Rpb24gaGFja3lPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0KGRhdGUpLnJlcGxhY2UoL1xcdTIwMEUvZywgJycpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuXG4gIHJldHVybiBbZlllYXIsIGZNb250aCwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmRdO1xufVxuXG5mdW5jdGlvbiBwYXJ0c09mZnNldChkdGYsIGRhdGUpIHtcbiAgdmFyIGZvcm1hdHRlZCA9IGR0Zi5mb3JtYXRUb1BhcnRzKGRhdGUpLFxuICAgICAgZmlsbGVkID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKElBTkFab25lLCBfWm9uZSk7XG5cbiAgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllciA9IGZ1bmN0aW9uIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiBzICYmIHMubWF0Y2goL15bYS16XystXXsxLDI1Nn1cXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8kL2kpO1xuICB9O1xuXG4gIElBTkFab25lLmlzVmFsaWRab25lID0gZnVuY3Rpb24gaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvLyBFdGMvR01UKzggLT4gNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIElBTkFab25lKG5hbWUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJQU5BWm9uZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMuem9uZU5hbWUgPSBuYW1lO1xuICAgIF90aGlzLnZhbGlkID0gSUFOQVpvbmUuaXNWYWxpZFpvbmUobmFtZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcblxuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSwgdGhpcy56b25lTmFtZSk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgICBkdGYgPSBtYWtlRFRGKHRoaXMuem9uZU5hbWUpLFxuICAgICAgICBfcmVmMiA9IGR0Zi5mb3JtYXRUb1BhcnRzID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSksXG4gICAgICAgIGZZZWFyID0gX3JlZjJbMF0sXG4gICAgICAgIGZNb250aCA9IF9yZWYyWzFdLFxuICAgICAgICBmRGF5ID0gX3JlZjJbMl0sXG4gICAgICAgIGZIb3VyID0gX3JlZjJbM10sXG4gICAgICAgIGZNaW51dGUgPSBfcmVmMls0XSxcbiAgICAgICAgZlNlY29uZCA9IF9yZWYyWzVdLFxuICAgICAgICBhc1VUQyA9IERhdGUuVVRDKGZZZWFyLCBmTW9udGggLSAxLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZCk7XG5cbiAgICB2YXIgYXNUUyA9IGRhdGUudmFsdWVPZigpO1xuICAgIGFzVFMgLT0gYXNUUyAlIDEwMDA7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH07XG5cbiAgSUFOQVpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdpYW5hJyAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgY3JlYXRlQ2xhc3MoSUFOQVpvbmUsIFt7XG4gICAga2V5OiAndHlwZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gJ2lhbmEnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5pdmVyc2FsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gSUFOQVpvbmU7XG59KFpvbmUpO1xuXG52YXIgc2luZ2xldG9uJDEgPSBudWxsO1xuXG5mdW5jdGlvbiBob3Vyc01pbnV0ZXNPZmZzZXQoeikge1xuICB2YXIgaG91cnMgPSBNYXRoLnRydW5jKHouZml4ZWQgLyA2MCksXG4gICAgICBtaW51dGVzID0gTWF0aC5hYnMoei5maXhlZCAlIDYwKSxcbiAgICAgIHNpZ24gPSBob3VycyA+IDAgPyAnKycgOiAnLScsXG4gICAgICBiYXNlID0gc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcbiAgcmV0dXJuIG1pbnV0ZXMgPiAwID8gYmFzZSArICc6JyArIHBhZFN0YXJ0KG1pbnV0ZXMsIDIpIDogYmFzZTtcbn1cblxudmFyIEZpeGVkT2Zmc2V0Wm9uZSA9IGZ1bmN0aW9uIChfWm9uZSkge1xuICBpbmhlcml0cyhGaXhlZE9mZnNldFpvbmUsIF9ab25lKTtcblxuICBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UgPSBmdW5jdGlvbiBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9O1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllciA9IGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKHMpIHtcbiAgICBpZiAocykge1xuICAgICAgdmFyIHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWRPZmZzZXRab25lKHNpZ25lZE9mZnNldChyWzFdLCByWzJdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgbnVsbCwgW3tcbiAgICBrZXk6ICd1dGNJbnN0YW5jZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpbmdsZXRvbiQxO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGaXhlZE9mZnNldFpvbmUpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfWm9uZS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5wcm90b3R5cGUub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfTtcblxuICBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09ICdmaXhlZCcgJiYgb3RoZXJab25lLmZpeGVkID09PSB0aGlzLmZpeGVkO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ25hbWUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyAnVVRDJyA6ICdVVEMnICsgaG91cnNNaW51dGVzT2Zmc2V0KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VuaXZlcnNhbCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRml4ZWRPZmZzZXRab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQyID0gbnVsbDtcblxudmFyIEludmFsaWRab25lID0gZnVuY3Rpb24gKF9ab25lKSB7XG4gIGluaGVyaXRzKEludmFsaWRab25lLCBfWm9uZSk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZFpvbmUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW52YWxpZFpvbmUpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSW52YWxpZFpvbmUucHJvdG90eXBlLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIEludmFsaWRab25lLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfTtcblxuICBJbnZhbGlkWm9uZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiAnaW52YWxpZCc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bml2ZXJzYWwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2lzVmFsaWQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAnaW5zdGFuY2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHNpbmdsZXRvbiQyID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiQyID0gbmV3IEludmFsaWRab25lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uJDI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnZhbGlkWm9uZTtcbn0oWm9uZSk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0ID0gdm9pZCAwO1xuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICB2YXIgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09ICdsb2NhbCcpIHJldHVybiBMb2NhbFpvbmUuaW5zdGFuY2U7ZWxzZSBpZiAobG93ZXJlZCA9PT0gJ3V0YycgfHwgbG93ZXJlZCA9PT0gJ2dtdCcpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7ZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gbmV3IElBTkFab25lKGlucHV0KTtlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShpbnB1dCk7XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoaW5wdXQpKSA9PT0gJ29iamVjdCcgJiYgaW5wdXQub2Zmc2V0KSB7XG4gICAgLy8gVGhpcyBpcyBkdW1iLCBidXQgdGhlIGluc3RhbmNlb2YgY2hlY2sgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHJlYWxseSB3b3JrXG4gICAgLy8gc28gd2UncmUgZHVjayBjaGVja2luZyBpdFxuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSW52YWxpZFpvbmUuaW5zdGFuY2U7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuXG4vKipcclxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cclxuICovXG5cbnZhciBTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2V0dGluZ3MoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXHJcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXHJcbiAgICogQHJldHVybiB7dm9pZH1cclxuICAgKi9cbiAgU2V0dGluZ3MucmVzZXRDYWNoZXMgPSBmdW5jdGlvbiByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICB9O1xuXG4gIGNyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogJ25vdycsXG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBub3c7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRab25lTmFtZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoeikge1xuICAgICAgaWYgKCF6KSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRab25lID0gbm9ybWFsaXplWm9uZSh6KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgb2JqZWN0IHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7Wm9uZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0Wm9uZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFpvbmUgfHwgTG9jYWxab25lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RlZmF1bHRMb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobG9jYWxlKSB7XG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkZWZhdWx0TnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGVmYXVsdE91dHB1dENhbGVuZGFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgTHV4b24gd2lsbCB0aHJvdyB3aGVuIGl0IGVuY291bnRlcnMgaW52YWxpZCBEYXRlVGltZXMsIER1cmF0aW9ucywgb3IgSW50ZXJ2YWxzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0aHJvd09uSW52YWxpZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhyb3dPbkludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKHQpIHtcbiAgICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNldHRpbmdzO1xufSgpO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIHZhciBzID0gJyc7XG4gIGZvciAodmFyIF9pdGVyYXRvciA9IHNwbGl0cywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbiA9IF9yZWY7XG5cbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxudmFyIHRva2VuVG9PYmplY3QgPSB7XG4gIEQ6IERBVEVfU0hPUlQsXG4gIEREOiBEQVRFX01FRCxcbiAgREREOiBEQVRFX0ZVTEwsXG4gIEREREQ6IERBVEVfSFVHRSxcbiAgdDogVElNRV9TSU1QTEUsXG4gIHR0OiBUSU1FX1dJVEhfU0VDT05EUyxcbiAgdHR0OiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VULFxuICB0dHR0OiBUSU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IFRJTUVfMjRfU0lNUExFLFxuICBUVDogVElNRV8yNF9XSVRIX1NFQ09ORFMsXG4gIFRUVDogVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VULFxuICBmOiBEQVRFVElNRV9TSE9SVCxcbiAgZmY6IERBVEVUSU1FX01FRCxcbiAgZmZmOiBEQVRFVElNRV9GVUxMLFxuICBmZmZmOiBEQVRFVElNRV9IVUdFLFxuICBGOiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTLFxuICBGRkY6IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTLFxuICBGRkZGOiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EU1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIEZvcm1hdHRlci5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUobG9jYWxlKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGZvcm1hdE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB7IHJvdW5kOiB0cnVlIH0sIG9wdHMpO1xuICAgIHJldHVybiBuZXcgRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnBhcnNlRm9ybWF0ID0gZnVuY3Rpb24gcGFyc2VGb3JtYXQoZm10KSB7XG4gICAgdmFyIGN1cnJlbnQgPSBudWxsLFxuICAgICAgICBjdXJyZW50RnVsbCA9ICcnLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gZm10LmNoYXJBdChpKTtcbiAgICAgIGlmIChjID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudEZ1bGwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjdXJyZW50RnVsbCA9ICcnO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH07XG5cbiAgZnVuY3Rpb24gRm9ybWF0dGVyKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlcik7XG5cbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQgPSBmdW5jdGlvbiBmb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgb3B0cykge1xuICAgIGlmICh0aGlzLnN5c3RlbUxvYyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zeXN0ZW1Mb2MgPSB0aGlzLmxvYy5yZWRlZmF1bHRUb1N5c3RlbSgpO1xuICAgIH1cbiAgICB2YXIgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0KCk7XG4gIH07XG5cbiAgRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYuZm9ybWF0VG9QYXJ0cygpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLm51bSA9IGZ1bmN0aW9uIG51bShuKSB7XG4gICAgdmFyIHAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgICAvLyB3ZSBnZXQgc29tZSBwZXJmIG91dCBvZiBkb2luZyB0aGlzIGhlcmUsIGFubm95aW5nbHlcbiAgICBpZiAodGhpcy5vcHRzLmZvcmNlU2ltcGxlKSB7XG4gICAgICByZXR1cm4gcGFkU3RhcnQobiwgcCk7XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuXG4gICAgaWYgKHAgPiAwKSB7XG4gICAgICBvcHRzLnBhZFRvID0gcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2MubnVtYmVyRm9ybWF0dGVyKG9wdHMpLmZvcm1hdChuKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSAnZW4nO1xuICAgIHZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob3B0cywgZXh0cmFjdCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvYy5leHRyYWN0KGR0LCBvcHRzLCBleHRyYWN0KTtcbiAgICB9LFxuICAgICAgICBmb3JtYXRPZmZzZXQgPSBmdW5jdGlvbiBmb3JtYXRPZmZzZXQob3B0cykge1xuICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgIHJldHVybiAnWic7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyAnKycgOiAnLScsXG4gICAgICAgICAgYmFzZSA9ICcnICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlICdzaG9ydCc6XG4gICAgICAgICAgcmV0dXJuICcnICsgc2lnbiArIF90aGlzLm51bShNYXRoLmFicyhob3VycyksIDIpICsgJzonICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuICAgICAgICBjYXNlICduYXJyb3cnOlxuICAgICAgICAgIHJldHVybiBtaW51dGVzID4gMCA/IGJhc2UgKyAnOicgKyBtaW51dGVzIDogYmFzZTtcbiAgICAgICAgY2FzZSAndGVjaGllJzpcbiAgICAgICAgICByZXR1cm4gJycgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1ZhbHVlIGZvcm1hdCAnICsgb3B0cy5mb3JtYXQgKyAnIGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7IGhvdXI6ICdudW1lcmljJywgaG91cjEyOiB0cnVlIH0sICdkYXlwZXJpb2QnKTtcbiAgICB9LFxuICAgICAgICBtb250aCA9IGZ1bmN0aW9uIG1vbnRoKGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgbW9udGg6IGxlbmd0aCB9IDogeyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKTtcbiAgICB9LFxuICAgICAgICB3ZWVrZGF5ID0gZnVuY3Rpb24gd2Vla2RheShsZW5ndGgsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkgOiBzdHJpbmcoc3RhbmRhbG9uZSA/IHsgd2Vla2RheTogbGVuZ3RoIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCwgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSwgJ3dlZWtkYXknKTtcbiAgICB9LFxuICAgICAgICBtYXliZU1hY3JvID0gZnVuY3Rpb24gbWF5YmVNYWNybyh0b2tlbikge1xuICAgICAgdmFyIG1hY3JvID0gdG9rZW5Ub09iamVjdFt0b2tlbl07XG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHsgZXJhOiBsZW5ndGggfSwgJ2VyYScpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyO1xuXG4gICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICAvLyBtc1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kKTtcbiAgICAgICAgY2FzZSAndSc6XG4gICAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCk7XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnNlY29uZCwgMik7XG4gICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAvLyBob3Vyc1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyKTtcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIpO1xuICAgICAgICBjYXNlICdISCc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyLCAyKTtcbiAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiAnbmFycm93JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlonOlxuICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3Nob3J0JywgYWxsb3daOiBfdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgY2FzZSAnWlpaJzpcbiAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogJ3RlY2hpZScsIGFsbG93WjogZmFsc2UgfSk7XG4gICAgICAgIGNhc2UgJ1paWlonOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcbiAgICAgICAgY2FzZSAnWlpaWlonOlxuICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVMb25nO1xuICAgICAgICAvLyB6b25lXG4gICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgIHJldHVybiBkdC56b25lTmFtZTtcbiAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnbnVtZXJpYycgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSk7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgZGF5OiAnMi1kaWdpdCcgfSwgJ2RheScpIDogX3RoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ2xvbmcnLCB0cnVlKTtcbiAgICAgICAgY2FzZSAnY2NjY2MnOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ25hcnJvdycsIHRydWUpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuICAgICAgICBjYXNlICdFJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICBjYXNlICdFRUUnOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KCdsb25nJywgZmFsc2UpO1xuICAgICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheSgnbmFycm93JywgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG4gICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCk7XG4gICAgICAgIGNhc2UgJ0xMJzpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJzItZGlnaXQnLCBkYXk6ICdudW1lcmljJyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgdHJ1ZSk7XG4gICAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgIHJldHVybiBtb250aCgnbG9uZycsIHRydWUpO1xuICAgICAgICBjYXNlICdMTExMTCc6XG4gICAgICAgICAgLy8gbGlrZSBKXG4gICAgICAgICAgcmV0dXJuIG1vbnRoKCduYXJyb3cnLCB0cnVlKTtcbiAgICAgICAgLy8gbW9udGhzIC0gZm9ybWF0XG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyBtb250aDogJ251bWVyaWMnIH0sICdtb250aCcpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHsgbW9udGg6ICcyLWRpZ2l0JyB9LCAnbW9udGgnKSA6IF90aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoJ3Nob3J0JywgZmFsc2UpO1xuICAgICAgICBjYXNlICdNTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ2xvbmcnLCBmYWxzZSk7XG4gICAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoJ25hcnJvdycsIGZhbHNlKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoeyB5ZWFyOiAnMi1kaWdpdCcgfSwgJ3llYXInKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgICAgLy8gbGlrZSAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDQpO1xuICAgICAgICBjYXNlICd5eXl5eXknOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7IHllYXI6ICdudW1lcmljJyB9LCAneWVhcicpIDogX3RoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAvLyBlcmFzXG4gICAgICAgIGNhc2UgJ0cnOlxuICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICByZXR1cm4gZXJhKCdzaG9ydCcpO1xuICAgICAgICBjYXNlICdHRyc6XG4gICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgIHJldHVybiBlcmEoJ2xvbmcnKTtcbiAgICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICAgIHJldHVybiBlcmEoJ25hcnJvdycpO1xuICAgICAgICBjYXNlICdrayc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgIGNhc2UgJ2tra2snOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcbiAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcbiAgICAgICAgY2FzZSAnb29vJzpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICBjYXNlICdxJzpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnF1YXJ0ZXIpO1xuICAgICAgICBjYXNlICdxcSc6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG1heWJlTWFjcm8odG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfTtcblxuICBGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICByZXR1cm4gJ21pbnV0ZSc7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIHJldHVybiAnaG91cic7XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5udW0obGlsZHVyLmdldChtYXBwZWQpLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgICAgcmVhbFRva2VucyA9IHRva2Vucy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBfcmVmMikge1xuICAgICAgdmFyIGxpdGVyYWwgPSBfcmVmMi5saXRlcmFsLFxuICAgICAgICAgIHZhbCA9IF9yZWYyLnZhbDtcbiAgICAgIHJldHVybiBsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKTtcbiAgICB9LCBbXSksXG4gICAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvLmFwcGx5KGR1ciwgcmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuZnVuY3Rpb24gc3lzdGVtTG9jYWxlKCkge1xuICBpZiAoc3lzTG9jYWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH0gZWxzZSBpZiAoaGFzSW50bCgpKSB7XG4gICAgdmFyIGNvbXB1dGVkU3lzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuICAgIHN5c0xvY2FsZUNhY2hlID0gY29tcHV0ZWRTeXMgPT09ICd1bmQnID8gJ2VuLVVTJyA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9ICdlbi1VUyc7XG4gICAgcmV0dXJuIHN5c0xvY2FsZUNhY2hlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGxDb25maWdTdHJpbmcobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKSB7XG4gIGlmIChoYXNJbnRsKCkpIHtcbiAgICBsb2NhbGUgPSBBcnJheS5pc0FycmF5KGxvY2FsZSkgPyBsb2NhbGUgOiBbbG9jYWxlXTtcblxuICAgIGlmIChvdXRwdXRDYWxlbmRhciB8fCBudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGxvY2FsZSA9IGxvY2FsZS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgbCArPSAnLXUnO1xuXG4gICAgICAgIGlmIChvdXRwdXRDYWxlbmRhcikge1xuICAgICAgICAgIGwgKz0gJy1jYS0nICsgb3V0cHV0Q2FsZW5kYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgICAgbCArPSAnLW51LScgKyBudW1iZXJpbmdTeXN0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgdmFyIG1zID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBtYXBXZWVrZGF5cyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzICsgaSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gJ2Vycm9yJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09ICdlbicpIHtcbiAgICByZXR1cm4gZW5nbGlzaEZuKGxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGludGxGbihsZW5ndGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRmFzdE51bWJlcnMobG9jKSB7XG4gIGlmIChsb2MubnVtYmVyaW5nU3lzdGVtICYmIGxvYy5udW1iZXJpbmdTeXN0ZW0gIT09ICdsYXRuJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gJ2xhdG4nIHx8ICFsb2MubG9jYWxlIHx8IGxvYy5sb2NhbGUuc3RhcnRzV2l0aCgnZW4nKSB8fCBoYXNJbnRsKCkgJiYgSW50bC5EYXRlVGltZUZvcm1hdChsb2MuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubnVtYmVyaW5nU3lzdGVtID09PSAnbGF0bic7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaW1wbGVOdW1iZXJGb3JtYXR0ZXIob3B0cykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNpbXBsZU51bWJlckZvcm1hdHRlcik7XG5cbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMucm91bmQgPSBvcHRzLnJvdW5kIHx8IGZhbHNlO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgU2ltcGxlTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQoaSkge1xuICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiByb3VuZFRvKGksIHRoaXMucm91bmQgPyAwIDogMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW50bE51bWJlckZvcm1hdHRlcihpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50bE51bWJlckZvcm1hdHRlcik7XG5cbiAgICB2YXIgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSB9O1xuXG4gICAgaWYgKG9wdHMucGFkVG8gPiAwKSB7XG4gICAgICBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucm91bmQpIHtcbiAgICAgIGludGxPcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5mbG9vciA9IG9wdHMuZmxvb3I7XG4gICAgdGhpcy5pbnRsID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGludGwsIGludGxPcHRzKTtcbiAgfVxuXG4gIEludGxOdW1iZXJGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmludGwuZm9ybWF0KGZpeGVkKTtcbiAgfTtcblxuICByZXR1cm4gSW50bE51bWJlckZvcm1hdHRlcjtcbn0oKTtcblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgUG9seURhdGVGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seURhdGVGb3JtYXR0ZXIpO1xuXG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG5cbiAgICB2YXIgeiA9IHZvaWQgMDtcbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSAnVVRDJztcbiAgICAgIGlmIChvcHRzLnRpbWVab25lTmFtZSkge1xuICAgICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmR0ID0gZHQub2Zmc2V0ID09PSAwID8gZHQgOiBEYXRlVGltZS5mcm9tTWlsbGlzKGR0LnRzICsgZHQub2Zmc2V0ICogNjAgKiAxMDAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGR0LnpvbmUudHlwZSA9PT0gJ2xvY2FsJykge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciByZWFsSW50bE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMpO1xuICAgICAgaWYgKHopIHtcbiAgICAgICAgcmVhbEludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoaW50bCwgcmVhbEludGxPcHRzKTtcbiAgICB9XG4gIH1cblxuICBQb2x5RGF0ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZSgnZW4tVVMnKTtcbiAgICAgIHJldHVybiBGb3JtYXR0ZXIuY3JlYXRlKGxvYykuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMuZHQsIHRva2VuRm9ybWF0KTtcbiAgICB9XG4gIH07XG5cbiAgUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIFBvbHlEYXRlRm9ybWF0dGVyLnByb3RvdHlwZS5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlZE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaGFzSW50bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHRmLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6ICdlbi1VUycsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogJ2xhdG4nLFxuICAgICAgICBvdXRwdXRDYWxlbmRhcjogJ2dyZWdvcnknXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9seURhdGVGb3JtYXR0ZXI7XG59KCk7XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgTG9jYWxlLmZyb21PcHRzID0gZnVuY3Rpb24gZnJvbU9wdHMob3B0cykge1xuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKG9wdHMubG9jYWxlLCBvcHRzLm51bWJlcmluZ1N5c3RlbSwgb3B0cy5vdXRwdXRDYWxlbmRhciwgb3B0cy5kZWZhdWx0VG9FTik7XG4gIH07XG5cbiAgTG9jYWxlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgICB2YXIgZGVmYXVsdFRvRU4gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgdmFyIHNwZWNpZmllZExvY2FsZSA9IGxvY2FsZSB8fCBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlLFxuXG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/ICdlbi1VUycgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICB9O1xuXG4gIExvY2FsZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdCgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmLm91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfTtcblxuICBmdW5jdGlvbiBMb2NhbGUobG9jYWxlLCBudW1iZXJpbmcsIG91dHB1dENhbGVuZGFyLCBzcGVjaWZpZWRMb2NhbGUpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmc7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICAgIHRoaXMuaW50bCA9IGludGxDb25maWdTdHJpbmcodGhpcy5sb2NhbGUsIHRoaXMubnVtYmVyaW5nU3lzdGVtLCB0aGlzLm91dHB1dENhbGVuZGFyKTtcblxuICAgIHRoaXMud2Vla2RheXNDYWNoZSA9IHsgZm9ybWF0OiB7fSwgc3RhbmRhbG9uZToge30gfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IG51bGw7XG4gICAgdGhpcy5lcmFDYWNoZSA9IHt9O1xuXG4gICAgdGhpcy5zcGVjaWZpZWRMb2NhbGUgPSBzcGVjaWZpZWRMb2NhbGU7XG4gICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IG51bGw7XG4gIH1cblxuICAvLyB0b2RvOiBjYWNoZSBtZVxuICBMb2NhbGUucHJvdG90eXBlLmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoKSB7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09ICdlbicgfHwgdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKSA9PT0gJ2VuLXVzJyB8fCBpbnRsICYmIEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgnZW4tdXMnKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09ICdsYXRuJykgJiYgKHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IG51bGwgfHwgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gJ2dyZWdvcnknKTtcblxuICAgIGlmICghaGFzRlRQICYmICEoaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSAmJiAhZGVmYXVsdE9LKSB7XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gJ2VuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdpbnRsJztcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKGFsdHMpIHtcbiAgICBpZiAoIWFsdHMgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIExvY2FsZS5jcmVhdGUoYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLCBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBMb2NhbGUucHJvdG90eXBlLnJlZGVmYXVsdFRvRU4gPSBmdW5jdGlvbiByZWRlZmF1bHRUb0VOKCkge1xuICAgIHZhciBhbHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHsgZGVmYXVsdFRvRU46IHRydWUgfSkpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbSgpIHtcbiAgICB2YXIgYWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5jbG9uZShPYmplY3QuYXNzaWduKHt9LCBhbHRzLCB7IGRlZmF1bHRUb0VOOiBmYWxzZSB9KSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tb250aHMgPSBmdW5jdGlvbiBtb250aHMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBkZWZhdWx0T0sgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBtb250aHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnRsID0gZm9ybWF0ID8geyBtb250aDogbGVuZ3RoLCBkYXk6ICdudW1lcmljJyB9IDogeyBtb250aDogbGVuZ3RoIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSc7XG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsICdtb250aCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzJCQxKGxlbmd0aCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIGRlZmF1bHRPSyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIHdlZWtkYXlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IGZvcm1hdCA/IHsgd2Vla2RheTogbGVuZ3RoLCB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0gOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnO1xuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCAnd2Vla2RheScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMkJDEoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCB1bmRlZmluZWQsIGRlZmF1bHRPSywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lcmlkaWVtcztcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgY291bGQgYmUgYXJpYml0cmFyeSBkYXkgcGVyaW9kcy4gV2UncmUgZ29ubmEgYXNzdW1lIHRoZXJlIGFyZSBleGFjdGx5IHR3b1xuICAgICAgLy8gZm9yIEFNIGFuZCBQTS4gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYnV0IGl0J3MgbWFrZXMgcGFyc2luZyB3YXkgZWFzaWVyLlxuICAgICAgaWYgKCFfdGhpczMubWVyaWRpZW1DYWNoZSkge1xuICAgICAgICB2YXIgaW50bCA9IHsgaG91cjogJ251bWVyaWMnLCBob3VyMTI6IHRydWUgfTtcbiAgICAgICAgX3RoaXMzLm1lcmlkaWVtQ2FjaGUgPSBbRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgOSksIERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDE5KV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuZXh0cmFjdChkdCwgaW50bCwgJ2RheXBlcmlvZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE9LID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgZXJhcywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSB7IGVyYTogbGVuZ3RoIH07XG5cbiAgICAgIC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cbiAgICAgIGlmICghX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXM0LmVyYUNhY2hlW2xlbmd0aF0gPSBbRGF0ZVRpbWUudXRjKC00MCwgMSwgMSksIERhdGVUaW1lLnV0YygyMDE3LCAxLCAxKV0ubWFwKGZ1bmN0aW9uIChkdCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczQuZXh0cmFjdChkdCwgaW50bCwgJ2VyYScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzNC5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIGV4dHJhY3QoZHQsIGludGxPcHRzLCBmaWVsZCkge1xuICAgIHZhciBkZiA9IHRoaXMuZHRGb3JtYXR0ZXIoZHQsIGludGxPcHRzKSxcbiAgICAgICAgcmVzdWx0cyA9IGRmLmZvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZmllbGQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmcgPyBtYXRjaGluZy52YWx1ZSA6IG51bGw7XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5udW1iZXJGb3JtYXR0ZXIgPSBmdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXIoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgLy8gdGhpcyBmb3JjZXNpbXBsZSBvcHRpb24gaXMgbmV2ZXIgdXNlZCAodGhlIG9ubHkgY2FsbGVyIHNob3J0LWNpcmN1aXRzIG9uIGl0LCBidXQgaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUpXG4gICAgLy8gKGluIGNvbnRyYXN0LCB0aGUgcmVzdCBvZiB0aGUgY29uZGl0aW9uIGlzIHVzZWQgaGVhdmlseSlcbiAgICBpZiAob3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzIHx8ICFoYXNJbnRsKCkpIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGxOdW1iZXJGb3JtYXR0ZXIodGhpcy5pbnRsLCBvcHRzKTtcbiAgICB9XG4gIH07XG5cbiAgTG9jYWxlLnByb3RvdHlwZS5kdEZvcm1hdHRlciA9IGZ1bmN0aW9uIGR0Rm9ybWF0dGVyKGR0KSB7XG4gICAgdmFyIGludGxPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgUG9seURhdGVGb3JtYXR0ZXIoZHQsIHRoaXMuaW50bCwgaW50bE9wdHMpO1xuICB9O1xuXG4gIExvY2FsZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlID09PSBvdGhlci5sb2NhbGUgJiYgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJiB0aGlzLm91dHB1dENhbGVuZGFyID09PSBvdGhlci5vdXRwdXRDYWxlbmRhcjtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhMb2NhbGUsIFt7XG4gICAga2V5OiAnZmFzdE51bWJlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuZmFzdE51bWJlcnNDYWNoZWQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXG4gKiBUaGlzIGZpbGUgaGFuZGxlcyBwYXJzaW5nIGZvciB3ZWxsLXNwZWNpZmllZCBmb3JtYXRzLiBIZXJlJ3MgaG93IGl0IHdvcmtzOlxuICogVHdvIHRoaW5ncyBnbyBpbnRvIHBhcnNpbmc6IGEgcmVnZXggdG8gbWF0Y2ggd2l0aCBhbmQgYW4gZXh0cmFjdG9yIHRvIHRha2UgYXBhcnQgdGhlIGdyb3VwcyBpbiB0aGUgbWF0Y2guXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XG4gKiBwYXJzZSgpIGRvZXMgdGhlIHdvcmsgb2YgZXhlY3V0aW5nIHRoZSByZWdleCBhbmQgYXBwbHlpbmcgdGhlIGV4dHJhY3Rvci4gSXQgdGFrZXMgbXVsdGlwbGUgcmVnZXgvZXh0cmFjdG9yIHBhaXJzIHRvIHRyeSBpbiBzZXF1ZW5jZS5cbiAqIEV4dHJhY3RvcnMgY2FuIHRha2UgYSBcImN1cnNvclwiIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IGluIHRoZSBtYXRjaCB0byBsb29rIGF0LiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY29tYmluZSBleHRyYWN0b3JzLlxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cbiAqIFNvbWUgZXh0cmFjdGlvbnMgYXJlIHN1cGVyIGR1bWIgYW5kIHNpbXBsZVBhcnNlIGFuZCBmcm9tU3RyaW5ncyBoZWxwIERSWSB0aGVtLlxuICovXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWdleGVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVnZXhlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJlZ2V4ZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgZnVsbCA9IHJlZ2V4ZXMucmVkdWNlKGZ1bmN0aW9uIChmLCByKSB7XG4gICAgcmV0dXJuIGYgKyByLnNvdXJjZTtcbiAgfSwgJycpO1xuICByZXR1cm4gUmVnRXhwKCdeJyArIGZ1bGwgKyAnJCcpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycygpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBleHRyYWN0b3JzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gQXJyYXkoX2xlbjMgPiAxID8gX2xlbjMgLSAxIDogMCksIF9rZXkzID0gMTsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIHBhdHRlcm5zW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gcGF0dGVybnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWYzO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfcmVmMztcbiAgICB2YXIgcmVnZXggPSBfcmVmMlswXTtcbiAgICB2YXIgZXh0cmFjdG9yID0gX3JlZjJbMV07XG5cbiAgICB2YXIgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIGN1cnNvcikge1xuICAgIHZhciByZXQgPSB7fTtcbiAgICB2YXIgaSA9IHZvaWQgMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRba2V5c1tpXV0gPSBwYXJzZUludChtYXRjaFtjdXJzb3IgKyBpXSk7XG4gICAgfVxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn1cblxuLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xudmFyIG9mZnNldFJlZ2V4ID0gLyg/OihaKXwoWystXVxcZFxcZCkoPzo6PyhcXGRcXGQpKT8pLyxcbiAgICBpc29UaW1lQmFzZVJlZ2V4ID0gLyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpbLixdKFxcZHsxLDl9KSk/KT8pPy8sXG4gICAgaXNvVGltZVJlZ2V4ID0gUmVnRXhwKCcnICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyAnPycpLFxuICAgIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cCgnKD86VCcgKyBpc29UaW1lUmVnZXguc291cmNlICsgJyk/JyksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCktPyhcXGQpLyxcbiAgICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgICBleHRyYWN0SVNPV2Vla0RhdGEgPSBzaW1wbGVQYXJzZSgnd2Vla1llYXInLCAnd2Vla051bWJlcicsICd3ZWVrRGF5JyksXG4gICAgZXh0cmFjdElTT09yZGluYWxEYXRhID0gc2ltcGxlUGFyc2UoJ3llYXInLCAnb3JkaW5hbCcpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyAnID8oPzonICsgb2Zmc2V0UmVnZXguc291cmNlICsgJ3woW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/JyksXG4gICAgc3FsVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKCcoPzogJyArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyAnKT8nKTtcblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIHllYXI6IHBhcnNlSW50KG1hdGNoW2N1cnNvcl0pLFxuICAgIG1vbnRoOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAxXSkgfHwgMSxcbiAgICBkYXk6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDJdKSB8fCAxXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIHZhciBsb2NhbCA9ICFtYXRjaFtjdXJzb3JdICYmICFtYXRjaFtjdXJzb3IgKyAxXSxcbiAgICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICAgIHpvbmUgPSBsb2NhbCA/IG51bGwgOiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoZnVsbE9mZnNldCk7XG4gIHJldHVybiBbe30sIHpvbmUsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SUFOQVpvbmUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBuZXcgSUFOQVpvbmUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIGR1cmF0aW9uIHBhcnNpbmdcblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KFxcZHsxLDl9KVkpPyg/OihcXGR7MSw5fSlNKT8oPzooXFxkezEsOX0pRCk/KD86VCg/OihcXGR7MSw5fSlIKT8oPzooXFxkezEsOX0pTSk/KD86KFxcZHsxLDl9KSg/OlsuLF0oXFxkezEsOX0pKT9TKT8pP3woXFxkezEsOX0pVykkLztcblxuZnVuY3Rpb24gZXh0cmFjdElTT0R1cmF0aW9uKG1hdGNoKSB7XG4gIHZhciB5ZWFyU3RyID0gbWF0Y2hbMV0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzJdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbM10sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs1XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzZdLFxuICAgICAgbWlsbGlzZWNvbmRzU3RyID0gbWF0Y2hbN10sXG4gICAgICB3ZWVrU3RyID0gbWF0Y2hbOF07XG5cblxuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59XG5cbi8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcbnZhciBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwXG59O1xuXG5mdW5jdGlvbiBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHllYXI6IHllYXJTdHIubGVuZ3RoID09PSAyID8gdW50cnVuY2F0ZVllYXIocGFyc2VJbnQoeWVhclN0cikpIDogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGg6IG1vbnRoU3RyLmxlbmd0aCA9PT0gMiA/IHBhcnNlSW50KG1vbnRoU3RyLCAxMCkgOiBtb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludChkYXlTdHIpLFxuICAgIGhvdXI6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWludXRlU3RyKVxuICB9O1xuXG4gIGlmIChzZWNvbmRTdHIpIHJlc3VsdC5zZWNvbmQgPSBwYXJzZUludChzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID0gd2Vla2RheVN0ci5sZW5ndGggPiAzID8gd2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxIDogd2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpICsgMTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJGQyAyODIyLzUzMjJcbnZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgZGF5U3RyID0gbWF0Y2hbMl0sXG4gICAgICBtb250aFN0ciA9IG1hdGNoWzNdLFxuICAgICAgeWVhclN0ciA9IG1hdGNoWzRdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzVdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNl0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs3XSxcbiAgICAgIG9ic09mZnNldCA9IG1hdGNoWzhdLFxuICAgICAgbWlsT2Zmc2V0ID0gbWF0Y2hbOV0sXG4gICAgICBvZmZIb3VyU3RyID0gbWF0Y2hbMTBdLFxuICAgICAgb2ZmTWludXRlU3RyID0gbWF0Y2hbMTFdLFxuICAgICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuXG5cbiAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS50cmltKCk7XG59XG5cbi8vIGh0dHAgZGF0ZVxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICB2YXIgd2Vla2RheVN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs3XSxcbiAgICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW3JmYzg1MCwgZXh0cmFjdFJGQzExMjNPcjg1MF0sIFthc2NpaSwgZXh0cmFjdEFTQ0lJXSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UocywgW2NvbWJpbmVSZWdleGVzKHNxbFltZFJlZ2V4LCBzcWxUaW1lRXh0ZW5zaW9uUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPWW1kLCBleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0sIFtjb21iaW5lUmVnZXhlcyhzcWxUaW1lUmVnZXgpLCBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCwgZXh0cmFjdElBTkFab25lKV0pO1xufVxuXG52YXIgSU5WQUxJRCA9ICdJbnZhbGlkIER1cmF0aW9uJyxcbiAgICBVTlBBUlNBQkxFID0gJ3VucGFyc2FibGUnO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICBtaW51dGVzOiB7IHNlY29uZHM6IDYwLCBtaWxsaXNlY29uZHM6IDYwICogMTAwMCB9LFxuICBzZWNvbmRzOiB7IG1pbGxpc2Vjb25kczogMTAwMCB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7XG5cbi8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxudmFyIG9yZGVyZWRVbml0cyA9IFsneWVhcnMnLCAncXVhcnRlcnMnLCAnbW9udGhzJywgJ3dlZWtzJywgJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddO1xuXG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cykge1xuICB2YXIgY2xlYXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIC8vIGRlZXAgbWVyZ2UgZm9yIHZhbHNcbiAgdmFyIGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogT2JqZWN0LmFzc2lnbih7fSwgZHVyLnZhbHVlcywgYWx0cy52YWx1ZXMgfHwge30pLFxuICAgIGxvYzogZHVyLmxvYy5jbG9uZShhbHRzLmxvYyksXG4gICAgY29udmVyc2lvbkFjY3VyYWN5OiBhbHRzLmNvbnZlcnNpb25BY2N1cmFjeSB8fCBkdXIuY29udmVyc2lvbkFjY3VyYWN5XG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbi8vIHNvbWUgZnVuY3Rpb25zIHJlYWxseSBjYXJlIGFib3V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIGR1cmF0aW9uLCBzbyBjb21iaW5lZCB3aXRoXG4vLyBub3JtYWxpemUoKSB0aGlzIHRlbGxzIHVzIHdoZXRoZXIgdGhpcyBkdXJhdGlvbiBpcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZVxuZnVuY3Rpb24gaXNIaWdoT3JkZXJOZWdhdGl2ZShvYmopIHtcbiAgLy8gb25seSBydWxlIGlzIHRoYXQgdGhlIGhpZ2hlc3Qtb3JkZXIgcGFydCBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYgPSBfaS52YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgayA9IF9yZWY7XG5cbiAgICBpZiAob2JqW2tdKSByZXR1cm4gb2JqW2tdIDwgMDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICB2YXIgY29udiA9IG1hdHJpeFt0b1VuaXRdW2Zyb21Vbml0XSxcbiAgICAgIGFkZGVkID0gTWF0aC5mbG9vcihmcm9tTWFwW2Zyb21Vbml0XSAvIGNvbnYpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXMsIGN1cnJlbnQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbikge1xuICBpZiAoaXNOdW1iZXIoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb24pO1xuICB9IGVsc2UgaWYgKGR1cmF0aW9uIGluc3RhbmNlb2YgRHVyYXRpb24pIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0gZWxzZSBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGR1cmF0aW9uIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGEgRHVyYXRpb24sIHVzZSB7QGxpbmsgRHVyYXRpb24uZnJvbU1pbGxpc30sIHtAbGluayBEdXJhdGlvbi5mcm9tT2JqZWN0fSwgb3Ige0BsaW5rIER1cmF0aW9uLmZyb21JU099LlxyXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayB5ZWFyc30sIHtAbGluayBtb250aHN9LCB7QGxpbmsgd2Vla3N9LCB7QGxpbmsgZGF5c30sIHtAbGluayBob3Vyc30sIHtAbGluayBtaW51dGVzfSwge0BsaW5rIHNlY29uZHN9LCB7QGxpbmsgbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKiBUbyBjcmVhdGUgbmV3IER1cmF0aW9ucyBvdXQgb2Ygb2xkIG9uZXMgdXNlIHtAbGluayBwbHVzfSwge0BsaW5rIG1pbnVzfSwge0BsaW5rIG5vcm1hbGl6ZX0sIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2hpZnRUb30sIGFuZCB7QGxpbmsgbmVnYXRlfS5cclxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIGFzfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0pTT059XHJcbiAqXHJcbiAqIFRoZXJlJ3MgYXJlIG1vcmUgbWV0aG9kcyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdmFsaWRpdHksIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb24oY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRHVyYXRpb24pO1xuXG4gICAgdmFyIGFjY3VyYXRlID0gY29uZmlnLmNvbnZlcnNpb25BY2N1cmFjeSA9PT0gJ2xvbmd0ZXJtJyB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gJ2xvbmd0ZXJtJyA6ICdjYXN1YWwnO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gIH1cblxuICAvKipcclxuICAgKiBDcmVhdGUgRHVyYXRpb24gZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uZnJvbU1pbGxpcyA9IGZ1bmN0aW9uIGZyb21NaWxsaXMoY291bnQsIG9wdHMpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGgga2V5cyBsaWtlICd5ZWFycycgYW5kICdob3Vycy4gXHJcbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiB6ZXJvICBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmhvdXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmouY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCB8fCAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0R1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7XG4gICAgICB2YWx1ZXM6IG5vcm1hbGl6ZU9iamVjdChvYmosIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvYmopLFxuICAgICAgY29udmVyc2lvbkFjY3VyYWN5OiBvYmouY29udmVyc2lvbkFjY3VyYWN5XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChVTlBBUlNBQkxFKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHJlYXNvbiB0aGlzIGlzIGludmFsaWRcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRHVyYXRpb25FcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIHZhciBpZ25vcmVVbmtub3duID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIHZhciBub3JtYWxpemVkID0ge1xuICAgICAgeWVhcjogJ3llYXJzJyxcbiAgICAgIHllYXJzOiAneWVhcnMnLFxuICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXJzJyxcbiAgICAgIHF1YXJ0ZXJzOiAncXVhcnRlcnMnLFxuICAgICAgbW9udGg6ICdtb250aHMnLFxuICAgICAgbW9udGhzOiAnbW9udGhzJyxcbiAgICAgIHdlZWs6ICd3ZWVrcycsXG4gICAgICB3ZWVrczogJ3dlZWtzJyxcbiAgICAgIGRheTogJ2RheXMnLFxuICAgICAgZGF5czogJ2RheXMnLFxuICAgICAgaG91cjogJ2hvdXJzJyxcbiAgICAgIGhvdXJzOiAnaG91cnMnLFxuICAgICAgbWludXRlOiAnbWludXRlcycsXG4gICAgICBtaW51dGVzOiAnbWludXRlcycsXG4gICAgICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgICAgIHNlY29uZHM6ICdzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmRzJyxcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcydcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsb29yPXRydWVdIC0gZmxvb3IgbnVtZXJpY2FsIHZhbHVlc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgLy8gcmV2ZXJzZS1jb21wYXQgc2luY2UgMS4yOyB3ZSBhbHdheXMgcm91bmQgZG93biBub3csIG5ldmVyIHVwLCBhbmQgd2UgZG8gaXQgYnkgZGVmYXVsdC4gU286XG4gICAgLy8gMS4gYWx3YXlzIHR1cm4gb2ZmIHJvdW5kaW5nIGluIHRoZSB1bmRlcmx5aW5nIGZvcm1hdHRlclxuICAgIC8vIDIuIHR1cm4gb2ZmIGZsb29yaW5nIGlmIGVpdGhlciByb3VuZGluZyBpcyB0dXJuZWQgb2ZmIG9yIGZsb29yaW5nIGlzIHR1cm5lZCBvZmYsIG90aGVyd2lzZSBsZWF2ZSBpdCBvblxuICAgIHZhciBmbXRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0cywgeyBmbG9vcjogdHJ1ZSwgcm91bmQ6IGZhbHNlIH0pO1xuICAgIGlmIChvcHRzLnJvdW5kID09PSBmYWxzZSB8fCBvcHRzLmZsb29yID09PSBmYWxzZSkge1xuICAgICAgZm10T3B0cy5mbG9vciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gb3B0cyAtIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG9iamVjdFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnZhbHVlcyk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlQ29uZmlnKSB7XG4gICAgICBiYXNlLmNvbnZlcnNpb25BY2N1cmFjeSA9IHRoaXMuY29udmVyc2lvbkFjY3VyYWN5O1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA0LCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1A0TVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNSB9KS50b0lTTygpIC8vPT4gJ1A1TSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbGxpc2Vjb25kczogNiB9KS50b0lTTygpIC8vPT4gJ1BUMC4wMDZTJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIC8vIHdlIGNvdWxkIHVzZSB0aGUgZm9ybWF0dGVyLCBidXQgdGhpcyBpcyBhbiBlYXNpZXIgd2F5IHRvIGdldCB0aGUgbWluaW11bSBzdHJpbmdcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcyA9ICdQJyxcbiAgICAgICAgbm9ybSA9IHRoaXMubm9ybWFsaXplKCk7XG5cbiAgICAvLyBJU08gZHVyYXRpb25zIGFyZSBhbHdheXMgcG9zaXRpdmUsIHNvIHRha2UgdGhlIGFic29sdXRlIHZhbHVlXG4gICAgbm9ybSA9IGlzSGlnaE9yZGVyTmVnYXRpdmUobm9ybS52YWx1ZXMpID8gbm9ybS5uZWdhdGUoKSA6IG5vcm07XG5cbiAgICBpZiAobm9ybS55ZWFycyA+IDApIHMgKz0gbm9ybS55ZWFycyArICdZJztcbiAgICBpZiAobm9ybS5tb250aHMgPiAwIHx8IG5vcm0ucXVhcnRlcnMgPiAwKSBzICs9IG5vcm0ubW9udGhzICsgbm9ybS5xdWFydGVycyAqIDMgKyAnTSc7XG4gICAgaWYgKG5vcm0uZGF5cyA+IDAgfHwgbm9ybS53ZWVrcyA+IDApIHMgKz0gbm9ybS5kYXlzICsgbm9ybS53ZWVrcyAqIDcgKyAnRCc7XG4gICAgaWYgKG5vcm0uaG91cnMgPiAwIHx8IG5vcm0ubWludXRlcyA+IDAgfHwgbm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gJ1QnO1xuICAgIGlmIChub3JtLmhvdXJzID4gMCkgcyArPSBub3JtLmhvdXJzICsgJ0gnO1xuICAgIGlmIChub3JtLm1pbnV0ZXMgPiAwKSBzICs9IG5vcm0ubWludXRlcyArICdNJztcbiAgICBpZiAobm9ybS5zZWNvbmRzID4gMCB8fCBub3JtLm1pbGxpc2Vjb25kcyA+IDApIHMgKz0gbm9ybS5zZWNvbmRzICsgbm9ybS5taWxsaXNlY29uZHMgLyAxMDAwICsgJ1MnO1xuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLmFzKCdtaWxsaXNlY29uZHMnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHRoZSBSRVBMLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICB2YXIgdmFsc0luc3BlY3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0KCkpO1xuICAgICAgcmV0dXJuICdEdXJhdGlvbiB7XFxuICB2YWx1ZXM6ICcgKyB2YWxzSW5zcGVjdCArICcsXFxuICBsb2NhbGU6ICcgKyB0aGlzLmxvY2FsZSArICcsXFxuICBjb252ZXJzaW9uQWNjdXJhY3k6ICcgKyB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSArICcgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICcgKyB0aGlzLmludmFsaWRSZWFzb24gKyAnIH0nO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IG9yZGVyZWRVbml0cywgX2lzQXJyYXkyID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IyKSwgX2kyID0gMCwgX2l0ZXJhdG9yMiA9IF9pc0FycmF5MiA/IF9pdGVyYXRvcjIgOiBfaXRlcmF0b3IyW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjI7XG5cbiAgICAgIGlmIChfaXNBcnJheTIpIHtcbiAgICAgICAgaWYgKF9pMiA+PSBfaXRlcmF0b3IyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yMltfaTIrK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaTIgPSBfaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgaWYgKF9pMi5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjIgPSBfaTIudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrID0gX3JlZjI7XG5cbiAgICAgIHZhciB2YWwgPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICBpZiAodmFsICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5wbHVzKGR1ci5uZWdhdGUoKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLnllYXJzIC8vPT4gMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkubW9udGhzIC8vPT4gMFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZGF5cyAvLz0+IDNcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0JCQxKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG1peGVkIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIGR1ci5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWYzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNvbnZlcnNpb25BY2N1cmFjeSA9IF9yZWYzLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSB9KSxcbiAgICAgICAgb3B0cyA9IHsgbG9jOiBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ2RheXMnKSAvLz0+IDM2NVxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLmFzID0gZnVuY3Rpb24gYXModW5pdCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnNoaWZ0VG8odW5pdCkuZ2V0KHVuaXQpIDogTmFOO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBuZWcgPSBpc0hpZ2hPcmRlck5lZ2F0aXZlKHRoaXMudmFsdWVzKSxcbiAgICAgICAgdmFscyA9IChuZWcgPyB0aGlzLm5lZ2F0ZSgpIDogdGhpcykudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICAgIHJldHVybiBuZWcgPyBkdXIubmVnYXRlKCkgOiBkdXI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIER1cmF0aW9uIGludG8gaXRzIHJlcHJlc2VudGF0aW9uIGluIGEgZGlmZmVyZW50IHNldCBvZiB1bml0cy5cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ucHJvdG90eXBlLnNoaWZ0VG8gPSBmdW5jdGlvbiBzaGlmdFRvKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB1bml0cyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuXG4gICAgdmFyIGJ1aWx0ID0ge30sXG4gICAgICAgIGFjY3VtdWxhdGVkID0ge30sXG4gICAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgdmFyIGxhc3RVbml0ID0gdm9pZCAwO1xuXG4gICAgbm9ybWFsaXplVmFsdWVzKHRoaXMubWF0cml4LCB2YWxzKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBvcmRlcmVkVW5pdHMsIF9pc0FycmF5MyA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMyksIF9pMyA9IDAsIF9pdGVyYXRvcjMgPSBfaXNBcnJheTMgPyBfaXRlcmF0b3IzIDogX2l0ZXJhdG9yM1tTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY0O1xuXG4gICAgICBpZiAoX2lzQXJyYXkzKSB7XG4gICAgICAgIGlmIChfaTMgPj0gX2l0ZXJhdG9yMy5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNCA9IF9pdGVyYXRvcjNbX2kzKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kzID0gX2l0ZXJhdG9yMy5uZXh0KCk7XG4gICAgICAgIGlmIChfaTMuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY0ID0gX2kzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY0O1xuXG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcblxuICAgICAgICB2YXIgb3duID0gMDtcblxuICAgICAgICAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gTWF0aC50cnVuYyhvd24pO1xuICAgICAgICBidWlsdFtrXSA9IGk7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gb3duIC0gaTtcblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gdGhhdCBzaG91bGQgYmUgcm9sbGVkIHVwIGluIHRvIHRoaXNcbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgaWYgKGxhc3RVbml0KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgaWYgKGFjY3VtdWxhdGVkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSA+IDApIHtcbiAgICAgICAgICAgIGJ1aWx0W2xhc3RVbml0XSArPSBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBidWlsdCB9LCB0cnVlKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5wcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmVnYXRlZCA9IHt9O1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyksIF9pc0FycmF5NCA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yNCksIF9pNCA9IDAsIF9pdGVyYXRvcjQgPSBfaXNBcnJheTQgPyBfaXRlcmF0b3I0IDogX2l0ZXJhdG9yNFtTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWY1O1xuXG4gICAgICBpZiAoX2lzQXJyYXk0KSB7XG4gICAgICAgIGlmIChfaTQgPj0gX2l0ZXJhdG9yNC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmNSA9IF9pdGVyYXRvcjRbX2k0KytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2k0ID0gX2l0ZXJhdG9yNC5uZXh0KCk7XG4gICAgICAgIGlmIChfaTQuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWY1ID0gX2k0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgayA9IF9yZWY1O1xuXG4gICAgICBuZWdhdGVkW2tdID0gLXRoaXMudmFsdWVzW2tdO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG5lZ2F0ZWQgfSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB5ZWFycy5cclxuICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogRXF1YWxpdHkgY2hlY2tcclxuICAgKiBUd28gRHVyYXRpb25zIGFyZSBlcXVhbCBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIHVuaXRzIGFuZCB0aGUgc2FtZSB2YWx1ZXMgZm9yIGVhY2ggdW5pdC5cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIER1cmF0aW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gb3JkZXJlZFVuaXRzLCBfaXNBcnJheTUgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvcjUpLCBfaTUgPSAwLCBfaXRlcmF0b3I1ID0gX2lzQXJyYXk1ID8gX2l0ZXJhdG9yNSA6IF9pdGVyYXRvcjVbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmNjtcblxuICAgICAgaWYgKF9pc0FycmF5NSkge1xuICAgICAgICBpZiAoX2k1ID49IF9pdGVyYXRvcjUubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjYgPSBfaXRlcmF0b3I1W19pNSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pNSA9IF9pdGVyYXRvcjUubmV4dCgpO1xuICAgICAgICBpZiAoX2k1LmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmNiA9IF9pNS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSBfcmVmNjtcblxuICAgICAgaWYgKHRoaXMudmFsdWVzW3VdICE9PSBvdGhlci52YWx1ZXNbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhEdXJhdGlvbiwgW3tcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3llYXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVycy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncXVhcnRlcnMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRocy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2Vla3NcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3MnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheXMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91cnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXJzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGVzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGVzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2Vjb25kcycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbWlsbGlzZWNvbmRzJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xyXG4gICAgICogb24gaW52YWxpZCBEYXRlVGltZXMgb3IgSW50ZXJ2YWxzLlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ludmFsaWRSZWFzb24nLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZDtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIER1cmF0aW9uO1xufSgpO1xuXG52YXIgSU5WQUxJRCQxID0gJ0ludmFsaWQgSW50ZXJ2YWwnO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuICEhc3RhcnQgJiYgISFlbmQgJiYgc3RhcnQuaXNWYWxpZCAmJiBlbmQuaXNWYWxpZCAmJiBzdGFydCA8PSBlbmQ7XG59XG5cbi8qKlxyXG4gKiBBbiBJbnRlcnZhbCBvYmplY3QgcmVwcmVzZW50cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBvZiB0aW1lLCB3aGVyZSBlYWNoIGVuZHBvaW50IGlzIGEge0BsaW5rIERhdGVUaW1lfS4gQ29uY2VwdHVhbGx5LCBpdCdzIGEgY29udGFpbmVyIGZvciB0aG9zZSB0d28gZW5kcG9pbnRzLCBhY2NvbXBhbmllZCBieSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgY29tcGFyaW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gSW50ZXJ2YWw6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIGFmdGVyfSwge0BsaW5rIGJlZm9yZX0sIG9yIHtAbGluayBmcm9tSVNPfS5cclxuICogKiAqKkFjY2Vzc29ycyoqIFVzZSB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgZW5kfSB0byBnZXQgdGhlIHN0YXJ0IGFuZCBlbmQuXHJcbiAqICogKipJbnRlcnJvZ2F0aW9uKiogVG8gYW5hbHl6ZSB0aGUgSW50ZXJ2YWwsIHVzZSB7QGxpbmsgY291bnR9LCB7QGxpbmsgbGVuZ3RofSwge0BsaW5rIGhhc1NhbWV9LCB7QGxpbmsgY29udGFpbnN9LCB7QGxpbmsgaXNBZnRlcn0sIG9yIHtAbGluayBpc0JlZm9yZX0uXHJcbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIHNldH0sIHtAbGluayBzcGxpdEF0fSwge0BsaW5rIHNwbGl0Qnl9LCB7QGxpbmsgZGl2aWRlRXF1YWxseX0sIHtAbGluayBtZXJnZX0sIHtAbGluayB4b3J9LCB7QGxpbmsgdW5pb259LCB7QGxpbmsgaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIGRpZmZlcmVuY2V9LlxyXG4gKiAqICoqQ29tcGFyaXNvbioqIFRvIGNvbXBhcmUgdGhpcyBJbnRlcnZhbCB0byBhbm90aGVyIG9uZSwgdXNlIHtAbGluayBlcXVhbHN9LCB7QGxpbmsgb3ZlcmxhcHN9LCB7QGxpbmsgYWJ1dHNTdGFydH0sIHtAbGluayBhYnV0c0VuZH0sIHtAbGluayBlbmd1bGZzfVxyXG4gKiAqICoqT3V0cHV0KioqIFRvIGNvbnZlcnQgdGhlIEludGVydmFsIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvSVNPfSwge0BsaW5rIHRvRm9ybWF0fSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS5cclxuICovXG5cbnZhciBJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cbiAgZnVuY3Rpb24gSW50ZXJ2YWwoY29uZmlnKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJ2YWwpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5lID0gY29uZmlnLmVuZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWRSZWFzb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoeyBpbnZhbGlkUmVhc29uOiByZWFzb24gfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGFuIGVuZCBEYXRlVGltZS4gSW5jbHVzaXZlIG9mIHRoZSBzdGFydCBidXQgbm90IHRoZSBlbmQuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBlbmRcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmZyb21EYXRlVGltZXMgPSBmdW5jdGlvbiBmcm9tRGF0ZVRpbWVzKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYnVpbHRTdGFydCA9IGZyaWVuZGx5RGF0ZVRpbWUoc3RhcnQpLFxuICAgICAgICBidWlsdEVuZCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZFJlYXNvbjogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZCkgPyBudWxsIDogJ2ludmFsaWQgZW5kcG9pbnRzJ1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBJbnRlcnZhbCBmcm9tIGEgc3RhcnQgRGF0ZVRpbWUgYW5kIGEgRHVyYXRpb24gdG8gZXh0ZW5kIHRvLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IHN0YXJ0XHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYWZ0ZXIgPSBmdW5jdGlvbiBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gcGFzcyB7QHNlZSBEYXRlVGltZS5mcm9tSVNPfVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08oc3RyaW5nLCBvcHRzKSB7XG4gICAgaWYgKHN0cmluZykge1xuICAgICAgdmFyIF9zdHJpbmckc3BsaXQgPSBzdHJpbmcuc3BsaXQoL1xcLy8pLFxuICAgICAgICAgIHMgPSBfc3RyaW5nJHNwbGl0WzBdLFxuICAgICAgICAgIGUgPSBfc3RyaW5nJHNwbGl0WzFdO1xuXG4gICAgICBpZiAocyAmJiBlKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksIERhdGVUaW1lLmZyb21JU08oZSwgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZCgnaW52YWxpZCBJU08gZm9ybWF0Jyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gcmV0dXJuIHRoZSBsZW5ndGggaW4uXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuICBJbnRlcnZhbC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gbGVuZ3RoKCkge1xuICAgIHZhciB1bml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnbWlsbGlzZWNvbmRzJztcblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY291bnQgb2YgbWludXRlcywgaG91cnMsIGRheXMsIG1vbnRocywgb3IgeWVhcnMgaW5jbHVkZWQgaW4gdGhlIEludGVydmFsLCBldmVuIGluIHBhcnQuXHJcbiAgICogVW5saWtlIHtAbGluayBsZW5ndGh9IHRoaXMgY291bnRzIHNlY3Rpb25zIG9mIHRoZSBjYWxlbmRhciwgbm90IHBlcmlvZHMgb2YgdGltZSwgZS5nLiBzcGVjaWZ5aW5nICdkYXknXHJcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3VuaXQ9J21pbGxpc2Vjb25kcyddIC0gdGhlIHVuaXQgb2YgdGltZSB0byBjb3VudC5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbiBjb3VudCgpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ21pbGxpc2Vjb25kcyc7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIE5hTjtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICAgIGVuZCA9IHRoaXMuZW5kLnN0YXJ0T2YodW5pdCk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZW5kLmRpZmYoc3RhcnQsIHVuaXQpLmdldCh1bml0KSkgKyAxO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgaGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQgRGF0ZVRpbWVzLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmlzQWZ0ZXIgPSBmdW5jdGlvbiBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUuaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gZGF0ZVRpbWUgJiYgdGhpcy5lID4gZGF0ZVRpbWU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogXCJTZXRzXCIgdGhlIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZXMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyB0byBzZXRcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuZW5kIC0gdGhlIGVuZGluZyBEYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCQkMSgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIHN0YXJ0ID0gX3JlZi5zdGFydCxcbiAgICAgICAgZW5kID0gX3JlZi5lbmQ7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQgfHwgdGhpcy5zLCBlbmQgfHwgdGhpcy5lKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBzb3J0ZWQgPSBkYXRlVGltZXMubWFwKGZyaWVuZGx5RGF0ZVRpbWUpLnNvcnQoKSxcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgICBpID0gMDtcblxuXG4gICAgd2hpbGUgKHMgPCB0aGlzLmUpIHtcbiAgICAgIHZhciBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoJ21pbGxpc2Vjb25kcycpID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICAgIGFkZGVkID0gdm9pZCAwLFxuICAgICAgICBuZXh0ID0gdm9pZCAwO1xuXG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzbWFsbGVyIGludGVydmFscy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZQYXJ0cyAtIFRoZSBudW1iZXIgb2YgSW50ZXJ2YWxzIHRvIGRpdmlkZSB0aGUgSW50ZXJ2YWwgaW50by5cclxuICAgKiBAcmV0dXJuIHtbSW50ZXJ2YWxdfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmRpdmlkZUVxdWFsbHkgPSBmdW5jdGlvbiBkaXZpZGVFcXVhbGx5KG51bWJlck9mUGFydHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLnNwbGl0QnkodGhpcy5sZW5ndGgoKSAvIG51bWJlck9mUGFydHMpLnNsaWNlKDAsIG51bWJlck9mUGFydHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgb3ZlcmxhcHMgd2l0aCB0aGUgc3BlY2lmaWVkIEludGVydmFsXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLm92ZXJsYXBzID0gZnVuY3Rpb24gb3ZlcmxhcHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lID4gb3RoZXIucyAmJiB0aGlzLnMgPCBvdGhlci5lO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBzdGFydCBpcyBhZGphY2VudCB0byB0aGUgc3BlY2lmaWVkIEludGVydmFsJ3MgZW5kLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5hYnV0c0VuZCA9IGZ1bmN0aW9uIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLmVuZ3VsZnMgPSBmdW5jdGlvbiBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWF4aW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWluaW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgaS5lLiwgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXHJcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA8IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuXG4gICAgaWYgKHMgPiBlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIHVuaW9uIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlLnVuaW9uID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIHMgPSB0aGlzLnMgPCBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgICAgZSA9IHRoaXMuZSA+IG90aGVyLmUgPyB0aGlzLmUgOiBvdGhlci5lO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgZW5kcyA9IGludGVydmFscy5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBbeyB0aW1lOiBpLnMsIHR5cGU6ICdzJyB9LCB7IHRpbWU6IGkuZSwgdHlwZTogJ2UnIH1dO1xuICAgIH0pLFxuICAgICAgICBmbGF0dGVuZWQgPSAoX0FycmF5JHByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZSkuY29uY2F0LmFwcGx5KF9BcnJheSRwcm90b3R5cGUsIGVuZHMpLFxuICAgICAgICBhcnIgPSBmbGF0dGVuZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGFyciwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMztcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgX3JlZjMgPSBfaS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBfcmVmMztcblxuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gJ3MnID8gMSA6IC0xO1xuXG4gICAgICBpZiAoY3VycmVudENvdW50ID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gaS50aW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0ICYmICtzdGFydCAhPT0gK2kudGltZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHN0YXJ0LCBpLnRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSW50ZXJ2YWwubWVyZ2UocmVzdWx0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgaW50ZXJ2YWxzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcmV0dXJuIEludGVydmFsLnhvcihbdGhpc10uY29uY2F0KGludGVydmFscykpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIF90aGlzLmludGVyc2VjdGlvbihpKTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpICYmICFpLmlzRW1wdHkoKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gJ1snICsgdGhpcy5zLnRvSVNPKCkgKyAnIFxcdTIwMTMgJyArIHRoaXMuZS50b0lTTygpICsgJyknO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnSW50ZXJ2YWwge1xcbiAgc3RhcnQ6ICcgKyB0aGlzLnN0YXJ0LnRvSVNPKCkgKyAnLFxcbiAgZW5kOiAnICsgdGhpcy5lbmQudG9JU08oKSArICcsXFxuICB6b25lOiAgICcgKyB0aGlzLnN0YXJ0LnpvbmUubmFtZSArICcsXFxuICBsb2NhbGU6ICAgJyArIHRoaXMuc3RhcnQubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgJy8nICsgdGhpcy5lLnRvSVNPKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIEludGVydmFsLnByb3RvdHlwZS50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQpIHtcbiAgICB2YXIgX3JlZjQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBfcmVmNCRzZXBhcmF0b3IgPSBfcmVmNC5zZXBhcmF0b3IsXG4gICAgICAgIHNlcGFyYXRvciA9IF9yZWY0JHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJyDigJMgJyA6IF9yZWY0JHNlcGFyYXRvcjtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiAnJyArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gYSBEdXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIHRpbWUgc3Bhbm5lZCBieSB0aGlzIGludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCdkYXlzJykudG9PYmplY3QoKSAvLz0+IHsgZGF5czogMS4wMjQxODEyMTUyNzc3Nzc4IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LjgyMDk1IH1cclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignc2Vjb25kcycpLnRvT2JqZWN0KCkgLy89PiB7IHNlY29uZHM6IDg4NDg5LjI1NyB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5wcm90b3R5cGUudG9EdXJhdGlvbiA9IGZ1bmN0aW9uIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBjcmVhdGVDbGFzcyhJbnRlcnZhbCwgW3tcbiAgICBrZXk6ICdzdGFydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGVuZCBvZiB0aGUgSW50ZXJ2YWxcclxuICAgICAqIEB0eXBlIHtEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdlbmQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBhdCBsZWFzdCBpdHMgc3RhcnQsIGkuZS4gdGhhdCB0aGUgSW50ZXJ2YWwgaXNuJ3QgJ2JhY2t3YXJkcycuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBJbnRlcnZhbDtcbn0oKTtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5cbnZhciBJbmZvID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgSW5mby5oYXNEU1QgPSBmdW5jdGlvbiBoYXNEU1QoKSB7XG4gICAgdmFyIHpvbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFNldHRpbmdzLmRlZmF1bHRab25lO1xuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7IG1vbnRoOiAxMiB9KTtcblxuICAgIHJldHVybiAhem9uZS51bml2ZXJzYWwgJiYgcHJvdG8ub2Zmc2V0ICE9PSBwcm90by5zZXQoeyBtb250aDogNiB9KS5vZmZzZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG5cblxuICBJbmZvLmlzVmFsaWRJQU5BWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRJQU5BWm9uZSh6b25lKSB7XG4gICAgcmV0dXJuICEhSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcih6b25lKSAmJiBJQU5BWm9uZS5pc1ZhbGlkWm9uZSh6b25lKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHN0YW5kYWxvbmUgbW9udGggbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcj0nZ3JlZ29yeSddIC0gdGhlIGNhbGVuZGFyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JylbMF0gLy89PiAnSmFuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycpWzBdIC8vPT4gJzEnXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfZoSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiacq7IEknXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzID0gZnVuY3Rpb24gbW9udGhzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdW5kZWZpbmVkID8gJ2dyZWdvcnknIDogX3JlZiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgbW9udGhzfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tb250aHNGb3JtYXQgPSBmdW5jdGlvbiBtb250aHNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjIkbG9jYWxlID0gX3JlZjIubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmMiRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmMiRsb2NhbGUsXG4gICAgICAgIF9yZWYyJG51bWJlcmluZ1N5c3RlbSA9IF9yZWYyLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjIkbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBfcmVmMiRvdXRwdXRDYWxlbmRhciA9IF9yZWYyLm91dHB1dENhbGVuZGFyLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYyJG91dHB1dENhbGVuZGFyID09PSB1bmRlZmluZWQgPyAnZ3JlZ29yeScgOiBfcmVmMiRvdXRwdXRDYWxlbmRhcjtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikubW9udGhzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIHdlZWsgbmFtZXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygpWzBdIC8vPT4gJ01vbmRheSdcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSlbMF0gLy89PiAnbHVuLidcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2FyJyB9KVswXSAvLz0+ICfYp9mE2KfYq9mG2YrZhidcbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby53ZWVrZGF5cyA9IGZ1bmN0aW9uIHdlZWtkYXlzKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdsb25nJztcblxuICAgIHZhciBfcmVmMyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXG4gICAqIEZvcm1hdCB3ZWVrZGF5cyBkaWZmZXIgZnJvbSBzdGFuZGFsb25lIHdlZWtkYXlzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byBtb3JlIGRhdGUgaW5mb3JtYXRpb24uIEluIHNvbWUgbGFuZ3VhZ2VzLCB0aGF0XG4gICAqIGNoYW5nZXMgdGhlIHN0cmluZy5cbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2xvbmcnO1xuXG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQkbG9jYWxlID0gX3JlZjQubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNCRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNCRsb2NhbGUsXG4gICAgICAgIF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZjQkbnVtYmVyaW5nU3lzdGVtID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjQkbnVtYmVyaW5nU3lzdGVtO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBtZXJpZGllbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcygpIC8vPT4gWyAnQU0nLCAnUE0nIF1cbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdkZScgfSkgLy89PiBbICd2b3JtLicsICduYWNobS4nIF1cbiAgICogQHJldHVybiB7W3N0cmluZ119XG4gICAqL1xuXG5cbiAgSW5mby5tZXJpZGllbXMgPSBmdW5jdGlvbiBtZXJpZGllbXMoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgX3JlZjUkbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNSRsb2NhbGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBfcmVmNSRsb2NhbGU7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZXJhcywgc3VjaCBhcyBbJ0JDJywgJ0FEJ10uIFRoZSBsb2NhbGUgY2FuIGJlIHNwZWNpZmllZCwgYnV0IHRoZSBjYWxlbmRhciBzeXN0ZW0gaXMgYWx3YXlzIEdyZWdvcmlhbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J3Nob3J0J10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBlcmEgcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJzaG9ydFwiIG9yIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCkgLy89PiBbICdCQycsICdBRCcgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cbiAgICogQGV4YW1wbGUgSW5mby5lcmFzKCdsb25nJywgeyBsb2NhbGU6ICdmcicgfSkgLy89PiBbICdhdmFudCBKw6lzdXMtQ2hyaXN0JywgJ2FwcsOocyBKw6lzdXMtQ2hyaXN0JyBdXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3Nob3J0JztcblxuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIF9yZWY2JGxvY2FsZSA9IF9yZWY2LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjYkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX3JlZjYkbG9jYWxlO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudWxsLCAnZ3JlZ29yeScpLmVyYXMobGVuZ3RoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xuICAgKiAqIGBpbnRsVG9rZW5zYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemVkIHRva2VuLWJhc2VkIGZvcm1hdHRpbmcvcGFyc2luZ1xuICAgKiAqIGBpbnRsYDogd2hldGhlciB0aGlzIGVudmlyb25tZW50IHN1cHBvcnRzIGdlbmVyYWwgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG5cbiAgSW5mby5mZWF0dXJlcyA9IGZ1bmN0aW9uIGZlYXR1cmVzKCkge1xuICAgIHZhciBpbnRsID0gZmFsc2UsXG4gICAgICAgIGludGxUb2tlbnMgPSBmYWxzZSxcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcblxuICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgIGludGwgPSB0cnVlO1xuICAgICAgaW50bFRva2VucyA9IGhhc0Zvcm1hdFRvUGFydHMoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgem9uZXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4nLCB7IHRpbWVab25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgPT09ICdBbWVyaWNhL05ld19Zb3JrJztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnRsOiBpbnRsLCBpbnRsVG9rZW5zOiBpbnRsVG9rZW5zLCB6b25lczogem9uZXMgfTtcbiAgfTtcblxuICByZXR1cm4gSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gZGF5RGlmZihlYXJsaWVyLCBsYXRlcikge1xuICB2YXIgdXRjRGF5U3RhcnQgPSBmdW5jdGlvbiB1dGNEYXlTdGFydChkdCkge1xuICAgIHJldHVybiBkdC50b1VUQygwLCB7IGtlZXBMb2NhbFRpbWU6IHRydWUgfSkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICB9LFxuICAgICAgbXMgPSB1dGNEYXlTdGFydChsYXRlcikgLSB1dGNEYXlTdGFydChlYXJsaWVyKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoJ2RheXMnKSk7XG59XG5cbmZ1bmN0aW9uIGhpZ2hPcmRlckRpZmZzKGN1cnNvciwgbGF0ZXIsIHVuaXRzKSB7XG4gIHZhciBkaWZmZXJzID0gW1sneWVhcnMnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnllYXIgLSBhLnllYXI7XG4gIH1dLCBbJ21vbnRocycsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFsnd2Vla3MnLCBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICByZXR1cm4gKGRheXMgLSBkYXlzICUgNykgLyA3O1xuICB9XSwgWydkYXlzJywgZGF5RGlmZl1dO1xuXG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBsb3dlc3RPcmRlciA9IHZvaWQgMCxcbiAgICAgIGhpZ2hXYXRlciA9IHZvaWQgMDtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBkaWZmZXJzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmMjtcblxuICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgX3JlZjIgPSBfaXRlcmF0b3JbX2krK107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfcmVmMjtcbiAgICB2YXIgdW5pdCA9IF9yZWZbMF07XG4gICAgdmFyIGRpZmZlciA9IF9yZWZbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIHZhciBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcblxuICAgICAgaGlnaFdhdGVyID0gY3Vyc29yLnBsdXMoKF9jdXJzb3IkcGx1cyA9IHt9LCBfY3Vyc29yJHBsdXNbdW5pdF0gPSBkZWx0YSwgX2N1cnNvciRwbHVzKSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICB2YXIgX2hpZ2hXYXRlciRtaW51cztcblxuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXIubWludXMoKF9oaWdoV2F0ZXIkbWludXMgPSB7fSwgX2hpZ2hXYXRlciRtaW51c1t1bml0XSA9IDEsIF9oaWdoV2F0ZXIkbWludXMpKTtcbiAgICAgICAgZGVsdGEgLT0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICB2YXIgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSAnbWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgpIHtcbiAgdmFyIHBvc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgcmV0dXJuIHsgcmVnZXg6IHJlZ2V4LCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZikge1xuICAgICAgdmFyIHMgPSBfcmVmWzBdO1xuICAgICAgcmV0dXJuIHBvc3QocGFyc2VJbnQocykpO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi8sICdcXFxcLj8nKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXC4vLCAnJykudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbignfCcpKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMikge1xuICAgICAgICB2YXIgcyA9IF9yZWYyWzBdO1xuICAgICAgICByZXR1cm4gc3RyaW5ncy5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpO1xuICAgICAgICB9KSArIHN0YXJ0SW5kZXg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sIGdyb3VwczogZ3JvdXBzIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4geyByZWdleDogcmVnZXgsIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH0gfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7IHJlZ2V4OiBSZWdFeHAodC52YWwpLCBkZXNlcjogZnVuY3Rpb24gZGVzZXIoX3JlZjUpIHtcbiAgICAgICAgdmFyIHMgPSBfcmVmNVswXTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9LCBsaXRlcmFsOiB0cnVlIH07XG4gIH0sXG4gICAgICB1bml0YXRlID0gZnVuY3Rpb24gdW5pdGF0ZSh0KSB7XG4gICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAvLyBlcmFcbiAgICAgIGNhc2UgJ0cnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoJ3Nob3J0JywgZmFsc2UpLCAwKTtcbiAgICAgIGNhc2UgJ0dHJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKCdsb25nJywgZmFsc2UpLCAwKTtcbiAgICAgIC8vIHllYXJzXG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG4gICAgICBjYXNlICd5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgY2FzZSAneXl5eXknOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcbiAgICAgIGNhc2UgJ3l5eXl5eSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KC9cXGR7Nn0vKTtcbiAgICAgIC8vIG1vbnRoc1xuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdzaG9ydCcsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnTU1NTSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKCdsb25nJywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdMJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnTExMJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoJ3Nob3J0JywgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocygnbG9uZycsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAvLyBkYXRlc1xuICAgICAgY2FzZSAnZCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIC8vIG9yZGluYWxzXG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICBjYXNlICdvb28nOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG4gICAgICBjYXNlICdISCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnaGgnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgY2FzZSAnc3MnOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgY2FzZSAnUyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuICAgICAgY2FzZSAnU1NTJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1xcZHsxLDl9Lyk7XG4gICAgICAvLyBtZXJpZGllbVxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG4gICAgICBjYXNlICdra2trJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICBjYXNlICdrayc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgIGNhc2UgJ1cnOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICBjYXNlICdXVyc6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyB3ZWVrZGF5c1xuICAgICAgY2FzZSAnRSc6XG4gICAgICBjYXNlICdjJzpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ3Nob3J0JywgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnbG9uZycsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjJzpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cygnc2hvcnQnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoJ2xvbmcnLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgLy8gb2Zmc2V0L3pvbmVcbiAgICAgIGNhc2UgJ1onOlxuICAgICAgY2FzZSAnWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/LywgMik7XG4gICAgICBjYXNlICdaWlonOlxuICAgICAgICByZXR1cm4gb2Zmc2V0KC8oWystXVxcZHsxLDJ9KShcXGR7Mn0pPy8sIDIpO1xuICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBaWlpaIChQU1QpIG9yIFpaWlpaIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpIGluIHBhcnNpbmdcbiAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuICAgICAgY2FzZSAneic6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1tBLVphLXpfXXsxLDI1Nn1cXC9bQS1aYS16X117MSwyNTZ9Lyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFBcbiAgfTtcblxuICB1bml0LnRva2VuID0gdG9rZW47XG5cbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgJygnICsgci5zb3VyY2UgKyAnKSc7XG4gIH0sICcnKTtcbiAgcmV0dXJuIFsnXicgKyByZSArICckJywgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIHZhciBtYXRjaGVzID0gaW5wdXQubWF0Y2gocmVnZXgpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgdmFyIGFsbCA9IHt9O1xuICAgIHZhciBtYXRjaEluZGV4ID0gMTtcbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoSW5kZXggKz0gZ3JvdXBzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ1MnOlxuICAgICAgICByZXR1cm4gJ21pbGxpc2Vjb25kJztcbiAgICAgIGNhc2UgJ3MnOlxuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgICBjYXNlICdtJzpcbiAgICAgICAgcmV0dXJuICdtaW51dGUnO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICBjYXNlICdIJzpcbiAgICAgICAgcmV0dXJuICdob3VyJztcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gJ2RheSc7XG4gICAgICBjYXNlICdvJzpcbiAgICAgICAgcmV0dXJuICdvcmRpbmFsJztcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgY2FzZSAnTSc6XG4gICAgICAgIHJldHVybiAnbW9udGgnO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHJldHVybiAneWVhcic7XG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ2MnOlxuICAgICAgICByZXR1cm4gJ3dlZWtkYXknO1xuICAgICAgY2FzZSAnVyc6XG4gICAgICAgIHJldHVybiAnd2Vla051bWJlcic7XG4gICAgICBjYXNlICdrJzpcbiAgICAgICAgcmV0dXJuICd3ZWVrWWVhcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmUgPSB2b2lkIDA7XG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gbmV3IElBTkFab25lKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyhtYXRjaGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGspIHtcbiAgICB2YXIgZiA9IHRvRmllbGQoayk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQ6IGlucHV0LCB0b2tlbnM6IHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBfYnVpbGRSZWdleCA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgICByZWdleFN0cmluZyA9IF9idWlsZFJlZ2V4WzBdLFxuICAgICAgICBoYW5kbGVycyA9IF9idWlsZFJlZ2V4WzFdLFxuICAgICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgJ2knKSxcbiAgICAgICAgX21hdGNoID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICAgIHJhd01hdGNoZXMgPSBfbWF0Y2hbMF0sXG4gICAgICAgIG1hdGNoZXMgPSBfbWF0Y2hbMV0sXG4gICAgICAgIF9yZWY2ID0gbWF0Y2hlcyA/IGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykgOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgIHJlc3VsdCA9IF9yZWY2WzBdLFxuICAgICAgICB6b25lID0gX3JlZjZbMV07XG5cbiAgICByZXR1cm4geyBpbnB1dDogaW5wdXQsIHRva2VuczogdG9rZW5zLCByZWdleDogcmVnZXgsIHJhd01hdGNoZXM6IHJhd01hdGNoZXMsIG1hdGNoZXM6IG1hdGNoZXMsIHJlc3VsdDogcmVzdWx0LCB6b25lOiB6b25lIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgX2V4cGxhaW5Gcm9tVG9rZW5zID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSxcbiAgICAgIHJlc3VsdCA9IF9leHBsYWluRnJvbVRva2Vucy5yZXN1bHQsXG4gICAgICB6b25lID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnpvbmUsXG4gICAgICBpbnZhbGlkUmVhc29uID0gX2V4cGxhaW5Gcm9tVG9rZW5zLmludmFsaWRSZWFzb247XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuXG52YXIgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gICAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHZhciBqcyA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBqcyA9PT0gMCA/IDcgOiBqcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSkge1xuICByZXR1cm4gZGF5ICsgKGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcilbbW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSB7XG4gIHZhciB0YWJsZSA9IGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcixcbiAgICAgIG1vbnRoMCA9IHRhYmxlLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpIDwgb3JkaW5hbDtcbiAgfSksXG4gICAgICBkYXkgPSBvcmRpbmFsIC0gdGFibGVbbW9udGgwXTtcbiAgcmV0dXJuIHsgbW9udGg6IG1vbnRoMCArIDEsIGRheTogZGF5IH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICB2YXIgeWVhciA9IGdyZWdPYmoueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ09iai5tb250aCxcbiAgICAgIGRheSA9IGdyZWdPYmouZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgICAgd2Vla2RheSA9IGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KTtcblxuXG4gIHZhciB3ZWVrTnVtYmVyID0gTWF0aC5mbG9vcigob3JkaW5hbCAtIHdlZWtkYXkgKyAxMCkgLyA3KSxcbiAgICAgIHdlZWtZZWFyID0gdm9pZCAwO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB3ZWVrWWVhcjogd2Vla1llYXIsIHdlZWtOdW1iZXI6IHdlZWtOdW1iZXIsIHdlZWtkYXk6IHdlZWtkYXkgfSwgdGltZU9iamVjdChncmVnT2JqKSk7XG59XG5cbmZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICB2YXIgd2Vla1llYXIgPSB3ZWVrRGF0YS53ZWVrWWVhcixcbiAgICAgIHdlZWtOdW1iZXIgPSB3ZWVrRGF0YS53ZWVrTnVtYmVyLFxuICAgICAgd2Vla2RheSA9IHdlZWtEYXRhLndlZWtkYXksXG4gICAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICAgIHllYXJJbkRheXMgPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcblxuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhciA9IHZvaWQgMDtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIHZhciBfdW5jb21wdXRlT3JkaW5hbCA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCksXG4gICAgICBtb250aCA9IF91bmNvbXB1dGVPcmRpbmFsLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwuZGF5O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHsgeWVhcjogeWVhciwgbW9udGg6IG1vbnRoLCBkYXk6IGRheSB9LCB0aW1lT2JqZWN0KHdlZWtEYXRhKSk7XG59XG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICB2YXIgeWVhciA9IGdyZWdEYXRhLnllYXIsXG4gICAgICBtb250aCA9IGdyZWdEYXRhLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ0RhdGEuZGF5LFxuICAgICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB5ZWFyOiB5ZWFyLCBvcmRpbmFsOiBvcmRpbmFsIH0sIHRpbWVPYmplY3QoZ3JlZ0RhdGEpKTtcbn1cblxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCwgZGF5OiBkYXkgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkV2Vla0RhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoud2Vla1llYXIpLFxuICAgICAgdmFsaWRXZWVrID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgICAgdmFsaWRXZWVrZGF5ID0gbnVtYmVyQmV0d2VlbihvYmoud2Vla2RheSwgMSwgNyk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gJ3dlZWtZZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiAnd2VlayBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gJ3dlZWtkYXkgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuICd5ZWFyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiAnb3JkaW5hbCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkWWVhciA9IGlzTnVtYmVyKG9iai55ZWFyKSxcbiAgICAgIHZhbGlkTW9udGggPSBudW1iZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgICAgdmFsaWREYXkgPSBudW1iZXJCZXR3ZWVuKG9iai5kYXksIDEsIGRheXNJbk1vbnRoKG9iai55ZWFyLCBvYmoubW9udGgpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiAneWVhciBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1vbnRoKSB7XG4gICAgcmV0dXJuICdtb250aCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiAnZGF5IG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgdmFyIHZhbGlkSG91ciA9IG51bWJlckJldHdlZW4ob2JqLmhvdXIsIDAsIDIzKSxcbiAgICAgIHZhbGlkTWludXRlID0gbnVtYmVyQmV0d2VlbihvYmoubWludXRlLCAwLCA1OSksXG4gICAgICB2YWxpZFNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLnNlY29uZCwgMCwgNTkpLFxuICAgICAgdmFsaWRNaWxsaXNlY29uZCA9IG51bWJlckJldHdlZW4ob2JqLm1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuICdob3VyIG91dCBvZiByYW5nZSc7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWludXRlKSB7XG4gICAgcmV0dXJuICdtaW51dGUgb3V0IG9mIHJhbmdlJztcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gJ3NlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuICdtaWxsaXNlY29uZCBvdXQgb2YgcmFuZ2UnO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gJ0ludmFsaWQgRGF0ZVRpbWUnLFxuICAgIElOVkFMSURfSU5QVVQgPSAnaW52YWxpZCBpbnB1dCcsXG4gICAgVU5TVVBQT1JURURfWk9ORSA9ICd1bnN1cHBvcnRlZCB6b25lJyxcbiAgICBVTlBBUlNBQkxFJDEgPSAndW5wYXJzYWJsZSc7XG5cbi8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn1cblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZFJlYXNvbjogaW5zdC5pbnZhbGlkUmVhc29uXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywgeyBvbGQ6IGN1cnJlbnQgfSkpO1xufVxuXG4vLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwO1xuXG4gIC8vIFRlc3Qgd2hldGhlciB0aGUgem9uZSBtYXRjaGVzIHRoZSBvZmZzZXQgZm9yIHRoaXMgdHNcbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcblxuICAvLyBJZiBzbywgb2Zmc2V0IGRpZG4ndCBjaGFuZ2UgYW5kIHdlJ3JlIGRvbmVcbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH1cblxuICAvLyBJZiBub3QsIGNoYW5nZSB0aGUgdHMgYnkgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIG9mZnNldFxuICB1dGNHdWVzcyAtPSAobzIgLSBvKSAqIDYwICogMTAwMDtcblxuICAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcbiAgdmFyIG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIHZhciBkID0gbmV3IERhdGUodHMpO1xuXG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufVxuXG4vLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuZnVuY3Rpb24gb2JqVG9Mb2NhbFRTKG9iaikge1xuICB2YXIgZCA9IERhdGUuVVRDKG9iai55ZWFyLCBvYmoubW9udGggLSAxLCBvYmouZGF5LCBvYmouaG91ciwgb2JqLm1pbnV0ZSwgb2JqLnNlY29uZCwgb2JqLm1pbGxpc2Vjb25kKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIob2JqLnllYXIpO1xuICB9XG4gIHJldHVybiArZDtcbn1cblxuLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuZnVuY3Rpb24gb2JqVG9UUyhvYmosIG9mZnNldCwgem9uZSkge1xuICByZXR1cm4gZml4T2Zmc2V0KG9ialRvTG9jYWxUUyhvYmopLCBvZmZzZXQsIHpvbmUpO1xufVxuXG4vLyBjcmVhdGUgYSBuZXcgRFQgaW5zdGFuY2UgYnkgYWRkaW5nIGEgZHVyYXRpb24sIGFkanVzdGluZyBmb3IgRFNUc1xuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgdmFyIG9QcmUgPSBpbnN0Lm8sXG4gICAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBkdXIueWVhcnMsXG4gICAgICBtb250aCA9IGluc3QuYy5tb250aCArIGR1ci5tb250aHMgKyBkdXIucXVhcnRlcnMgKiAzLFxuICAgICAgYyA9IE9iamVjdC5hc3NpZ24oe30sIGluc3QuYywge1xuICAgIHllYXI6IHllYXIsXG4gICAgbW9udGg6IG1vbnRoLFxuICAgIGRheTogTWF0aC5taW4oaW5zdC5jLmRheSwgZGF5c0luTW9udGgoeWVhciwgbW9udGgpKSArIGR1ci5kYXlzICsgZHVyLndlZWtzICogN1xuICB9KSxcbiAgICAgIG1pbGxpc1RvQWRkID0gRHVyYXRpb24uZnJvbU9iamVjdCh7XG4gICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICBtaW51dGVzOiBkdXIubWludXRlcyxcbiAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHNcbiAgfSkuYXMoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgbG9jYWxUUyA9IG9ialRvTG9jYWxUUyhjKTtcblxuICB2YXIgX2ZpeE9mZnNldCA9IGZpeE9mZnNldChsb2NhbFRTLCBvUHJlLCBpbnN0LnpvbmUpLFxuICAgICAgdHMgPSBfZml4T2Zmc2V0WzBdLFxuICAgICAgbyA9IF9maXhPZmZzZXRbMV07XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzOiB0cywgbzogbyB9O1xufVxuXG4vLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzKSB7XG4gIHZhciBzZXRab25lID0gb3B0cy5zZXRab25lLFxuICAgICAgem9uZSA9IG9wdHMuem9uZTtcblxuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIGludGVycHJldGF0aW9uWm9uZSA9IHBhcnNlZFpvbmUgfHwgem9uZSxcbiAgICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbihwYXJzZWQsIG9wdHMsIHtcbiAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoVU5QQVJTQUJMRSQxKTtcbiAgfVxufVxuXG4vLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuZnVuY3Rpb24gdG9UZWNoRm9ybWF0KGR0LCBmb3JtYXQpIHtcbiAgcmV0dXJuIGR0LmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoJ2VuLVVTJyksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn1cblxuLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcbmZ1bmN0aW9uIHRvVGVjaFRpbWVGb3JtYXQoZHQsIF9yZWYpIHtcbiAgdmFyIF9yZWYkc3VwcHJlc3NTZWNvbmRzID0gX3JlZi5zdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc1NlY29uZHMgPSBfcmVmJHN1cHByZXNzU2Vjb25kcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9IF9yZWYuc3VwcHJlc3NNaWxsaXNlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWYkc3VwcHJlc3NNaWxsaXNlYyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHN1cHByZXNzTWlsbGlzZWMsXG4gICAgICBfcmVmJGluY2x1ZGVPZmZzZXQgPSBfcmVmLmluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRpbmNsdWRlT2Zmc2V0LFxuICAgICAgX3JlZiRpbmNsdWRlWm9uZSA9IF9yZWYuaW5jbHVkZVpvbmUsXG4gICAgICBpbmNsdWRlWm9uZSA9IF9yZWYkaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiRpbmNsdWRlWm9uZSxcbiAgICAgIF9yZWYkc3BhY2Vab25lID0gX3JlZi5zcGFjZVpvbmUsXG4gICAgICBzcGFjZVpvbmUgPSBfcmVmJHNwYWNlWm9uZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHNwYWNlWm9uZTtcblxuICB2YXIgZm10ID0gJ0hIOm1tJztcblxuICBpZiAoIXN1cHByZXNzU2Vjb25kcyB8fCBkdC5zZWNvbmQgIT09IDAgfHwgZHQubWlsbGlzZWNvbmQgIT09IDApIHtcbiAgICBmbXQgKz0gJzpzcyc7XG4gICAgaWYgKCFzdXBwcmVzc01pbGxpc2Vjb25kcyB8fCBkdC5taWxsaXNlY29uZCAhPT0gMCkge1xuICAgICAgZm10ICs9ICcuU1NTJztcbiAgICB9XG4gIH1cblxuICBpZiAoKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpICYmIHNwYWNlWm9uZSkge1xuICAgIGZtdCArPSAnICc7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gJ3onO1xuICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICBmbXQgKz0gJ1paJztcbiAgfVxuXG4gIHJldHVybiB0b1RlY2hGb3JtYXQoZHQsIGZtdCk7XG59XG5cbi8vIGRlZmF1bHRzIGZvciB1bnNwZWNpZmllZCB1bml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFyc1xudmFyIGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdFdlZWtVbml0VmFsdWVzID0ge1xuICB3ZWVrTnVtYmVyOiAxLFxuICB3ZWVrZGF5OiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn0sXG4gICAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICBvcmRpbmFsOiAxLFxuICBob3VyOiAwLFxuICBtaW51dGU6IDAsXG4gIHNlY29uZDogMCxcbiAgbWlsbGlzZWNvbmQ6IDBcbn07XG5cbi8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xudmFyIG9yZGVyZWRVbml0cyQxID0gWyd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gWyd3ZWVrWWVhcicsICd3ZWVrTnVtYmVyJywgJ3dlZWtkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ10sXG4gICAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFsneWVhcicsICdvcmRpbmFsJywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICB2YXIgaWdub3JlVW5rbm93biA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSB7XG4gICAgeWVhcjogJ3llYXInLFxuICAgIHllYXJzOiAneWVhcicsXG4gICAgbW9udGg6ICdtb250aCcsXG4gICAgbW9udGhzOiAnbW9udGgnLFxuICAgIGRheTogJ2RheScsXG4gICAgZGF5czogJ2RheScsXG4gICAgaG91cjogJ2hvdXInLFxuICAgIGhvdXJzOiAnaG91cicsXG4gICAgbWludXRlOiAnbWludXRlJyxcbiAgICBtaW51dGVzOiAnbWludXRlJyxcbiAgICBzZWNvbmQ6ICdzZWNvbmQnLFxuICAgIHNlY29uZHM6ICdzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kJyxcbiAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgd2Vla2RheXM6ICd3ZWVrZGF5JyxcbiAgICB3ZWVrbnVtYmVyOiAnd2Vla051bWJlcicsXG4gICAgd2Vla3NudW1iZXI6ICd3ZWVrTnVtYmVyJyxcbiAgICB3ZWVrbnVtYmVyczogJ3dlZWtOdW1iZXInLFxuICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgIHdlZWt5ZWFyczogJ3dlZWtZZWFyJyxcbiAgICBvcmRpbmFsOiAnb3JkaW5hbCdcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG5cbiAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBvcmRlcmVkVW5pdHMkMSwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICB2YXIgX3JlZjI7XG5cbiAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmMiA9IF9pLnZhbHVlO1xuICAgIH1cblxuICAgIHZhciB1ID0gX3JlZjI7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWRSZWFzb24gPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWRSZWFzb24pO1xuICB9XG5cbiAgdmFyIHRzTm93ID0gU2V0dGluZ3Mubm93KCksXG4gICAgICBvZmZzZXRQcm92aXMgPSB6b25lLm9mZnNldCh0c05vdyksXG4gICAgICBfb2JqVG9UUyA9IG9ialRvVFMob2JqLCBvZmZzZXRQcm92aXMsIHpvbmUpLFxuICAgICAgdHMgPSBfb2JqVG9UU1swXSxcbiAgICAgIG8gPSBfb2JqVG9UU1sxXTtcblxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG5cbi8qKlxyXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXHJcbiAqXHJcbiAqIEEgRGF0ZVRpbWUgY29tcHJpc2VzIG9mOlxyXG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxyXG4gKiAqIEEgdGltZSB6b25lLiBFYWNoIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB6b25lIChieSBkZWZhdWx0IHRoZSBsb2NhbCBzeXN0ZW0ncyB6b25lKS5cclxuICogKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBlZmZlY3QgaG93IG91dHB1dCBzdHJpbmdzIGFyZSBmb3JtYXR0ZWQsIHN1Y2ggYXMgYGxvY2FsZWAsIGBudW1iZXJpbmdTeXN0ZW1gLCBhbmQgYG91dHB1dENhbGVuZGFyYC5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlczpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIGxvY2FsfSwge0BsaW5rIHV0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIGZyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21JU099LCB7QGxpbmsgZnJvbUhUVFB9LCBhbmQge0BsaW5rIGZyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIGZyb21KU0RhdGV9LlxyXG4gKiAqICoqR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCB0aW1lKio6IFRvIGV4YW1pbmUgdGhlIEdyZWdvcmlhbiBwcm9wZXJ0aWVzIG9mIGEgRGF0ZVRpbWUgaW5kaXZpZHVhbGx5IChpLmUgYXMgb3Bwb3NlZCB0byBjb2xsZWN0aXZlbHkgdGhyb3VnaCB7QGxpbmsgdG9PYmplY3R9KSwgdXNlIHRoZSB7QGxpbmsgeWVhcn0sIHtAbGluayBtb250aH0sXHJcbiAqIHtAbGluayBkYXl9LCB7QGxpbmsgaG91cn0sIHtAbGluayBtaW51dGV9LCB7QGxpbmsgc2Vjb25kfSwge0BsaW5rIG1pbGxpc2Vjb25kfSBhY2Nlc3NvcnMuXHJcbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayB3ZWVrWWVhcn0sIHtAbGluayB3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayB3ZWVrZGF5fSBhY2Nlc3NvcnMuXHJcbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlIHRoZSB7QGxpbmsgbG9jYWxlfSBhbmQge0BsaW5rIG51bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqVHJhbnNmb3JtYXRpb24qKjogVG8gdHJhbnNmb3JtIHRoZSBEYXRlVGltZSBpbnRvIG90aGVyIERhdGVUaW1lcywgdXNlIHtAbGluayBzZXR9LCB7QGxpbmsgcmVjb25maWd1cmV9LCB7QGxpbmsgc2V0Wm9uZX0sIHtAbGluayBzZXRMb2NhbGV9LCB7QGxpbmsgcGx1c30sIHtAbGluayBtaW51c30sIHtAbGluayBlbmRPZn0sIHtAbGluayBzdGFydE9mfSwge0BsaW5rIHRvVVRDfSwgYW5kIHtAbGluayB0b0xvY2FsfS5cclxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIHRvSlNPTn0sIHtAbGluayB0b0lTT30sIHtAbGluayB0b0hUVFB9LCB7QGxpbmsgdG9PYmplY3R9LCB7QGxpbmsgdG9SRkMyODIyfSwge0BsaW5rIHRvU3RyaW5nfSwge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSwge0BsaW5rIHRvRm9ybWF0fSwge0BsaW5rIHRvTWlsbGlzfSBhbmQge0BsaW5rIHRvSlNEYXRlfS5cclxuICpcclxuICogVGhlcmUncyBwbGVudHkgb3RoZXJzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uLCB0aW1lIHpvbmVzLCBhbHRlcm5hdGl2ZSBjYWxlbmRhcnMsIHZhbGlkaXR5LCBhbmQgc28gb24sIHNlZSB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbi5cclxuICovXG5cbnZhciBEYXRlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIERhdGVUaW1lKGNvbmZpZykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERhdGVUaW1lKTtcblxuICAgIHZhciB6b25lID0gY29uZmlnLnpvbmUgfHwgU2V0dGluZ3MuZGVmYXVsdFpvbmUsXG4gICAgICAgIGludmFsaWRSZWFzb24gPSBjb25maWcuaW52YWxpZFJlYXNvbiB8fCAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBJTlZBTElEX0lOUFVUIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyBVTlNVUFBPUlRFRF9aT05FIDogbnVsbCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuICAgIHRoaXMudHMgPSBpc1VuZGVmaW5lZChjb25maWcudHMpID8gU2V0dGluZ3Mubm93KCkgOiBjb25maWcudHM7XG5cbiAgICB2YXIgYyA9IG51bGwsXG4gICAgICAgIG8gPSBudWxsO1xuICAgIGlmICghaW52YWxpZFJlYXNvbikge1xuICAgICAgdmFyIHVuY2hhbmdlZCA9IGNvbmZpZy5vbGQgJiYgY29uZmlnLm9sZC50cyA9PT0gdGhpcy50cyAmJiBjb25maWcub2xkLnpvbmUuZXF1YWxzKHpvbmUpO1xuICAgICAgYyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQuYyA6IHRzVG9PYmoodGhpcy50cywgem9uZS5vZmZzZXQodGhpcy50cykpO1xuICAgICAgbyA9IHVuY2hhbmdlZCA/IGNvbmZpZy5vbGQubyA6IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBpbnZhbGlkUmVhc29uO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5vID0gbztcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0czogU2V0dGluZ3Mubm93KCkgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgaW4gVVRDXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYHV0YygpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIGkuZS4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzKSAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0wMVQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVpcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnV0YyA9IGZ1bmN0aW9uIHV0Yyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KCksXG4gICAgICAgIHpvbmU6IEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWlja0RUKHtcbiAgICAgICAgeWVhcjogeWVhcixcbiAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgaG91cjogaG91cixcbiAgICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmRcbiAgICAgIH0sIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IGlzRGF0ZShkYXRlKSA/IGRhdGUudmFsdWVPZigpIDogTmFOLFxuICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucylcbiAgICB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgLSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCBVVENcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tTWlsbGlzID0gZnVuY3Rpb24gZnJvbU1pbGxpcyhtaWxsaXNlY29uZHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gY3JlYXRlIHRoZSBEYXRlVGltZSBmcm9tXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouZGF5IC0gYSBkYXkgb2YgdGhlIG1vbnRoLCAxLTMxLCBkZXBlbmRpbmcgb24gdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla051bWJlciAtIGFuIElTTyB3ZWVrIG51bWJlciwgYmV0d2VlbiAxIGFuZCA1MiBvciA1MywgZGVwZW5kaW5nIG9uIHRoZSB5ZWFyXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGUgLSBtaW51dGUgb2YgdGhlIGhvdXIsIDAtNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29iai56b25lPSdsb2NhbCddIC0gaW50ZXJwcmV0IHRoZSBudW1iZXJzIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciB6b25lLiBDYW4gdGFrZSBhbnkgdmFsdWUgdGFrZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldFpvbmUoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiB9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTAxLTAxVDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0pIC8vfj4gdG9kYXkgYXQgMTA6MjY6MDZcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ3V0YycgfSksXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdsb2NhbCcgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiwgem9uZTogJ0FtZXJpY2EvTmV3X1lvcmsnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICB2YXIgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvYmouem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH1cblxuICAgIHZhciB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgICBvZmZzZXRQcm92aXMgPSB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZVVuaXQsIHRydWUpLFxuICAgICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yTUQgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5tb250aCkgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSxcbiAgICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9iaik7XG5cbiAgICAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgdmFyIHVuaXRzID0gdm9pZCAwLFxuICAgICAgICBkZWZhdWx0VmFsdWVzID0gdm9pZCAwLFxuICAgICAgICBvYmpOb3cgPSB0c1RvT2JqKHRzTm93LCBvZmZzZXRQcm92aXMpO1xuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gdW5pdHMsIF9pc0FycmF5MiA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMiksIF9pMiA9IDAsIF9pdGVyYXRvcjIgPSBfaXNBcnJheTIgPyBfaXRlcmF0b3IyIDogX2l0ZXJhdG9yMltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkyKSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yMi5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcjJbX2kyKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kyID0gX2l0ZXJhdG9yMi5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYzID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYzO1xuXG4gICAgICB2YXIgdiA9IG5vcm1hbGl6ZWRbdV07XG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlcyB3ZSBoYXZlIGFyZSBpbiByYW5nZVxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkUmVhc29uID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkUmVhc29uKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdGltZVxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pO1xuXG4gICAgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnbWlzbWF0Y2hlZCB3ZWVrZGF5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi1XMDUtNCcpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0KSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUlTT0RhdGUgPSBwYXJzZUlTT0RhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VJU09EYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSVNPRGF0ZVsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgUkZDIDI4MjIgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJ1R1ZSwgMjUgTm92IDIwMTYgMTM6MjM6MTIgKzA2MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21SRkMyODIyID0gZnVuY3Rpb24gZnJvbVJGQzI4MjIodGV4dCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgdmFyIF9wYXJzZUhUVFBEYXRlID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUhUVFBEYXRlWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlSFRUUERhdGVbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSB8fCBpc1VuZGVmaW5lZChmbXQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Zyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzID09PSB1bmRlZmluZWQgPyBudWxsIDogX29wdGlvbnMkbnVtYmVyaW5nU3lzLFxuICAgICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7IGxvY2FsZTogbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSwgZGVmYXVsdFRvRU46IHRydWUgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZFJlYXNvbiA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZFJlYXNvbikge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZFJlYXNvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyh0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBTUUwgZGF0ZSwgdGltZSwgb3IgZGF0ZXRpbWVcclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIrMDY6MDAnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicsIHsgem9uZTogJ0FtZXJpY2EvTG9zX0FuZ2VsZXMnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TUUwgPSBmdW5jdGlvbiBmcm9tU1FMKHRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgX3BhcnNlU1FMID0gcGFyc2VTUUwodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VTUUxbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VTUUxbMV07XG5cbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRpb25zKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbikge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ25lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihyZWFzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHsgaW52YWxpZFJlYXNvbjogcmVhc29uIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBJTkZPXG5cbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA3LCA0KS5nZXQoJ21vbnRoJyk7IC8vPT4gN1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQkJDEodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXHJcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgYnkgYW4gb3BlcmF0aW9uIG9uIGFub3RoZXIgaW52YWxpZCBkYXRlXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSB0aGUgc2FtZSBvcHRpb25zIGFzIHRvTG9jYWxlU3RyaW5nXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuICBEYXRlVGltZS5wcm90b3R5cGUucmVzb2x2ZWRMb2NhbGVPcHRzID0gZnVuY3Rpb24gcmVzb2x2ZWRMb2NhbGVPcHRzKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIHZhciBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMgPSBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5yZXNvbHZlZE9wdGlvbnModGhpcyksXG4gICAgICAgIGxvY2FsZSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX0Zvcm1hdHRlciRjcmVhdGUkcmVzLmNhbGVuZGFyO1xuXG4gICAgcmV0dXJuIHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcjogY2FsZW5kYXIgfTtcbiAgfTtcblxuICAvLyBUUkFOU0ZPUk1cblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gVVRDLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBzZXRab25lfSgndXRjJylcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIG9wdGlvbmFsbHksIGFuIG9mZnNldCBmcm9tIFVUQyBpbiBtaW51dGVzXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvVVRDID0gZnVuY3Rpb24gdG9VVEMoKSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5zZXRab25lKEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZShvZmZzZXQpLCBvcHRzKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gdGhlIGhvc3QncyBsb2NhbCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICpcclxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUobmV3IExvY2FsWm9uZSgpKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lKSB7XG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgX3JlZjQka2VlcExvY2FsVGltZSA9IF9yZWY0LmtlZXBMb2NhbFRpbWUsXG4gICAgICAgIGtlZXBMb2NhbFRpbWUgPSBfcmVmNCRrZWVwTG9jYWxUaW1lID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY0JGtlZXBMb2NhbFRpbWUsXG4gICAgICAgIF9yZWY0JGtlZXBDYWxlbmRhclRpbSA9IF9yZWY0LmtlZXBDYWxlbmRhclRpbWUsXG4gICAgICAgIGtlZXBDYWxlbmRhclRpbWUgPSBfcmVmNCRrZWVwQ2FsZW5kYXJUaW0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjQka2VlcENhbGVuZGFyVGltO1xuXG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFVOU1VQUE9SVEVEX1pPTkUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lOiB6b25lIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5yZWNvbmZpZ3VyZSh7IGxvY2FsZTogJ2VuLUdCJyB9KVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnJlY29uZmlndXJlID0gZnVuY3Rpb24gcmVjb25maWd1cmUoKSB7XG4gICAgdmFyIF9yZWY1ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjUubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNS5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjUub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGU6IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBvdXRwdXRDYWxlbmRhciB9KTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IGxvYzogbG9jIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5zZXRMb2NhbGUoJ2VuLUdCJylcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zZXRMb2NhbGUgPSBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25maWd1cmUoeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0JCQxKHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KHZhbHVlcywgbm9ybWFsaXplVW5pdCksXG4gICAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHwgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSk7XG5cbiAgICB2YXIgbWl4ZWQgPSB2b2lkIDA7XG4gICAgaWYgKHNldHRpbmdXZWVrU3R1ZmYpIHtcbiAgICAgIG1peGVkID0gd2Vla1RvR3JlZ29yaWFuKE9iamVjdC5hc3NpZ24oZ3JlZ29yaWFuVG9XZWVrKHRoaXMuYyksIG5vcm1hbGl6ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0gT2JqZWN0LmFzc2lnbih0aGlzLnRvT2JqZWN0KCksIG5vcm1hbGl6ZWQpO1xuXG4gICAgICAvLyBpZiB3ZSBkaWRuJ3Qgc2V0IHRoZSBkYXkgYnV0IHdlIGVuZGVkIHVwIG9uIGFuIG92ZXJmbG93IGRhdGUsXG4gICAgICAvLyB1c2UgdGhlIGxhc3QgZGF5IG9mIHRoZSByaWdodCBtb250aFxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7IHRzOiB0cywgbzogbyB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBBZGQgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqXHJcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAxIH0pIC8vfj4gdGhpcyB0aW1lIHRvbW9ycm93XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5wbHVzKER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMywgbWludXRlczogMTMgfSkpIC8vfj4gaW4gMSBociwgMTMgbWluXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUucGx1cyA9IGZ1bmN0aW9uIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdW5pdCBvZiB0aW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ21vbnRoJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDEnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdkYXknKS50b0lTT1RpbWUoKTsgLy89PiAnMDA6MDAuMDAwLTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdob3VyJykudG9JU09UaW1lKCk7IC8vPT4gJzA1OjAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5zdGFydE9mID0gZnVuY3Rpb24gc3RhcnRPZih1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBvID0ge30sXG4gICAgICAgIG5vcm1hbGl6ZWRVbml0ID0gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAncXVhcnRlcnMnOlxuICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgby5kYXkgPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09ICd3ZWVrcycpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSAncXVhcnRlcnMnKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAoaS5lLiB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBlbmQgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZigneWVhcicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMTItMzFUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLmVuZE9mKCdob3VyJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QwNTo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZW5kT2YgPSBmdW5jdGlvbiBlbmRPZih1bml0KSB7XG4gICAgdmFyIF9zdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF9zdGFydE9mJHBsdXMgPSB7fSwgX3N0YXJ0T2YkcGx1c1t1bml0XSA9IDEsIF9zdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07XG5cbiAgLy8gT1VUUFVUXG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxyXG4gICAqICoqWW91IG1heSBub3Qgd2FudCB0aGlzLioqIFNlZSB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvciBhIG1vcmUgZmxleGlibGUgZm9ybWF0dGluZyB0b29sLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQgdG9rZW5zIHN1cHBvcnRlZC5cclxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMucm91bmQgLSByb3VuZCBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnNldExvY2FsZSgnZnInKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IGF2ci4gMjInXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0Zvcm1hdChcIkhIICdob3VycyBhbmQnIG1tICdtaW51dGVzJ1wiKSAvLz0+ICcyMCBob3VycyBhbmQgNTUgbWludXRlcydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9Gb3JtYXQgPSBmdW5jdGlvbiB0b0Zvcm1hdChmbXQpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKCksIG9wdHMpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGRhdGUuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyB0aGUgSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBhbmQgYW55IHByZXNldHMgZGVmaW5lZCBieSBMdXhvbiwgc3VjaCBhcyBgRGF0ZVRpbWUuREFURV9GVUxMYCBvciBgRGF0ZVRpbWUuVElNRV9TSU1QTEVgLlxyXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbi5cclxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cclxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV9TSU1QTEUpOyAvLz0+ICcxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe3dlZWtkYXk6ICdsb25nJywgbW9udGg6ICdsb25nJywgZGF5OiAnMi1kaWdpdCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Mb2NhbGVTdHJpbmcoe2hvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCd9KTsgLy89PiAnMTE6MzInXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IERBVEVfU0hPUlQ7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBmb3JtYXQgXCJwYXJ0c1wiLCBpLmUuIGluZGl2aWR1YWwgdG9rZW5zIGFsb25nIHdpdGggbWV0YWRhdGEuIFRoaXMgaXMgYWxsb3dzIGNhbGxlcnMgdG8gcG9zdC1wcm9jZXNzIGluZGl2aWR1YWwgc2VjdGlvbnMgb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdC9mb3JtYXRUb1BhcnRzXHJcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMsIHNhbWUgYXMgYHRvTG9jYWxlU3RyaW5nYC5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gW1xyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0xvY2FsZVBhcnRzID0gZnVuY3Rpb24gdG9Mb2NhbGVQYXJ0cygpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODIsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1J1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKCkge1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArICdUJyArIHRoaXMudG9JU09UaW1lKG9wdHMpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICd5eXl5LU1NLWRkJyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgdGltZSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzU2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIHNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKCkgLy89PiAnMDc6MzQ6MTkuMzYxWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5ob3VyKDcpLm1pbnV0ZSgzNCkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9JU09UaW1lID0gZnVuY3Rpb24gdG9JU09UaW1lKCkge1xuICAgIHZhciBfcmVmNiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9IF9yZWY2LnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IF9yZWY2JHN1cHByZXNzTWlsbGlzZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmNiRzdXBwcmVzc01pbGxpc2UsXG4gICAgICAgIF9yZWY2JHN1cHByZXNzU2Vjb25kcyA9IF9yZWY2LnN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZjYkc3VwcHJlc3NTZWNvbmRzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9yZWY2JHN1cHByZXNzU2Vjb25kcyxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldDtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHsgc3VwcHJlc3NTZWNvbmRzOiBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcywgaW5jbHVkZU9mZnNldDogaW5jbHVkZU9mZnNldCB9KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIFJGQyAyODIyLWNvbXBhdGlibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUsIGFsd2F5cyBpbiBVVENcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvUkZDMjgyMiA9IGZ1bmN0aW9uIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsICdFRUUsIGRkIExMTCB5eXl5IGhoOm1tOnNzIFpaWicpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSBzdHJpbmcgY29uZm9ybXMgdG8gUkZDIDExMjMuXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMywgMTkpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMTk6MDA6MDAgR01UJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS50b0hUVFAgPSBmdW5jdGlvbiB0b0hUVFAoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLnRvVVRDKCksIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJ1wiKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxEYXRlID0gZnVuY3Rpb24gdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgJ3l5eXktTU0tZGQnKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnRvU1FMKCkgLy89PiAnMDU6MTU6MTYuMzQ1J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVab25lOiBmYWxzZSB9KSAvLz0+ICcwNToxNToxNi4zNDUgQW1lcmljYS9OZXdfWW9yaydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TUUxUaW1lID0gZnVuY3Rpb24gdG9TUUxUaW1lKCkge1xuICAgIHZhciBfcmVmNyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICAgIF9yZWY3JGluY2x1ZGVPZmZzZXQgPSBfcmVmNy5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjckaW5jbHVkZU9mZnNldCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWY3JGluY2x1ZGVPZmZzZXQsXG4gICAgICAgIF9yZWY3JGluY2x1ZGVab25lID0gX3JlZjcuaW5jbHVkZVpvbmUsXG4gICAgICAgIGluY2x1ZGVab25lID0gX3JlZjckaW5jbHVkZVpvbmUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjckaW5jbHVkZVpvbmU7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7IGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsIGluY2x1ZGVab25lOiBpbmNsdWRlWm9uZSwgc3BhY2Vab25lOiB0cnVlIH0pO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIEFtZXJpY2EvTmV3X1lvcmsnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvU1FMID0gZnVuY3Rpb24gdG9TUUwoKSB7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgJyAnICsgdGhpcy50b1NRTFRpbWUob3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIFJFUEwuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiAnRGF0ZVRpbWUge1xcbiAgdHM6ICcgKyB0aGlzLnRvSVNPKCkgKyAnLFxcbiAgem9uZTogJyArIHRoaXMuem9uZS5uYW1lICsgJyxcXG4gIGxvY2FsZTogJyArIHRoaXMubG9jYWxlICsgJyB9JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJyArIHRoaXMuaW52YWxpZFJlYXNvbiArICcgfSc7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvTWlsbGlzID0gZnVuY3Rpb24gdG9NaWxsaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU47XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuXG4gICAgdmFyIGJhc2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5vdXRwdXRDYWxlbmRhciA9IHRoaXMub3V0cHV0Q2FsZW5kYXI7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBEYXRlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnRvSlNEYXRlID0gZnVuY3Rpb24gdG9KU0RhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgOiBOYU4pO1xuICB9O1xuXG4gIC8vIENPTVBBUkVcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gRGF0ZVRpbWVzIGFzIGEgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiB2YXIgaTEgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgyLTA1LTI1VDA5OjQ1JyksXHJcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xyXG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxyXG4gICAqIGkyLmRpZmYoaTEsICdob3VycycpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMjE2OC43NSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XHJcbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiBkaWZmKG90aGVyRGF0ZVRpbWUpIHtcbiAgICB2YXIgdW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ21pbGxpc2Vjb25kcyc7XG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyRGF0ZVRpbWUuaXNWYWxpZCkgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uIHx8IG90aGVyRGF0ZVRpbWUuaW52YWxpZFJlYXNvbik7XG5cbiAgICB2YXIgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgICAgb3RoZXJJc0xhdGVyID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCkgPiB0aGlzLnZhbHVlT2YoKSxcbiAgICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgICBkaWZmZWQgPSBfZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3coKSB7XG4gICAgdmFyIHVuaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdtaWxsaXNlY29uZHMnO1xuICAgIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmRpZmYoRGF0ZVRpbWUubG9jYWwoKSwgdW5pdCwgb3B0cyk7XG4gIH07XG5cbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHNwYW5uaW5nIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgYW5vdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUucHJvdG90eXBlLnVudGlsID0gZnVuY3Rpb24gdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5wcm90b3R5cGUuaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVuaXQgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbnB1dE1zID0gb3RoZXJEYXRlVGltZS52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmVuZE9mKHVuaXQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEYXRlVGltZXMgYXJlIGVxdWFsIGlmZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSBtaWxsaXNlY29uZFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkICYmIG90aGVyLmlzVmFsaWQgJiYgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJiB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmIHRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgZGF0ZVRpbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWluKTtcbiAgfTtcblxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcclxuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgRGF0ZVRpbWVzIGZyb20gd2hpY2ggdG8gY2hvb3NlIHRoZSBtYXhpbXVtXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubWF4ID0gZnVuY3Rpb24gbWF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0ZVRpbWVzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTtcblxuICAvLyBNSVNDXG5cbiAgLyoqXHJcbiAgICogRXhwbGFpbiBob3cgYSBzdHJpbmcgd291bGQgYmUgcGFyc2VkIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGFrZW4gYnkgZnJvbUZvcm1hdCgpXHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4gPSBmdW5jdGlvbiBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIF9vcHRpb25zJGxvY2FsZTIgPSBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJGxvY2FsZTIsXG4gICAgICAgIF9vcHRpb25zJG51bWJlcmluZ1N5czIgPSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX29wdGlvbnMkbnVtYmVyaW5nU3lzMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5czIsXG4gICAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHsgbG9jYWxlOiBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLCBkZWZhdWx0VG9FTjogdHJ1ZSB9KTtcblxuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfTtcblxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxyXG4gICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xyXG4gICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6ICdpc1ZhbGlkJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpbnZhbGlkUmVhc29uJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdsb2NhbGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLmxvY2FsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbnVtYmVyaW5nU3lzdGVtJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvdXRwdXQgY2FsZW5kYXIgb2YgYSBEYXRlVGltZSwgc3VjaCAnaXNsYW1pYycuIFRoZSBvdXRwdXQgY2FsZW5kYXIgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvdXRwdXRDYWxlbmRhcicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3pvbmVOYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHllYXJcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd5ZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMueWVhciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnF1YXJ0ZXIgLy89PiAyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3F1YXJ0ZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IE1hdGguY2VpbCh0aGlzLmMubW9udGggLyAzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGgnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuZGF5IC8vPT4gMjVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZGF5JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBob3VyIG9mIHRoZSBkYXkgKDAtMjMpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2hvdXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaW51dGUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIpLnNlY29uZCAvLz0+IDUyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCAoMC05OTkpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtaWxsaXNlY29uZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIHllYXJcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrWWVhciAvLz0+IDIwMTVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla1llYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWsgbnVtYmVyIG9mIHRoZSB3ZWVrIHllYXIgKDEtNTJpc2gpLlxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtOdW1iZXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxyXG4gICAgICogMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBvcmRpbmFsIChpLmUuIHRoZSBkYXkgb2YgdGhlIHllYXIpXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkub3JkaW5hbCAvLz0+IDE0NVxyXG4gICAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvcmRpbmFsJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCBtb250aCBuYW1lLCBzdWNoIGFzICdPY3QnLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbW9udGhTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0b2JlcicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtb250aExvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKCdsb25nJywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IHdlZWtkYXksIHN1Y2ggYXMgJ01vbicuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3dlZWtkYXlTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIHdlZWtkYXksIHN1Y2ggYXMgJ01vbmRheScuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla2RheUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoJ2xvbmcnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IG9mIHRoaXMgRGF0ZVRpbWUgaW4gbWludXRlc1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5vZmZzZXQgLy89PiAtMjQwXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5vZmZzZXQgLy89PiAwXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ29mZnNldE5hbWVTaG9ydCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiAnc2hvcnQnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnb2Zmc2V0TmFtZUxvbmcnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICAgIGZvcm1hdDogJ2xvbmcnLFxuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnaXNPZmZzZXRGaXhlZCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLnVuaXZlcnNhbCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luRFNUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIGlmICh0aGlzLmlzT2Zmc2V0Rml4ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogMSB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiA1IH0pLm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc0luTGVhcFllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdkYXlzSW5Nb250aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2RheXNJblllYXInLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IGRheXNJblllYXIodGhpcy55ZWFyKSA6IE5hTjtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnd2Vla3NJbldlZWtZZWFyJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB3ZWVrc0luV2Vla1llYXIodGhpcy53ZWVrWWVhcikgOiBOYU47XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdEQVRFX1NIT1JUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX01FRCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9NRUQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFX0ZVTEwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVfSFVHRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURV9IVUdFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9TSU1QTEUnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfU0lNUExFO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ1RJTUVfV0lUSF9TSE9SVF9PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV9XSVRIX0xPTkdfT0ZGU0VUJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1NJTVBMRScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9TSU1QTEU7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfU0hPUlQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRUQnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX01FRDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICAgIH1cblxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnREFURVRJTUVfRlVMTCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTDtcbiAgICB9XG5cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUycsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuXG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ0RBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIERhdGVUaW1lO1xufSgpO1xuZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBEYXRlVGltZSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50Jyk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiZnVuY3Rpb24gQWdlbnQoKSB7XG4gIHRoaXMuX2RlZmF1bHRzID0gW107XG59XG5cbltcInVzZVwiLCBcIm9uXCIsIFwib25jZVwiLCBcInNldFwiLCBcInF1ZXJ5XCIsIFwidHlwZVwiLCBcImFjY2VwdFwiLCBcImF1dGhcIiwgXCJ3aXRoQ3JlZGVudGlhbHNcIiwgXCJzb3J0UXVlcnlcIiwgXCJyZXRyeVwiLCBcIm9rXCIsIFwicmVkaXJlY3RzXCIsXG4gXCJ0aW1lb3V0XCIsIFwiYnVmZmVyXCIsIFwic2VyaWFsaXplXCIsIFwicGFyc2VcIiwgXCJjYVwiLCBcImtleVwiLCBcInBmeFwiLCBcImNlcnRcIl0uZm9yRWFjaChmdW5jdGlvbihmbikge1xuICAvKiogRGVmYXVsdCBzZXR0aW5nIGZvciBhbGwgcmVxdWVzdHMgZnJvbSB0aGlzIGFnZW50ICovXG4gIEFnZW50LnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbigvKnZhcmFyZ3MqLykge1xuICAgIHRoaXMuX2RlZmF1bHRzLnB1c2goe2ZuOmZuLCBhcmd1bWVudHM6YXJndW1lbnRzfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn0pO1xuXG5BZ2VudC5wcm90b3R5cGUuX3NldERlZmF1bHRzID0gZnVuY3Rpb24ocmVxKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcbiAgICAgIHJlcVtkZWYuZm5dLmFwcGx5KHJlcSwgZGVmLmFyZ3VtZW50cyk7XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZW50O1xuIiwiLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG52YXIgcm9vdDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgeyAvLyBCcm93c2VyIHdpbmRvd1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gV2ViIFdvcmtlclxuICByb290ID0gc2VsZjtcbn0gZWxzZSB7IC8vIE90aGVyIGVudmlyb25tZW50c1xuICBjb25zb2xlLndhcm4oXCJVc2luZyBicm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGluIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuICByb290ID0gdGhpcztcbn1cblxudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCdjb21wb25lbnQtZW1pdHRlcicpO1xudmFyIFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi9yZXF1ZXN0LWJhc2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG52YXIgUmVzcG9uc2VCYXNlID0gcmVxdWlyZSgnLi9yZXNwb25zZS1iYXNlJyk7XG52YXIgQWdlbnQgPSByZXF1aXJlKCcuL2FnZW50LWJhc2UnKTtcblxuLyoqXG4gKiBOb29wLlxuICovXG5cbmZ1bmN0aW9uIG5vb3AoKXt9O1xuXG4vKipcbiAqIEV4cG9zZSBgcmVxdWVzdGAuXG4gKi9cblxudmFyIHJlcXVlc3QgPSBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIERldGVybWluZSBYSFIuXG4gKi9cblxucmVxdWVzdC5nZXRYSFIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChyb290LlhNTEh0dHBSZXF1ZXN0XG4gICAgICAmJiAoIXJvb3QubG9jYXRpb24gfHwgJ2ZpbGU6JyAhPSByb290LmxvY2F0aW9uLnByb3RvY29sXG4gICAgICAgICAgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICB9IGVsc2Uge1xuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gIH1cbiAgdGhyb3cgRXJyb3IoXCJCcm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGNvdWxkIG5vdCBmaW5kIFhIUlwiKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhZGRlZCB0byBzdXBwb3J0IElFLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgdHJpbSA9ICcnLnRyaW1cbiAgPyBmdW5jdGlvbihzKSB7IHJldHVybiBzLnRyaW0oKTsgfVxuICA6IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLCAnJyk7IH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBnaXZlbiBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUob2JqKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgdmFyIHBhaXJzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCBvYmpba2V5XSk7XG4gIH1cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBIZWxwcyAnc2VyaWFsaXplJyB3aXRoIHNlcmlhbGl6aW5nIGFycmF5cy5cbiAqIE11dGF0ZXMgdGhlIHBhaXJzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqL1xuXG5mdW5jdGlvbiBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2YWwpIHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgZm9yKHZhciBzdWJrZXkgaW4gdmFsKSB7XG4gICAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXkgKyAnWycgKyBzdWJrZXkgKyAnXScsIHZhbFtzdWJrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgICAgICArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemVPYmplY3QgPSBzZXJpYWxpemU7XG5cbi8qKlxuICAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuXG4gICpcbiAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICogQHJldHVybiB7T2JqZWN0fVxuICAqIEBhcGkgcHJpdmF0ZVxuICAqL1xuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICB2YXIgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTtcbiAgdmFyIHBhaXI7XG4gIHZhciBwb3M7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhaXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT0gLTEpIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpcildID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZSgwLCBwb3MpKV0gPVxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZShwb3MgKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ3RleHQveG1sJyxcbiAgdXJsZW5jb2RlZDogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICdmb3JtLWRhdGEnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuLyoqXG4gKiBEZWZhdWx0IHNlcmlhbGl6YXRpb24gbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihvYmope1xuICogICAgICAgcmV0dXJuICdnZW5lcmF0ZWQgeG1sIGhlcmUnO1xuICogICAgIH07XG4gKlxuICovXG5cbnJlcXVlc3Quc2VyaWFsaXplID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAnYXBwbGljYXRpb24vanNvbic6IEpTT04uc3RyaW5naWZ5XG59O1xuXG4vKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbGluZSA9IGxpbmVzW2ldO1xuICAgIGluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgeyAvLyBjb3VsZCBiZSBlbXB0eSBsaW5lLCBqdXN0IHNraXAgaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICAvLyBzaG91bGQgbWF0Y2ggL2pzb24gb3IgK2pzb25cbiAgLy8gYnV0IG5vdCAvanNvbi1zZXFcbiAgcmV0dXJuIC9bXFwvK11qc29uKCR8W14tXFx3XSkvLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSkge1xuICB0aGlzLnJlcSA9IHJlcTtcbiAgdGhpcy54aHIgPSB0aGlzLnJlcS54aHI7XG4gIC8vIHJlc3BvbnNlVGV4dCBpcyBhY2Nlc3NpYmxlIG9ubHkgaWYgcmVzcG9uc2VUeXBlIGlzICcnIG9yICd0ZXh0JyBhbmQgb24gb2xkZXIgYnJvd3NlcnNcbiAgdGhpcy50ZXh0ID0gKCh0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgJiYgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fCB0eXBlb2YgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgPyB0aGlzLnhoci5yZXNwb25zZVRleHRcbiAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgdmFyIHN0YXR1cyA9IHRoaXMueGhyLnN0YXR1cztcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG4gIHRoaXMuX3NldFN0YXR1c1Byb3BlcnRpZXMoc3RhdHVzKTtcbiAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIC8vIGdldEFsbFJlc3BvbnNlSGVhZGVycyBzb21ldGltZXMgZmFsc2VseSByZXR1cm5zIFwiXCIgZm9yIENPUlMgcmVxdWVzdHMsIGJ1dFxuICAvLyBnZXRSZXNwb25zZUhlYWRlciBzdGlsbCB3b3Jrcy4gc28gd2UgZ2V0IGNvbnRlbnQtdHlwZSBldmVuIGlmIGdldHRpbmdcbiAgLy8gb3RoZXIgaGVhZGVycyBmYWlscy5cbiAgdGhpcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpO1xuICB0aGlzLl9zZXRIZWFkZXJQcm9wZXJ0aWVzKHRoaXMuaGVhZGVyKTtcblxuICBpZiAobnVsbCA9PT0gdGhpcy50ZXh0ICYmIHJlcS5fcmVzcG9uc2VUeXBlKSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy54aHIucmVzcG9uc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy5yZXEubWV0aG9kICE9ICdIRUFEJ1xuICAgICAgPyB0aGlzLl9wYXJzZUJvZHkodGhpcy50ZXh0ID8gdGhpcy50ZXh0IDogdGhpcy54aHIucmVzcG9uc2UpXG4gICAgICA6IG51bGw7XG4gIH1cbn1cblxuUmVzcG9uc2VCYXNlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuX3BhcnNlQm9keSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgcGFyc2UgPSByZXF1ZXN0LnBhcnNlW3RoaXMudHlwZV07XG4gIGlmICh0aGlzLnJlcS5fcGFyc2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxLl9wYXJzZXIodGhpcywgc3RyKTtcbiAgfVxuICBpZiAoIXBhcnNlICYmIGlzSlNPTih0aGlzLnR5cGUpKSB7XG4gICAgcGFyc2UgPSByZXF1ZXN0LnBhcnNlWydhcHBsaWNhdGlvbi9qc29uJ107XG4gIH1cbiAgcmV0dXJuIHBhcnNlICYmIHN0ciAmJiAoc3RyLmxlbmd0aCB8fCBzdHIgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgPyBwYXJzZShzdHIpXG4gICAgOiBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYEVycm9yYCByZXByZXNlbnRhdGl2ZSBvZiB0aGlzIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm4ge0Vycm9yfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUudG9FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gIHZhciB1cmwgPSByZXEudXJsO1xuXG4gIHZhciBtc2cgPSAnY2Fubm90ICcgKyBtZXRob2QgKyAnICcgKyB1cmwgKyAnICgnICsgdGhpcy5zdGF0dXMgKyAnKSc7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gbWV0aG9kO1xuICBlcnIudXJsID0gdXJsO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VgLlxuICovXG5cbnJlcXVlc3QuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG1ldGhvZCwgdXJsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fcXVlcnkgPSB0aGlzLl9xdWVyeSB8fCBbXTtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICB0aGlzLmhlYWRlciA9IHt9OyAvLyBwcmVzZXJ2ZXMgaGVhZGVyIG5hbWUgY2FzZVxuICB0aGlzLl9oZWFkZXIgPSB7fTsgLy8gY29lcmNlcyBoZWFkZXIgbmFtZXMgdG8gbG93ZXJjYXNlXG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgZXJyID0gbmV3IEVycm9yKCdQYXJzZXIgaXMgdW5hYmxlIHRvIHBhcnNlIHRoZSByZXNwb25zZScpO1xuICAgICAgZXJyLnBhcnNlID0gdHJ1ZTtcbiAgICAgIGVyci5vcmlnaW5hbCA9IGU7XG4gICAgICAvLyBpc3N1ZSAjNjc1OiByZXR1cm4gdGhlIHJhdyByZXNwb25zZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgaWYgKHNlbGYueGhyKSB7XG4gICAgICAgIC8vIGllOSBkb2Vzbid0IGhhdmUgJ3Jlc3BvbnNlJyBwcm9wZXJ0eVxuICAgICAgICBlcnIucmF3UmVzcG9uc2UgPSB0eXBlb2Ygc2VsZi54aHIucmVzcG9uc2VUeXBlID09ICd1bmRlZmluZWQnID8gc2VsZi54aHIucmVzcG9uc2VUZXh0IDogc2VsZi54aHIucmVzcG9uc2U7XG4gICAgICAgIC8vIGlzc3VlICM4NzY6IHJldHVybiB0aGUgaHR0cCBzdGF0dXMgY29kZSBpZiB0aGUgcmVzcG9uc2UgcGFyc2luZyBmYWlsc1xuICAgICAgICBlcnIuc3RhdHVzID0gc2VsZi54aHIuc3RhdHVzID8gc2VsZi54aHIuc3RhdHVzIDogbnVsbDtcbiAgICAgICAgZXJyLnN0YXR1c0NvZGUgPSBlcnIuc3RhdHVzOyAvLyBiYWNrd2FyZHMtY29tcGF0IG9ubHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyci5yYXdSZXNwb25zZSA9IG51bGw7XG4gICAgICAgIGVyci5zdGF0dXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgncmVzcG9uc2UnLCByZXMpO1xuXG4gICAgdmFyIG5ld19lcnI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghc2VsZi5faXNSZXNwb25zZU9LKHJlcykpIHtcbiAgICAgICAgbmV3X2VyciA9IG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCB8fCAnVW5zdWNjZXNzZnVsIEhUVFAgcmVzcG9uc2UnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGN1c3RvbV9lcnIpIHtcbiAgICAgIG5ld19lcnIgPSBjdXN0b21fZXJyOyAvLyBvaygpIGNhbGxiYWNrIGNhbiB0aHJvd1xuICAgIH1cblxuICAgIC8vICMxMDAwIGRvbid0IGNhdGNoIGVycm9ycyBmcm9tIHRoZSBjYWxsYmFjayB0byBhdm9pZCBkb3VibGUgY2FsbGluZyBpdFxuICAgIGlmIChuZXdfZXJyKSB7XG4gICAgICBuZXdfZXJyLm9yaWdpbmFsID0gZXJyO1xuICAgICAgbmV3X2Vyci5yZXNwb25zZSA9IHJlcztcbiAgICAgIG5ld19lcnIuc3RhdHVzID0gcmVzLnN0YXR1cztcbiAgICAgIHNlbGYuY2FsbGJhY2sobmV3X2VyciwgcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5jYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWl4aW4gYEVtaXR0ZXJgIGFuZCBgUmVxdWVzdEJhc2VgLlxuICovXG5cbkVtaXR0ZXIoUmVxdWVzdC5wcm90b3R5cGUpO1xuUmVxdWVzdEJhc2UoUmVxdWVzdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbcGFzc10gb3B0aW9uYWwgaW4gY2FzZSBvZiB1c2luZyAnYmVhcmVyJyBhcyB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB3aXRoICd0eXBlJyBwcm9wZXJ0eSAnYXV0bycsICdiYXNpYycgb3IgJ2JlYXJlcicgKGRlZmF1bHQgJ2Jhc2ljJylcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdXRoID0gZnVuY3Rpb24odXNlciwgcGFzcywgb3B0aW9ucyl7XG4gIGlmICgxID09PSBhcmd1bWVudHMubGVuZ3RoKSBwYXNzID0gJyc7XG4gIGlmICh0eXBlb2YgcGFzcyA9PT0gJ29iamVjdCcgJiYgcGFzcyAhPT0gbnVsbCkgeyAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYnRvYSA/ICdiYXNpYycgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIHZhciBlbmNvZGVyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBidG9hKSB7XG4gICAgICByZXR1cm4gYnRvYShzdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYmFzaWMgYXV0aCwgYnRvYSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9O1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4gKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiAqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uKHZhbCl7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdmFsKSB2YWwgPSBzZXJpYWxpemUodmFsKTtcbiAgaWYgKHZhbCkgdGhpcy5fcXVlcnkucHVzaCh2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYG9wdGlvbnNgIChvciBmaWxlbmFtZSkuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuYXR0YWNoKCdjb250ZW50JywgbmV3IEJsb2IoWyc8YSBpZD1cImFcIj48YiBpZD1cImJcIj5oZXkhPC9iPjwvYT4nXSwgeyB0eXBlOiBcInRleHQvaHRtbFwifSkpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge0Jsb2J8RmlsZX0gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oZmllbGQsIGZpbGUsIG9wdGlvbnMpe1xuICBpZiAoZmlsZSkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICB0aHJvdyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgb3B0aW9ucyB8fCBmaWxlLm5hbWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhID0gZnVuY3Rpb24oKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZm9ybURhdGE7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24oZXJyLCByZXMpe1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICB2YXIgZm4gPSB0aGlzLl9jYWxsYmFjaztcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcblxuICBpZiAoZXJyKSB7XG4gICAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVyci5yZXRyaWVzID0gdGhpcy5fcmV0cmllcyAtIDE7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBmbihlcnIsIHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcXG5Qb3NzaWJsZSBjYXVzZXM6IHRoZSBuZXR3b3JrIGlzIG9mZmxpbmUsIE9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4sIHRoZSBwYWdlIGlzIGJlaW5nIHVubG9hZGVkLCBldGMuJyk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG5cbiAgZXJyLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICBlcnIubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIGVyci51cmwgPSB0aGlzLnVybDtcblxuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vLyBUaGlzIG9ubHkgd2FybnMsIGJlY2F1c2UgdGhlIHJlcXVlc3QgaXMgc3RpbGwgbGlrZWx5IHRvIHdvcmtcblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IFJlcXVlc3QucHJvdG90eXBlLmNhID0gUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbigpe1xuICBjb25zb2xlLndhcm4oXCJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gVGhpcyB0aHJvd3MsIGJlY2F1c2UgaXQgY2FuJ3Qgc2VuZC9yZWNlaXZlIGRhdGEgYXMgZXhwZWN0ZWRcblJlcXVlc3QucHJvdG90eXBlLnBpcGUgPSBSZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKCl7XG4gIHRocm93IEVycm9yKFwiU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIik7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgaG9zdCBvYmplY3QsXG4gKiB3ZSBkb24ndCB3YW50IHRvIHNlcmlhbGl6ZSB0aGVzZSA6KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2lzSG9zdCA9IGZ1bmN0aW9uIF9pc0hvc3Qob2JqKSB7XG4gIC8vIE5hdGl2ZSBvYmplY3RzIHN0cmluZ2lmeSB0byBbb2JqZWN0IEZpbGVdLCBbb2JqZWN0IEJsb2JdLCBbb2JqZWN0IEZvcm1EYXRhXSwgZXRjLlxuICByZXR1cm4gb2JqICYmICdvYmplY3QnID09PSB0eXBlb2Ygb2JqICYmICFBcnJheS5pc0FycmF5KG9iaikgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbil7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiAuZW5kKCkgd2FzIGNhbGxlZCB0d2ljZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIHN1cGVyYWdlbnRcIik7XG4gIH1cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuXG4gIHJldHVybiB0aGlzLl9lbmQoKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgeGhyID0gKHRoaXMueGhyID0gcmVxdWVzdC5nZXRYSFIoKSk7XG4gIHZhciBkYXRhID0gdGhpcy5fZm9ybURhdGEgfHwgdGhpcy5fZGF0YTtcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHhoci5yZWFkeVN0YXRlO1xuICAgIGlmIChyZWFkeVN0YXRlID49IDIgJiYgc2VsZi5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gICAgfVxuICAgIGlmICg0ICE9IHJlYWR5U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBJRTksIHJlYWRzIHRvIGFueSBwcm9wZXJ0eSAoZS5nLiBzdGF0dXMpIG9mZiBvZiBhbiBhYm9ydGVkIFhIUiB3aWxsXG4gICAgLy8gcmVzdWx0IGluIHRoZSBlcnJvciBcIkNvdWxkIG5vdCBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIGR1ZSB0byBlcnJvciBjMDBjMDIzZlwiXG4gICAgdmFyIHN0YXR1cztcbiAgICB0cnkgeyBzdGF0dXMgPSB4aHIuc3RhdHVzIH0gY2F0Y2goZSkgeyBzdGF0dXMgPSAwOyB9XG5cbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgaWYgKHNlbGYudGltZWRvdXQgfHwgc2VsZi5fYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgcmV0dXJuIHNlbGYuY3Jvc3NEb21haW5FcnJvcigpO1xuICAgIH1cbiAgICBzZWxmLmVtaXQoJ2VuZCcpO1xuICB9O1xuXG4gIC8vIHByb2dyZXNzXG4gIHZhciBoYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZSkge1xuICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgIH1cbiAgICBlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzZWxmLmVtaXQoJ3Byb2dyZXNzJywgZSk7XG4gIH07XG4gIGlmICh0aGlzLmhhc0xpc3RlbmVycygncHJvZ3Jlc3MnKSkge1xuICAgIHRyeSB7XG4gICAgICB4aHIub25wcm9ncmVzcyA9IGhhbmRsZVByb2dyZXNzLmJpbmQobnVsbCwgJ2Rvd25sb2FkJyk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICd1cGxvYWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIC8vIEFjY2Vzc2luZyB4aHIudXBsb2FkIGZhaWxzIGluIElFIGZyb20gYSB3ZWIgd29ya2VyLCBzbyBqdXN0IHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgIC8vIFJlcG9ydGVkIGhlcmU6XG4gICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgzNzI0NS94bWxodHRwcmVxdWVzdC11cGxvYWQtdGhyb3dzLWludmFsaWQtYXJndW1lbnQtd2hlbi11c2VkLWZyb20td2ViLXdvcmtlci1jb250ZXh0XG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICB0cnkge1xuICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSwgdGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdHJ1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBzZWUgIzExNDlcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gQ09SU1xuICBpZiAodGhpcy5fd2l0aENyZWRlbnRpYWxzKSB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAvLyBib2R5XG4gIGlmICghdGhpcy5fZm9ybURhdGEgJiYgJ0dFVCcgIT0gdGhpcy5tZXRob2QgJiYgJ0hFQUQnICE9IHRoaXMubWV0aG9kICYmICdzdHJpbmcnICE9IHR5cGVvZiBkYXRhICYmICF0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICAvLyBzZXJpYWxpemUgc3R1ZmZcbiAgICB2YXIgY29udGVudFR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIHZhciBzZXJpYWxpemUgPSB0aGlzLl9zZXJpYWxpemVyIHx8IHJlcXVlc3Quc2VyaWFsaXplW2NvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXSA6ICcnXTtcbiAgICBpZiAoIXNlcmlhbGl6ZSAmJiBpc0pTT04oY29udGVudFR5cGUpKSB7XG4gICAgICBzZXJpYWxpemUgPSByZXF1ZXN0LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGhlYWRlciBmaWVsZHNcbiAgZm9yICh2YXIgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAobnVsbCA9PSB0aGlzLmhlYWRlcltmaWVsZF0pIGNvbnRpbnVlO1xuXG4gICAgaWYgKHRoaXMuaGVhZGVyLmhhc093blByb3BlcnR5KGZpZWxkKSlcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgOiBudWxsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5yZXF1ZXN0LmFnZW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgQWdlbnQoKTtcbn07XG5cbltcIkdFVFwiLCBcIlBPU1RcIiwgXCJPUFRJT05TXCIsIFwiUEFUQ0hcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgQWdlbnQucHJvdG90eXBlW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IGZ1bmN0aW9uKHVybCwgZm4pIHtcbiAgICB2YXIgcmVxID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdHMocmVxKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcS5lbmQoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9O1xufSk7XG5cbkFnZW50LnByb3RvdHlwZS5kZWwgPSBBZ2VudC5wcm90b3R5cGVbJ2RlbGV0ZSddO1xuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuZ2V0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5oZWFkID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5xdWVyeShkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogT1BUSU9OUyBxdWVyeSB0byBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3Qub3B0aW9ucyA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ09QVElPTlMnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogREVMRVRFIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWwodXJsLCBkYXRhLCBmbikge1xuICB2YXIgcmVxID0gcmVxdWVzdCgnREVMRVRFJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59XG5cbnJlcXVlc3RbJ2RlbCddID0gZGVsO1xucmVxdWVzdFsnZGVsZXRlJ10gPSBkZWw7XG5cbi8qKlxuICogUEFUQ0ggYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucGF0Y2ggPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSAoZm4gPSBkYXRhKSwgKGRhdGEgPSBudWxsKTtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQT1NUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIChmbiA9IGRhdGEpLCAoZGF0YSA9IG51bGwpO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBVVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQVVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgKGZuID0gZGF0YSksIChkYXRhID0gbnVsbCk7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIG51bGwgIT09IG9iaiAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgb2YgbWl4ZWQtaW4gZnVuY3Rpb25zIHNoYXJlZCBiZXR3ZWVuIG5vZGUgYW5kIGNsaWVudCBjb2RlXG4gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0QmFzZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0QmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0QmFzZWAuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0QmFzZShvYmopIHtcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XG59XG5cbi8qKlxuICogTWl4aW4gdGhlIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gUmVxdWVzdEJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBfY2xlYXJUaW1lb3V0KCl7XG4gIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gIGRlbGV0ZSB0aGlzLl90aW1lcjtcbiAgZGVsZXRlIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXNwb25zZSBib2R5IHBhcnNlclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBpbmNvbWluZyBkYXRhIGludG8gcmVxdWVzdC5ib2R5XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UoZm4pe1xuICB0aGlzLl9wYXJzZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBmb3JtYXQgb2YgYmluYXJ5IHJlc3BvbnNlIGJvZHkuXG4gKiBJbiBicm93c2VyIHZhbGlkIGZvcm1hdHMgYXJlICdibG9iJyBhbmQgJ2FycmF5YnVmZmVyJyxcbiAqIHdoaWNoIHJldHVybiBCbG9iIGFuZCBBcnJheUJ1ZmZlciwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIE5vZGUgYWxsIHZhbHVlcyByZXN1bHQgaW4gQnVmZmVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnJlc3BvbnNlVHlwZSgnYmxvYicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbih2YWwpe1xuICB0aGlzLl9yZXNwb25zZVR5cGUgPSB2YWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlcXVlc3QgYm9keSBzZXJpYWxpemVyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGRhdGEgc2V0IHZpYSAuc2VuZCBvciAuYXR0YWNoIGludG8gcGF5bG9hZCB0byBzZW5kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZShmbil7XG4gIHRoaXMuX3NlcmlhbGl6ZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aW1lb3V0cy5cbiAqXG4gKiAtIHJlc3BvbnNlIHRpbWVvdXQgaXMgdGltZSBiZXR3ZWVuIHNlbmRpbmcgcmVxdWVzdCBhbmQgcmVjZWl2aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS4gSW5jbHVkZXMgRE5TIGFuZCBjb25uZWN0aW9uIHRpbWUuXG4gKiAtIGRlYWRsaW5lIGlzIHRoZSB0aW1lIGZyb20gc3RhcnQgb2YgdGhlIHJlcXVlc3QgdG8gcmVjZWl2aW5nIHJlc3BvbnNlIGJvZHkgaW4gZnVsbC4gSWYgdGhlIGRlYWRsaW5lIGlzIHRvbyBzaG9ydCBsYXJnZSBmaWxlcyBtYXkgbm90IGxvYWQgYXQgYWxsIG9uIHNsb3cgY29ubmVjdGlvbnMuXG4gKlxuICogVmFsdWUgb2YgMCBvciBmYWxzZSBtZWFucyBubyB0aW1lb3V0LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gbXMgb3Ige3Jlc3BvbnNlLCBkZWFkbGluZX1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIHRpbWVvdXQob3B0aW9ucyl7XG4gIGlmICghb3B0aW9ucyB8fCAnb2JqZWN0JyAhPT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucztcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIHN3aXRjaChvcHRpb24pIHtcbiAgICAgIGNhc2UgJ2RlYWRsaW5lJzpcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG9wdGlvbnMuZGVhZGxpbmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSBvcHRpb25zLnJlc3BvbnNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUud2FybihcIlVua25vd24gdGltZW91dCBvcHRpb25cIiwgb3B0aW9uKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgb24gZXJyb3IuXG4gKlxuICogRmFpbGVkIHJlcXVlc3RzIHdpbGwgYmUgcmV0cmllZCAnY291bnQnIHRpbWVzIGlmIHRpbWVvdXQgb3IgZXJyLmNvZGUgPj0gNTAwLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uIHJldHJ5KGNvdW50LCBmbil7XG4gIC8vIERlZmF1bHQgdG8gMSBpZiBubyBjb3VudCBwYXNzZWQgb3IgdHJ1ZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBjb3VudCA9PT0gdHJ1ZSkgY291bnQgPSAxO1xuICBpZiAoY291bnQgPD0gMCkgY291bnQgPSAwO1xuICB0aGlzLl9tYXhSZXRyaWVzID0gY291bnQ7XG4gIHRoaXMuX3JldHJpZXMgPSAwO1xuICB0aGlzLl9yZXRyeUNhbGxiYWNrID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIEVSUk9SX0NPREVTID0gW1xuICAnRUNPTk5SRVNFVCcsXG4gICdFVElNRURPVVQnLFxuICAnRUFERFJJTkZPJyxcbiAgJ0VTT0NLRVRUSU1FRE9VVCdcbl07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZC5cbiAqIChCb3Jyb3dlZCBmcm9tIHNlZ21lbnRpby9zdXBlcmFnZW50LXJldHJ5KVxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gW3Jlc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3Nob3VsZFJldHJ5ID0gZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgaWYgKCF0aGlzLl9tYXhSZXRyaWVzIHx8IHRoaXMuX3JldHJpZXMrKyA+PSB0aGlzLl9tYXhSZXRyaWVzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLl9yZXRyeUNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBvdmVycmlkZSA9IHRoaXMuX3JldHJ5Q2FsbGJhY2soZXJyLCByZXMpO1xuICAgICAgaWYgKG92ZXJyaWRlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChvdmVycmlkZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIHVuZGVmaW5lZCBmYWxscyBiYWNrIHRvIGRlZmF1bHRzXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuICBpZiAocmVzICYmIHJlcy5zdGF0dXMgJiYgcmVzLnN0YXR1cyA+PSA1MDAgJiYgcmVzLnN0YXR1cyAhPSA1MDEpIHJldHVybiB0cnVlO1xuICBpZiAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICYmIH5FUlJPUl9DT0RFUy5pbmRleE9mKGVyci5jb2RlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gU3VwZXJhZ2VudCB0aW1lb3V0XG4gICAgaWYgKGVyci50aW1lb3V0ICYmIGVyci5jb2RlID09ICdFQ09OTkFCT1JURUQnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXJyLmNyb3NzRG9tYWluKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHJ5IHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fcmV0cnkgPSBmdW5jdGlvbigpIHtcblxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIC8vIG5vZGVcbiAgaWYgKHRoaXMucmVxKSB7XG4gICAgdGhpcy5yZXEgPSBudWxsO1xuICAgIHRoaXMucmVxID0gdGhpcy5yZXF1ZXN0KCk7XG4gIH1cblxuICB0aGlzLl9hYm9ydGVkID0gZmFsc2U7XG4gIHRoaXMudGltZWRvdXQgPSBmYWxzZTtcblxuICByZXR1cm4gdGhpcy5fZW5kKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2Ugc3VwcG9ydFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZWplY3RdXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgaWYgKCF0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBzdXBlcmFnZW50IHJlcXVlc3Qgd2FzIHNlbnQgdHdpY2UsIGJlY2F1c2UgYm90aCAuZW5kKCkgYW5kIC50aGVuKCkgd2VyZSBjYWxsZWQuIE5ldmVyIGNhbGwgLmVuZCgpIGlmIHlvdSB1c2UgcHJvbWlzZXNcIik7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oaW5uZXJSZXNvbHZlLCBpbm5lclJlamVjdCkge1xuICAgICAgc2VsZi5lbmQoZnVuY3Rpb24oZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikgaW5uZXJSZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSBpbm5lclJlc29sdmUocmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGVbJ2NhdGNoJ10gPSBmdW5jdGlvbihjYikge1xuICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgY2IpO1xufTtcblxuLyoqXG4gKiBBbGxvdyBmb3IgZXh0ZW5zaW9uXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICBmbih0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUub2sgPSBmdW5jdGlvbihjYikge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGNiKSB0aHJvdyBFcnJvcihcIkNhbGxiYWNrIHJlcXVpcmVkXCIpO1xuICB0aGlzLl9va0NhbGxiYWNrID0gY2I7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9pc1Jlc3BvbnNlT0sgPSBmdW5jdGlvbihyZXMpIHtcbiAgaWYgKCFyZXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fb2tDYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLl9va0NhbGxiYWNrKHJlcyk7XG4gIH1cblxuICByZXR1cm4gcmVzLnN0YXR1cyA+PSAyMDAgJiYgcmVzLnN0YXR1cyA8IDMwMDtcbn07XG5cbi8qKlxuICogR2V0IHJlcXVlc3QgaGVhZGVyIGBmaWVsZGAuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICByZXR1cm4gdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBoZWFkZXIgYGZpZWxkYCB2YWx1ZS5cbiAqIFRoaXMgaXMgYSBkZXByZWNhdGVkIGludGVybmFsIEFQSS4gVXNlIGAuZ2V0KGZpZWxkKWAgaW5zdGVhZC5cbiAqXG4gKiAoZ2V0SGVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN1cGVyYWdlbnQgY29kZSBiYXNlKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXRIZWFkZXIgPSBSZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNldCgnWC1BUEktS2V5JywgJ2Zvb2JhcicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdYLUFQSS1LZXknOiAnZm9vYmFyJyB9KVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnVuc2V0KCdVc2VyLUFnZW50JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xuICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGUgdGhlIGZpZWxkIGBuYW1lYCBhbmQgYHZhbGAsIG9yIG11bHRpcGxlIGZpZWxkcyB3aXRoIG9uZSBvYmplY3RcbiAqIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiByZXF1ZXN0IGJvZGllcy5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCgnZm9vJywgJ2JhcicpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5maWVsZCh7IGZvbzogJ2JhcicsIGJhejogJ3F1eCcgfSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfEJsb2J8RmlsZXxCdWZmZXJ8ZnMuUmVhZFN0cmVhbX0gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuICAvLyBuYW1lIHNob3VsZCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LlxuICBpZiAobnVsbCA9PT0gbmFtZSB8fCB1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIG5hbWUgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiLmZpZWxkKCkgY2FuJ3QgYmUgdXNlZCBpZiAuc2VuZCgpIGlzIHVzZWQuIFBsZWFzZSB1c2Ugb25seSAuc2VuZCgpIG9yIG9ubHkgLmZpZWxkKCkgJiAuYXR0YWNoKClcIik7XG4gIH1cblxuICBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgdGhpcy5maWVsZChrZXksIG5hbWVba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIGZvciAodmFyIGkgaW4gdmFsKSB7XG4gICAgICB0aGlzLmZpZWxkKG5hbWUsIHZhbFtpXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdmFsIHNob3VsZCBiZSBkZWZpbmVkIG5vd1xuICBpZiAobnVsbCA9PT0gdmFsIHx8IHVuZGVmaW5lZCA9PT0gdmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCcuZmllbGQobmFtZSwgdmFsKSB2YWwgY2FuIG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGlmICgnYm9vbGVhbicgPT09IHR5cGVvZiB2YWwpIHtcbiAgICB2YWwgPSAnJyArIHZhbDtcbiAgfVxuICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChuYW1lLCB2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0aGlzLl9hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIgJiYgdGhpcy54aHIuYWJvcnQoKTsgLy8gYnJvd3NlclxuICB0aGlzLnJlcSAmJiB0aGlzLnJlcS5hYm9ydCgpOyAvLyBub2RlXG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIHRoaXMuZW1pdCgnYWJvcnQnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2F1dGggPSBmdW5jdGlvbih1c2VyLCBwYXNzLCBvcHRpb25zLCBiYXNlNjRFbmNvZGVyKSB7XG4gIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgY2FzZSAnYmFzaWMnOlxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGJhc2U2NEVuY29kZXIodXNlciArICc6JyArIHBhc3MpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYXV0byc6XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcjtcbiAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWFyZXInOiAvLyB1c2FnZSB3b3VsZCBiZSAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB1c2VyKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbmFibGUgdHJhbnNtaXNzaW9uIG9mIGNvb2tpZXMgd2l0aCB4LWRvbWFpbiByZXF1ZXN0cy5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHRoaXMgdG8gd29yayB0aGUgb3JpZ2luIG11c3Qgbm90IGJlXG4gKiB1c2luZyBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiIHdpdGggYSB3aWxkY2FyZCxcbiAqIGFuZCBhbHNvIG11c3Qgc2V0IFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIlxuICogdG8gXCJ0cnVlXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24ob24pIHtcbiAgLy8gVGhpcyBpcyBicm93c2VyLW9ubHkgZnVuY3Rpb25hbGl0eS4gTm9kZSBzaWRlIGlzIG5vLW9wLlxuICBpZiAob24gPT0gdW5kZWZpbmVkKSBvbiA9IHRydWU7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IG9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYXggcmVkaXJlY3RzIHRvIGBuYC4gRG9lcyBub3RpbmcgaW4gYnJvd3NlciBYSFIgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUucmVkaXJlY3RzID0gZnVuY3Rpb24obil7XG4gIHRoaXMuX21heFJlZGlyZWN0cyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpemUgb2YgYnVmZmVyZWQgcmVzcG9uc2UgYm9keSwgaW4gYnl0ZXMuIENvdW50cyB1bmNvbXByZXNzZWQgc2l6ZS5cbiAqIERlZmF1bHQgMjAwTUIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUubWF4UmVzcG9uc2VTaXplID0gZnVuY3Rpb24obil7XG4gIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIG4pIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50XCIpO1xuICB9XG4gIHRoaXMuX21heFJlc3BvbnNlU2l6ZSA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRvIGEgcGxhaW4gamF2YXNjcmlwdCBvYmplY3QgKG5vdCBKU09OIHN0cmluZykgb2Ygc2NhbGFyIHByb3BlcnRpZXMuXG4gKiBOb3RlIGFzIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJldHVybiBhIHVzZWZ1bCBub24tdGhpcyB2YWx1ZSxcbiAqIGl0IGNhbm5vdCBiZSBjaGFpbmVkLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gZGVzY3JpYmluZyBtZXRob2QsIHVybCwgYW5kIGRhdGEgb2YgdGhpcyByZXF1ZXN0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgIHVybDogdGhpcy51cmwsXG4gICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICBoZWFkZXJzOiB0aGlzLl9oZWFkZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgIGFzIHRoZSByZXF1ZXN0IGJvZHksIGRlZmF1bHRpbmcgdGhlIGAudHlwZSgpYCB0byBcImpzb25cIiB3aGVuXG4gKiBhbiBvYmplY3QgaXMgZ2l2ZW4uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gbWFudWFsIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgIC5zZW5kKCd7XCJuYW1lXCI6XCJ0alwifScpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZGF0YVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oZGF0YSl7XG4gIHZhciBpc09iaiA9IGlzT2JqZWN0KGRhdGEpO1xuICB2YXIgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG5cbiAgaWYgKHRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi5zZW5kKCkgY2FuJ3QgYmUgdXNlZCBpZiAuYXR0YWNoKCkgb3IgLmZpZWxkKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiKTtcbiAgfVxuXG4gIGlmIChpc09iaiAmJiAhdGhpcy5fZGF0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuICB9IGVsc2UgaWYgKGRhdGEgJiYgdGhpcy5fZGF0YSAmJiB0aGlzLl9pc0hvc3QodGhpcy5fZGF0YSkpIHtcbiAgICB0aHJvdyBFcnJvcihcIkNhbid0IG1lcmdlIHRoZXNlIHNlbmQgY2FsbHNcIik7XG4gIH1cblxuICAvLyBtZXJnZVxuICBpZiAoaXNPYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIC8vIGRlZmF1bHQgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2Zvcm0nKTtcbiAgICB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgICBpZiAoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgPT0gdHlwZSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGFcbiAgICAgICAgPyB0aGlzLl9kYXRhICsgJyYnICsgZGF0YVxuICAgICAgICA6IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAodGhpcy5fZGF0YSB8fCAnJykgKyBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICghaXNPYmogfHwgdGhpcy5faXNIb3N0KGRhdGEpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBkZWZhdWx0IHRvIGpzb25cbiAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2pzb24nKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNvcnQgYHF1ZXJ5c3RyaW5nYCBieSB0aGUgc29ydCBmdW5jdGlvblxuICpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0IG9yZGVyXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeSgpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gY3VzdG9taXplZCBzb3J0IGZ1bmN0aW9uXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3VzZXInKVxuICogICAgICAgICAucXVlcnkoJ25hbWU9TmljaycpXG4gKiAgICAgICAgIC5xdWVyeSgnc2VhcmNoPU1hbm55JylcbiAqICAgICAgICAgLnNvcnRRdWVyeShmdW5jdGlvbihhLCBiKXtcbiAqICAgICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAqICAgICAgICAgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc29ydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zb3J0UXVlcnkgPSBmdW5jdGlvbihzb3J0KSB7XG4gIC8vIF9zb3J0IGRlZmF1bHQgdG8gdHJ1ZSBidXQgb3RoZXJ3aXNlIGNhbiBiZSBhIGZ1bmN0aW9uIG9yIGJvb2xlYW5cbiAgdGhpcy5fc29ydCA9IHR5cGVvZiBzb3J0ID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBzb3J0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29tcG9zZSBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gcmVxLnVybFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2ZpbmFsaXplUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpe1xuICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeS5qb2luKCcmJyk7XG4gIGlmIChxdWVyeSkge1xuICAgIHRoaXMudXJsICs9ICh0aGlzLnVybC5pbmRleE9mKCc/JykgPj0gMCA/ICcmJyA6ICc/JykgKyBxdWVyeTtcbiAgfVxuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwOyAvLyBNYWtlcyB0aGUgY2FsbCBpZGVtcG90ZW50XG5cbiAgaWYgKHRoaXMuX3NvcnQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnVybC5pbmRleE9mKCc/Jyk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBxdWVyeUFyciA9IHRoaXMudXJsLnN1YnN0cmluZyhpbmRleCArIDEpLnNwbGl0KCcmJyk7XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRoaXMuX3NvcnQpIHtcbiAgICAgICAgcXVlcnlBcnIuc29ydCh0aGlzLl9zb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5QXJyLnNvcnQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gdGhpcy51cmwuc3Vic3RyaW5nKDAsIGluZGV4KSArICc/JyArIHF1ZXJ5QXJyLmpvaW4oJyYnKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEZvciBiYWNrd2FyZHMgY29tcGF0IG9ubHlcblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXBwZW5kUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpIHtjb25zb2xlLnRyYWNlKFwiVW5zdXBwb3J0ZWRcIik7fVxuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHRpbWVvdXQgZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl90aW1lb3V0RXJyb3IgPSBmdW5jdGlvbihyZWFzb24sIHRpbWVvdXQsIGVycm5vKXtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVyciA9IG5ldyBFcnJvcihyZWFzb24gKyB0aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyk7XG4gIGVyci50aW1lb3V0ID0gdGltZW91dDtcbiAgZXJyLmNvZGUgPSAnRUNPTk5BQk9SVEVEJztcbiAgZXJyLmVycm5vID0gZXJybm87XG4gIHRoaXMudGltZWRvdXQgPSB0cnVlO1xuICB0aGlzLmFib3J0KCk7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGRlYWRsaW5lXG4gIGlmICh0aGlzLl90aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5fdGltZW91dEVycm9yKCdUaW1lb3V0IG9mICcsIHNlbGYuX3RpbWVvdXQsICdFVElNRScpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXQpO1xuICB9XG4gIC8vIHJlc3BvbnNlIHRpbWVvdXRcbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVGltZW91dCAmJiAhdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcignUmVzcG9uc2UgdGltZW91dCBvZiAnLCBzZWxmLl9yZXNwb25zZVRpbWVvdXQsICdFVElNRURPVVQnKTtcbiAgICB9LCB0aGlzLl9yZXNwb25zZVRpbWVvdXQpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VCYXNlYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3BvbnNlQmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZUJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2VCYXNlKG9iaikge1xuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcbn1cblxuLyoqXG4gKiBNaXhpbiB0aGUgcHJvdG90eXBlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBSZXNwb25zZUJhc2UucHJvdG90eXBlKSB7XG4gICAgb2JqW2tleV0gPSBSZXNwb25zZUJhc2UucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gIHJldHVybiB0aGlzLmhlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciByZWxhdGVkIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGAudHlwZWAgdGhlIGNvbnRlbnQgdHlwZSB3aXRob3V0IHBhcmFtc1xuICpcbiAqIEEgcmVzcG9uc2Ugb2YgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiBcInRleHQvcGxhaW5cIi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgICAvLyBUT0RPOiBtb2FyIVxuICAgIC8vIFRPRE86IG1ha2UgdGhpcyBhIHV0aWxcblxuICAgIC8vIGNvbnRlbnQtdHlwZVxuICAgIHZhciBjdCA9IGhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJyc7XG4gICAgdGhpcy50eXBlID0gdXRpbHMudHlwZShjdCk7XG5cbiAgICAvLyBwYXJhbXNcbiAgICB2YXIgcGFyYW1zID0gdXRpbHMucGFyYW1zKGN0KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1zKSB0aGlzW2tleV0gPSBwYXJhbXNba2V5XTtcblxuICAgIHRoaXMubGlua3MgPSB7fTtcblxuICAgIC8vIGxpbmtzXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGhlYWRlci5saW5rKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtzID0gdXRpbHMucGFyc2VMaW5rcyhoZWFkZXIubGluayk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgZmxhZ3Mgc3VjaCBhcyBgLm9rYCBiYXNlZCBvbiBgc3RhdHVzYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSBhIDJ4eCByZXNwb25zZSB3aWxsIGdpdmUgeW91IGEgYC5va2Agb2YgX190cnVlX19cbiAqIHdoZXJlYXMgNXh4IHdpbGwgYmUgX19mYWxzZV9fIGFuZCBgLmVycm9yYCB3aWxsIGJlIF9fdHJ1ZV9fLiBUaGVcbiAqIGAuY2xpZW50RXJyb3JgIGFuZCBgLnNlcnZlckVycm9yYCBhcmUgYWxzbyBhdmFpbGFibGUgdG8gYmUgbW9yZVxuICogc3BlY2lmaWMsIGFuZCBgLnN0YXR1c1R5cGVgIGlzIHRoZSBjbGFzcyBvZiBlcnJvciByYW5naW5nIGZyb20gMS4uNVxuICogc29tZXRpbWVzIHVzZWZ1bCBmb3IgbWFwcGluZyByZXNwb25kIGNvbG9ycyBldGMuXG4gKlxuICogXCJzdWdhclwiIHByb3BlcnRpZXMgYXJlIGFsc28gZGVmaW5lZCBmb3IgY29tbW9uIGNhc2VzLiBDdXJyZW50bHkgcHJvdmlkaW5nOlxuICpcbiAqICAgLSAubm9Db250ZW50XG4gKiAgIC0gLmJhZFJlcXVlc3RcbiAqICAgLSAudW5hdXRob3JpemVkXG4gKiAgIC0gLm5vdEFjY2VwdGFibGVcbiAqICAgLSAubm90Rm91bmRcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgICB2YXIgdHlwZSA9IHN0YXR1cyAvIDEwMCB8IDA7XG5cbiAgICAvLyBzdGF0dXMgLyBjbGFzc1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzVHlwZSA9IHR5cGU7XG5cbiAgICAvLyBiYXNpY3NcbiAgICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gICAgdGhpcy5vayA9IDIgPT0gdHlwZTtcbiAgICB0aGlzLnJlZGlyZWN0ID0gMyA9PSB0eXBlO1xuICAgIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IDUgPT0gdHlwZTtcbiAgICB0aGlzLmVycm9yID0gKDQgPT0gdHlwZSB8fCA1ID09IHR5cGUpXG4gICAgICAgID8gdGhpcy50b0Vycm9yKClcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIC8vIHN1Z2FyXG4gICAgdGhpcy5jcmVhdGVkID0gMjAxID09IHN0YXR1cztcbiAgICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgICB0aGlzLm5vQ29udGVudCA9IDIwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy5iYWRSZXF1ZXN0ID0gNDAwID09IHN0YXR1cztcbiAgICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RBY2NlcHRhYmxlID0gNDA2ID09IHN0YXR1cztcbiAgICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG4gICAgdGhpcy5ub3RGb3VuZCA9IDQwNCA9PSBzdGF0dXM7XG4gICAgdGhpcy51bnByb2Nlc3NhYmxlRW50aXR5ID0gNDIyID09IHN0YXR1cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCk7XG59O1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcmFtcyA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqPSAqLyk7XG4gICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgdmFyIHZhbCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBQYXJzZSBMaW5rIGhlYWRlciBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5wYXJzZUxpbmtzID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvICosICovKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBzdHIpe1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo7ICovKTtcbiAgICB2YXIgdXJsID0gcGFydHNbMF0uc2xpY2UoMSwgLTEpO1xuICAgIHZhciByZWwgPSBwYXJ0c1sxXS5zcGxpdCgvICo9ICovKVsxXS5zbGljZSgxLCAtMSk7XG4gICAgb2JqW3JlbF0gPSB1cmw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBTdHJpcCBjb250ZW50IHJlbGF0ZWQgZmllbGRzIGZyb20gYGhlYWRlcmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQHJldHVybiB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuY2xlYW5IZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIsIGNoYW5nZXNPcmlnaW4pe1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgZGVsZXRlIGhlYWRlclsnY29udGVudC1sZW5ndGgnXTtcbiAgZGVsZXRlIGhlYWRlclsndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgZGVsZXRlIGhlYWRlclsnaG9zdCddO1xuICAvLyBzZWN1aXJ0eVxuICBpZiAoY2hhbmdlc09yaWdpbikge1xuICAgIGRlbGV0ZSBoZWFkZXJbJ2F1dGhvcml6YXRpb24nXTtcbiAgICBkZWxldGUgaGVhZGVyWydjb29raWUnXTtcbiAgfVxuICByZXR1cm4gaGVhZGVyO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iXX0=
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tungsten
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-15 00:00:00.000000000 Z
12
+ date: 2018-08-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -316,12 +316,12 @@ files:
316
316
  - lib/tungsten.rb
317
317
  - lib/tungsten/helper.rb
318
318
  - lib/tungsten/version.rb
319
- - public/code-0.2.8.js
320
- - public/code-0.2.8.js.gz
321
- - public/tungsten-0.2.8.css
322
- - public/tungsten-0.2.8.css.gz
323
- - public/tungsten-0.2.8.js
324
- - public/tungsten-0.2.8.js.gz
319
+ - public/code-0.2.9.js
320
+ - public/code-0.2.9.js.gz
321
+ - public/tungsten-0.2.9.css
322
+ - public/tungsten-0.2.9.css.gz
323
+ - public/tungsten-0.2.9.js
324
+ - public/tungsten-0.2.9.js.gz
325
325
  homepage:
326
326
  licenses:
327
327
  - MIT
Binary file
Binary file