WordPress.org

Make WordPress Core

Ticket #39598: 39598.diff

File 39598.diff, 533.4 KB (added by maguiar, 3 years ago)

Add media queries for header in small devices

  • src/wp-content/themes/twentyseventeen/style.css

    diff --git src/wp-content/themes/twentyseventeen/style.css src/wp-content/themes/twentyseventeen/style.css
    index da3791d578..132ab37766 100644
    body:not(.title-tagline-hidden) .site-branding-text { 
    16531653        width: 100%;
    16541654}
    16551655
     1656/**
     1657Use media queries to prevent extremely tall header in iOS lte 7
     1658Used formula to get height: Device screen height - ( Device screen height * 25% ) = 75vh
     1659*/
     1660/* iPad */
     1661@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) {
     1662        .has-header-image.twentyseventeen-front-page .custom-header,
     1663        .has-header-video.twentyseventeen-front-page .custom-header,
     1664        .has-header-image.home.blog .custom-header,
     1665        .has-header-video.home.blog .custom-header {
     1666                height: 576px;
     1667        }
     1668}
     1669
     1670@media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) {
     1671        .has-header-image.twentyseventeen-front-page .custom-header,
     1672        .has-header-video.twentyseventeen-front-page .custom-header,
     1673        .has-header-image.home.blog .custom-header,
     1674        .has-header-video.home.blog .custom-header {
     1675                height: 1024px;
     1676        }
     1677}
     1678
     1679/* iPhone 5 */
     1680@media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2) {
     1681        .has-header-image.twentyseventeen-front-page .custom-header,
     1682        .has-header-video.twentyseventeen-front-page .custom-header,
     1683        .has-header-image.home.blog .custom-header,
     1684        .has-header-video.home.blog .custom-header  {
     1685                height: 240px;
     1686        }
     1687}
     1688@media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2) {
     1689        .has-header-image.twentyseventeen-front-page .custom-header,
     1690        .has-header-video.twentyseventeen-front-page .custom-header,
     1691        .has-header-image.home.blog .custom-header,
     1692        .has-header-video.home.blog .custom-header  {
     1693                height: 426px;
     1694        }
     1695}
     1696
     1697/* iPhone 4 */
     1698@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio : 2) {
     1699        .has-header-image.twentyseventeen-front-page .custom-header,
     1700        .has-header-video.twentyseventeen-front-page .custom-header,
     1701        .has-header-image.home.blog .custom-header,
     1702        .has-header-video.home.blog .custom-header {
     1703                height: 240px;
     1704        }
     1705}
     1706@media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio : 2) {
     1707        .has-header-image.twentyseventeen-front-page .custom-header,
     1708        .has-header-video.twentyseventeen-front-page .custom-header,
     1709        .has-header-image.home.blog .custom-header,
     1710        .has-header-video.home.blog .custom-header {
     1711                height: 360px;
     1712        }
     1713}
     1714
    16561715.custom-header-media {
    16571716        bottom: 0;
    16581717        left: 0;
  • src/wp-includes/js/media-audiovideo.js

    diff --git src/wp-includes/js/media-audiovideo.js src/wp-includes/js/media-audiovideo.js
    index e37a22189f..3412e9e5e8 100644
    VideoDetails = MediaDetails.extend({ 
    918918
    919919module.exports = VideoDetails;
    920920
    921 },{}]},{},[1]);
     921},{}]},{},[1])
     922//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvYXVkaW92aWRlby5tYW5pZmVzdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9hdWRpby1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL3ZpZGVvLWRldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzL3Bvc3QtbWVkaWEuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXVkaW8tZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS9hdWRpby1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL21lZGlhLWRldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvdmlkZW8tZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9tZWRpYS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ZpZGVvLWRldGFpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgbWVkaWEgPSB3cC5tZWRpYSxcblx0YmFzZVNldHRpbmdzID0gd2luZG93Ll93cG1lanNTZXR0aW5ncyB8fCB7fSxcblx0bDEwbiA9IHdpbmRvdy5fd3BNZWRpYVZpZXdzTDEwbiB8fCB7fTtcblxuLyoqXG4gKiBAbWl4aW5cbiAqL1xud3AubWVkaWEubWl4aW4gPSB7XG5cdG1lanNTZXR0aW5nczogYmFzZVNldHRpbmdzLFxuXG5cdHJlbW92ZUFsbFBsYXllcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwO1xuXG5cdFx0aWYgKCB3aW5kb3cubWVqcyAmJiB3aW5kb3cubWVqcy5wbGF5ZXJzICkge1xuXHRcdFx0Zm9yICggcCBpbiB3aW5kb3cubWVqcy5wbGF5ZXJzICkge1xuXHRcdFx0XHR3aW5kb3cubWVqcy5wbGF5ZXJzW3BdLnBhdXNlKCk7XG5cdFx0XHRcdHRoaXMucmVtb3ZlUGxheWVyKCB3aW5kb3cubWVqcy5wbGF5ZXJzW3BdICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSB0aGUgTWVkaWFFbGVtZW50IG1ldGhvZCBmb3IgcmVtb3ZpbmcgYSBwbGF5ZXIuXG5cdCAqXHRNZWRpYUVsZW1lbnQgdHJpZXMgdG8gcHVsbCB0aGUgYXVkaW8vdmlkZW8gdGFnIG91dCBvZlxuXHQgKlx0aXRzIGNvbnRhaW5lciBhbmQgcmUtYWRkIGl0IHRvIHRoZSBET00uXG5cdCAqL1xuXHRyZW1vdmVQbGF5ZXI6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgZmVhdHVyZUluZGV4LCBmZWF0dXJlO1xuXG5cdFx0aWYgKCAhIHQub3B0aW9ucyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBpbnZva2UgZmVhdHVyZXMgY2xlYW51cFxuXHRcdGZvciAoIGZlYXR1cmVJbmRleCBpbiB0Lm9wdGlvbnMuZmVhdHVyZXMgKSB7XG5cdFx0XHRmZWF0dXJlID0gdC5vcHRpb25zLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG5cdFx0XHRpZiAoIHRbJ2NsZWFuJyArIGZlYXR1cmVdICkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHRbJ2NsZWFuJyArIGZlYXR1cmVdKHQpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggISB0LmlzRHluYW1pYyApIHtcblx0XHRcdHQuJG5vZGUucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCAnbmF0aXZlJyAhPT0gdC5tZWRpYS5wbHVnaW5UeXBlICkge1xuXHRcdFx0dC4kbWVkaWEucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIHdpbmRvdy5tZWpzLnBsYXllcnNbdC5pZF07XG5cblx0XHR0LmNvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0Lmdsb2JhbFVuYmluZCgpO1xuXHRcdGRlbGV0ZSB0Lm5vZGUucGxheWVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBbGxvd3MgYW55IGNsYXNzIHRoYXQgaGFzIHNldCAncGxheWVyJyB0byBhIE1lZGlhRWxlbWVudFBsYXllclxuXHQgKiAgaW5zdGFuY2UgdG8gcmVtb3ZlIHRoZSBwbGF5ZXIgd2hlbiBsaXN0ZW5pbmcgdG8gZXZlbnRzLlxuXHQgKlxuXHQgKiAgRXhhbXBsZXM6IG1vZGFsIGNsb3Nlcywgc2hvcnRjb2RlIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQsIGV0Yy5cblx0ICovXG5cdHVuc2V0UGxheWVycyA6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5wbGF5ZXJzICYmIHRoaXMucGxheWVycy5sZW5ndGggKSB7XG5cdFx0XHRfLmVhY2goIHRoaXMucGxheWVycywgZnVuY3Rpb24gKHBsYXllcikge1xuXHRcdFx0XHRwbGF5ZXIucGF1c2UoKTtcblx0XHRcdFx0d3AubWVkaWEubWl4aW4ucmVtb3ZlUGxheWVyKCBwbGF5ZXIgKTtcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMucGxheWVycyA9IFtdO1xuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBBdXRvd2lyZSBcImNvbGxlY3Rpb25cIi10eXBlIHNob3J0Y29kZXNcbiAqL1xud3AubWVkaWEucGxheWxpc3QgPSBuZXcgd3AubWVkaWEuY29sbGVjdGlvbih7XG5cdHRhZzogJ3BsYXlsaXN0Jyxcblx0ZWRpdFRpdGxlIDogbDEwbi5lZGl0UGxheWxpc3RUaXRsZSxcblx0ZGVmYXVsdHMgOiB7XG5cdFx0aWQ6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzdHlsZTogJ2xpZ2h0Jyxcblx0XHR0cmFja2xpc3Q6IHRydWUsXG5cdFx0dHJhY2tudW1iZXJzOiB0cnVlLFxuXHRcdGltYWdlczogdHJ1ZSxcblx0XHRhcnRpc3RzOiB0cnVlLFxuXHRcdHR5cGU6ICdhdWRpbydcblx0fVxufSk7XG5cbi8qKlxuICogU2hvcnRjb2RlIG1vZGVsaW5nIGZvciBhdWRpb1xuICogIGBlZGl0KClgIHByZXBhcmVzIHRoZSBzaG9ydGNvZGUgZm9yIHRoZSBtZWRpYSBtb2RhbFxuICogIGBzaG9ydGNvZGUoKWAgYnVpbGRzIHRoZSBuZXcgc2hvcnRjb2RlIGFmdGVyIHVwZGF0ZVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqL1xud3AubWVkaWEuYXVkaW8gPSB7XG5cdGNvZXJjZSA6IHdwLm1lZGlhLmNvZXJjZSxcblxuXHRkZWZhdWx0cyA6IHtcblx0XHRpZCA6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzcmMgOiAnJyxcblx0XHRsb29wIDogZmFsc2UsXG5cdFx0YXV0b3BsYXkgOiBmYWxzZSxcblx0XHRwcmVsb2FkIDogJ25vbmUnLFxuXHRcdHdpZHRoIDogNDAwXG5cdH0sXG5cblx0ZWRpdCA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdHZhciBmcmFtZSwgc2hvcnRjb2RlID0gd3Auc2hvcnRjb2RlLm5leHQoICdhdWRpbycsIGRhdGEgKS5zaG9ydGNvZGU7XG5cblx0XHRmcmFtZSA9IHdwLm1lZGlhKHtcblx0XHRcdGZyYW1lOiAnYXVkaW8nLFxuXHRcdFx0c3RhdGU6ICdhdWRpby1kZXRhaWxzJyxcblx0XHRcdG1ldGFkYXRhOiBfLmRlZmF1bHRzKCBzaG9ydGNvZGUuYXR0cnMubmFtZWQsIHRoaXMuZGVmYXVsdHMgKVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZyYW1lO1xuXHR9LFxuXG5cdHNob3J0Y29kZSA6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHR2YXIgY29udGVudDtcblxuXHRcdF8uZWFjaCggdGhpcy5kZWZhdWx0cywgZnVuY3Rpb24oIHZhbHVlLCBrZXkgKSB7XG5cdFx0XHRtb2RlbFsga2V5IF0gPSB0aGlzLmNvZXJjZSggbW9kZWwsIGtleSApO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSBtb2RlbFsga2V5IF0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBtb2RlbFsga2V5IF07XG5cdFx0XHR9XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0Y29udGVudCA9IG1vZGVsLmNvbnRlbnQ7XG5cdFx0ZGVsZXRlIG1vZGVsLmNvbnRlbnQ7XG5cblx0XHRyZXR1cm4gbmV3IHdwLnNob3J0Y29kZSh7XG5cdFx0XHR0YWc6ICdhdWRpbycsXG5cdFx0XHRhdHRyczogbW9kZWwsXG5cdFx0XHRjb250ZW50OiBjb250ZW50XG5cdFx0fSk7XG5cdH1cbn07XG5cbi8qKlxuICogU2hvcnRjb2RlIG1vZGVsaW5nIGZvciB2aWRlb1xuICogIGBlZGl0KClgIHByZXBhcmVzIHRoZSBzaG9ydGNvZGUgZm9yIHRoZSBtZWRpYSBtb2RhbFxuICogIGBzaG9ydGNvZGUoKWAgYnVpbGRzIHRoZSBuZXcgc2hvcnRjb2RlIGFmdGVyIHVwZGF0ZVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqL1xud3AubWVkaWEudmlkZW8gPSB7XG5cdGNvZXJjZSA6IHdwLm1lZGlhLmNvZXJjZSxcblxuXHRkZWZhdWx0cyA6IHtcblx0XHRpZCA6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCxcblx0XHRzcmMgOiAnJyxcblx0XHRwb3N0ZXIgOiAnJyxcblx0XHRsb29wIDogZmFsc2UsXG5cdFx0YXV0b3BsYXkgOiBmYWxzZSxcblx0XHRwcmVsb2FkIDogJ21ldGFkYXRhJyxcblx0XHRjb250ZW50IDogJycsXG5cdFx0d2lkdGggOiA2NDAsXG5cdFx0aGVpZ2h0IDogMzYwXG5cdH0sXG5cblx0ZWRpdCA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdHZhciBmcmFtZSxcblx0XHRcdHNob3J0Y29kZSA9IHdwLnNob3J0Y29kZS5uZXh0KCAndmlkZW8nLCBkYXRhICkuc2hvcnRjb2RlLFxuXHRcdFx0YXR0cnM7XG5cblx0XHRhdHRycyA9IHNob3J0Y29kZS5hdHRycy5uYW1lZDtcblx0XHRhdHRycy5jb250ZW50ID0gc2hvcnRjb2RlLmNvbnRlbnQ7XG5cblx0XHRmcmFtZSA9IHdwLm1lZGlhKHtcblx0XHRcdGZyYW1lOiAndmlkZW8nLFxuXHRcdFx0c3RhdGU6ICd2aWRlby1kZXRhaWxzJyxcblx0XHRcdG1ldGFkYXRhOiBfLmRlZmF1bHRzKCBhdHRycywgdGhpcy5kZWZhdWx0cyApXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZnJhbWU7XG5cdH0sXG5cblx0c2hvcnRjb2RlIDogZnVuY3Rpb24oIG1vZGVsICkge1xuXHRcdHZhciBjb250ZW50O1xuXG5cdFx0Xy5lYWNoKCB0aGlzLmRlZmF1bHRzLCBmdW5jdGlvbiggdmFsdWUsIGtleSApIHtcblx0XHRcdG1vZGVsWyBrZXkgXSA9IHRoaXMuY29lcmNlKCBtb2RlbCwga2V5ICk7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IG1vZGVsWyBrZXkgXSApIHtcblx0XHRcdFx0ZGVsZXRlIG1vZGVsWyBrZXkgXTtcblx0XHRcdH1cblx0XHR9LCB0aGlzICk7XG5cblx0XHRjb250ZW50ID0gbW9kZWwuY29udGVudDtcblx0XHRkZWxldGUgbW9kZWwuY29udGVudDtcblxuXHRcdHJldHVybiBuZXcgd3Auc2hvcnRjb2RlKHtcblx0XHRcdHRhZzogJ3ZpZGVvJyxcblx0XHRcdGF0dHJzOiBtb2RlbCxcblx0XHRcdGNvbnRlbnQ6IGNvbnRlbnRcblx0XHR9KTtcblx0fVxufTtcblxubWVkaWEubW9kZWwuUG9zdE1lZGlhID0gcmVxdWlyZSggJy4vbW9kZWxzL3Bvc3QtbWVkaWEuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkF1ZGlvRGV0YWlscyA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2F1ZGlvLWRldGFpbHMuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL3ZpZGVvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWVkaWFEZXRhaWxzID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvbWVkaWEtZGV0YWlscy5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5BdWRpb0RldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS9hdWRpby1kZXRhaWxzLmpzJyApO1xubWVkaWEudmlldy5NZWRpYUZyYW1lLlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL2ZyYW1lL3ZpZGVvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL21lZGlhLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3LkF1ZGlvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL2F1ZGlvLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3LlZpZGVvRGV0YWlscyA9IHJlcXVpcmUoICcuL3ZpZXdzL3ZpZGVvLWRldGFpbHMuanMnICk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuQXVkaW9EZXRhaWxzXG4gKlxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBBdWRpbyBEZXRhaWxzIHN0YXRlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBTdGF0ZSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEF1ZGlvRGV0YWlscztcblxuQXVkaW9EZXRhaWxzID0gU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICdhdWRpby1kZXRhaWxzJyxcblx0XHR0aXRsZTogbDEwbi5hdWRpb0RldGFpbHNUaXRsZSxcblx0XHRjb250ZW50OiAnYXVkaW8tZGV0YWlscycsXG5cdFx0bWVudTogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHJvdXRlcjogZmFsc2UsXG5cdFx0cHJpb3JpdHk6IDYwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0U3RhdGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdWRpb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuVmlkZW9EZXRhaWxzXG4gKlxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBWaWRlbyBEZXRhaWxzIHN0YXRlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBTdGF0ZSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFZpZGVvRGV0YWlscztcblxuVmlkZW9EZXRhaWxzID0gU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICd2aWRlby1kZXRhaWxzJyxcblx0XHR0aXRsZTogbDEwbi52aWRlb0RldGFpbHNUaXRsZSxcblx0XHRjb250ZW50OiAndmlkZW8tZGV0YWlscycsXG5cdFx0bWVudTogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHJvdXRlcjogZmFsc2UsXG5cdFx0cHJpb3JpdHk6IDYwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0U3RhdGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWRlb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLlBvc3RNZWRpYVxuICpcbiAqIFNoYXJlZCBtb2RlbCBjbGFzcyBmb3IgYXVkaW8gYW5kIHZpZGVvLiBVcGRhdGVzIHRoZSBtb2RlbCBhZnRlclxuICogICBcIkFkZCBBdWRpb3xWaWRlbyBTb3VyY2VcIiBhbmQgXCJSZXBsYWNlIEF1ZGlvfFZpZGVvXCIgc3RhdGVzIHJldHVyblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBQb3N0TWVkaWEgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmF0dGFjaG1lbnQgPSBmYWxzZTtcblx0fSxcblxuXHRzZXRTb3VyY2U6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHRoaXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5leHRlbnNpb24gPSBhdHRhY2htZW50LmdldCggJ2ZpbGVuYW1lJyApLnNwbGl0KCcuJykucG9wKCk7XG5cblx0XHRpZiAoIHRoaXMuZ2V0KCAnc3JjJyApICYmIHRoaXMuZXh0ZW5zaW9uID09PSB0aGlzLmdldCggJ3NyYycgKS5zcGxpdCgnLicpLnBvcCgpICkge1xuXHRcdFx0dGhpcy51bnNldCggJ3NyYycgKTtcblx0XHR9XG5cblx0XHRpZiAoIF8uY29udGFpbnMoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MuZW1iZWRFeHRzLCB0aGlzLmV4dGVuc2lvbiApICkge1xuXHRcdFx0dGhpcy5zZXQoIHRoaXMuZXh0ZW5zaW9uLCB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAndXJsJyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudW5zZXQoIHRoaXMuZXh0ZW5zaW9uICk7XG5cdFx0fVxuXHR9LFxuXG5cdGNoYW5nZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHRoaXMuc2V0U291cmNlKCBhdHRhY2htZW50ICk7XG5cblx0XHR0aGlzLnVuc2V0KCAnc3JjJyApO1xuXHRcdF8uZWFjaCggXy53aXRob3V0KCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmVtYmVkRXh0cywgdGhpcy5leHRlbnNpb24gKSwgZnVuY3Rpb24oIGV4dCApIHtcblx0XHRcdHRoaXMudW5zZXQoIGV4dCApO1xuXHRcdH0sIHRoaXMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zdE1lZGlhO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF1ZGlvRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIE1lZGlhRGV0YWlscyA9IHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzLFxuXHRBdWRpb0RldGFpbHM7XG5cbkF1ZGlvRGV0YWlscyA9IE1lZGlhRGV0YWlscy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdhdWRpby1kZXRhaWxzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnYXVkaW8tZGV0YWlscycpLFxuXG5cdHNldE1lZGlhOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXVkaW8gPSB0aGlzLiQoJy53cC1hdWRpby1zaG9ydGNvZGUnKTtcblxuXHRcdGlmICggYXVkaW8uZmluZCggJ3NvdXJjZScgKS5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGF1ZGlvLmlzKCc6aGlkZGVuJykgKSB7XG5cdFx0XHRcdGF1ZGlvLnNob3coKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubWVkaWEgPSBNZWRpYURldGFpbHMucHJlcGFyZVNyYyggYXVkaW8uZ2V0KDApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF1ZGlvLmhpZGUoKTtcblx0XHRcdHRoaXMubWVkaWEgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXVkaW9EZXRhaWxzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLk1lZGlhRGV0YWlsc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3RcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIE1lZGlhRGV0YWlscyA9IHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHMsXG5cdE1lZGlhTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTWVkaWFMaWJyYXJ5LFxuXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEF1ZGlvRGV0YWlscztcblxuQXVkaW9EZXRhaWxzID0gTWVkaWFEZXRhaWxzLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0aWQ6ICAgICAgJ2F1ZGlvJyxcblx0XHR1cmw6ICAgICAnJyxcblx0XHRtZW51OiAgICAnYXVkaW8tZGV0YWlscycsXG5cdFx0Y29udGVudDogJ2F1ZGlvLWRldGFpbHMnLFxuXHRcdHRvb2xiYXI6ICdhdWRpby1kZXRhaWxzJyxcblx0XHR0eXBlOiAgICAnbGluaycsXG5cdFx0dGl0bGU6ICAgIGwxMG4uYXVkaW9EZXRhaWxzVGl0bGUsXG5cdFx0cHJpb3JpdHk6IDEyMFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdG9wdGlvbnMuRGV0YWlsc1ZpZXcgPSB3cC5tZWRpYS52aWV3LkF1ZGlvRGV0YWlscztcblx0XHRvcHRpb25zLmNhbmNlbFRleHQgPSBsMTBuLmF1ZGlvRGV0YWlsc0NhbmNlbDtcblx0XHRvcHRpb25zLmFkZFRleHQgPSBsMTBuLmF1ZGlvQWRkU291cmNlVGl0bGU7XG5cblx0XHRNZWRpYURldGFpbHMucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCggdGhpcywgb3B0aW9ucyApO1xuXHR9LFxuXG5cdGJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0TWVkaWFEZXRhaWxzLnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6cmVuZGVyOnJlcGxhY2UtYXVkaW8nLCB0aGlzLnJlbmRlclJlcGxhY2VUb29sYmFyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6cmVuZGVyOmFkZC1hdWRpby1zb3VyY2UnLCB0aGlzLnJlbmRlckFkZFNvdXJjZVRvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5BdWRpb0RldGFpbHMoIHtcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWFcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IE1lZGlhTGlicmFyeSgge1xuXHRcdFx0XHR0eXBlOiAnYXVkaW8nLFxuXHRcdFx0XHRpZDogJ3JlcGxhY2UtYXVkaW8nLFxuXHRcdFx0XHR0aXRsZTogbDEwbi5hdWRpb1JlcGxhY2VUaXRsZSxcblx0XHRcdFx0dG9vbGJhcjogJ3JlcGxhY2UtYXVkaW8nLFxuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYSxcblx0XHRcdFx0bWVudTogJ2F1ZGlvLWRldGFpbHMnXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ2F1ZGlvJyxcblx0XHRcdFx0aWQ6ICdhZGQtYXVkaW8tc291cmNlJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4uYXVkaW9BZGRTb3VyY2VUaXRsZSxcblx0XHRcdFx0dG9vbGJhcjogJ2FkZC1hdWRpby1zb3VyY2UnLFxuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYSxcblx0XHRcdFx0bWVudTogZmFsc2Vcblx0XHRcdH0gKVxuXHRcdF0pO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdWRpb0RldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBTZWxlY3QgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRNZWRpYURldGFpbHM7XG5cbk1lZGlhRGV0YWlscyA9IFNlbGVjdC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdtZWRpYScsXG5cdFx0dXJsOiAgICAgJycsXG5cdFx0bWVudTogICAgJ21lZGlhLWRldGFpbHMnLFxuXHRcdGNvbnRlbnQ6ICdtZWRpYS1kZXRhaWxzJyxcblx0XHR0b29sYmFyOiAnbWVkaWEtZGV0YWlscycsXG5cdFx0dHlwZTogICAgJ2xpbmsnLFxuXHRcdHByaW9yaXR5OiAxMjBcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLkRldGFpbHNWaWV3ID0gb3B0aW9ucy5EZXRhaWxzVmlldztcblx0XHR0aGlzLmNhbmNlbFRleHQgPSBvcHRpb25zLmNhbmNlbFRleHQ7XG5cdFx0dGhpcy5hZGRUZXh0ID0gb3B0aW9ucy5hZGRUZXh0O1xuXG5cdFx0dGhpcy5tZWRpYSA9IG5ldyB3cC5tZWRpYS5tb2RlbC5Qb3N0TWVkaWEoIG9wdGlvbnMubWV0YWRhdGEgKTtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uID0gbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggdGhpcy5tZWRpYS5hdHRhY2htZW50LCB7IG11bHRpcGxlOiBmYWxzZSB9ICk7XG5cdFx0U2VsZWN0LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZW51ID0gdGhpcy5kZWZhdWx0cy5tZW51O1xuXG5cdFx0U2VsZWN0LnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5vbiggJ21lbnU6Y3JlYXRlOicgKyBtZW51LCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpyZW5kZXI6JyArIG1lbnUsIHRoaXMucmVuZGVyRGV0YWlsc0NvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpyZW5kZXI6JyArIG1lbnUsIHRoaXMucmVuZGVyTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjonICsgbWVudSwgdGhpcy5yZW5kZXJEZXRhaWxzVG9vbGJhciwgdGhpcyApO1xuXHR9LFxuXG5cdHJlbmRlckRldGFpbHNDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlldyA9IG5ldyB0aGlzLkRldGFpbHNWaWV3KHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogdGhpcy5zdGF0ZSgpLm1lZGlhLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5zdGF0ZSgpLm1lZGlhLmF0dGFjaG1lbnRcblx0XHR9KS5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblx0fSxcblxuXHRyZW5kZXJNZW51OiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgbGFzdFN0YXRlID0gdGhpcy5sYXN0U3RhdGUoKSxcblx0XHRcdHByZXZpb3VzID0gbGFzdFN0YXRlICYmIGxhc3RTdGF0ZS5pZCxcblx0XHRcdGZyYW1lID0gdGhpcztcblxuXHRcdHZpZXcuc2V0KHtcblx0XHRcdGNhbmNlbDoge1xuXHRcdFx0XHR0ZXh0OiAgICAgdGhpcy5jYW5jZWxUZXh0LFxuXHRcdFx0XHRwcmlvcml0eTogMjAsXG5cdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0XHRcdFx0ZnJhbWUuc2V0U3RhdGUoIHByZXZpb3VzICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZyYW1lLmNsb3NlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2VwYXJhdGVDYW5jZWw6IG5ldyB3cC5tZWRpYS5WaWV3KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnc2VwYXJhdG9yJyxcblx0XHRcdFx0cHJpb3JpdHk6IDQwXG5cdFx0XHR9KVxuXHRcdH0pO1xuXG5cdH0sXG5cblx0c2V0UHJpbWFyeUJ1dHRvbjogZnVuY3Rpb24odGV4dCwgaGFuZGxlcikge1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGJ1dHRvbjoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIHRleHQsXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyO1xuXHRcdFx0XHRcdFx0aGFuZGxlci5jYWxsKCB0aGlzLCBjb250cm9sbGVyLCBjb250cm9sbGVyLnN0YXRlKCkgKTtcblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRyZW5kZXJEZXRhaWxzVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXRQcmltYXJ5QnV0dG9uKCBsMTBuLnVwZGF0ZSwgZnVuY3Rpb24oIGNvbnRyb2xsZXIsIHN0YXRlICkge1xuXHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0c3RhdGUudHJpZ2dlciggJ3VwZGF0ZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0cmVuZGVyUmVwbGFjZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2V0UHJpbWFyeUJ1dHRvbiggbDEwbi5yZXBsYWNlLCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgYXR0YWNobWVudCA9IHN0YXRlLmdldCggJ3NlbGVjdGlvbicgKS5zaW5nbGUoKTtcblx0XHRcdGNvbnRyb2xsZXIubWVkaWEuY2hhbmdlQXR0YWNobWVudCggYXR0YWNobWVudCApO1xuXHRcdFx0c3RhdGUudHJpZ2dlciggJ3JlcGxhY2UnLCBjb250cm9sbGVyLm1lZGlhLnRvSlNPTigpICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHJlbmRlckFkZFNvdXJjZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2V0UHJpbWFyeUJ1dHRvbiggdGhpcy5hZGRUZXh0LCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgYXR0YWNobWVudCA9IHN0YXRlLmdldCggJ3NlbGVjdGlvbicgKS5zaW5nbGUoKTtcblx0XHRcdGNvbnRyb2xsZXIubWVkaWEuc2V0U291cmNlKCBhdHRhY2htZW50ICk7XG5cdFx0XHRzdGF0ZS50cmlnZ2VyKCAnYWRkLXNvdXJjZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lZGlhRGV0YWlscztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLlZpZGVvRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NZWRpYURldGFpbHNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBNZWRpYURldGFpbHMgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuTWVkaWFEZXRhaWxzLFxuXHRNZWRpYUxpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLk1lZGlhTGlicmFyeSxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0VmlkZW9EZXRhaWxzO1xuXG5WaWRlb0RldGFpbHMgPSBNZWRpYURldGFpbHMuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAndmlkZW8nLFxuXHRcdHVybDogICAgICcnLFxuXHRcdG1lbnU6ICAgICd2aWRlby1kZXRhaWxzJyxcblx0XHRjb250ZW50OiAndmlkZW8tZGV0YWlscycsXG5cdFx0dG9vbGJhcjogJ3ZpZGVvLWRldGFpbHMnLFxuXHRcdHR5cGU6ICAgICdsaW5rJyxcblx0XHR0aXRsZTogICAgbDEwbi52aWRlb0RldGFpbHNUaXRsZSxcblx0XHRwcmlvcml0eTogMTIwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucy5EZXRhaWxzVmlldyA9IHdwLm1lZGlhLnZpZXcuVmlkZW9EZXRhaWxzO1xuXHRcdG9wdGlvbnMuY2FuY2VsVGV4dCA9IGwxMG4udmlkZW9EZXRhaWxzQ2FuY2VsO1xuXHRcdG9wdGlvbnMuYWRkVGV4dCA9IGwxMG4udmlkZW9BZGRTb3VyY2VUaXRsZTtcblxuXHRcdE1lZGlhRGV0YWlscy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKCB0aGlzLCBvcHRpb25zICk7XG5cdH0sXG5cblx0YmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHtcblx0XHRNZWRpYURldGFpbHMucHJvdG90eXBlLmJpbmRIYW5kbGVycy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6cmVwbGFjZS12aWRlbycsIHRoaXMucmVuZGVyUmVwbGFjZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6YWRkLXZpZGVvLXNvdXJjZScsIHRoaXMucmVuZGVyQWRkU291cmNlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjpzZWxlY3QtcG9zdGVyLWltYWdlJywgdGhpcy5yZW5kZXJTZWxlY3RQb3N0ZXJJbWFnZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6YWRkLXRyYWNrJywgdGhpcy5yZW5kZXJBZGRUcmFja1Rvb2xiYXIsIHRoaXMgKTtcblx0fSxcblxuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5WaWRlb0RldGFpbHMoe1xuXHRcdFx0XHRtZWRpYTogdGhpcy5tZWRpYVxuXHRcdFx0fSksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ3ZpZGVvJyxcblx0XHRcdFx0aWQ6ICdyZXBsYWNlLXZpZGVvJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9SZXBsYWNlVGl0bGUsXG5cdFx0XHRcdHRvb2xiYXI6ICdyZXBsYWNlLXZpZGVvJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6ICd2aWRlby1kZXRhaWxzJ1xuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgTWVkaWFMaWJyYXJ5KCB7XG5cdFx0XHRcdHR5cGU6ICd2aWRlbycsXG5cdFx0XHRcdGlkOiAnYWRkLXZpZGVvLXNvdXJjZScsXG5cdFx0XHRcdHRpdGxlOiBsMTBuLnZpZGVvQWRkU291cmNlVGl0bGUsXG5cdFx0XHRcdHRvb2xiYXI6ICdhZGQtdmlkZW8tc291cmNlJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6IGZhbHNlXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBNZWRpYUxpYnJhcnkoIHtcblx0XHRcdFx0dHlwZTogJ2ltYWdlJyxcblx0XHRcdFx0aWQ6ICdzZWxlY3QtcG9zdGVyLWltYWdlJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9TZWxlY3RQb3N0ZXJJbWFnZVRpdGxlLFxuXHRcdFx0XHR0b29sYmFyOiAnc2VsZWN0LXBvc3Rlci1pbWFnZScsXG5cdFx0XHRcdG1lZGlhOiB0aGlzLm1lZGlhLFxuXHRcdFx0XHRtZW51OiAndmlkZW8tZGV0YWlscydcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IE1lZGlhTGlicmFyeSgge1xuXHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdGlkOiAnYWRkLXRyYWNrJyxcblx0XHRcdFx0dGl0bGU6IGwxMG4udmlkZW9BZGRUcmFja1RpdGxlLFxuXHRcdFx0XHR0b29sYmFyOiAnYWRkLXRyYWNrJyxcblx0XHRcdFx0bWVkaWE6IHRoaXMubWVkaWEsXG5cdFx0XHRcdG1lbnU6ICd2aWRlby1kZXRhaWxzJ1xuXHRcdFx0fSApXG5cdFx0XSk7XG5cdH0sXG5cblx0cmVuZGVyU2VsZWN0UG9zdGVySW1hZ2VUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldFByaW1hcnlCdXR0b24oIGwxMG4udmlkZW9TZWxlY3RQb3N0ZXJJbWFnZVRpdGxlLCBmdW5jdGlvbiggY29udHJvbGxlciwgc3RhdGUgKSB7XG5cdFx0XHR2YXIgdXJscyA9IFtdLCBhdHRhY2htZW50ID0gc3RhdGUuZ2V0KCAnc2VsZWN0aW9uJyApLnNpbmdsZSgpO1xuXG5cdFx0XHRjb250cm9sbGVyLm1lZGlhLnNldCggJ3Bvc3RlcicsIGF0dGFjaG1lbnQuZ2V0KCAndXJsJyApICk7XG5cdFx0XHRzdGF0ZS50cmlnZ2VyKCAnc2V0LXBvc3Rlci1pbWFnZScsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblxuXHRcdFx0Xy5lYWNoKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmVtYmVkRXh0cywgZnVuY3Rpb24gKGV4dCkge1xuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXIubWVkaWEuZ2V0KCBleHQgKSApIHtcblx0XHRcdFx0XHR1cmxzLnB1c2goIGNvbnRyb2xsZXIubWVkaWEuZ2V0KCBleHQgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHdwLmFqYXguc2VuZCggJ3NldC1hdHRhY2htZW50LXRodW1ibmFpbCcsIHtcblx0XHRcdFx0ZGF0YSA6IHtcblx0XHRcdFx0XHR1cmxzOiB1cmxzLFxuXHRcdFx0XHRcdHRodW1ibmFpbF9pZDogYXR0YWNobWVudC5nZXQoICdpZCcgKVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHJlbmRlckFkZFRyYWNrVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXRQcmltYXJ5QnV0dG9uKCBsMTBuLnZpZGVvQWRkVHJhY2tUaXRsZSwgZnVuY3Rpb24oIGNvbnRyb2xsZXIsIHN0YXRlICkge1xuXHRcdFx0dmFyIGF0dGFjaG1lbnQgPSBzdGF0ZS5nZXQoICdzZWxlY3Rpb24nICkuc2luZ2xlKCksXG5cdFx0XHRcdGNvbnRlbnQgPSBjb250cm9sbGVyLm1lZGlhLmdldCggJ2NvbnRlbnQnICk7XG5cblx0XHRcdGlmICggLTEgPT09IGNvbnRlbnQuaW5kZXhPZiggYXR0YWNobWVudC5nZXQoICd1cmwnICkgKSApIHtcblx0XHRcdFx0Y29udGVudCArPSBbXG5cdFx0XHRcdFx0Jzx0cmFjayBzcmNsYW5nPVwiZW5cIiBsYWJlbD1cIkVuZ2xpc2hcIiBraW5kPVwic3VidGl0bGVzXCIgc3JjPVwiJyxcblx0XHRcdFx0XHRhdHRhY2htZW50LmdldCggJ3VybCcgKSxcblx0XHRcdFx0XHQnXCIgLz4nXG5cdFx0XHRcdF0uam9pbignJyk7XG5cblx0XHRcdFx0Y29udHJvbGxlci5tZWRpYS5zZXQoICdjb250ZW50JywgY29udGVudCApO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUudHJpZ2dlciggJ2FkZC10cmFjaycsIGNvbnRyb2xsZXIubWVkaWEudG9KU09OKCkgKTtcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvRGV0YWlscztcbiIsIi8qIGdsb2JhbCBNZWRpYUVsZW1lbnRQbGF5ZXIgKi9cblxuLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBBdHRhY2htZW50RGlzcGxheSA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXksXG5cdCQgPSBqUXVlcnksXG5cdE1lZGlhRGV0YWlscztcblxuTWVkaWFEZXRhaWxzID0gQXR0YWNobWVudERpc3BsYXkuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMsICdzdWNjZXNzJyk7XG5cdFx0dGhpcy5wbGF5ZXJzID0gW107XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAnY2xvc2UnLCB3cC5tZWRpYS5taXhpbi51bnNldFBsYXllcnMgKTtcblx0XHR0aGlzLm9uKCAncmVhZHknLCB0aGlzLnNldFBsYXllciApO1xuXHRcdHRoaXMub24oICdtZWRpYTpzZXR0aW5nOnJlbW92ZScsIHdwLm1lZGlhLm1peGluLnVuc2V0UGxheWVycywgdGhpcyApO1xuXHRcdHRoaXMub24oICdtZWRpYTpzZXR0aW5nOnJlbW92ZScsIHRoaXMucmVuZGVyICk7XG5cdFx0dGhpcy5vbiggJ21lZGlhOnNldHRpbmc6cmVtb3ZlJywgdGhpcy5zZXRQbGF5ZXIgKTtcblxuXHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRldmVudHM6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIF8uZXh0ZW5kKCB7XG5cdFx0XHQnY2xpY2sgLnJlbW92ZS1zZXR0aW5nJyA6ICdyZW1vdmVTZXR0aW5nJyxcblx0XHRcdCdjaGFuZ2UgLmNvbnRlbnQtdHJhY2snIDogJ3NldFRyYWNrcycsXG5cdFx0XHQnY2xpY2sgLnJlbW92ZS10cmFjaycgOiAnc2V0VHJhY2tzJyxcblx0XHRcdCdjbGljayAuYWRkLW1lZGlhLXNvdXJjZScgOiAnYWRkU291cmNlJ1xuXHRcdH0sIEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5ldmVudHMgKTtcblx0fSxcblxuXHRwcmVwYXJlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXy5kZWZhdWx0cyh7XG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbC50b0pTT04oKVxuXHRcdH0sIHRoaXMub3B0aW9ucyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYSBzZXR0aW5nJ3MgVUkgd2hlbiB0aGUgbW9kZWwgdW5zZXRzIGl0XG5cdCAqXG5cdCAqIEBmaXJlcyB3cC5tZWRpYS52aWV3Lk1lZGlhRGV0YWlscyNtZWRpYTpzZXR0aW5nOnJlbW92ZVxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBlXG5cdCAqL1xuXHRyZW1vdmVTZXR0aW5nIDogZnVuY3Rpb24oZSkge1xuXHRcdHZhciB3cmFwID0gJCggZS5jdXJyZW50VGFyZ2V0ICkucGFyZW50KCksIHNldHRpbmc7XG5cdFx0c2V0dGluZyA9IHdyYXAuZmluZCggJ2lucHV0JyApLmRhdGEoICdzZXR0aW5nJyApO1xuXG5cdFx0aWYgKCBzZXR0aW5nICkge1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldCggc2V0dGluZyApO1xuXHRcdFx0dGhpcy50cmlnZ2VyKCAnbWVkaWE6c2V0dGluZzpyZW1vdmUnLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0d3JhcC5yZW1vdmUoKTtcblx0fSxcblxuXHQvKipcblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzI21lZGlhOnNldHRpbmc6cmVtb3ZlXG5cdCAqL1xuXHRzZXRUcmFja3MgOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdHJhY2tzID0gJyc7XG5cblx0XHRfLmVhY2goIHRoaXMuJCgnLmNvbnRlbnQtdHJhY2snKSwgZnVuY3Rpb24odHJhY2spIHtcblx0XHRcdHRyYWNrcyArPSAkKCB0cmFjayApLnZhbCgpO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KCAnY29udGVudCcsIHRyYWNrcyApO1xuXHRcdHRoaXMudHJpZ2dlciggJ21lZGlhOnNldHRpbmc6cmVtb3ZlJywgdGhpcyApO1xuXHR9LFxuXG5cdGFkZFNvdXJjZSA6IGZ1bmN0aW9uKCBlICkge1xuXHRcdHRoaXMuY29udHJvbGxlci5sYXN0TWltZSA9ICQoIGUuY3VycmVudFRhcmdldCApLmRhdGEoICdtaW1lJyApO1xuXHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggJ2FkZC0nICsgdGhpcy5jb250cm9sbGVyLmRlZmF1bHRzLmlkICsgJy1zb3VyY2UnICk7XG5cdH0sXG5cblx0bG9hZFBsYXllcjogZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMucGxheWVycy5wdXNoKCBuZXcgTWVkaWFFbGVtZW50UGxheWVyKCB0aGlzLm1lZGlhLCB0aGlzLnNldHRpbmdzICkgKTtcblx0XHR0aGlzLnNjcmlwdFhociA9IGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIE1lZGlhRWxlbWVudFBsYXllclxuXHQgKi9cblx0c2V0UGxheWVyIDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGJhc2VTZXR0aW5ncywgc3JjO1xuXG5cdFx0aWYgKCB0aGlzLnBsYXllcnMubGVuZ3RoIHx8ICEgdGhpcy5tZWRpYSB8fCB0aGlzLnNjcmlwdFhociApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzcmMgPSB0aGlzLm1vZGVsLmdldCggJ3NyYycgKTtcblxuXHRcdGlmICggc3JjICYmIHNyYy5pbmRleE9mKCAndmltZW8nICkgPiAtMSAmJiAhICggJ0Zyb29nYWxvb3AnIGluIHdpbmRvdyApICkge1xuXHRcdFx0YmFzZVNldHRpbmdzID0gd3AubWVkaWEubWl4aW4ubWVqc1NldHRpbmdzO1xuXHRcdFx0dGhpcy5zY3JpcHRYaHIgPSAkLmdldFNjcmlwdCggYmFzZVNldHRpbmdzLnBsdWdpblBhdGggKyAnZnJvb2dhbG9vcC5taW4uanMnLCBfLmJpbmQoIHRoaXMubG9hZFBsYXllciwgdGhpcyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubG9hZFBsYXllcigpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQGFic3RyYWN0XG5cdCAqL1xuXHRzZXRNZWRpYSA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHN1Y2Nlc3MgOiBmdW5jdGlvbihtZWpzKSB7XG5cdFx0dmFyIGF1dG9wbGF5ID0gbWVqcy5hdHRyaWJ1dGVzLmF1dG9wbGF5ICYmICdmYWxzZScgIT09IG1lanMuYXR0cmlidXRlcy5hdXRvcGxheTtcblxuXHRcdGlmICggJ2ZsYXNoJyA9PT0gbWVqcy5wbHVnaW5UeXBlICYmIGF1dG9wbGF5ICkge1xuXHRcdFx0bWVqcy5hZGRFdmVudExpc3RlbmVyKCAnY2FucGxheScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRtZWpzLnBsYXkoKTtcblx0XHRcdH0sIGZhbHNlICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tZWpzID0gbWVqcztcblx0fSxcblxuXHQvKipcblx0ICogQHJldHVybnMge21lZGlhLnZpZXcuTWVkaWFEZXRhaWxzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdHNldFRpbWVvdXQoIF8uYmluZCggZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLnJlc2V0Rm9jdXMoKTtcblx0XHR9LCB0aGlzICksIDEwICk7XG5cblx0XHR0aGlzLnNldHRpbmdzID0gXy5kZWZhdWx0cygge1xuXHRcdFx0c3VjY2VzcyA6IHRoaXMuc3VjY2Vzc1xuXHRcdH0sIHdwLm1lZGlhLm1peGluLm1lanNTZXR0aW5ncyApO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0TWVkaWEoKTtcblx0fSxcblxuXHRyZXNldEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiQoICcuZW1iZWQtbWVkaWEtc2V0dGluZ3MnICkuc2Nyb2xsVG9wKCAwICk7XG5cdH1cbn0sIHtcblx0aW5zdGFuY2VzIDogMCxcblx0LyoqXG5cdCAqIFdoZW4gbXVsdGlwbGUgcGxheWVycyBpbiB0aGUgRE9NIGNvbnRhaW4gdGhlIHNhbWUgc3JjLCB0aGluZ3MgZ2V0IHdlaXJkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtXG5cdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cblx0ICovXG5cdHByZXBhcmVTcmMgOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgaSA9IE1lZGlhRGV0YWlscy5pbnN0YW5jZXMrKztcblx0XHRfLmVhY2goICQoIGVsZW0gKS5maW5kKCAnc291cmNlJyApLCBmdW5jdGlvbiggc291cmNlICkge1xuXHRcdFx0c291cmNlLnNyYyA9IFtcblx0XHRcdFx0c291cmNlLnNyYyxcblx0XHRcdFx0c291cmNlLnNyYy5pbmRleE9mKCc/JykgPiAtMSA/ICcmJyA6ICc/Jyxcblx0XHRcdFx0J189Jyxcblx0XHRcdFx0aVxuXHRcdFx0XS5qb2luKCcnKTtcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVkaWFEZXRhaWxzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlZpZGVvRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIE1lZGlhRGV0YWlscyA9IHdwLm1lZGlhLnZpZXcuTWVkaWFEZXRhaWxzLFxuXHRWaWRlb0RldGFpbHM7XG5cblZpZGVvRGV0YWlscyA9IE1lZGlhRGV0YWlscy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICd2aWRlby1kZXRhaWxzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgndmlkZW8tZGV0YWlscycpLFxuXG5cdHNldE1lZGlhOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlkZW8gPSB0aGlzLiQoJy53cC12aWRlby1zaG9ydGNvZGUnKTtcblxuXHRcdGlmICggdmlkZW8uZmluZCggJ3NvdXJjZScgKS5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIHZpZGVvLmlzKCc6aGlkZGVuJykgKSB7XG5cdFx0XHRcdHZpZGVvLnNob3coKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIHZpZGVvLmhhc0NsYXNzKCAneW91dHViZS12aWRlbycgKSAmJiAhIHZpZGVvLmhhc0NsYXNzKCAndmltZW8tdmlkZW8nICkgKSB7XG5cdFx0XHRcdHRoaXMubWVkaWEgPSBNZWRpYURldGFpbHMucHJlcGFyZVNyYyggdmlkZW8uZ2V0KDApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLm1lZGlhID0gdmlkZW8uZ2V0KDApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWRlby5oaWRlKCk7XG5cdFx0XHR0aGlzLm1lZGlhID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvRGV0YWlscztcbiJdfQ==
  • src/wp-includes/js/media-grid.js

    diff --git src/wp-includes/js/media-grid.js src/wp-includes/js/media-grid.js
    index edf429e896..b5053eb782 100644
    Manage = MediaFrame.extend({ 
    861861
    862862module.exports = Manage;
    863863
    864 },{}]},{},[2]);
     864},{}]},{},[2])
     865//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvZWRpdC1hdHRhY2htZW50LW1ldGFkYXRhLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2dyaWQubWFuaWZlc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvcm91dGVycy9tYW5hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9kZXRhaWxzLXR3by1jb2x1bW4uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYnV0dG9uL2RlbGV0ZS1zZWxlY3RlZC1wZXJtYW5lbnRseS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9idXR0b24vZGVsZXRlLXNlbGVjdGVkLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2J1dHRvbi9zZWxlY3QtbW9kZS10b2dnbGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZWRpdC1pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL2VkaXQtYXR0YWNobWVudHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvbWFuYWdlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuRWRpdEF0dGFjaG1lbnRNZXRhZGF0YVxuICpcbiAqIEEgc3RhdGUgZm9yIGVkaXRpbmcgYW4gYXR0YWNobWVudCdzIG1ldGFkYXRhLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0RWRpdEF0dGFjaG1lbnRNZXRhZGF0YTtcblxuRWRpdEF0dGFjaG1lbnRNZXRhZGF0YSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAnZWRpdC1hdHRhY2htZW50Jyxcblx0XHQvLyBUaXRsZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbiB2aWV3LlxuXHRcdHRpdGxlOiAgIGwxMG4uYXR0YWNobWVudERldGFpbHMsXG5cdFx0Ly8gUmVnaW9uIG1vZGUgZGVmYXVsdHMuXG5cdFx0Y29udGVudDogJ2VkaXQtbWV0YWRhdGEnLFxuXHRcdG1lbnU6ICAgIGZhbHNlLFxuXHRcdHRvb2xiYXI6IGZhbHNlLFxuXHRcdHJvdXRlcjogIGZhbHNlXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVkaXRBdHRhY2htZW50TWV0YWRhdGE7XG4iLCJ2YXIgbWVkaWEgPSB3cC5tZWRpYTtcblxubWVkaWEuY29udHJvbGxlci5FZGl0QXR0YWNobWVudE1ldGFkYXRhID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvZWRpdC1hdHRhY2htZW50LW1ldGFkYXRhLmpzJyApO1xubWVkaWEudmlldy5NZWRpYUZyYW1lLk1hbmFnZSA9IHJlcXVpcmUoICcuL3ZpZXdzL2ZyYW1lL21hbmFnZS5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzLlR3b0NvbHVtbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQvZGV0YWlscy10d28tY29sdW1uLmpzJyApO1xubWVkaWEudmlldy5NZWRpYUZyYW1lLk1hbmFnZS5Sb3V0ZXIgPSByZXF1aXJlKCAnLi9yb3V0ZXJzL21hbmFnZS5qcycgKTtcbm1lZGlhLnZpZXcuRWRpdEltYWdlLkRldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9lZGl0LWltYWdlLWRldGFpbHMuanMnICk7XG5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuRWRpdEF0dGFjaG1lbnRzID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvZWRpdC1hdHRhY2htZW50cy5qcycgKTtcbm1lZGlhLnZpZXcuU2VsZWN0TW9kZVRvZ2dsZUJ1dHRvbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2J1dHRvbi9zZWxlY3QtbW9kZS10b2dnbGUuanMnICk7XG5tZWRpYS52aWV3LkRlbGV0ZVNlbGVjdGVkQnV0dG9uID0gcmVxdWlyZSggJy4vdmlld3MvYnV0dG9uL2RlbGV0ZS1zZWxlY3RlZC5qcycgKTtcbm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseUJ1dHRvbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2J1dHRvbi9kZWxldGUtc2VsZWN0ZWQtcGVybWFuZW50bHkuanMnICk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5NYW5hZ2UuUm91dGVyXG4gKlxuICogQSByb3V0ZXIgZm9yIGhhbmRsaW5nIHRoZSBicm93c2VyIGhpc3RvcnkgYW5kIGFwcGxpY2F0aW9uIHN0YXRlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIEJhY2tib25lLlJvdXRlclxuICovXG52YXIgUm91dGVyID0gQmFja2JvbmUuUm91dGVyLmV4dGVuZCh7XG5cdHJvdXRlczoge1xuXHRcdCd1cGxvYWQucGhwP2l0ZW09OnNsdWcnOiAgICAnc2hvd0l0ZW0nLFxuXHRcdCd1cGxvYWQucGhwP3NlYXJjaD06cXVlcnknOiAnc2VhcmNoJ1xuXHR9LFxuXG5cdC8vIE1hcCByb3V0ZXMgYWdhaW5zdCB0aGUgcGFnZSBVUkxcblx0YmFzZVVybDogZnVuY3Rpb24oIHVybCApIHtcblx0XHRyZXR1cm4gJ3VwbG9hZC5waHAnICsgdXJsO1xuXHR9LFxuXG5cdC8vIFJlc3BvbmQgdG8gdGhlIHNlYXJjaCByb3V0ZSBieSBmaWxsaW5nIHRoZSBzZWFyY2ggZmllbGQgYW5kIHRyaWdnZ2VyaW5nIHRoZSBpbnB1dCBldmVudFxuXHRzZWFyY2g6IGZ1bmN0aW9uKCBxdWVyeSApIHtcblx0XHRqUXVlcnkoICcjbWVkaWEtc2VhcmNoLWlucHV0JyApLnZhbCggcXVlcnkgKS50cmlnZ2VyKCAnaW5wdXQnICk7XG5cdH0sXG5cblx0Ly8gU2hvdyB0aGUgbW9kYWwgd2l0aCBhIHNwZWNpZmljIGl0ZW1cblx0c2hvd0l0ZW06IGZ1bmN0aW9uKCBxdWVyeSApIHtcblx0XHR2YXIgbWVkaWEgPSB3cC5tZWRpYSxcblx0XHRcdGxpYnJhcnkgPSBtZWRpYS5mcmFtZS5zdGF0ZSgpLmdldCgnbGlicmFyeScpLFxuXHRcdFx0aXRlbTtcblxuXHRcdC8vIFRyaWdnZXIgdGhlIG1lZGlhIGZyYW1lIHRvIG9wZW4gdGhlIGNvcnJlY3QgaXRlbVxuXHRcdGl0ZW0gPSBsaWJyYXJ5LmZpbmRXaGVyZSggeyBpZDogcGFyc2VJbnQoIHF1ZXJ5LCAxMCApIH0gKTtcblx0XHRpZiAoIGl0ZW0gKSB7XG5cdFx0XHRtZWRpYS5mcmFtZS50cmlnZ2VyKCAnZWRpdDphdHRhY2htZW50JywgaXRlbSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpdGVtID0gbWVkaWEuYXR0YWNobWVudCggcXVlcnkgKTtcblx0XHRcdG1lZGlhLmZyYW1lLmxpc3RlblRvKCBpdGVtLCAnY2hhbmdlJywgZnVuY3Rpb24oIG1vZGVsICkge1xuXHRcdFx0XHRtZWRpYS5mcmFtZS5zdG9wTGlzdGVuaW5nKCBpdGVtICk7XG5cdFx0XHRcdG1lZGlhLmZyYW1lLnRyaWdnZXIoICdlZGl0OmF0dGFjaG1lbnQnLCBtb2RlbCApO1xuXHRcdFx0fSApO1xuXHRcdFx0aXRlbS5mZXRjaCgpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUm91dGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRGV0YWlscy5Ud29Db2x1bW5cbiAqXG4gKiBBIHNpbWlsYXIgdmlldyB0byBtZWRpYS52aWV3LkF0dGFjaG1lbnQuRGV0YWlsc1xuICogZm9yIHVzZSBpbiB0aGUgRWRpdCBBdHRhY2htZW50IG1vZGFsLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5EZXRhaWxzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBEZXRhaWxzID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHMsXG5cdFR3b0NvbHVtbjtcblxuVHdvQ29sdW1uID0gRGV0YWlscy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogd3AudGVtcGxhdGUoICdhdHRhY2htZW50LWRldGFpbHMtdHdvLWNvbHVtbicgKSxcblxuXHRlZGl0QXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5jb250cm9sbGVyLmNvbnRlbnQubW9kZSggJ2VkaXQtaW1hZ2UnICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE5vb3AgdGhpcyBmcm9tIHBhcmVudCBjbGFzcywgZG9lc24ndCBhcHBseSBoZXJlLlxuXHQgKi9cblx0dG9nZ2xlU2VsZWN0aW9uSGFuZGxlcjogZnVuY3Rpb24oKSB7fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdERldGFpbHMucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHR3cC5tZWRpYS5taXhpbi5yZW1vdmVBbGxQbGF5ZXJzKCk7XG5cdFx0dGhpcy4kKCAnYXVkaW8sIHZpZGVvJyApLmVhY2goIGZ1bmN0aW9uIChpLCBlbGVtKSB7XG5cdFx0XHR2YXIgZWwgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRGV0YWlscy5wcmVwYXJlU3JjKCBlbGVtICk7XG5cdFx0XHRuZXcgd2luZG93Lk1lZGlhRWxlbWVudFBsYXllciggZWwsIHdwLm1lZGlhLm1peGluLm1lanNTZXR0aW5ncyApO1xuXHRcdH0gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVHdvQ29sdW1uO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkRlbGV0ZVNlbGVjdGVkUGVybWFuZW50bHlCdXR0b25cbiAqXG4gKiBXaGVuIE1FRElBX1RSQVNIIGlzIHRydWUsIGEgYnV0dG9uIHRoYXQgaGFuZGxlcyBidWxrIERlbGV0ZSBQZXJtYW5lbnRseSBsb2dpY1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRCdXR0b25cbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkJ1dHRvblxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQnV0dG9uID0gd3AubWVkaWEudmlldy5CdXR0b24sXG5cdERlbGV0ZVNlbGVjdGVkID0gd3AubWVkaWEudmlldy5EZWxldGVTZWxlY3RlZEJ1dHRvbixcblx0RGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseTtcblxuRGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseSA9IERlbGV0ZVNlbGVjdGVkLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdERlbGV0ZVNlbGVjdGVkLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdzZWxlY3Q6YWN0aXZhdGUnLCB0aGlzLnNlbGVjdEFjdGl2YXRlLCB0aGlzICk7XG5cdFx0dGhpcy5jb250cm9sbGVyLm9uKCAnc2VsZWN0OmRlYWN0aXZhdGUnLCB0aGlzLnNlbGVjdERlYWN0aXZhdGUsIHRoaXMgKTtcblx0fSxcblxuXHRmaWx0ZXJDaGFuZ2U6IGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHR0aGlzLmNhblNob3cgPSAoICd0cmFzaCcgPT09IG1vZGVsLmdldCggJ3N0YXR1cycgKSApO1xuXHR9LFxuXG5cdHNlbGVjdEFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRvZ2dsZURpc2FibGVkKCk7XG5cdFx0dGhpcy4kZWwudG9nZ2xlQ2xhc3MoICdoaWRkZW4nLCAhIHRoaXMuY2FuU2hvdyApO1xuXHR9LFxuXG5cdHNlbGVjdERlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlRGlzYWJsZWQoKTtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLnNlbGVjdEFjdGl2YXRlKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlbGV0ZVNlbGVjdGVkUGVybWFuZW50bHk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRCdXR0b25cbiAqXG4gKiBBIGJ1dHRvbiB0aGF0IGhhbmRsZXMgYnVsayBEZWxldGUvVHJhc2ggbG9naWNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkJ1dHRvblxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQnV0dG9uID0gd3AubWVkaWEudmlldy5CdXR0b24sXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdERlbGV0ZVNlbGVjdGVkO1xuXG5EZWxldGVTZWxlY3RlZCA9IEJ1dHRvbi5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRCdXR0b24ucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdGlmICggdGhpcy5vcHRpb25zLmZpbHRlcnMgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuZmlsdGVycy5tb2RlbC5vbiggJ2NoYW5nZScsIHRoaXMuZmlsdGVyQ2hhbmdlLCB0aGlzICk7XG5cdFx0fVxuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ3NlbGVjdGlvbjp0b2dnbGUnLCB0aGlzLnRvZ2dsZURpc2FibGVkLCB0aGlzICk7XG5cdH0sXG5cblx0ZmlsdGVyQ2hhbmdlOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0aWYgKCAndHJhc2gnID09PSBtb2RlbC5nZXQoICdzdGF0dXMnICkgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCggJ3RleHQnLCBsMTBuLnVudHJhc2hTZWxlY3RlZCApO1xuXHRcdH0gZWxzZSBpZiAoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubWVkaWFUcmFzaCApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCAndGV4dCcsIGwxMG4udHJhc2hTZWxlY3RlZCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCggJ3RleHQnLCBsMTBuLmRlbGV0ZVNlbGVjdGVkICk7XG5cdFx0fVxuXHR9LFxuXG5cdHRvZ2dsZURpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCggJ2Rpc2FibGVkJywgISB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoICdzZWxlY3Rpb24nICkubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRCdXR0b24ucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnc2VsZWN0JyApICkge1xuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoICdkZWxldGUtc2VsZWN0ZWQtYnV0dG9uJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ2RlbGV0ZS1zZWxlY3RlZC1idXR0b24gaGlkZGVuJyApO1xuXHRcdH1cblx0XHR0aGlzLnRvZ2dsZURpc2FibGVkKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlbGV0ZVNlbGVjdGVkO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNlbGVjdE1vZGVUb2dnbGVCdXR0b25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkJ1dHRvblxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQnV0dG9uID0gd3AubWVkaWEudmlldy5CdXR0b24sXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFNlbGVjdE1vZGVUb2dnbGU7XG5cblNlbGVjdE1vZGVUb2dnbGUgPSBCdXR0b24uZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRzaXplIDogJydcblx0XHR9ICk7XG5cblx0XHRCdXR0b24ucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ3NlbGVjdDphY3RpdmF0ZSBzZWxlY3Q6ZGVhY3RpdmF0ZScsIHRoaXMudG9nZ2xlQnVsa0VkaXRIYW5kbGVyLCB0aGlzICk7XG5cdFx0dGhpcy5jb250cm9sbGVyLm9uKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJywgdGhpcy5iYWNrLCB0aGlzICk7XG5cdH0sXG5cblx0YmFjazogZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMuY29udHJvbGxlci5kZWFjdGl2YXRlTW9kZSggJ3NlbGVjdCcgKS5hY3RpdmF0ZU1vZGUoICdlZGl0JyApO1xuXHR9LFxuXG5cdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRCdXR0b24ucHJvdG90eXBlLmNsaWNrLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdzZWxlY3QnICkgKSB7XG5cdFx0XHR0aGlzLmJhY2soKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLmRlYWN0aXZhdGVNb2RlKCAnZWRpdCcgKS5hY3RpdmF0ZU1vZGUoICdzZWxlY3QnICk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0QnV0dG9uLnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnc2VsZWN0LW1vZGUtdG9nZ2xlLWJ1dHRvbicgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVCdWxrRWRpdEhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0b29sYmFyID0gdGhpcy5jb250cm9sbGVyLmNvbnRlbnQuZ2V0KCkudG9vbGJhciwgY2hpbGRyZW47XG5cblx0XHRjaGlsZHJlbiA9IHRvb2xiYXIuJCggJy5tZWRpYS10b29sYmFyLXNlY29uZGFyeSA+ICosIC5tZWRpYS10b29sYmFyLXByaW1hcnkgPiAqJyApO1xuXG5cdFx0Ly8gVE9ETzogdGhlIEZyYW1lIHNob3VsZCBiZSBkb2luZyBhbGwgb2YgdGhpcy5cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdzZWxlY3QnICkgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCgge1xuXHRcdFx0XHRzaXplOiAnbGFyZ2UnLFxuXHRcdFx0XHR0ZXh0OiBsMTBuLmNhbmNlbFNlbGVjdGlvblxuXHRcdFx0fSApO1xuXHRcdFx0Y2hpbGRyZW4ubm90KCAnLnNwaW5uZXIsIC5tZWRpYS1idXR0b24nICkuaGlkZSgpO1xuXHRcdFx0dGhpcy4kZWwuc2hvdygpO1xuXHRcdFx0dG9vbGJhci4kKCAnLmRlbGV0ZS1zZWxlY3RlZC1idXR0b24nICkucmVtb3ZlQ2xhc3MoICdoaWRkZW4nICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCB7XG5cdFx0XHRcdHNpemU6ICcnLFxuXHRcdFx0XHR0ZXh0OiBsMTBuLmJ1bGtTZWxlY3Rcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuY29udHJvbGxlci5jb250ZW50LmdldCgpLiRlbC5yZW1vdmVDbGFzcyggJ2ZpeGVkJyApO1xuXHRcdFx0dG9vbGJhci4kZWwuY3NzKCAnd2lkdGgnLCAnJyApO1xuXHRcdFx0dG9vbGJhci4kKCAnLmRlbGV0ZS1zZWxlY3RlZC1idXR0b24nICkuYWRkQ2xhc3MoICdoaWRkZW4nICk7XG5cdFx0XHRjaGlsZHJlbi5ub3QoICcubWVkaWEtYnV0dG9uJyApLnNob3coKTtcblx0XHRcdHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKS5yZXNldCgpO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0TW9kZVRvZ2dsZTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5FZGl0SW1hZ2UuRGV0YWlsc1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRWRpdEltYWdlXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0RWRpdEltYWdlID0gd3AubWVkaWEudmlldy5FZGl0SW1hZ2UsXG5cdERldGFpbHM7XG5cbkRldGFpbHMgPSBFZGl0SW1hZ2UuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5lZGl0b3IgPSB3aW5kb3cuaW1hZ2VFZGl0O1xuXHRcdHRoaXMuZnJhbWUgPSBvcHRpb25zLmZyYW1lO1xuXHRcdHRoaXMuY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlcjtcblx0XHRWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLmNvbnRlbnQubW9kZSggJ2VkaXQtbWV0YWRhdGEnICk7XG5cdH0sXG5cblx0c2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5mZXRjaCgpLmRvbmUoIF8uYmluZCggZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmZyYW1lLmNvbnRlbnQubW9kZSggJ2VkaXQtbWV0YWRhdGEnICk7XG5cdFx0fSwgdGhpcyApICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5FZGl0QXR0YWNobWVudHNcbiAqXG4gKiBBIGZyYW1lIGZvciBlZGl0aW5nIHRoZSBkZXRhaWxzIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS5cbiAqXG4gKiBPcGVucyBpbiBhIG1vZGFsIGJ5IGRlZmF1bHQuXG4gKlxuICogUmVxdWlyZXMgYW4gYXR0YWNobWVudCBtb2RlbCB0byBiZSBwYXNzZWQgaW4gdGhlIG9wdGlvbnMgaGFzaCB1bmRlciBgbW9kZWxgLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqIEBtaXhlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICovXG52YXIgRnJhbWUgPSB3cC5tZWRpYS52aWV3LkZyYW1lLFxuXHRNZWRpYUZyYW1lID0gd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLFxuXG5cdCQgPSBqUXVlcnksXG5cdEVkaXRBdHRhY2htZW50cztcblxuRWRpdEF0dGFjaG1lbnRzID0gTWVkaWFGcmFtZS5leHRlbmQoe1xuXG5cdGNsYXNzTmFtZTogJ2VkaXQtYXR0YWNobWVudC1mcmFtZScsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoICdlZGl0LWF0dGFjaG1lbnQtZnJhbWUnICksXG5cdHJlZ2lvbnM6ICAgWyAndGl0bGUnLCAnY29udGVudCcgXSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2sgLmxlZnQnOiAgJ3ByZXZpb3VzTWVkaWFJdGVtJyxcblx0XHQnY2xpY2sgLnJpZ2h0JzogJ25leHRNZWRpYUl0ZW0nXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0RnJhbWUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRtb2RhbDogdHJ1ZSxcblx0XHRcdHN0YXRlOiAnZWRpdC1hdHRhY2htZW50J1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5jb250cm9sbGVyID0gdGhpcy5vcHRpb25zLmNvbnRyb2xsZXI7XG5cdFx0dGhpcy5ncmlkUm91dGVyID0gdGhpcy5jb250cm9sbGVyLmdyaWRSb3V0ZXI7XG5cdFx0dGhpcy5saWJyYXJ5ID0gdGhpcy5vcHRpb25zLmxpYnJhcnk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5tb2RlbCApIHtcblx0XHRcdHRoaXMubW9kZWwgPSB0aGlzLm9wdGlvbnMubW9kZWw7XG5cdFx0fVxuXG5cdFx0dGhpcy5iaW5kSGFuZGxlcnMoKTtcblx0XHR0aGlzLmNyZWF0ZVN0YXRlcygpO1xuXHRcdHRoaXMuY3JlYXRlTW9kYWwoKTtcblxuXHRcdHRoaXMudGl0bGUubW9kZSggJ2RlZmF1bHQnICk7XG5cdFx0dGhpcy50b2dnbGVOYXYoKTtcblx0fSxcblxuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEJpbmQgZGVmYXVsdCB0aXRsZSBjcmVhdGlvbi5cblx0XHR0aGlzLm9uKCAndGl0bGU6Y3JlYXRlOmRlZmF1bHQnLCB0aGlzLmNyZWF0ZVRpdGxlLCB0aGlzICk7XG5cblx0XHQvLyBDbG9zZSB0aGUgbW9kYWwgaWYgdGhlIGF0dGFjaG1lbnQgaXMgZGVsZXRlZC5cblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOnN0YXR1cyBkZXN0cm95JywgdGhpcy5jbG9zZSwgdGhpcyApO1xuXG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6Y3JlYXRlOmVkaXQtbWV0YWRhdGEnLCB0aGlzLmVkaXRNZXRhZGF0YU1vZGUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY29udGVudDpjcmVhdGU6ZWRpdC1pbWFnZScsIHRoaXMuZWRpdEltYWdlTW9kZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjb250ZW50OnJlbmRlcjplZGl0LWltYWdlJywgdGhpcy5lZGl0SW1hZ2VNb2RlUmVuZGVyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2Nsb3NlJywgdGhpcy5kZXRhY2ggKTtcblx0fSxcblxuXHRjcmVhdGVNb2RhbDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSW5pdGlhbGl6ZSBtb2RhbCBjb250YWluZXIgdmlldy5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5tb2RhbCApIHtcblx0XHRcdHRoaXMubW9kYWwgPSBuZXcgd3AubWVkaWEudmlldy5Nb2RhbCh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRcdHRpdGxlOiAgICAgIHRoaXMub3B0aW9ucy50aXRsZVxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubW9kYWwub24oICdvcGVuJywgXy5iaW5kKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCQoICdib2R5JyApLm9uKCAna2V5ZG93bi5tZWRpYS1tb2RhbCcsIF8uYmluZCggdGhpcy5rZXlFdmVudCwgdGhpcyApICk7XG5cdFx0XHR9LCB0aGlzICkgKTtcblxuXHRcdFx0Ly8gQ29tcGxldGVseSBkZXN0cm95IHRoZSBtb2RhbCBET00gZWxlbWVudCB3aGVuIGNsb3NpbmcgaXQuXG5cdFx0XHR0aGlzLm1vZGFsLm9uKCAnY2xvc2UnLCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLm1vZGFsLnJlbW92ZSgpO1xuXHRcdFx0XHQkKCAnYm9keScgKS5vZmYoICdrZXlkb3duLm1lZGlhLW1vZGFsJyApOyAvKiByZW1vdmUgdGhlIGtleWRvd24gZXZlbnQgKi9cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZm9jdXMgaXRlbSBpZiBwb3NzaWJsZVxuXHRcdFx0XHQkKCAnbGkuYXR0YWNobWVudFtkYXRhLWlkPVwiJyArIHRoaXMubW9kZWwuZ2V0KCAnaWQnICkgKydcIl0nICkuZm9jdXMoKTtcblx0XHRcdFx0dGhpcy5yZXNldFJvdXRlKCk7XG5cdFx0XHR9LCB0aGlzICkgKTtcblxuXHRcdFx0Ly8gU2V0IHRoaXMgZnJhbWUgYXMgdGhlIG1vZGFsJ3MgY29udGVudC5cblx0XHRcdHRoaXMubW9kYWwuY29udGVudCggdGhpcyApO1xuXHRcdFx0dGhpcy5tb2RhbC5vcGVuKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGQgdGhlIGRlZmF1bHQgc3RhdGVzIHRvIHRoZSBmcmFtZS5cblx0ICovXG5cdGNyZWF0ZVN0YXRlczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdGF0ZXMuYWRkKFtcblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkVkaXRBdHRhY2htZW50TWV0YWRhdGEoIHsgbW9kZWw6IHRoaXMubW9kZWwgfSApXG5cdFx0XSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnRlbnQgcmVnaW9uIHJlbmRlcmluZyBjYWxsYmFjayBmb3IgdGhlIGBlZGl0LW1ldGFkYXRhYCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29udGVudFJlZ2lvbiBCYXNpYyBvYmplY3Qgd2l0aCBhIGB2aWV3YCBwcm9wZXJ0eSwgd2hpY2hcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB3aXRoIHRoZSBwcm9wZXIgcmVnaW9uIHZpZXcuXG5cdCAqL1xuXHRlZGl0TWV0YWRhdGFNb2RlOiBmdW5jdGlvbiggY29udGVudFJlZ2lvbiApIHtcblx0XHRjb250ZW50UmVnaW9uLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHMuVHdvQ29sdW1uKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogICAgICB0aGlzLm1vZGVsXG5cdFx0fSk7XG5cblx0XHQvKipcblx0XHQgKiBBdHRhY2ggYSBzdWJ2aWV3IHRvIGRpc3BsYXkgZmllbGRzIGFkZGVkIHZpYSB0aGVcblx0XHQgKiBgYXR0YWNobWVudF9maWVsZHNfdG9fZWRpdGAgZmlsdGVyLlxuXHRcdCAqL1xuXHRcdGNvbnRlbnRSZWdpb24udmlldy52aWV3cy5zZXQoICcuYXR0YWNobWVudC1jb21wYXQnLCBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50Q29tcGF0KHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogICAgICB0aGlzLm1vZGVsXG5cdFx0fSkgKTtcblxuXHRcdC8vIFVwZGF0ZSBicm93c2VyIHVybCB3aGVuIG5hdmlnYXRpbmcgbWVkaWEgZGV0YWlsc1xuXHRcdGlmICggdGhpcy5tb2RlbCApIHtcblx0XHRcdHRoaXMuZ3JpZFJvdXRlci5uYXZpZ2F0ZSggdGhpcy5ncmlkUm91dGVyLmJhc2VVcmwoICc/aXRlbT0nICsgdGhpcy5tb2RlbC5pZCApICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW5kZXIgdGhlIEVkaXRJbWFnZSB2aWV3IGludG8gdGhlIGZyYW1lJ3MgY29udGVudCByZWdpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZW50UmVnaW9uIEJhc2ljIG9iamVjdCB3aXRoIGEgYHZpZXdgIHByb3BlcnR5LCB3aGljaFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHdpdGggdGhlIHByb3BlciByZWdpb24gdmlldy5cblx0ICovXG5cdGVkaXRJbWFnZU1vZGU6IGZ1bmN0aW9uKCBjb250ZW50UmVnaW9uICkge1xuXHRcdHZhciBlZGl0SW1hZ2VDb250cm9sbGVyID0gbmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuRWRpdEltYWdlKCB7XG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCxcblx0XHRcdGZyYW1lOiB0aGlzXG5cdFx0fSApO1xuXHRcdC8vIE5vb3Agc29tZSBtZXRob2RzLlxuXHRcdGVkaXRJbWFnZUNvbnRyb2xsZXIuX3Rvb2xiYXIgPSBmdW5jdGlvbigpIHt9O1xuXHRcdGVkaXRJbWFnZUNvbnRyb2xsZXIuX3JvdXRlciA9IGZ1bmN0aW9uKCkge307XG5cdFx0ZWRpdEltYWdlQ29udHJvbGxlci5fbWVudSA9IGZ1bmN0aW9uKCkge307XG5cblx0XHRjb250ZW50UmVnaW9uLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5FZGl0SW1hZ2UuRGV0YWlscygge1xuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwsXG5cdFx0XHRmcmFtZTogdGhpcyxcblx0XHRcdGNvbnRyb2xsZXI6IGVkaXRJbWFnZUNvbnRyb2xsZXJcblx0XHR9ICk7XG5cdH0sXG5cblx0ZWRpdEltYWdlTW9kZVJlbmRlcjogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmlldy5vbiggJ3JlYWR5Jywgdmlldy5sb2FkRWRpdG9yICk7XG5cdH0sXG5cblx0dG9nZ2xlTmF2OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiQoJy5sZWZ0JykudG9nZ2xlQ2xhc3MoICdkaXNhYmxlZCcsICEgdGhpcy5oYXNQcmV2aW91cygpICk7XG5cdFx0dGhpcy4kKCcucmlnaHQnKS50b2dnbGVDbGFzcyggJ2Rpc2FibGVkJywgISB0aGlzLmhhc05leHQoKSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXJlbmRlciB0aGUgdmlldy5cblx0ICovXG5cdHJlcmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBPbmx5IHJlcmVuZGVyIHRoZSBgY29udGVudGAgcmVnaW9uLlxuXHRcdGlmICggdGhpcy5jb250ZW50Lm1vZGUoKSAhPT0gJ2VkaXQtbWV0YWRhdGEnICkge1xuXHRcdFx0dGhpcy5jb250ZW50Lm1vZGUoICdlZGl0LW1ldGFkYXRhJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbnRlbnQucmVuZGVyKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy50b2dnbGVOYXYoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2xpY2sgaGFuZGxlciB0byBzd2l0Y2ggdG8gdGhlIHByZXZpb3VzIG1lZGlhIGl0ZW0uXG5cdCAqL1xuXHRwcmV2aW91c01lZGlhSXRlbTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMuaGFzUHJldmlvdXMoKSApIHtcblx0XHRcdHRoaXMuJCggJy5sZWZ0JyApLmJsdXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5tb2RlbCA9IHRoaXMubGlicmFyeS5hdCggdGhpcy5nZXRDdXJyZW50SW5kZXgoKSAtIDEgKTtcblx0XHR0aGlzLnJlcmVuZGVyKCk7XG5cdFx0dGhpcy4kKCAnLmxlZnQnICkuZm9jdXMoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2xpY2sgaGFuZGxlciB0byBzd2l0Y2ggdG8gdGhlIG5leHQgbWVkaWEgaXRlbS5cblx0ICovXG5cdG5leHRNZWRpYUl0ZW06IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggISB0aGlzLmhhc05leHQoKSApIHtcblx0XHRcdHRoaXMuJCggJy5yaWdodCcgKS5ibHVyKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMubW9kZWwgPSB0aGlzLmxpYnJhcnkuYXQoIHRoaXMuZ2V0Q3VycmVudEluZGV4KCkgKyAxICk7XG5cdFx0dGhpcy5yZXJlbmRlcigpO1xuXHRcdHRoaXMuJCggJy5yaWdodCcgKS5mb2N1cygpO1xuXHR9LFxuXG5cdGdldEN1cnJlbnRJbmRleDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubGlicmFyeS5pbmRleE9mKCB0aGlzLm1vZGVsICk7XG5cdH0sXG5cblx0aGFzTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICggdGhpcy5nZXRDdXJyZW50SW5kZXgoKSArIDEgKSA8IHRoaXMubGlicmFyeS5sZW5ndGg7XG5cdH0sXG5cblx0aGFzUHJldmlvdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAoIHRoaXMuZ2V0Q3VycmVudEluZGV4KCkgLSAxICkgPiAtMTtcblx0fSxcblx0LyoqXG5cdCAqIFJlc3BvbmQgdG8gdGhlIGtleWJvYXJkIGV2ZW50czogcmlnaHQgYXJyb3csIGxlZnQgYXJyb3csIGV4Y2VwdCB3aGVuXG5cdCAqIGZvY3VzIGlzIGluIGEgdGV4dGFyZWEgb3IgaW5wdXQgZmllbGQuXG5cdCAqL1xuXHRrZXlFdmVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggKCAnSU5QVVQnID09PSBldmVudC50YXJnZXQubm9kZU5hbWUgfHwgJ1RFWFRBUkVBJyA9PT0gZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkgJiYgISAoIGV2ZW50LnRhcmdldC5yZWFkT25seSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBUaGUgcmlnaHQgYXJyb3cga2V5XG5cdFx0aWYgKCAzOSA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdHRoaXMubmV4dE1lZGlhSXRlbSgpO1xuXHRcdH1cblx0XHQvLyBUaGUgbGVmdCBhcnJvdyBrZXlcblx0XHRpZiAoIDM3ID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0dGhpcy5wcmV2aW91c01lZGlhSXRlbSgpO1xuXHRcdH1cblx0fSxcblxuXHRyZXNldFJvdXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdyaWRSb3V0ZXIubmF2aWdhdGUoIHRoaXMuZ3JpZFJvdXRlci5iYXNlVXJsKCAnJyApICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVkaXRBdHRhY2htZW50cztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLk1hbmFnZVxuICpcbiAqIEEgZ2VuZXJpYyBtYW5hZ2VtZW50IGZyYW1lIHdvcmtmbG93LlxuICpcbiAqIFVzZWQgaW4gdGhlIG1lZGlhIGdyaWQgdmlldy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIE1lZGlhRnJhbWUgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUsXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cblx0JCA9IEJhY2tib25lLiQsXG5cdE1hbmFnZTtcblxuTWFuYWdlID0gTWVkaWFGcmFtZS5leHRlbmQoe1xuXHQvKipcblx0ICogQGdsb2JhbCB3cC5VcGxvYWRlclxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHR0aXRsZTogICAgICcnLFxuXHRcdFx0bW9kYWw6ICAgICBmYWxzZSxcblx0XHRcdHNlbGVjdGlvbjogW10sXG5cdFx0XHRsaWJyYXJ5OiAgIHt9LCAvLyBPcHRpb25zIGhhc2ggZm9yIHRoZSBxdWVyeSB0byB0aGUgbWVkaWEgbGlicmFyeS5cblx0XHRcdG11bHRpcGxlOiAgJ2FkZCcsXG5cdFx0XHRzdGF0ZTogICAgICdsaWJyYXJ5Jyxcblx0XHRcdHVwbG9hZGVyOiAgdHJ1ZSxcblx0XHRcdG1vZGU6ICAgICAgWyAnZ3JpZCcsICdlZGl0JyBdXG5cdFx0fSk7XG5cblx0XHR0aGlzLiRib2R5ID0gJCggZG9jdW1lbnQuYm9keSApO1xuXHRcdHRoaXMuJHdpbmRvdyA9ICQoIHdpbmRvdyApO1xuXHRcdHRoaXMuJGFkbWluQmFyID0gJCggJyN3cGFkbWluYmFyJyApO1xuXHRcdC8vIFN0b3JlIHRoZSBBZGQgTmV3IGJ1dHRvbiBmb3IgbGF0ZXIgcmV1c2UgaW4gd3AubWVkaWEudmlldy5VcGxvYWRlcklubGluZS5cblx0XHR0aGlzLiR1cGxvYWRlclRvZ2dsZXIgPSAkKCAnLnBhZ2UtdGl0bGUtYWN0aW9uJyApXG5cdFx0XHQuYXR0ciggJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnIClcblx0XHRcdC5vbiggJ2NsaWNrJywgXy5iaW5kKCB0aGlzLmFkZE5ld0NsaWNrSGFuZGxlciwgdGhpcyApICk7XG5cblx0XHR0aGlzLiR3aW5kb3cub24oICdzY3JvbGwgcmVzaXplJywgXy5kZWJvdW5jZSggXy5iaW5kKCB0aGlzLmZpeFBvc2l0aW9uLCB0aGlzICksIDE1ICkgKTtcblxuXHRcdC8vIEVuc3VyZSBjb3JlIGFuZCBtZWRpYSBncmlkIHZpZXcgVUkgaXMgZW5hYmxlZC5cblx0XHR0aGlzLiRlbC5hZGRDbGFzcygnd3AtY29yZS11aScpO1xuXG5cdFx0Ly8gRm9yY2UgdGhlIHVwbG9hZGVyIG9mZiBpZiB0aGUgdXBsb2FkIGxpbWl0IGhhcyBiZWVuIGV4Y2VlZGVkIG9yXG5cdFx0Ly8gaWYgdGhlIGJyb3dzZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuXHRcdGlmICggd3AuVXBsb2FkZXIubGltaXRFeGNlZWRlZCB8fCAhIHdwLlVwbG9hZGVyLmJyb3dzZXIuc3VwcG9ydGVkICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnVwbG9hZGVyID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBhIHdpbmRvdy13aWRlIHVwbG9hZGVyLlxuXHRcdGlmICggdGhpcy5vcHRpb25zLnVwbG9hZGVyICkge1xuXHRcdFx0dGhpcy51cGxvYWRlciA9IG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVyV2luZG93KHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0dXBsb2FkZXI6IHtcblx0XHRcdFx0XHRkcm9wem9uZTogIGRvY3VtZW50LmJvZHksXG5cdFx0XHRcdFx0Y29udGFpbmVyOiBkb2N1bWVudC5ib2R5XG5cdFx0XHRcdH1cblx0XHRcdH0pLnJlbmRlcigpO1xuXHRcdFx0dGhpcy51cGxvYWRlci5yZWFkeSgpO1xuXHRcdFx0JCgnYm9keScpLmFwcGVuZCggdGhpcy51cGxvYWRlci5lbCApO1xuXG5cdFx0XHR0aGlzLm9wdGlvbnMudXBsb2FkZXIgPSBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmdyaWRSb3V0ZXIgPSBuZXcgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLk1hbmFnZS5Sb3V0ZXIoKTtcblxuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0TWVkaWFGcmFtZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHQvLyBBcHBlbmQgdGhlIGZyYW1lIHZpZXcgZGlyZWN0bHkgdGhlIHN1cHBsaWVkIGNvbnRhaW5lci5cblx0XHR0aGlzLiRlbC5hcHBlbmRUbyggdGhpcy5vcHRpb25zLmNvbnRhaW5lciApO1xuXG5cdFx0dGhpcy5jcmVhdGVTdGF0ZXMoKTtcblx0XHR0aGlzLmJpbmRSZWdpb25Nb2RlSGFuZGxlcnMoKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuYmluZFNlYXJjaEhhbmRsZXIoKTtcblx0fSxcblxuXHRiaW5kU2VhcmNoSGFuZGxlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlYXJjaCA9IHRoaXMuJCggJyNtZWRpYS1zZWFyY2gtaW5wdXQnICksXG5cdFx0XHRjdXJyZW50U2VhcmNoID0gdGhpcy5vcHRpb25zLmNvbnRhaW5lci5kYXRhKCAnc2VhcmNoJyApLFxuXHRcdFx0c2VhcmNoVmlldyA9IHRoaXMuYnJvd3NlclZpZXcudG9vbGJhci5nZXQoICdzZWFyY2gnICkuJGVsLFxuXHRcdFx0bGlzdE1vZGUgPSB0aGlzLiQoICcudmlldy1saXN0JyApLFxuXG5cdFx0XHRpbnB1dCAgPSBfLmRlYm91bmNlKCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHR2YXIgdmFsID0gJCggZS5jdXJyZW50VGFyZ2V0ICkudmFsKCksXG5cdFx0XHRcdFx0dXJsID0gJyc7XG5cblx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0dXJsICs9ICc/c2VhcmNoPScgKyB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5ncmlkUm91dGVyLm5hdmlnYXRlKCB0aGlzLmdyaWRSb3V0ZXIuYmFzZVVybCggdXJsICkgKTtcblx0XHRcdH0sIDEwMDAgKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgVVJMIHdoZW4gZW50ZXJpbmcgc2VhcmNoIHN0cmluZyAoYXQgbW9zdCBvbmNlIHBlciBzZWNvbmQpXG5cdFx0c2VhcmNoLm9uKCAnaW5wdXQnLCBfLmJpbmQoIGlucHV0LCB0aGlzICkgKTtcblx0XHRzZWFyY2hWaWV3LnZhbCggY3VycmVudFNlYXJjaCApLnRyaWdnZXIoICdpbnB1dCcgKTtcblxuXHRcdHRoaXMuZ3JpZFJvdXRlci5vbiggJ3JvdXRlOnNlYXJjaCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRpZiAoIGhyZWYuaW5kZXhPZiggJ21vZGU9JyApID4gLTEgKSB7XG5cdFx0XHRcdGhyZWYgPSBocmVmLnJlcGxhY2UoIC9tb2RlPVteJl0rL2csICdtb2RlPWxpc3QnICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRocmVmICs9IGhyZWYuaW5kZXhPZiggJz8nICkgPiAtMSA/ICcmbW9kZT1saXN0JyA6ICc/bW9kZT1saXN0Jztcblx0XHRcdH1cblx0XHRcdGhyZWYgPSBocmVmLnJlcGxhY2UoICdzZWFyY2g9JywgJ3M9JyApO1xuXHRcdFx0bGlzdE1vZGUucHJvcCggJ2hyZWYnLCBocmVmICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGRlZmF1bHQgc3RhdGVzIGZvciB0aGUgZnJhbWUuXG5cdCAqL1xuXHRjcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RhdGVzICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgZGVmYXVsdCBzdGF0ZXMuXG5cdFx0dGhpcy5zdGF0ZXMuYWRkKFtcblx0XHRcdG5ldyBMaWJyYXJ5KHtcblx0XHRcdFx0bGlicmFyeTogICAgICAgICAgICB3cC5tZWRpYS5xdWVyeSggb3B0aW9ucy5saWJyYXJ5ICksXG5cdFx0XHRcdG11bHRpcGxlOiAgICAgICAgICAgb3B0aW9ucy5tdWx0aXBsZSxcblx0XHRcdFx0dGl0bGU6ICAgICAgICAgICAgICBvcHRpb25zLnRpdGxlLFxuXHRcdFx0XHRjb250ZW50OiAgICAgICAgICAgICdicm93c2UnLFxuXHRcdFx0XHR0b29sYmFyOiAgICAgICAgICAgICdzZWxlY3QnLFxuXHRcdFx0XHRjb250ZW50VXNlclNldHRpbmc6IGZhbHNlLFxuXHRcdFx0XHRmaWx0ZXJhYmxlOiAgICAgICAgICdhbGwnLFxuXHRcdFx0XHRhdXRvU2VsZWN0OiAgICAgICAgIGZhbHNlXG5cdFx0XHR9KVxuXHRcdF0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBCaW5kIHJlZ2lvbiBtb2RlIGFjdGl2YXRpb24gZXZlbnRzIHRvIHByb3BlciBoYW5kbGVycy5cblx0ICovXG5cdGJpbmRSZWdpb25Nb2RlSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub24oICdjb250ZW50OmNyZWF0ZTpicm93c2UnLCB0aGlzLmJyb3dzZUNvbnRlbnQsIHRoaXMgKTtcblxuXHRcdC8vIEhhbmRsZSBhIGZyYW1lLWxldmVsIGV2ZW50IGZvciBlZGl0aW5nIGFuIGF0dGFjaG1lbnQuXG5cdFx0dGhpcy5vbiggJ2VkaXQ6YXR0YWNobWVudCcsIHRoaXMub3BlbkVkaXRBdHRhY2htZW50TW9kYWwsIHRoaXMgKTtcblxuXHRcdHRoaXMub24oICdzZWxlY3Q6YWN0aXZhdGUnLCB0aGlzLmJpbmRLZXlkb3duLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3NlbGVjdDpkZWFjdGl2YXRlJywgdGhpcy51bmJpbmRLZXlkb3duLCB0aGlzICk7XG5cdH0sXG5cblx0aGFuZGxlS2V5ZG93bjogZnVuY3Rpb24oIGUgKSB7XG5cdFx0aWYgKCAyNyA9PT0gZS53aGljaCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuZGVhY3RpdmF0ZU1vZGUoICdzZWxlY3QnICkuYWN0aXZhdGVNb2RlKCAnZWRpdCcgKTtcblx0XHR9XG5cdH0sXG5cblx0YmluZEtleWRvd246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGJvZHkub24oICdrZXlkb3duLnNlbGVjdCcsIF8uYmluZCggdGhpcy5oYW5kbGVLZXlkb3duLCB0aGlzICkgKTtcblx0fSxcblxuXHR1bmJpbmRLZXlkb3duOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRib2R5Lm9mZiggJ2tleWRvd24uc2VsZWN0JyApO1xuXHR9LFxuXG5cdGZpeFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGJyb3dzZXIsICR0b29sYmFyO1xuXHRcdGlmICggISB0aGlzLmlzTW9kZUFjdGl2ZSggJ3NlbGVjdCcgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkYnJvd3NlciA9IHRoaXMuJCgnLmF0dGFjaG1lbnRzLWJyb3dzZXInKTtcblx0XHQkdG9vbGJhciA9ICRicm93c2VyLmZpbmQoJy5tZWRpYS10b29sYmFyJyk7XG5cblx0XHQvLyBPZmZzZXQgZG9lc24ndCBhcHBlYXIgdG8gdGFrZSB0b3AgbWFyZ2luIGludG8gYWNjb3VudCwgaGVuY2UgKzE2XG5cdFx0aWYgKCAoICRicm93c2VyLm9mZnNldCgpLnRvcCArIDE2ICkgPCB0aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKCkgKyB0aGlzLiRhZG1pbkJhci5oZWlnaHQoKSApIHtcblx0XHRcdCRicm93c2VyLmFkZENsYXNzKCAnZml4ZWQnICk7XG5cdFx0XHQkdG9vbGJhci5jc3MoJ3dpZHRoJywgJGJyb3dzZXIud2lkdGgoKSArICdweCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkYnJvd3Nlci5yZW1vdmVDbGFzcyggJ2ZpeGVkJyApO1xuXHRcdFx0JHRvb2xiYXIuY3NzKCd3aWR0aCcsICcnKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENsaWNrIGhhbmRsZXIgZm9yIHRoZSBgQWRkIE5ld2AgYnV0dG9uLlxuXHQgKi9cblx0YWRkTmV3Q2xpY2tIYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLnRyaWdnZXIoICd0b2dnbGU6dXBsb2FkOmF0dGFjaG1lbnQnICk7XG5cblx0XHRpZiAoIHRoaXMudXBsb2FkZXIgKSB7XG5cdFx0XHR0aGlzLnVwbG9hZGVyLnJlZnJlc2goKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIE9wZW4gdGhlIEVkaXQgQXR0YWNobWVudCBtb2RhbC5cblx0ICovXG5cdG9wZW5FZGl0QXR0YWNobWVudE1vZGFsOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0Ly8gQ3JlYXRlIGEgbmV3IEVkaXRBdHRhY2htZW50IGZyYW1lLCBwYXNzaW5nIGFsb25nIHRoZSBsaWJyYXJ5IGFuZCB0aGUgYXR0YWNobWVudCBtb2RlbC5cblx0XHR3cC5tZWRpYSgge1xuXHRcdFx0ZnJhbWU6ICAgICAgICdlZGl0LWF0dGFjaG1lbnRzJyxcblx0XHRcdGNvbnRyb2xsZXI6ICB0aGlzLFxuXHRcdFx0bGlicmFyeTogICAgIHRoaXMuc3RhdGUoKS5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdG1vZGVsOiAgICAgICBtb2RlbFxuXHRcdH0gKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGF0dGFjaG1lbnRzIGJyb3dzZXIgdmlldyB3aXRoaW4gdGhlIGNvbnRlbnQgcmVnaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29udGVudFJlZ2lvbiBCYXNpYyBvYmplY3Qgd2l0aCBhIGB2aWV3YCBwcm9wZXJ0eSwgd2hpY2hcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB3aXRoIHRoZSBwcm9wZXIgcmVnaW9uIHZpZXcuXG5cdCAqIEB0aGlzIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG5cdCAqL1xuXHRicm93c2VDb250ZW50OiBmdW5jdGlvbiggY29udGVudFJlZ2lvbiApIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XG5cblx0XHQvLyBCcm93c2Ugb3VyIGxpYnJhcnkgb2YgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5icm93c2VyVmlldyA9IGNvbnRlbnRSZWdpb24udmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzQnJvd3Nlcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0Y29sbGVjdGlvbjogc3RhdGUuZ2V0KCdsaWJyYXJ5JyksXG5cdFx0XHRzZWxlY3Rpb246ICBzdGF0ZS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0bW9kZWw6ICAgICAgc3RhdGUsXG5cdFx0XHRzb3J0YWJsZTogICBzdGF0ZS5nZXQoJ3NvcnRhYmxlJyksXG5cdFx0XHRzZWFyY2g6ICAgICBzdGF0ZS5nZXQoJ3NlYXJjaGFibGUnKSxcblx0XHRcdGZpbHRlcnM6ICAgIHN0YXRlLmdldCgnZmlsdGVyYWJsZScpLFxuXHRcdFx0ZGF0ZTogICAgICAgc3RhdGUuZ2V0KCdkYXRlJyksXG5cdFx0XHRkaXNwbGF5OiAgICBzdGF0ZS5nZXQoJ2Rpc3BsYXlTZXR0aW5ncycpLFxuXHRcdFx0ZHJhZ0luZm86ICAgc3RhdGUuZ2V0KCdkcmFnSW5mbycpLFxuXHRcdFx0c2lkZWJhcjogICAgJ2Vycm9ycycsXG5cblx0XHRcdHN1Z2dlc3RlZFdpZHRoOiAgc3RhdGUuZ2V0KCdzdWdnZXN0ZWRXaWR0aCcpLFxuXHRcdFx0c3VnZ2VzdGVkSGVpZ2h0OiBzdGF0ZS5nZXQoJ3N1Z2dlc3RlZEhlaWdodCcpLFxuXG5cdFx0XHRBdHRhY2htZW50Vmlldzogc3RhdGUuZ2V0KCdBdHRhY2htZW50VmlldycpLFxuXG5cdFx0XHRzY3JvbGxFbGVtZW50OiBkb2N1bWVudFxuXHRcdH0pO1xuXHRcdHRoaXMuYnJvd3NlclZpZXcub24oICdyZWFkeScsIF8uYmluZCggdGhpcy5iaW5kRGVmZXJyZWQsIHRoaXMgKSApO1xuXG5cdFx0dGhpcy5lcnJvcnMgPSB3cC5VcGxvYWRlci5lcnJvcnM7XG5cdFx0dGhpcy5lcnJvcnMub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy5zaWRlYmFyVmlzaWJpbGl0eSwgdGhpcyApO1xuXHR9LFxuXG5cdHNpZGViYXJWaXNpYmlsaXR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJyb3dzZXJWaWV3LiQoICcubWVkaWEtc2lkZWJhcicgKS50b2dnbGUoICEhIHRoaXMuZXJyb3JzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGJpbmREZWZlcnJlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMuYnJvd3NlclZpZXcuZGZkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmJyb3dzZXJWaWV3LmRmZC5kb25lKCBfLmJpbmQoIHRoaXMuc3RhcnRIaXN0b3J5LCB0aGlzICkgKTtcblx0fSxcblxuXHRzdGFydEhpc3Rvcnk6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFZlcmlmeSBwdXNoU3RhdGUgc3VwcG9ydCBhbmQgYWN0aXZhdGVcblx0XHRpZiAoIHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSApIHtcblx0XHRcdGlmICggQmFja2JvbmUuSGlzdG9yeS5zdGFydGVkICkge1xuXHRcdFx0XHRCYWNrYm9uZS5oaXN0b3J5LnN0b3AoKTtcblx0XHRcdH1cblx0XHRcdEJhY2tib25lLmhpc3Rvcnkuc3RhcnQoIHtcblx0XHRcdFx0cm9vdDogd2luZG93Ll93cE1lZGlhR3JpZFNldHRpbmdzLmFkbWluVXJsLFxuXHRcdFx0XHRwdXNoU3RhdGU6IHRydWVcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hbmFnZTtcbiJdfQ==
  • src/wp-includes/js/media-models.js

    diff --git src/wp-includes/js/media-models.js src/wp-includes/js/media-models.js
    index f5683a939e..a3851a8220 100644
    Selection = Attachments.extend({ 
    15031503
    15041504module.exports = Selection;
    15051505
    1506 },{}]},{},[1]);
     1506},{}]},{},[1])
     1507//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzLm1hbmlmZXN0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL21vZGVscy9hdHRhY2htZW50LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL21vZGVscy9hdHRhY2htZW50cy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9tb2RlbHMvcG9zdC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9tb2RlbHMvcXVlcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvbW9kZWxzL3NlbGVjdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgJCA9IGpRdWVyeSxcblx0QXR0YWNobWVudCwgQXR0YWNobWVudHMsIGwxMG4sIG1lZGlhO1xuXG53aW5kb3cud3AgPSB3aW5kb3cud3AgfHwge307XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBtZWRpYSBmcmFtZS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBkZWZhdWx0IG1lZGlhIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbWFpbiBtZWRpYSBjb250cm9sbGVyLlxuICogQHJldHVybiB7d3AubWVkaWEudmlldy5NZWRpYUZyYW1lfSBBIG1lZGlhIHdvcmtmbG93LlxuICovXG5tZWRpYSA9IHdwLm1lZGlhID0gZnVuY3Rpb24oIGF0dHJpYnV0ZXMgKSB7XG5cdHZhciBNZWRpYUZyYW1lID0gbWVkaWEudmlldy5NZWRpYUZyYW1lLFxuXHRcdGZyYW1lO1xuXG5cdGlmICggISBNZWRpYUZyYW1lICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGF0dHJpYnV0ZXMgPSBfLmRlZmF1bHRzKCBhdHRyaWJ1dGVzIHx8IHt9LCB7XG5cdFx0ZnJhbWU6ICdzZWxlY3QnXG5cdH0pO1xuXG5cdGlmICggJ3NlbGVjdCcgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5TZWxlY3QgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5TZWxlY3QoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ3Bvc3QnID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuUG9zdCApIHtcblx0XHRmcmFtZSA9IG5ldyBNZWRpYUZyYW1lLlBvc3QoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ21hbmFnZScgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5NYW5hZ2UgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5NYW5hZ2UoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ2ltYWdlJyA9PT0gYXR0cmlidXRlcy5mcmFtZSAmJiBNZWRpYUZyYW1lLkltYWdlRGV0YWlscyApIHtcblx0XHRmcmFtZSA9IG5ldyBNZWRpYUZyYW1lLkltYWdlRGV0YWlscyggYXR0cmlidXRlcyApO1xuXHR9IGVsc2UgaWYgKCAnYXVkaW8nID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzICkge1xuXHRcdGZyYW1lID0gbmV3IE1lZGlhRnJhbWUuQXVkaW9EZXRhaWxzKCBhdHRyaWJ1dGVzICk7XG5cdH0gZWxzZSBpZiAoICd2aWRlbycgPT09IGF0dHJpYnV0ZXMuZnJhbWUgJiYgTWVkaWFGcmFtZS5WaWRlb0RldGFpbHMgKSB7XG5cdFx0ZnJhbWUgPSBuZXcgTWVkaWFGcmFtZS5WaWRlb0RldGFpbHMoIGF0dHJpYnV0ZXMgKTtcblx0fSBlbHNlIGlmICggJ2VkaXQtYXR0YWNobWVudHMnID09PSBhdHRyaWJ1dGVzLmZyYW1lICYmIE1lZGlhRnJhbWUuRWRpdEF0dGFjaG1lbnRzICkge1xuXHRcdGZyYW1lID0gbmV3IE1lZGlhRnJhbWUuRWRpdEF0dGFjaG1lbnRzKCBhdHRyaWJ1dGVzICk7XG5cdH1cblxuXHRkZWxldGUgYXR0cmlidXRlcy5mcmFtZTtcblxuXHRtZWRpYS5mcmFtZSA9IGZyYW1lO1xuXG5cdHJldHVybiBmcmFtZTtcbn07XG5cbl8uZXh0ZW5kKCBtZWRpYSwgeyBtb2RlbDoge30sIHZpZXc6IHt9LCBjb250cm9sbGVyOiB7fSwgZnJhbWVzOiB7fSB9KTtcblxuLy8gTGluayBhbnkgbG9jYWxpemVkIHN0cmluZ3MuXG5sMTBuID0gbWVkaWEubW9kZWwubDEwbiA9IHdpbmRvdy5fd3BNZWRpYU1vZGVsc0wxMG4gfHwge307XG5cbi8vIExpbmsgYW55IHNldHRpbmdzLlxubWVkaWEubW9kZWwuc2V0dGluZ3MgPSBsMTBuLnNldHRpbmdzIHx8IHt9O1xuZGVsZXRlIGwxMG4uc2V0dGluZ3M7XG5cbkF0dGFjaG1lbnQgPSBtZWRpYS5tb2RlbC5BdHRhY2htZW50ID0gcmVxdWlyZSggJy4vbW9kZWxzL2F0dGFjaG1lbnQuanMnICk7XG5BdHRhY2htZW50cyA9IG1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzID0gcmVxdWlyZSggJy4vbW9kZWxzL2F0dGFjaG1lbnRzLmpzJyApO1xuXG5tZWRpYS5tb2RlbC5RdWVyeSA9IHJlcXVpcmUoICcuL21vZGVscy9xdWVyeS5qcycgKTtcbm1lZGlhLm1vZGVsLlBvc3RJbWFnZSA9IHJlcXVpcmUoICcuL21vZGVscy9wb3N0LWltYWdlLmpzJyApO1xubWVkaWEubW9kZWwuU2VsZWN0aW9uID0gcmVxdWlyZSggJy4vbW9kZWxzL3NlbGVjdGlvbi5qcycgKTtcblxuLyoqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFVUSUxJVElFU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBBIGJhc2ljIGVxdWFsaXR5IGNvbXBhcmF0b3IgZm9yIEJhY2tib25lIG1vZGVscy5cbiAqXG4gKiBVc2VkIHRvIG9yZGVyIG1vZGVscyB3aXRoaW4gYSBjb2xsZWN0aW9uIC0gQHNlZSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50cy5jb21wYXJhdG9yKCkuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICBhICBUaGUgcHJpbWFyeSBwYXJhbWV0ZXIgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSAge21peGVkfSAgYiAgVGhlIHByaW1hcnkgcGFyYW1ldGVyIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGFjIFRoZSBmYWxsYmFjayBwYXJhbWV0ZXIgdG8gY29tcGFyZSwgYSdzIGNpZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gYmMgVGhlIGZhbGxiYWNrIHBhcmFtZXRlciB0byBjb21wYXJlLCBiJ3MgY2lkLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAtMTogYSBzaG91bGQgY29tZSBiZWZvcmUgYi5cbiAqICAgICAgICAgICAgICAgICAgICAgIDA6IGEgYW5kIGIgYXJlIG9mIHRoZSBzYW1lIHJhbmsuXG4gKiAgICAgICAgICAgICAgICAgICAgICAxOiBiIHNob3VsZCBjb21lIGJlZm9yZSBhLlxuICovXG5tZWRpYS5jb21wYXJlID0gZnVuY3Rpb24oIGEsIGIsIGFjLCBiYyApIHtcblx0aWYgKCBfLmlzRXF1YWwoIGEsIGIgKSApIHtcblx0XHRyZXR1cm4gYWMgPT09IGJjID8gMCA6IChhYyA+IGJjID8gLTEgOiAxKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYSA+IGIgPyAtMSA6IDE7XG5cdH1cbn07XG5cbl8uZXh0ZW5kKCBtZWRpYSwge1xuXHQvKipcblx0ICogbWVkaWEudGVtcGxhdGUoIGlkIClcblx0ICpcblx0ICogRmV0Y2ggYSBKYXZhU2NyaXB0IHRlbXBsYXRlIGZvciBhbiBpZCwgYW5kIHJldHVybiBhIHRlbXBsYXRpbmcgZnVuY3Rpb24gZm9yIGl0LlxuXHQgKlxuXHQgKiBTZWUgd3AudGVtcGxhdGUoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLnRlbXBsYXRlIGFzIHRlbXBsYXRlXG5cdCAqL1xuXHR0ZW1wbGF0ZTogd3AudGVtcGxhdGUsXG5cblx0LyoqXG5cdCAqIG1lZGlhLnBvc3QoIFthY3Rpb25dLCBbZGF0YV0gKVxuXHQgKlxuXHQgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBXb3JkUHJlc3MuXG5cdCAqIFNlZSB3cC5hamF4LnBvc3QoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLmFqYXgucG9zdCBhcyBwb3N0XG5cdCAqL1xuXHRwb3N0OiB3cC5hamF4LnBvc3QsXG5cblx0LyoqXG5cdCAqIG1lZGlhLmFqYXgoIFthY3Rpb25dLCBbb3B0aW9uc10gKVxuXHQgKlxuXHQgKiBTZW5kcyBhbiBYSFIgcmVxdWVzdCB0byBXb3JkUHJlc3MuXG5cdCAqIFNlZSB3cC5hamF4LnNlbmQoKSBpbiBgd3AtaW5jbHVkZXMvanMvd3AtdXRpbC5qc2AuXG5cdCAqXG5cdCAqIEBib3Jyb3dzIHdwLmFqYXguc2VuZCBhcyBhamF4XG5cdCAqL1xuXHRhamF4OiB3cC5hamF4LnNlbmQsXG5cblx0LyoqXG5cdCAqIFNjYWxlcyBhIHNldCBvZiBkaW1lbnNpb25zIHRvIGZpdCB3aXRoaW4gYm91bmRpbmcgZGltZW5zaW9ucy5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGRpbWVuc2lvbnNcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdGZpdDogZnVuY3Rpb24oIGRpbWVuc2lvbnMgKSB7XG5cdFx0dmFyIHdpZHRoICAgICA9IGRpbWVuc2lvbnMud2lkdGgsXG5cdFx0XHRoZWlnaHQgICAgPSBkaW1lbnNpb25zLmhlaWdodCxcblx0XHRcdG1heFdpZHRoICA9IGRpbWVuc2lvbnMubWF4V2lkdGgsXG5cdFx0XHRtYXhIZWlnaHQgPSBkaW1lbnNpb25zLm1heEhlaWdodCxcblx0XHRcdGNvbnN0cmFpbnQ7XG5cblx0XHQvLyBDb21wYXJlIHJhdGlvcyBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIHRvIGRldGVybWluZSB3aGljaFxuXHRcdC8vIG1heCB0byBjb25zdHJhaW4gYnkuIElmIGEgbWF4IHZhbHVlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhlXG5cdFx0Ly8gb3Bwb3NpdGUgc2lkZSBpcyB0aGUgY29uc3RyYWludC5cblx0XHRpZiAoICEgXy5pc1VuZGVmaW5lZCggbWF4V2lkdGggKSAmJiAhIF8uaXNVbmRlZmluZWQoIG1heEhlaWdodCApICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICggd2lkdGggLyBoZWlnaHQgPiBtYXhXaWR0aCAvIG1heEhlaWdodCApID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXHRcdH0gZWxzZSBpZiAoIF8uaXNVbmRlZmluZWQoIG1heEhlaWdodCApICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICd3aWR0aCc7XG5cdFx0fSBlbHNlIGlmICggIF8uaXNVbmRlZmluZWQoIG1heFdpZHRoICkgJiYgaGVpZ2h0ID4gbWF4SGVpZ2h0ICkge1xuXHRcdFx0Y29uc3RyYWludCA9ICdoZWlnaHQnO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RyYWluZWQgc2lkZSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4LFxuXHRcdC8vIHRoZW4gc2NhbGUgdGhlIHZhbHVlcy4gT3RoZXJ3aXNlIHJldHVybiB0aGUgb3JpZ2luYWxzOyB0aGV5IGZpdC5cblx0XHRpZiAoICd3aWR0aCcgPT09IGNvbnN0cmFpbnQgJiYgd2lkdGggPiBtYXhXaWR0aCApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogbWF4V2lkdGgsXG5cdFx0XHRcdGhlaWdodDogTWF0aC5yb3VuZCggbWF4V2lkdGggKiBoZWlnaHQgLyB3aWR0aCApXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoICdoZWlnaHQnID09PSBjb25zdHJhaW50ICYmIGhlaWdodCA+IG1heEhlaWdodCApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogTWF0aC5yb3VuZCggbWF4SGVpZ2h0ICogd2lkdGggLyBoZWlnaHQgKSxcblx0XHRcdFx0aGVpZ2h0OiBtYXhIZWlnaHRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHdpZHRoIDogd2lkdGgsXG5cdFx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRydW5jYXRlcyBhIHN0cmluZyBieSBpbmplY3RpbmcgYW4gZWxsaXBzaXMgaW50byB0aGUgbWlkZGxlLlxuXHQgKiBVc2VmdWwgZm9yIGZpbGVuYW1lcy5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW2xlbmd0aD0zMF1cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtyZXBsYWNlbWVudD0maGVsbGlwO11cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHN0cmluZywgdW5sZXNzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gc3RyaW5nLmxlbmd0aC5cblx0ICovXG5cdHRydW5jYXRlOiBmdW5jdGlvbiggc3RyaW5nLCBsZW5ndGgsIHJlcGxhY2VtZW50ICkge1xuXHRcdGxlbmd0aCA9IGxlbmd0aCB8fCAzMDtcblx0XHRyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50IHx8ICcmaGVsbGlwOyc7XG5cblx0XHRpZiAoIHN0cmluZy5sZW5ndGggPD0gbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0ciggMCwgbGVuZ3RoIC8gMiApICsgcmVwbGFjZW1lbnQgKyBzdHJpbmcuc3Vic3RyKCAtMSAqIGxlbmd0aCAvIDIgKTtcblx0fVxufSk7XG5cbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBNT0RFTFNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vKipcbiAqIHdwLm1lZGlhLmF0dGFjaG1lbnRcbiAqXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgQSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSBhIG1vZGVsLlxuICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9XG4gKi9cbm1lZGlhLmF0dGFjaG1lbnQgPSBmdW5jdGlvbiggaWQgKSB7XG5cdHJldHVybiBBdHRhY2htZW50LmdldCggaWQgKTtcbn07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRhY2htZW50cyB0aGF0IGhhdmUgYmVlbiBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c31cbiAqL1xuQXR0YWNobWVudHMuYWxsID0gbmV3IEF0dGFjaG1lbnRzKCk7XG5cbi8qKlxuICogd3AubWVkaWEucXVlcnlcbiAqXG4gKiBTaG9ydGhhbmQgZm9yIGNyZWF0aW5nIGEgbmV3IEF0dGFjaG1lbnRzIFF1ZXJ5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9XG4gKi9cbm1lZGlhLnF1ZXJ5ID0gZnVuY3Rpb24oIHByb3BzICkge1xuXHRyZXR1cm4gbmV3IEF0dGFjaG1lbnRzKCBudWxsLCB7XG5cdFx0cHJvcHM6IF8uZXh0ZW5kKCBfLmRlZmF1bHRzKCBwcm9wcyB8fCB7fSwgeyBvcmRlcmJ5OiAnZGF0ZScgfSApLCB7IHF1ZXJ5OiB0cnVlIH0gKVxuXHR9KTtcbn07XG5cbi8vIENsZWFuIHVwLiBQcmV2ZW50cyBtb2JpbGUgYnJvd3NlcnMgY2FjaGluZ1xuJCh3aW5kb3cpLm9uKCd1bmxvYWQnLCBmdW5jdGlvbigpe1xuXHR3aW5kb3cud3AgPSBudWxsO1xufSk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgJCA9IEJhY2tib25lLiQsXG5cdEF0dGFjaG1lbnQ7XG5cbkF0dGFjaG1lbnQgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHQvKipcblx0ICogVHJpZ2dlcmVkIHdoZW4gYXR0YWNobWVudCBkZXRhaWxzIGNoYW5nZVxuXHQgKiBPdmVycmlkZXMgQmFja2JvbmUuTW9kZWwuc3luY1xuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gbW9kZWxcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdHN5bmM6IGZ1bmN0aW9uKCBtZXRob2QsIG1vZGVsLCBvcHRpb25zICkge1xuXHRcdC8vIElmIHRoZSBhdHRhY2htZW50IGRvZXMgbm90IHlldCBoYXZlIGFuIGBpZGAsIHJldHVybiBhbiBpbnN0YW50bHlcblx0XHQvLyByZWplY3RlZCBwcm9taXNlLiBPdGhlcndpc2UsIGFsbCBvZiBvdXIgcmVxdWVzdHMgd2lsbCBmYWlsLlxuXHRcdGlmICggXy5pc1VuZGVmaW5lZCggdGhpcy5pZCApICkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBgcmVhZGAgcmVxdWVzdCBzbyBBdHRhY2htZW50LmZldGNoKCkgZnVuY3Rpb25zIGNvcnJlY3RseS5cblx0XHRpZiAoICdyZWFkJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0XHRvcHRpb25zLmNvbnRleHQgPSB0aGlzO1xuXHRcdFx0b3B0aW9ucy5kYXRhID0gXy5leHRlbmQoIG9wdGlvbnMuZGF0YSB8fCB7fSwge1xuXHRcdFx0XHRhY3Rpb246ICdnZXQtYXR0YWNobWVudCcsXG5cdFx0XHRcdGlkOiB0aGlzLmlkXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB3cC5tZWRpYS5hamF4KCBvcHRpb25zICk7XG5cblx0XHQvLyBPdmVybG9hZCB0aGUgYHVwZGF0ZWAgcmVxdWVzdCBzbyBwcm9wZXJ0aWVzIGNhbiBiZSBzYXZlZC5cblx0XHR9IGVsc2UgaWYgKCAndXBkYXRlJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0Ly8gSWYgd2UgZG8gbm90IGhhdmUgdGhlIG5lY2Vzc2FyeSBub25jZSwgZmFpbCBpbW1lZGl0YXRlbHkuXG5cdFx0XHRpZiAoICEgdGhpcy5nZXQoJ25vbmNlcycpIHx8ICEgdGhpcy5nZXQoJ25vbmNlcycpLnVwZGF0ZSApIHtcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRcdG9wdGlvbnMuY29udGV4dCA9IHRoaXM7XG5cblx0XHRcdC8vIFNldCB0aGUgYWN0aW9uIGFuZCBJRC5cblx0XHRcdG9wdGlvbnMuZGF0YSA9IF8uZXh0ZW5kKCBvcHRpb25zLmRhdGEgfHwge30sIHtcblx0XHRcdFx0YWN0aW9uOiAgJ3NhdmUtYXR0YWNobWVudCcsXG5cdFx0XHRcdGlkOiAgICAgIHRoaXMuaWQsXG5cdFx0XHRcdG5vbmNlOiAgIHRoaXMuZ2V0KCdub25jZXMnKS51cGRhdGUsXG5cdFx0XHRcdHBvc3RfaWQ6IHdwLm1lZGlhLm1vZGVsLnNldHRpbmdzLnBvc3QuaWRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIHZhbHVlcyBvZiB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzLlxuXHRcdFx0aWYgKCBtb2RlbC5oYXNDaGFuZ2VkKCkgKSB7XG5cdFx0XHRcdG9wdGlvbnMuZGF0YS5jaGFuZ2VzID0ge307XG5cblx0XHRcdFx0Xy5lYWNoKCBtb2RlbC5jaGFuZ2VkLCBmdW5jdGlvbiggdmFsdWUsIGtleSApIHtcblx0XHRcdFx0XHRvcHRpb25zLmRhdGEuY2hhbmdlc1sga2V5IF0gPSB0aGlzLmdldCgga2V5ICk7XG5cdFx0XHRcdH0sIHRoaXMgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHdwLm1lZGlhLmFqYXgoIG9wdGlvbnMgKTtcblxuXHRcdC8vIE92ZXJsb2FkIHRoZSBgZGVsZXRlYCByZXF1ZXN0IHNvIGF0dGFjaG1lbnRzIGNhbiBiZSByZW1vdmVkLlxuXHRcdC8vIFRoaXMgd2lsbCBwZXJtYW5lbnRseSBkZWxldGUgYW4gYXR0YWNobWVudC5cblx0XHR9IGVsc2UgaWYgKCAnZGVsZXRlJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRcdGlmICggISBvcHRpb25zLndhaXQgKSB7XG5cdFx0XHRcdHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9ucy5jb250ZXh0ID0gdGhpcztcblx0XHRcdG9wdGlvbnMuZGF0YSA9IF8uZXh0ZW5kKCBvcHRpb25zLmRhdGEgfHwge30sIHtcblx0XHRcdFx0YWN0aW9uOiAgICdkZWxldGUtcG9zdCcsXG5cdFx0XHRcdGlkOiAgICAgICB0aGlzLmlkLFxuXHRcdFx0XHRfd3Bub25jZTogdGhpcy5nZXQoJ25vbmNlcycpWydkZWxldGUnXVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB3cC5tZWRpYS5hamF4KCBvcHRpb25zICkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0XHRcdH0pLmZhaWwoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBgQmFja2JvbmUuc3luYygpYC5cblx0XHR9IGVsc2Uge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsIGBzeW5jYCBkaXJlY3RseSBvbiBCYWNrYm9uZS5Nb2RlbFxuXHRcdFx0ICovXG5cdFx0XHRyZXR1cm4gQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLnN5bmMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIENvbnZlcnQgZGF0ZSBzdHJpbmdzIGludG8gRGF0ZSBvYmplY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVzcCBUaGUgcmF3IHJlc3BvbnNlIG9iamVjdCwgdHlwaWNhbGx5IHJldHVybmVkIGJ5IGZldGNoKClcblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIG1vZGlmaWVkIHJlc3BvbnNlIG9iamVjdCwgd2hpY2ggaXMgdGhlIGF0dHJpYnV0ZXMgaGFzaFxuXHQgKiAgICB0byBiZSBzZXQgb24gdGhlIG1vZGVsLlxuXHQgKi9cblx0cGFyc2U6IGZ1bmN0aW9uKCByZXNwICkge1xuXHRcdGlmICggISByZXNwICkge1xuXHRcdFx0cmV0dXJuIHJlc3A7XG5cdFx0fVxuXG5cdFx0cmVzcC5kYXRlID0gbmV3IERhdGUoIHJlc3AuZGF0ZSApO1xuXHRcdHJlc3AubW9kaWZpZWQgPSBuZXcgRGF0ZSggcmVzcC5tb2RpZmllZCApO1xuXHRcdHJldHVybiByZXNwO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIHByb3BlcnRpZXMgdG8gYmUgc2F2ZWQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN5bmMgb3B0aW9ucy4gZS5nLiBwYXRjaCwgd2FpdCwgc3VjY2VzcywgZXJyb3IuXG5cdCAqXG5cdCAqIEB0aGlzIEJhY2tib25lLk1vZGVsXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0c2F2ZUNvbXBhdDogZnVuY3Rpb24oIGRhdGEsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIG1vZGVsID0gdGhpcztcblxuXHRcdC8vIElmIHdlIGRvIG5vdCBoYXZlIHRoZSBuZWNlc3Nhcnkgbm9uY2UsIGZhaWwgaW1tZWRpdGF0ZWx5LlxuXHRcdGlmICggISB0aGlzLmdldCgnbm9uY2VzJykgfHwgISB0aGlzLmdldCgnbm9uY2VzJykudXBkYXRlICkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3RXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB3cC5tZWRpYS5wb3N0KCAnc2F2ZS1hdHRhY2htZW50LWNvbXBhdCcsIF8uZGVmYXVsdHMoe1xuXHRcdFx0aWQ6ICAgICAgdGhpcy5pZCxcblx0XHRcdG5vbmNlOiAgIHRoaXMuZ2V0KCdub25jZXMnKS51cGRhdGUsXG5cdFx0XHRwb3N0X2lkOiB3cC5tZWRpYS5tb2RlbC5zZXR0aW5ncy5wb3N0LmlkXG5cdFx0fSwgZGF0YSApICkuZG9uZSggZnVuY3Rpb24oIHJlc3AsIHN0YXR1cywgeGhyICkge1xuXHRcdFx0bW9kZWwuc2V0KCBtb2RlbC5wYXJzZSggcmVzcCwgeGhyICksIG9wdGlvbnMgKTtcblx0XHR9KTtcblx0fVxufSwge1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IG1vZGVsIG9uIHRoZSBzdGF0aWMgJ2FsbCcgYXR0YWNobWVudHMgY29sbGVjdGlvbiBhbmQgcmV0dXJuIGl0LlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH1cblx0ICovXG5cdGNyZWF0ZTogZnVuY3Rpb24oIGF0dHJzICkge1xuXHRcdHZhciBBdHRhY2htZW50cyA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzO1xuXHRcdHJldHVybiBBdHRhY2htZW50cy5hbGwucHVzaCggYXR0cnMgKTtcblx0fSxcblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyBtb2RlbCBvbiB0aGUgc3RhdGljICdhbGwnIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gYW5kIHJldHVybiBpdC5cblx0ICpcblx0ICogSWYgdGhpcyBmdW5jdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhlIGlkLFxuXHQgKiBpdCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgYXR0YWNobWVudC5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgQSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSBhIG1vZGVsLlxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfHVuZGVmaW5lZH0gYXR0YWNobWVudFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH1cblx0ICovXG5cdGdldDogXy5tZW1vaXplKCBmdW5jdGlvbiggaWQsIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIEF0dGFjaG1lbnRzID0gd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHM7XG5cdFx0cmV0dXJuIEF0dGFjaG1lbnRzLmFsbC5wdXNoKCBhdHRhY2htZW50IHx8IHsgaWQ6IGlkIH0gKTtcblx0fSlcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzXG4gKlxuICogQSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzLlxuICpcbiAqIFRoaXMgY29sbGVjdGlvbiBoYXMgbm8gcGVyc2lzdGVuY2Ugd2l0aCB0aGUgc2VydmVyIHdpdGhvdXQgc3VwcGx5aW5nXG4gKiAnb3B0aW9ucy5wcm9wcy5xdWVyeSA9IHRydWUnLCB3aGljaCB3aWxsIG1pcnJvciB0aGUgY29sbGVjdGlvblxuICogdG8gYW4gQXR0YWNobWVudHMgUXVlcnkgY29sbGVjdGlvbiAtIEBzZWUgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHMubWlycm9yKCkuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuQ29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7YXJyYXl9ICBbbW9kZWxzXSAgICAgICAgICAgICAgICBNb2RlbHMgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAgICAgICAgICAgICAgIE9wdGlvbnMgaGFzaCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucHJvcHNdICAgICAgICAgT3B0aW9ucyBoYXNoIGZvciB0aGUgaW5pdGlhbCBxdWVyeSBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByb3BzLm9yZGVyXSAgIEluaXRpYWwgb3JkZXIgKEFTQyBvciBERVNDKSBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucHJvcHMub3JkZXJieV0gSW5pdGlhbCBhdHRyaWJ1dGUga2V5IHRvIG9yZGVyIHRoZSBjb2xsZWN0aW9uIGJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByb3BzLnF1ZXJ5XSAgIFdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gaXMgbGlua2VkIHRvIGFuIGF0dGFjaG1lbnRzIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9ic2VydmVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmlsdGVyc11cbiAqXG4gKi9cbnZhciBBdHRhY2htZW50cyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEB0eXBlIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fVxuXHQgKi9cblx0bW9kZWw6IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnQsXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBbbW9kZWxzPVtdXSBBcnJheSBvZiBtb2RlbHMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG1vZGVscywgb3B0aW9ucyApIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHRoaXMucHJvcHMgICA9IG5ldyBCYWNrYm9uZS5Nb2RlbCgpO1xuXHRcdHRoaXMuZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVycyB8fCB7fTtcblxuXHRcdC8vIEJpbmQgZGVmYXVsdCBgY2hhbmdlYCBldmVudHMgdG8gdGhlIGBwcm9wc2AgbW9kZWwuXG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZScsIHRoaXMuX2NoYW5nZUZpbHRlcmVkUHJvcHMsIHRoaXMgKTtcblxuXHRcdHRoaXMucHJvcHMub24oICdjaGFuZ2U6b3JkZXInLCAgIHRoaXMuX2NoYW5nZU9yZGVyLCAgIHRoaXMgKTtcblx0XHR0aGlzLnByb3BzLm9uKCAnY2hhbmdlOm9yZGVyYnknLCB0aGlzLl9jaGFuZ2VPcmRlcmJ5LCB0aGlzICk7XG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZTpxdWVyeScsICAgdGhpcy5fY2hhbmdlUXVlcnksICAgdGhpcyApO1xuXG5cdFx0dGhpcy5wcm9wcy5zZXQoIF8uZGVmYXVsdHMoIG9wdGlvbnMucHJvcHMgfHwge30gKSApO1xuXG5cdFx0aWYgKCBvcHRpb25zLm9ic2VydmUgKSB7XG5cdFx0XHR0aGlzLm9ic2VydmUoIG9wdGlvbnMub2JzZXJ2ZSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFNvcnQgdGhlIGNvbGxlY3Rpb24gd2hlbiB0aGUgb3JkZXIgYXR0cmlidXRlIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKi9cblx0X2NoYW5nZU9yZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuY29tcGFyYXRvciApIHtcblx0XHRcdHRoaXMuc29ydCgpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFNldCB0aGUgZGVmYXVsdCBjb21wYXJhdG9yIG9ubHkgd2hlbiB0aGUgYG9yZGVyYnlgIHByb3BlcnR5IGlzIHNldC5cblx0ICpcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlcmJ5XG5cdCAqL1xuXHRfY2hhbmdlT3JkZXJieTogZnVuY3Rpb24oIG1vZGVsLCBvcmRlcmJ5ICkge1xuXHRcdC8vIElmIGEgZGlmZmVyZW50IGNvbXBhcmF0b3IgaXMgZGVmaW5lZCwgYmFpbC5cblx0XHRpZiAoIHRoaXMuY29tcGFyYXRvciAmJiB0aGlzLmNvbXBhcmF0b3IgIT09IEF0dGFjaG1lbnRzLmNvbXBhcmF0b3IgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBvcmRlcmJ5ICYmICdwb3N0X19pbicgIT09IG9yZGVyYnkgKSB7XG5cdFx0XHR0aGlzLmNvbXBhcmF0b3IgPSBBdHRhY2htZW50cy5jb21wYXJhdG9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jb21wYXJhdG9yO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIElmIHRoZSBgcXVlcnlgIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLCBxdWVyeSB0aGUgc2VydmVyIHVzaW5nXG5cdCAqIHRoZSBgcHJvcHNgIHZhbHVlcywgYW5kIHN5bmMgdGhlIHJlc3VsdHMgdG8gdGhpcyBjb2xsZWN0aW9uLlxuXHQgKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHBhcmFtIHtCb29sZWFufSBxdWVyeVxuXHQgKi9cblx0X2NoYW5nZVF1ZXJ5OiBmdW5jdGlvbiggbW9kZWwsIHF1ZXJ5ICkge1xuXHRcdGlmICggcXVlcnkgKSB7XG5cdFx0XHR0aGlzLnByb3BzLm9uKCAnY2hhbmdlJywgdGhpcy5fcmVxdWVyeSwgdGhpcyApO1xuXHRcdFx0dGhpcy5fcmVxdWVyeSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnByb3BzLm9mZiggJ2NoYW5nZScsIHRoaXMuX3JlcXVlcnksIHRoaXMgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICovXG5cdF9jaGFuZ2VGaWx0ZXJlZFByb3BzOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0Ly8gSWYgdGhpcyBpcyBhIHF1ZXJ5LCB1cGRhdGluZyB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIGhhbmRsZWQgYnlcblx0XHQvLyBgdGhpcy5fcmVxdWVyeSgpYC5cblx0XHRpZiAoIHRoaXMucHJvcHMuZ2V0KCdxdWVyeScpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjaGFuZ2VkID0gXy5jaGFpbiggbW9kZWwuY2hhbmdlZCApLm1hcCggZnVuY3Rpb24oIHQsIHByb3AgKSB7XG5cdFx0XHR2YXIgZmlsdGVyID0gQXR0YWNobWVudHMuZmlsdGVyc1sgcHJvcCBdLFxuXHRcdFx0XHR0ZXJtID0gbW9kZWwuZ2V0KCBwcm9wICk7XG5cblx0XHRcdGlmICggISBmaWx0ZXIgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXJtICYmICEgdGhpcy5maWx0ZXJzWyBwcm9wIF0gKSB7XG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgcHJvcCBdID0gZmlsdGVyO1xuXHRcdFx0fSBlbHNlIGlmICggISB0ZXJtICYmIHRoaXMuZmlsdGVyc1sgcHJvcCBdID09PSBmaWx0ZXIgKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmZpbHRlcnNbIHByb3AgXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVjb3JkIHRoZSBjaGFuZ2UuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LCB0aGlzICkuYW55KCkudmFsdWUoKTtcblxuXHRcdGlmICggISBjaGFuZ2VkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIG5vIGBBdHRhY2htZW50c2AgbW9kZWwgaXMgcHJvdmlkZWQgdG8gc291cmNlIHRoZSBzZWFyY2hlc1xuXHRcdC8vIGZyb20sIHRoZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIHNvdXJjZSBmcm9tIHRoZSBleGlzdGluZ1xuXHRcdC8vIG1vZGVscy5cblx0XHRpZiAoICEgdGhpcy5fc291cmNlICkge1xuXHRcdFx0dGhpcy5fc291cmNlID0gbmV3IEF0dGFjaG1lbnRzKCB0aGlzLm1vZGVscyApO1xuXHRcdH1cblxuXHRcdHRoaXMucmVzZXQoIHRoaXMuX3NvdXJjZS5maWx0ZXIoIHRoaXMudmFsaWRhdG9yLCB0aGlzICkgKTtcblx0fSxcblxuXHR2YWxpZGF0ZURlc3Ryb3llZDogZmFsc2UsXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhbiBhdHRhY2htZW50IGlzIHZhbGlkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdCAqL1xuXHR2YWxpZGF0b3I6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdGlmICggISB0aGlzLnZhbGlkYXRlRGVzdHJveWVkICYmIGF0dGFjaG1lbnQuZGVzdHJveWVkICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gXy5hbGwoIHRoaXMuZmlsdGVycywgZnVuY3Rpb24oIGZpbHRlciApIHtcblx0XHRcdHJldHVybiAhISBmaWx0ZXIuY2FsbCggdGhpcywgYXR0YWNobWVudCApO1xuXHRcdH0sIHRoaXMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEFkZCBvciByZW1vdmUgYW4gYXR0YWNobWVudCB0byB0aGUgY29sbGVjdGlvbiBkZXBlbmRpbmcgb24gaXRzIHZhbGlkaXR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKCBhdHRhY2htZW50LCBvcHRpb25zICkge1xuXHRcdHZhciB2YWxpZCA9IHRoaXMudmFsaWRhdG9yKCBhdHRhY2htZW50ICksXG5cdFx0XHRoYXNBdHRhY2htZW50ID0gISEgdGhpcy5nZXQoIGF0dGFjaG1lbnQuY2lkICk7XG5cblx0XHRpZiAoICEgdmFsaWQgJiYgaGFzQXR0YWNobWVudCApIHtcblx0XHRcdHRoaXMucmVtb3ZlKCBhdHRhY2htZW50LCBvcHRpb25zICk7XG5cdFx0fSBlbHNlIGlmICggdmFsaWQgJiYgISBoYXNBdHRhY2htZW50ICkge1xuXHRcdFx0dGhpcy5hZGQoIGF0dGFjaG1lbnQsIG9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKipcblx0ICogQWRkIG9yIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSBhbm90aGVyIGNvbGxlY3Rpb24gZGVwZW5kaW5nIG9uIGVhY2ggb25lJ3MgdmFsaWRpdHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucz17fV1cblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzI3Jlc2V0XG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHZhbGlkYXRlQWxsOiBmdW5jdGlvbiggYXR0YWNobWVudHMsIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRfLmVhY2goIGF0dGFjaG1lbnRzLm1vZGVscywgZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR0aGlzLnZhbGlkYXRlKCBhdHRhY2htZW50LCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHRpZiAoICEgb3B0aW9ucy5zaWxlbnQgKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoICdyZXNldCcsIHRoaXMsIG9wdGlvbnMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdGFydCBvYnNlcnZpbmcgYW5vdGhlciBhdHRhY2htZW50cyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHNcblx0ICogYW5kIHJlcGxpY2F0ZSB0aGVtIG9uIHRoaXMgY29sbGVjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gb2JzZXJ2ZS5cblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdG9ic2VydmU6IGZ1bmN0aW9uKCBhdHRhY2htZW50cyApIHtcblx0XHR0aGlzLm9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzIHx8IFtdO1xuXHRcdHRoaXMub2JzZXJ2ZXJzLnB1c2goIGF0dGFjaG1lbnRzICk7XG5cblx0XHRhdHRhY2htZW50cy5vbiggJ2FkZCBjaGFuZ2UgcmVtb3ZlJywgdGhpcy5fdmFsaWRhdGVIYW5kbGVyLCB0aGlzICk7XG5cdFx0YXR0YWNobWVudHMub24oICdyZXNldCcsIHRoaXMuX3ZhbGlkYXRlQWxsSGFuZGxlciwgdGhpcyApO1xuXHRcdHRoaXMudmFsaWRhdGVBbGwoIGF0dGFjaG1lbnRzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdG9wIHJlcGxpY2F0aW5nIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyBmcm9tIGFub3RoZXIgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmcuXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHVub2JzZXJ2ZTogZnVuY3Rpb24oIGF0dGFjaG1lbnRzICkge1xuXHRcdGlmICggYXR0YWNobWVudHMgKSB7XG5cdFx0XHRhdHRhY2htZW50cy5vZmYoIG51bGwsIG51bGwsIHRoaXMgKTtcblx0XHRcdHRoaXMub2JzZXJ2ZXJzID0gXy53aXRob3V0KCB0aGlzLm9ic2VydmVycywgYXR0YWNobWVudHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRfLmVhY2goIHRoaXMub2JzZXJ2ZXJzLCBmdW5jdGlvbiggYXR0YWNobWVudHMgKSB7XG5cdFx0XHRcdGF0dGFjaG1lbnRzLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdFx0fSwgdGhpcyApO1xuXHRcdFx0ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gYXR0YWNobWVudHNcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0X3ZhbGlkYXRlSGFuZGxlcjogZnVuY3Rpb24oIGF0dGFjaG1lbnQsIGF0dGFjaG1lbnRzLCBvcHRpb25zICkge1xuXHRcdC8vIElmIHdlJ3JlIG5vdCBtaXJyb3JpbmcgdGhpcyBgYXR0YWNobWVudHNgIGNvbGxlY3Rpb24sXG5cdFx0Ly8gb25seSByZXRhaW4gdGhlIGBzaWxlbnRgIG9wdGlvbi5cblx0XHRvcHRpb25zID0gYXR0YWNobWVudHMgPT09IHRoaXMubWlycm9yaW5nID8gb3B0aW9ucyA6IHtcblx0XHRcdHNpbGVudDogb3B0aW9ucyAmJiBvcHRpb25zLnNpbGVudFxuXHRcdH07XG5cblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZSggYXR0YWNobWVudCwgb3B0aW9ucyApO1xuXHR9LFxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IGF0dGFjaG1lbnRzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdF92YWxpZGF0ZUFsbEhhbmRsZXI6IGZ1bmN0aW9uKCBhdHRhY2htZW50cywgb3B0aW9ucyApIHtcblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbCggYXR0YWNobWVudHMsIG9wdGlvbnMgKTtcblx0fSxcblx0LyoqXG5cdCAqIFN0YXJ0IG1pcnJvcmluZyBhbm90aGVyIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24sIGNsZWFyaW5nIG91dCBhbnkgbW9kZWxzIGFscmVhZHlcblx0ICogaW4gdGhlIGNvbGxlY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIG1pcnJvci5cblx0ICogQHJldHVybnMge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0bWlycm9yOiBmdW5jdGlvbiggYXR0YWNobWVudHMgKSB7XG5cdFx0aWYgKCB0aGlzLm1pcnJvcmluZyAmJiB0aGlzLm1pcnJvcmluZyA9PT0gYXR0YWNobWVudHMgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHR0aGlzLnVubWlycm9yKCk7XG5cdFx0dGhpcy5taXJyb3JpbmcgPSBhdHRhY2htZW50cztcblxuXHRcdC8vIENsZWFyIHRoZSBjb2xsZWN0aW9uIHNpbGVudGx5LiBBIGByZXNldGAgZXZlbnQgd2lsbCBiZSBmaXJlZFxuXHRcdC8vIHdoZW4gYG9ic2VydmUoKWAgY2FsbHMgYHZhbGlkYXRlQWxsKClgLlxuXHRcdHRoaXMucmVzZXQoIFtdLCB7IHNpbGVudDogdHJ1ZSB9ICk7XG5cdFx0dGhpcy5vYnNlcnZlKCBhdHRhY2htZW50cyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBTdG9wIG1pcnJvcmluZyBhbm90aGVyIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG5cdCAqL1xuXHR1bm1pcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMubWlycm9yaW5nICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudW5vYnNlcnZlKCB0aGlzLm1pcnJvcmluZyApO1xuXHRcdGRlbGV0ZSB0aGlzLm1pcnJvcmluZztcblx0fSxcblx0LyoqXG5cdCAqIFJldHJpZXZlIG1vcmUgYXR0YWNobWVudHMgZnJvbSB0aGUgc2VydmVyIGZvciB0aGUgY29sbGVjdGlvbi5cblx0ICpcblx0ICogT25seSB3b3JrcyBpZiB0aGUgY29sbGVjdGlvbiBpcyBtaXJyb3JpbmcgYSBRdWVyeSBBdHRhY2htZW50cyBjb2xsZWN0aW9uLFxuXHQgKiBhbmQgZm9yd2FyZHMgdG8gaXRzIGBtb3JlYCBtZXRob2QuIFRoaXMgY29sbGVjdGlvbiBjbGFzcyBkb2Vzbid0IGhhdmVcblx0ICogc2VydmVyIHBlcnNpc3RlbmNlIGJ5IGl0c2VsZi5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHRtb3JlOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIgZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdG1pcnJvcmluZyA9IHRoaXMubWlycm9yaW5nLFxuXHRcdFx0YXR0YWNobWVudHMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhIG1pcnJvcmluZyB8fCAhIG1pcnJvcmluZy5tb3JlICkge1xuXHRcdFx0cmV0dXJuIGRlZmVycmVkLnJlc29sdmVXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblx0XHQvLyBJZiB3ZSdyZSBtaXJyb3JpbmcgYW5vdGhlciBjb2xsZWN0aW9uLCBmb3J3YXJkIGBtb3JlYCB0b1xuXHRcdC8vIHRoZSBtaXJyb3JlZCBjb2xsZWN0aW9uLiBBY2NvdW50IGZvciBhIHJhY2UgY29uZGl0aW9uIGJ5XG5cdFx0Ly8gY2hlY2tpbmcgaWYgd2UncmUgc3RpbGwgbWlycm9yaW5nIHRoYXQgY29sbGVjdGlvbiB3aGVuXG5cdFx0Ly8gdGhlIHJlcXVlc3QgcmVzb2x2ZXMuXG5cdFx0bWlycm9yaW5nLm1vcmUoIG9wdGlvbnMgKS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggdGhpcyA9PT0gYXR0YWNobWVudHMubWlycm9yaW5nICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fSxcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgYXR0YWNobWVudHMgdGhhdCBoYXZlbid0IGJlZW4gc3luYydkIGZyb20gdGhlIHNlcnZlclxuXHQgKiB0aGF0IG1hdGNoIHRoZSBjb2xsZWN0aW9uJ3MgcXVlcnkuXG5cdCAqXG5cdCAqIE9ubHkgd29ya3MgaWYgdGhlIGNvbGxlY3Rpb24gaXMgbWlycm9yaW5nIGEgUXVlcnkgQXR0YWNobWVudHMgY29sbGVjdGlvbixcblx0ICogYW5kIGZvcndhcmRzIHRvIGl0cyBgaGFzTW9yZWAgbWV0aG9kLiBUaGlzIGNvbGxlY3Rpb24gY2xhc3MgZG9lc24ndCBoYXZlXG5cdCAqIHNlcnZlciBwZXJzaXN0ZW5jZSBieSBpdHNlbGYuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0aGFzTW9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWlycm9yaW5nID8gdGhpcy5taXJyb3JpbmcuaGFzTW9yZSgpIDogZmFsc2U7XG5cdH0sXG5cdC8qKlxuXHQgKiBBIGN1c3RvbSBBSkFYLXJlc3BvbnNlIHBhcnNlci5cblx0ICpcblx0ICogU2VlIHRyYWMgdGlja2V0ICMyNDc1M1xuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gcmVzcCBUaGUgcmF3IHJlc3BvbnNlIE9iamVjdC9BcnJheS5cblx0ICogQHBhcmFtIHtPYmplY3R9IHhoclxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiBtb2RlbCBhdHRyaWJ1dGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRwYXJzZTogZnVuY3Rpb24oIHJlc3AsIHhociApIHtcblx0XHRpZiAoICEgXy5pc0FycmF5KCByZXNwICkgKSB7XG5cdFx0XHRyZXNwID0gW3Jlc3BdO1xuXHRcdH1cblxuXHRcdHJldHVybiBfLm1hcCggcmVzcCwgZnVuY3Rpb24oIGF0dHJzICkge1xuXHRcdFx0dmFyIGlkLCBhdHRhY2htZW50LCBuZXdBdHRyaWJ1dGVzO1xuXG5cdFx0XHRpZiAoIGF0dHJzIGluc3RhbmNlb2YgQmFja2JvbmUuTW9kZWwgKSB7XG5cdFx0XHRcdGlkID0gYXR0cnMuZ2V0KCAnaWQnICk7XG5cdFx0XHRcdGF0dHJzID0gYXR0cnMuYXR0cmlidXRlcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlkID0gYXR0cnMuaWQ7XG5cdFx0XHR9XG5cblx0XHRcdGF0dGFjaG1lbnQgPSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50LmdldCggaWQgKTtcblx0XHRcdG5ld0F0dHJpYnV0ZXMgPSBhdHRhY2htZW50LnBhcnNlKCBhdHRycywgeGhyICk7XG5cblx0XHRcdGlmICggISBfLmlzRXF1YWwoIGF0dGFjaG1lbnQuYXR0cmlidXRlcywgbmV3QXR0cmlidXRlcyApICkge1xuXHRcdFx0XHRhdHRhY2htZW50LnNldCggbmV3QXR0cmlidXRlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0YWNobWVudDtcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIElmIHRoZSBjb2xsZWN0aW9uIGlzIGEgcXVlcnksIGNyZWF0ZSBhbmQgbWlycm9yIGFuIEF0dGFjaG1lbnRzIFF1ZXJ5IGNvbGxlY3Rpb24uXG5cdCAqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKi9cblx0X3JlcXVlcnk6IGZ1bmN0aW9uKCByZWZyZXNoICkge1xuXHRcdHZhciBwcm9wcztcblx0XHRpZiAoIHRoaXMucHJvcHMuZ2V0KCdxdWVyeScpICkge1xuXHRcdFx0cHJvcHMgPSB0aGlzLnByb3BzLnRvSlNPTigpO1xuXHRcdFx0cHJvcHMuY2FjaGUgPSAoIHRydWUgIT09IHJlZnJlc2ggKTtcblx0XHRcdHRoaXMubWlycm9yKCB3cC5tZWRpYS5tb2RlbC5RdWVyeS5nZXQoIHByb3BzICkgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGNvbGxlY3Rpb24gaXMgc29ydGVkIGJ5IGBtZW51T3JkZXJgLCByZWNhbGN1bGF0ZXMgYW5kIHNhdmVzXG5cdCAqIHRoZSBtZW51IG9yZGVyIHRvIHRoZSBkYXRhYmFzZS5cblx0ICpcblx0ICogQHJldHVybnMge3VuZGVmaW5lZHxQcm9taXNlfVxuXHQgKi9cblx0c2F2ZU1lbnVPcmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAnbWVudU9yZGVyJyAhPT0gdGhpcy5wcm9wcy5nZXQoJ29yZGVyYnknKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmVzIGFueSB1cGxvYWRpbmcgYXR0YWNobWVudHMsIHVwZGF0ZXMgZWFjaCBhdHRhY2htZW50J3Ncblx0XHQvLyBtZW51IG9yZGVyLCBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhbiB7IGlkOiBtZW51T3JkZXIgfVxuXHRcdC8vIG1hcHBpbmcgdG8gcGFzcyB0byB0aGUgcmVxdWVzdC5cblx0XHR2YXIgYXR0YWNobWVudHMgPSB0aGlzLmNoYWluKCkuZmlsdGVyKCBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHJldHVybiAhIF8uaXNVbmRlZmluZWQoIGF0dGFjaG1lbnQuaWQgKTtcblx0XHR9KS5tYXAoIGZ1bmN0aW9uKCBhdHRhY2htZW50LCBpbmRleCApIHtcblx0XHRcdC8vIEluZGljZXMgc3RhcnQgYXQgMS5cblx0XHRcdGluZGV4ID0gaW5kZXggKyAxO1xuXHRcdFx0YXR0YWNobWVudC5zZXQoICdtZW51T3JkZXInLCBpbmRleCApO1xuXHRcdFx0cmV0dXJuIFsgYXR0YWNobWVudC5pZCwgaW5kZXggXTtcblx0XHR9KS5vYmplY3QoKS52YWx1ZSgpO1xuXG5cdFx0aWYgKCBfLmlzRW1wdHkoIGF0dGFjaG1lbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdwLm1lZGlhLnBvc3QoICdzYXZlLWF0dGFjaG1lbnQtb3JkZXInLCB7XG5cdFx0XHRub25jZTogICAgICAgd3AubWVkaWEubW9kZWwuc2V0dGluZ3MucG9zdC5ub25jZSxcblx0XHRcdHBvc3RfaWQ6ICAgICB3cC5tZWRpYS5tb2RlbC5zZXR0aW5ncy5wb3N0LmlkLFxuXHRcdFx0YXR0YWNobWVudHM6IGF0dGFjaG1lbnRzXG5cdFx0fSk7XG5cdH1cbn0sIHtcblx0LyoqXG5cdCAqIEEgZnVuY3Rpb24gdG8gY29tcGFyZSB0d28gYXR0YWNobWVudCBtb2RlbHMgaW4gYW4gYXR0YWNobWVudHMgY29sbGVjdGlvbi5cblx0ICpcblx0ICogVXNlZCBhcyB0aGUgZGVmYXVsdCBjb21wYXJhdG9yIGZvciBpbnN0YW5jZXMgb2Ygd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHNcblx0ICogYW5kIGl0cyBzdWJjbGFzc2VzLiBAc2VlIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLl9jaGFuZ2VPcmRlcmJ5KCkuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gYVxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBiXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0xIGlmIHRoZSBmaXJzdCBtb2RlbCBzaG91bGQgY29tZSBiZWZvcmUgdGhlIHNlY29uZCxcblx0ICogICAgMCBpZiB0aGV5IGFyZSBvZiB0aGUgc2FtZSByYW5rIGFuZFxuXHQgKiAgICAxIGlmIHRoZSBmaXJzdCBtb2RlbCBzaG91bGQgY29tZSBhZnRlci5cblx0ICovXG5cdGNvbXBhcmF0b3I6IGZ1bmN0aW9uKCBhLCBiLCBvcHRpb25zICkge1xuXHRcdHZhciBrZXkgICA9IHRoaXMucHJvcHMuZ2V0KCdvcmRlcmJ5JyksXG5cdFx0XHRvcmRlciA9IHRoaXMucHJvcHMuZ2V0KCdvcmRlcicpIHx8ICdERVNDJyxcblx0XHRcdGFjICAgID0gYS5jaWQsXG5cdFx0XHRiYyAgICA9IGIuY2lkO1xuXG5cdFx0YSA9IGEuZ2V0KCBrZXkgKTtcblx0XHRiID0gYi5nZXQoIGtleSApO1xuXG5cdFx0aWYgKCAnZGF0ZScgPT09IGtleSB8fCAnbW9kaWZpZWQnID09PSBrZXkgKSB7XG5cdFx0XHRhID0gYSB8fCBuZXcgRGF0ZSgpO1xuXHRcdFx0YiA9IGIgfHwgbmV3IERhdGUoKTtcblx0XHR9XG5cblx0XHQvLyBJZiBgb3B0aW9ucy50aWVzYCBpcyBzZXQsIGRvbid0IGVuZm9yY2UgdGhlIGBjaWRgIHRpZWJyZWFrZXIuXG5cdFx0aWYgKCBvcHRpb25zICYmIG9wdGlvbnMudGllcyApIHtcblx0XHRcdGFjID0gYmMgPSBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiAoICdERVNDJyA9PT0gb3JkZXIgKSA/IHdwLm1lZGlhLmNvbXBhcmUoIGEsIGIsIGFjLCBiYyApIDogd3AubWVkaWEuY29tcGFyZSggYiwgYSwgYmMsIGFjICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAbmFtZXNwYWNlXG5cdCAqL1xuXHRmaWx0ZXJzOiB7XG5cdFx0LyoqXG5cdFx0ICogQHN0YXRpY1xuXHRcdCAqIE5vdGUgdGhhdCB0aGlzIGNsaWVudC1zaWRlIHNlYXJjaGluZyBpcyAqbm90KiBlcXVpdmFsZW50XG5cdFx0ICogdG8gb3VyIHNlcnZlci1zaWRlIHNlYXJjaGluZy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0YWNobWVudFxuXHRcdCAqXG5cdFx0ICogQHRoaXMgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHNcblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHNlYXJjaDogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHRpZiAoICEgdGhpcy5wcm9wcy5nZXQoJ3NlYXJjaCcpICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIF8uYW55KFsndGl0bGUnLCdmaWxlbmFtZScsJ2Rlc2NyaXB0aW9uJywnY2FwdGlvbicsJ25hbWUnXSwgZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0dmFyIHZhbHVlID0gYXR0YWNobWVudC5nZXQoIGtleSApO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgJiYgLTEgIT09IHZhbHVlLnNlYXJjaCggdGhpcy5wcm9wcy5nZXQoJ3NlYXJjaCcpICk7XG5cdFx0XHR9LCB0aGlzICk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdFx0ICpcblx0XHQgKiBAdGhpcyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dHlwZTogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMucHJvcHMuZ2V0KCd0eXBlJyksIGF0dHMgPSBhdHRhY2htZW50LnRvSlNPTigpLCBtaW1lLCBmb3VuZDtcblxuXHRcdFx0aWYgKCAhIHR5cGUgfHwgKCBfLmlzQXJyYXkoIHR5cGUgKSAmJiAhIHR5cGUubGVuZ3RoICkgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRtaW1lID0gYXR0cy5taW1lIHx8ICggYXR0cy5maWxlICYmIGF0dHMuZmlsZS50eXBlICkgfHwgJyc7XG5cblx0XHRcdGlmICggXy5pc0FycmF5KCB0eXBlICkgKSB7XG5cdFx0XHRcdGZvdW5kID0gXy5maW5kKCB0eXBlLCBmdW5jdGlvbiAodCkge1xuXHRcdFx0XHRcdHJldHVybiAtMSAhPT0gbWltZS5pbmRleE9mKCB0ICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvdW5kID0gLTEgIT09IG1pbWUuaW5kZXhPZiggdHlwZSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm91bmQ7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdFx0ICpcblx0XHQgKiBAdGhpcyB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dXBsb2FkZWRUbzogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR2YXIgdXBsb2FkZWRUbyA9IHRoaXMucHJvcHMuZ2V0KCd1cGxvYWRlZFRvJyk7XG5cdFx0XHRpZiAoIF8uaXNVbmRlZmluZWQoIHVwbG9hZGVkVG8gKSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1cGxvYWRlZFRvID09PSBhdHRhY2htZW50LmdldCgndXBsb2FkZWRUbycpO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogQHN0YXRpY1xuXHRcdCAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0YWNobWVudFxuXHRcdCAqXG5cdFx0ICogQHRoaXMgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHNcblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHN0YXR1czogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR2YXIgc3RhdHVzID0gdGhpcy5wcm9wcy5nZXQoJ3N0YXR1cycpO1xuXHRcdFx0aWYgKCBfLmlzVW5kZWZpbmVkKCBzdGF0dXMgKSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzdGF0dXMgPT09IGF0dGFjaG1lbnQuZ2V0KCdzdGF0dXMnKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnRzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5tb2RlbC5Qb3N0SW1hZ2VcbiAqXG4gKiBBbiBpbnN0YW5jZSBvZiBhbiBpbWFnZSB0aGF0J3MgYmVlbiBlbWJlZGRlZCBpbnRvIGEgcG9zdC5cbiAqXG4gKiBVc2VkIGluIHRoZSBlbWJlZGRlZCBpbWFnZSBhdHRhY2htZW50IGRpc3BsYXkgc2V0dGluZ3MgbW9kYWwgLSBAc2VlIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5JbWFnZURldGFpbHMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge2ludH0gW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgSW5pdGlhbCBtb2RlbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtpbnR9IFthdHRyaWJ1dGVzLmF0dGFjaG1lbnRfaWRdIElEIG9mIHRoZSBhdHRhY2htZW50LlxuICoqL1xudmFyIFBvc3RJbWFnZSA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIGF0dHJpYnV0ZXMgKSB7XG5cdFx0dmFyIEF0dGFjaG1lbnQgPSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50O1xuXHRcdHRoaXMuYXR0YWNobWVudCA9IGZhbHNlO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLmF0dGFjaG1lbnRfaWQgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnQgPSBBdHRhY2htZW50LmdldCggYXR0cmlidXRlcy5hdHRhY2htZW50X2lkICk7XG5cdFx0XHRpZiAoIHRoaXMuYXR0YWNobWVudC5nZXQoICd1cmwnICkgKSB7XG5cdFx0XHRcdHRoaXMuZGZkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cdFx0XHRcdHRoaXMuZGZkLnJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGZkID0gdGhpcy5hdHRhY2htZW50LmZldGNoKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJpbmRBdHRhY2htZW50TGlzdGVuZXJzKCk7XG5cdFx0fVxuXG5cdFx0Ly8ga2VlcCB1cmwgaW4gc3luYyB3aXRoIGNoYW5nZXMgdG8gdGhlIHR5cGUgb2YgbGlua1xuXHRcdHRoaXMub24oICdjaGFuZ2U6bGluaycsIHRoaXMudXBkYXRlTGlua1VybCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjaGFuZ2U6c2l6ZScsIHRoaXMudXBkYXRlU2l6ZSwgdGhpcyApO1xuXG5cdFx0dGhpcy5zZXRMaW5rVHlwZUZyb21VcmwoKTtcblx0XHR0aGlzLnNldEFzcGVjdFJhdGlvKCk7XG5cblx0XHR0aGlzLnNldCggJ29yaWdpbmFsVXJsJywgYXR0cmlidXRlcy51cmwgKTtcblx0fSxcblxuXHRiaW5kQXR0YWNobWVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5hdHRhY2htZW50LCAnc3luYycsIHRoaXMuc2V0TGlua1R5cGVGcm9tVXJsICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5hdHRhY2htZW50LCAnc3luYycsIHRoaXMuc2V0QXNwZWN0UmF0aW8gKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLmF0dGFjaG1lbnQsICdjaGFuZ2UnLCB0aGlzLnVwZGF0ZVNpemUgKTtcblx0fSxcblxuXHRjaGFuZ2VBdHRhY2htZW50OiBmdW5jdGlvbiggYXR0YWNobWVudCwgcHJvcHMgKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKCB0aGlzLmF0dGFjaG1lbnQgKTtcblx0XHR0aGlzLmF0dGFjaG1lbnQgPSBhdHRhY2htZW50O1xuXHRcdHRoaXMuYmluZEF0dGFjaG1lbnRMaXN0ZW5lcnMoKTtcblxuXHRcdHRoaXMuc2V0KCAnYXR0YWNobWVudF9pZCcsIHRoaXMuYXR0YWNobWVudC5nZXQoICdpZCcgKSApO1xuXHRcdHRoaXMuc2V0KCAnY2FwdGlvbicsIHRoaXMuYXR0YWNobWVudC5nZXQoICdjYXB0aW9uJyApICk7XG5cdFx0dGhpcy5zZXQoICdhbHQnLCB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAnYWx0JyApICk7XG5cdFx0dGhpcy5zZXQoICdzaXplJywgcHJvcHMuZ2V0KCAnc2l6ZScgKSApO1xuXHRcdHRoaXMuc2V0KCAnYWxpZ24nLCBwcm9wcy5nZXQoICdhbGlnbicgKSApO1xuXHRcdHRoaXMuc2V0KCAnbGluaycsIHByb3BzLmdldCggJ2xpbmsnICkgKTtcblx0XHR0aGlzLnVwZGF0ZUxpbmtVcmwoKTtcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcblx0fSxcblxuXHRzZXRMaW5rVHlwZUZyb21Vcmw6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaW5rVXJsID0gdGhpcy5nZXQoICdsaW5rVXJsJyApLFxuXHRcdFx0dHlwZTtcblxuXHRcdGlmICggISBsaW5rVXJsICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaW5rJywgJ25vbmUnICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZGVmYXVsdCB0byBjdXN0b20gaWYgdGhlcmUgaXMgYSBsaW5rVXJsXG5cdFx0dHlwZSA9ICdjdXN0b20nO1xuXG5cdFx0aWYgKCB0aGlzLmF0dGFjaG1lbnQgKSB7XG5cdFx0XHRpZiAoIHRoaXMuYXR0YWNobWVudC5nZXQoICd1cmwnICkgPT09IGxpbmtVcmwgKSB7XG5cdFx0XHRcdHR5cGUgPSAnZmlsZSc7XG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmF0dGFjaG1lbnQuZ2V0KCAnbGluaycgKSA9PT0gbGlua1VybCApIHtcblx0XHRcdFx0dHlwZSA9ICdwb3N0Jztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCB0aGlzLmdldCggJ3VybCcgKSA9PT0gbGlua1VybCApIHtcblx0XHRcdFx0dHlwZSA9ICdmaWxlJztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnNldCggJ2xpbmsnLCB0eXBlICk7XG5cdH0sXG5cblx0dXBkYXRlTGlua1VybDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpbmsgPSB0aGlzLmdldCggJ2xpbmsnICksXG5cdFx0XHR1cmw7XG5cblx0XHRzd2l0Y2goIGxpbmsgKSB7XG5cdFx0XHRjYXNlICdmaWxlJzpcblx0XHRcdFx0aWYgKCB0aGlzLmF0dGFjaG1lbnQgKSB7XG5cdFx0XHRcdFx0dXJsID0gdGhpcy5hdHRhY2htZW50LmdldCggJ3VybCcgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR1cmwgPSB0aGlzLmdldCggJ3VybCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNldCggJ2xpbmtVcmwnLCB1cmwgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwb3N0Jzpcblx0XHRcdFx0dGhpcy5zZXQoICdsaW5rVXJsJywgdGhpcy5hdHRhY2htZW50LmdldCggJ2xpbmsnICkgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdub25lJzpcblx0XHRcdFx0dGhpcy5zZXQoICdsaW5rVXJsJywgJycgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZVNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzaXplO1xuXG5cdFx0aWYgKCAhIHRoaXMuYXR0YWNobWVudCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZ2V0KCAnc2l6ZScgKSA9PT0gJ2N1c3RvbScgKSB7XG5cdFx0XHR0aGlzLnNldCggJ3dpZHRoJywgdGhpcy5nZXQoICdjdXN0b21XaWR0aCcgKSApO1xuXHRcdFx0dGhpcy5zZXQoICdoZWlnaHQnLCB0aGlzLmdldCggJ2N1c3RvbUhlaWdodCcgKSApO1xuXHRcdFx0dGhpcy5zZXQoICd1cmwnLCB0aGlzLmdldCggJ29yaWdpbmFsVXJsJyApICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c2l6ZSA9IHRoaXMuYXR0YWNobWVudC5nZXQoICdzaXplcycgKVsgdGhpcy5nZXQoICdzaXplJyApIF07XG5cblx0XHRpZiAoICEgc2l6ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnNldCggJ3VybCcsIHNpemUudXJsICk7XG5cdFx0dGhpcy5zZXQoICd3aWR0aCcsIHNpemUud2lkdGggKTtcblx0XHR0aGlzLnNldCggJ2hlaWdodCcsIHNpemUuaGVpZ2h0ICk7XG5cdH0sXG5cblx0c2V0QXNwZWN0UmF0aW86IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmdWxsO1xuXG5cdFx0aWYgKCB0aGlzLmF0dGFjaG1lbnQgJiYgdGhpcy5hdHRhY2htZW50LmdldCggJ3NpemVzJyApICkge1xuXHRcdFx0ZnVsbCA9IHRoaXMuYXR0YWNobWVudC5nZXQoICdzaXplcycgKS5mdWxsO1xuXG5cdFx0XHRpZiAoIGZ1bGwgKSB7XG5cdFx0XHRcdHRoaXMuc2V0KCAnYXNwZWN0UmF0aW8nLCBmdWxsLndpZHRoIC8gZnVsbC5oZWlnaHQgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuc2V0KCAnYXNwZWN0UmF0aW8nLCB0aGlzLmdldCggJ2N1c3RvbVdpZHRoJyApIC8gdGhpcy5nZXQoICdjdXN0b21IZWlnaHQnICkgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zdEltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5tb2RlbC5RdWVyeVxuICpcbiAqIEEgY29sbGVjdGlvbiBvZiBhdHRhY2htZW50cyB0aGF0IG1hdGNoIHRoZSBzdXBwbGllZCBxdWVyeSBhcmd1bWVudHMuXG4gKlxuICogTm90ZTogRG8gTk9UIGNoYW5nZSB0aGlzLmFyZ3MgYWZ0ZXIgdGhlIHF1ZXJ5IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICogICAgICAgVGhpbmdzIHdpbGwgYnJlYWsuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHNcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Db2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHthcnJheX0gIFttb2RlbHNdICAgICAgICAgICAgICAgICAgICAgIE1vZGVscyB0byBpbml0aWFsaXplIHdpdGggdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBoYXNoLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmFyZ3NdICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzIHF1ZXJ5IGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hcmdzLnBvc3RzX3Blcl9wYWdlXVxuICovXG52YXIgQXR0YWNobWVudHMgPSB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50cyxcblx0UXVlcnk7XG5cblF1ZXJ5ID0gQXR0YWNobWVudHMuZXh0ZW5kKHtcblx0LyoqXG5cdCAqIEBnbG9iYWwgd3AuVXBsb2FkZXJcblx0ICpcblx0ICogQHBhcmFtIHthcnJheX0gIFttb2RlbHM9W11dICBBcnJheSBvZiBpbml0aWFsIG1vZGVscyB0byBwb3B1bGF0ZSB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG1vZGVscywgb3B0aW9ucyApIHtcblx0XHR2YXIgYWxsb3dlZDtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdEF0dGFjaG1lbnRzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdHRoaXMuYXJncyAgICAgPSBvcHRpb25zLmFyZ3M7XG5cdFx0dGhpcy5faGFzTW9yZSA9IHRydWU7XG5cdFx0dGhpcy5jcmVhdGVkICA9IG5ldyBEYXRlKCk7XG5cblx0XHR0aGlzLmZpbHRlcnMub3JkZXIgPSBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHZhciBvcmRlcmJ5ID0gdGhpcy5wcm9wcy5nZXQoJ29yZGVyYnknKSxcblx0XHRcdFx0b3JkZXIgPSB0aGlzLnByb3BzLmdldCgnb3JkZXInKTtcblxuXHRcdFx0aWYgKCAhIHRoaXMuY29tcGFyYXRvciApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIHdhbnQgYW55IGl0ZW1zIHRoYXQgY2FuIGJlIHBsYWNlZCBiZWZvcmUgdGhlIGxhc3Rcblx0XHRcdC8vIGl0ZW0gaW4gdGhlIHNldC4gSWYgd2UgYWRkIGFueSBpdGVtcyBhZnRlciB0aGUgbGFzdFxuXHRcdFx0Ly8gaXRlbSwgdGhlbiB3ZSBjYW4ndCBndWFyYW50ZWUgdGhlIHNldCBpcyBjb21wbGV0ZS5cblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiAxICE9PSB0aGlzLmNvbXBhcmF0b3IoIGF0dGFjaG1lbnQsIHRoaXMubGFzdCgpLCB7IHRpZXM6IHRydWUgfSk7XG5cblx0XHRcdC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbm8gaXRlbXMgeWV0IGFuZFxuXHRcdFx0Ly8gd2UncmUgc29ydGluZyBmb3IgcmVjZW50IGl0ZW1zLiBJbiB0aGF0IGNhc2UsIHdlIHdhbnRcblx0XHRcdC8vIGNoYW5nZXMgdGhhdCBvY2N1cnJlZCBhZnRlciB3ZSBjcmVhdGVkIHRoZSBxdWVyeS5cblx0XHRcdH0gZWxzZSBpZiAoICdERVNDJyA9PT0gb3JkZXIgJiYgKCAnZGF0ZScgPT09IG9yZGVyYnkgfHwgJ21vZGlmaWVkJyA9PT0gb3JkZXJieSApICkge1xuXHRcdFx0XHRyZXR1cm4gYXR0YWNobWVudC5nZXQoIG9yZGVyYnkgKSA+PSB0aGlzLmNyZWF0ZWQ7XG5cblx0XHRcdC8vIElmIHdlJ3JlIHNvcnRpbmcgYnkgbWVudSBvcmRlciBhbmQgd2UgaGF2ZSBubyBpdGVtcyxcblx0XHRcdC8vIGFjY2VwdCBhbnkgaXRlbXMgdGhhdCBoYXZlIHRoZSBkZWZhdWx0IG1lbnUgb3JkZXIgKDApLlxuXHRcdFx0fSBlbHNlIGlmICggJ0FTQycgPT09IG9yZGVyICYmICdtZW51T3JkZXInID09PSBvcmRlcmJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gYXR0YWNobWVudC5nZXQoIG9yZGVyYnkgKSA9PT0gMDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCB3ZSBkb24ndCB3YW50IGFueSBpdGVtcyB5ZXQuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdC8vIE9ic2VydmUgdGhlIGNlbnRyYWwgYHdwLlVwbG9hZGVyLnF1ZXVlYCBjb2xsZWN0aW9uIHRvIHdhdGNoIGZvclxuXHRcdC8vIG5ldyBtYXRjaGVzIGZvciB0aGUgcXVlcnkuXG5cdFx0Ly9cblx0XHQvLyBPbmx5IG9ic2VydmUgd2hlbiBhIGxpbWl0ZWQgbnVtYmVyIG9mIHF1ZXJ5IGFyZ3MgYXJlIHNldC4gVGhlcmVcblx0XHQvLyBhcmUgbm8gZmlsdGVycyBmb3Igb3RoZXIgcHJvcGVydGllcywgc28gb2JzZXJ2aW5nIHdpbGwgcmVzdWx0IGluXG5cdFx0Ly8gZmFsc2UgcG9zaXRpdmVzIGluIHRob3NlIHF1ZXJpZXMuXG5cdFx0YWxsb3dlZCA9IFsgJ3MnLCAnb3JkZXInLCAnb3JkZXJieScsICdwb3N0c19wZXJfcGFnZScsICdwb3N0X21pbWVfdHlwZScsICdwb3N0X3BhcmVudCcgXTtcblx0XHRpZiAoIHdwLlVwbG9hZGVyICYmIF8oIHRoaXMuYXJncyApLmNoYWluKCkua2V5cygpLmRpZmZlcmVuY2UoIGFsbG93ZWQgKS5pc0VtcHR5KCkudmFsdWUoKSApIHtcblx0XHRcdHRoaXMub2JzZXJ2ZSggd3AuVXBsb2FkZXIucXVldWUgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGF0dGFjaG1lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIHN5bmMnZCBmcm9tIHRoZSBzZXJ2ZXJcblx0ICogdGhhdCBtYXRjaCB0aGUgY29sbGVjdGlvbidzIHF1ZXJ5LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGhhc01vcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9oYXNNb3JlO1xuXHR9LFxuXHQvKipcblx0ICogRmV0Y2ggbW9yZSBhdHRhY2htZW50cyBmcm9tIHRoZSBzZXJ2ZXIgZm9yIHRoZSBjb2xsZWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gICB7b2JqZWN0fSAgW29wdGlvbnM9e31dXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0bW9yZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIHF1ZXJ5ID0gdGhpcztcblxuXHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZXF1ZXN0IHBlbmRpbmcsIHJldHVybiBlYXJseSB3aXRoIHRoZSBEZWZlcnJlZCBvYmplY3QuXG5cdFx0aWYgKCB0aGlzLl9tb3JlICYmICdwZW5kaW5nJyA9PT0gdGhpcy5fbW9yZS5zdGF0ZSgpICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX21vcmU7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMuaGFzTW9yZSgpICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKCB0aGlzICkucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdG9wdGlvbnMucmVtb3ZlID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5fbW9yZSA9IHRoaXMuZmV0Y2goIG9wdGlvbnMgKS5kb25lKCBmdW5jdGlvbiggcmVzcCApIHtcblx0XHRcdGlmICggXy5pc0VtcHR5KCByZXNwICkgfHwgLTEgPT09IHRoaXMuYXJncy5wb3N0c19wZXJfcGFnZSB8fCByZXNwLmxlbmd0aCA8IHRoaXMuYXJncy5wb3N0c19wZXJfcGFnZSApIHtcblx0XHRcdFx0cXVlcnkuX2hhc01vcmUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIE92ZXJyaWRlcyBCYWNrYm9uZS5Db2xsZWN0aW9uLnN5bmNcblx0ICogT3ZlcnJpZGVzIHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLnN5bmNcblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBtb2RlbFxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0c3luYzogZnVuY3Rpb24oIG1ldGhvZCwgbW9kZWwsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGFyZ3MsIGZhbGxiYWNrO1xuXG5cdFx0Ly8gT3ZlcmxvYWQgdGhlIHJlYWQgbWV0aG9kIHNvIEF0dGFjaG1lbnQuZmV0Y2goKSBmdW5jdGlvbnMgY29ycmVjdGx5LlxuXHRcdGlmICggJ3JlYWQnID09PSBtZXRob2QgKSB7XG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRcdG9wdGlvbnMuY29udGV4dCA9IHRoaXM7XG5cdFx0XHRvcHRpb25zLmRhdGEgPSBfLmV4dGVuZCggb3B0aW9ucy5kYXRhIHx8IHt9LCB7XG5cdFx0XHRcdGFjdGlvbjogICdxdWVyeS1hdHRhY2htZW50cycsXG5cdFx0XHRcdHBvc3RfaWQ6IHdwLm1lZGlhLm1vZGVsLnNldHRpbmdzLnBvc3QuaWRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDbG9uZSB0aGUgYXJncyBzbyBtYW5pcHVsYXRpb24gaXMgbm9uLWRlc3RydWN0aXZlLlxuXHRcdFx0YXJncyA9IF8uY2xvbmUoIHRoaXMuYXJncyApO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgd2hpY2ggcGFnZSB0byBxdWVyeS5cblx0XHRcdGlmICggLTEgIT09IGFyZ3MucG9zdHNfcGVyX3BhZ2UgKSB7XG5cdFx0XHRcdGFyZ3MucGFnZWQgPSBNYXRoLnJvdW5kKCB0aGlzLmxlbmd0aCAvIGFyZ3MucG9zdHNfcGVyX3BhZ2UgKSArIDE7XG5cdFx0XHR9XG5cblx0XHRcdG9wdGlvbnMuZGF0YS5xdWVyeSA9IGFyZ3M7XG5cdFx0XHRyZXR1cm4gd3AubWVkaWEuYWpheCggb3B0aW9ucyApO1xuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gQmFja2JvbmUuc3luYygpXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbCB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50cy5zeW5jIG9yIEJhY2tib25lLnN5bmNcblx0XHRcdCAqL1xuXHRcdFx0ZmFsbGJhY2sgPSBBdHRhY2htZW50cy5wcm90b3R5cGUuc3luYyA/IEF0dGFjaG1lbnRzLnByb3RvdHlwZSA6IEJhY2tib25lO1xuXHRcdFx0cmV0dXJuIGZhbGxiYWNrLnN5bmMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fVxufSwge1xuXHQvKipcblx0ICogQHJlYWRvbmx5XG5cdCAqL1xuXHRkZWZhdWx0UHJvcHM6IHtcblx0XHRvcmRlcmJ5OiAnZGF0ZScsXG5cdFx0b3JkZXI6ICAgJ0RFU0MnXG5cdH0sXG5cdC8qKlxuXHQgKiBAcmVhZG9ubHlcblx0ICovXG5cdGRlZmF1bHRBcmdzOiB7XG5cdFx0cG9zdHNfcGVyX3BhZ2U6IDQwXG5cdH0sXG5cdC8qKlxuXHQgKiBAcmVhZG9ubHlcblx0ICovXG5cdG9yZGVyYnk6IHtcblx0XHRhbGxvd2VkOiAgWyAnbmFtZScsICdhdXRob3InLCAnZGF0ZScsICd0aXRsZScsICdtb2RpZmllZCcsICd1cGxvYWRlZFRvJywgJ2lkJywgJ3Bvc3RfX2luJywgJ21lbnVPcmRlcicgXSxcblx0XHQvKipcblx0XHQgKiBBIG1hcCBvZiBKYXZhU2NyaXB0IG9yZGVyYnkgdmFsdWVzIHRvIHRoZWlyIFdQX1F1ZXJ5IGVxdWl2YWxlbnRzLlxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFsdWVtYXA6IHtcblx0XHRcdCdpZCc6ICAgICAgICAgJ0lEJyxcblx0XHRcdCd1cGxvYWRlZFRvJzogJ3BhcmVudCcsXG5cdFx0XHQnbWVudU9yZGVyJzogICdtZW51X29yZGVyIElEJ1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEEgbWFwIG9mIEphdmFTY3JpcHQgcXVlcnkgcHJvcGVydGllcyB0byB0aGVpciBXUF9RdWVyeSBlcXVpdmFsZW50cy5cblx0ICpcblx0ICogQHJlYWRvbmx5XG5cdCAqL1xuXHRwcm9wbWFwOiB7XG5cdFx0J3NlYXJjaCc6ICAgICdzJyxcblx0XHQndHlwZSc6ICAgICAgJ3Bvc3RfbWltZV90eXBlJyxcblx0XHQncGVyUGFnZSc6ICAgJ3Bvc3RzX3Blcl9wYWdlJyxcblx0XHQnbWVudU9yZGVyJzogJ21lbnVfb3JkZXInLFxuXHRcdCd1cGxvYWRlZFRvJzogJ3Bvc3RfcGFyZW50Jyxcblx0XHQnc3RhdHVzJzogICAgICdwb3N0X3N0YXR1cycsXG5cdFx0J2luY2x1ZGUnOiAgICAncG9zdF9faW4nLFxuXHRcdCdleGNsdWRlJzogICAgJ3Bvc3RfX25vdF9pbidcblx0fSxcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gQXR0YWNobWVudHMgUXVlcnkgY29sbGVjdGlvbiBnaXZlbiB0aGUgcHJvcGVydGllcy5cblx0ICpcblx0ICogQ2FjaGVzIHF1ZXJ5IG9iamVjdHMgYW5kIHJldXNlcyB3aGVyZSBwb3NzaWJsZS5cblx0ICpcblx0ICogQHN0YXRpY1xuXHQgKiBAbWV0aG9kXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMuY2FjaGU9dHJ1ZV0gICBXaGV0aGVyIHRvIHVzZSB0aGUgcXVlcnkgY2FjaGUgb3Igbm90LlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLm9yZGVyXVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLm9yZGVyYnldXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMuaW5jbHVkZV1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5leGNsdWRlXVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzLnNdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMucG9zdF9taW1lX3R5cGVdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMucG9zdHNfcGVyX3BhZ2VdXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHMubWVudV9vcmRlcl1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5wb3N0X3BhcmVudF1cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcy5wb3N0X3N0YXR1c11cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEubW9kZWwuUXVlcnl9IEEgbmV3IEF0dGFjaG1lbnRzIFF1ZXJ5IGNvbGxlY3Rpb24uXG5cdCAqL1xuXHRnZXQ6IChmdW5jdGlvbigpe1xuXHRcdC8qKlxuXHRcdCAqIEBzdGF0aWNcblx0XHQgKiBAdHlwZSBBcnJheVxuXHRcdCAqL1xuXHRcdHZhciBxdWVyaWVzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBAcmV0dXJucyB7UXVlcnl9XG5cdFx0ICovXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCBwcm9wcywgb3B0aW9ucyApIHtcblx0XHRcdHZhciBhcmdzICAgICA9IHt9LFxuXHRcdFx0XHRvcmRlcmJ5ICA9IFF1ZXJ5Lm9yZGVyYnksXG5cdFx0XHRcdGRlZmF1bHRzID0gUXVlcnkuZGVmYXVsdFByb3BzLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0Y2FjaGUgICAgPSAhISBwcm9wcy5jYWNoZSB8fCBfLmlzVW5kZWZpbmVkKCBwcm9wcy5jYWNoZSApO1xuXG5cdFx0XHQvLyBSZW1vdmUgdGhlIGBxdWVyeWAgcHJvcGVydHkuIFRoaXMgaXNuJ3QgbGlua2VkIHRvIGEgcXVlcnksXG5cdFx0XHQvLyB0aGlzICppcyogdGhlIHF1ZXJ5LlxuXHRcdFx0ZGVsZXRlIHByb3BzLnF1ZXJ5O1xuXHRcdFx0ZGVsZXRlIHByb3BzLmNhY2hlO1xuXG5cdFx0XHQvLyBGaWxsIGRlZmF1bHQgYXJncy5cblx0XHRcdF8uZGVmYXVsdHMoIHByb3BzLCBkZWZhdWx0cyApO1xuXG5cdFx0XHQvLyBOb3JtYWxpemUgdGhlIG9yZGVyLlxuXHRcdFx0cHJvcHMub3JkZXIgPSBwcm9wcy5vcmRlci50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0aWYgKCAnREVTQycgIT09IHByb3BzLm9yZGVyICYmICdBU0MnICE9PSBwcm9wcy5vcmRlciApIHtcblx0XHRcdFx0cHJvcHMub3JkZXIgPSBkZWZhdWx0cy5vcmRlci50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIG9yZGVyYnkgdmFsdWUuXG5cdFx0XHRpZiAoICEgXy5jb250YWlucyggb3JkZXJieS5hbGxvd2VkLCBwcm9wcy5vcmRlcmJ5ICkgKSB7XG5cdFx0XHRcdHByb3BzLm9yZGVyYnkgPSBkZWZhdWx0cy5vcmRlcmJ5O1xuXHRcdFx0fVxuXG5cdFx0XHRfLmVhY2goIFsgJ2luY2x1ZGUnLCAnZXhjbHVkZScgXSwgZnVuY3Rpb24oIHByb3AgKSB7XG5cdFx0XHRcdGlmICggcHJvcHNbIHByb3AgXSAmJiAhIF8uaXNBcnJheSggcHJvcHNbIHByb3AgXSApICkge1xuXHRcdFx0XHRcdHByb3BzWyBwcm9wIF0gPSBbIHByb3BzWyBwcm9wIF0gXTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXG5cdFx0XHQvLyBHZW5lcmF0ZSB0aGUgcXVlcnkgYGFyZ3NgIG9iamVjdC5cblx0XHRcdC8vIENvcnJlY3QgYW55IGRpZmZlcmluZyBwcm9wZXJ0eSBuYW1lcy5cblx0XHRcdF8uZWFjaCggcHJvcHMsIGZ1bmN0aW9uKCB2YWx1ZSwgcHJvcCApIHtcblx0XHRcdFx0aWYgKCBfLmlzTnVsbCggdmFsdWUgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhcmdzWyBRdWVyeS5wcm9wbWFwWyBwcm9wIF0gfHwgcHJvcCBdID0gdmFsdWU7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRmlsbCBhbnkgb3RoZXIgZGVmYXVsdCBxdWVyeSBhcmdzLlxuXHRcdFx0Xy5kZWZhdWx0cyggYXJncywgUXVlcnkuZGVmYXVsdEFyZ3MgKTtcblxuXHRcdFx0Ly8gYHByb3BzLm9yZGVyYnlgIGRvZXMgbm90IGFsd2F5cyBtYXAgZGlyZWN0bHkgdG8gYGFyZ3Mub3JkZXJieWAuXG5cdFx0XHQvLyBTdWJzdGl0dXRlIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGluIG9yZGVyYnkua2V5bWFwLlxuXHRcdFx0YXJncy5vcmRlcmJ5ID0gb3JkZXJieS52YWx1ZW1hcFsgcHJvcHMub3JkZXJieSBdIHx8IHByb3BzLm9yZGVyYnk7XG5cblx0XHRcdC8vIFNlYXJjaCB0aGUgcXVlcnkgY2FjaGUgZm9yIGEgbWF0Y2hpbmcgcXVlcnkuXG5cdFx0XHRpZiAoIGNhY2hlICkge1xuXHRcdFx0XHRxdWVyeSA9IF8uZmluZCggcXVlcmllcywgZnVuY3Rpb24oIHF1ZXJ5ICkge1xuXHRcdFx0XHRcdHJldHVybiBfLmlzRXF1YWwoIHF1ZXJ5LmFyZ3MsIGFyZ3MgKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRxdWVyaWVzID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IHF1ZXJ5IGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlLlxuXHRcdFx0aWYgKCAhIHF1ZXJ5ICkge1xuXHRcdFx0XHRxdWVyeSA9IG5ldyBRdWVyeSggW10sIF8uZXh0ZW5kKCBvcHRpb25zIHx8IHt9LCB7XG5cdFx0XHRcdFx0cHJvcHM6IHByb3BzLFxuXHRcdFx0XHRcdGFyZ3M6ICBhcmdzXG5cdFx0XHRcdH0gKSApO1xuXHRcdFx0XHRxdWVyaWVzLnB1c2goIHF1ZXJ5ICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBxdWVyeTtcblx0XHR9O1xuXHR9KCkpXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBRdWVyeTtcbiIsIi8qKlxuICogd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uXG4gKlxuICogQSBzZWxlY3Rpb24gb2YgYXR0YWNobWVudHMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEubW9kZWwuQXR0YWNobWVudHNcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Db2xsZWN0aW9uXG4gKi9cbnZhciBBdHRhY2htZW50cyA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzLFxuXHRTZWxlY3Rpb247XG5cblNlbGVjdGlvbiA9IEF0dGFjaG1lbnRzLmV4dGVuZCh7XG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBgc2luZ2xlYCBtb2RlbCB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuXG5cdCAqIEJpbmRzIGBzaW5nbGVgIGluc3RlYWQgb2YgdXNpbmcgdGhlIGNvbnRleHQgYXJndW1lbnQgdG8gZW5zdXJlXG5cdCAqIGl0IHJlY2VpdmVzIG5vIHBhcmFtZXRlcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFttb2RlbHM9W11dIEFycmF5IG9mIG1vZGVscyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBjb2xsZWN0aW9uLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggbW9kZWxzLCBvcHRpb25zICkge1xuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRBdHRhY2htZW50cy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5tdWx0aXBsZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tdWx0aXBsZTtcblxuXHRcdHRoaXMub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgXy5iaW5kKCB0aGlzLnNpbmdsZSwgdGhpcywgZmFsc2UgKSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgd29ya2Zsb3cgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aS1zZWxlY3QsIGNsZWFyIG91dCB0aGUgc2VsZWN0aW9uXG5cdCAqIGJlZm9yZSBhZGRpbmcgYSBuZXcgYXR0YWNobWVudCB0byBpdC5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gbW9kZWxzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50W119XG5cdCAqL1xuXHRhZGQ6IGZ1bmN0aW9uKCBtb2RlbHMsIG9wdGlvbnMgKSB7XG5cdFx0aWYgKCAhIHRoaXMubXVsdGlwbGUgKSB7XG5cdFx0XHR0aGlzLnJlbW92ZSggdGhpcy5tb2RlbHMgKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAnYWRkJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0cmV0dXJuIEF0dGFjaG1lbnRzLnByb3RvdHlwZS5hZGQuY2FsbCggdGhpcywgbW9kZWxzLCBvcHRpb25zICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZpcmVkIHdoZW4gdG9nZ2xpbmcgKGNsaWNraW5nIG9uKSBhbiBhdHRhY2htZW50IGluIHRoZSBtb2RhbC5cblx0ICpcblx0ICogQHBhcmFtIHt1bmRlZmluZWR8Ym9vbGVhbnx3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBtb2RlbFxuXHQgKlxuXHQgKiBAZmlyZXMgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uI3NlbGVjdGlvbjpzaW5nbGVcblx0ICogQGZpcmVzIHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiNzZWxlY3Rpb246dW5zaW5nbGVcblx0ICpcblx0ICogQHJldHVybnMge0JhY2tib25lLk1vZGVsfVxuXHQgKi9cblx0c2luZ2xlOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0dmFyIHByZXZpb3VzID0gdGhpcy5fc2luZ2xlO1xuXG5cdFx0Ly8gSWYgYSBgbW9kZWxgIGlzIHByb3ZpZGVkLCB1c2UgaXQgYXMgdGhlIHNpbmdsZSBtb2RlbC5cblx0XHRpZiAoIG1vZGVsICkge1xuXHRcdFx0dGhpcy5fc2luZ2xlID0gbW9kZWw7XG5cdFx0fVxuXHRcdC8vIElmIHRoZSBzaW5nbGUgbW9kZWwgaXNuJ3QgaW4gdGhlIHNlbGVjdGlvbiwgcmVtb3ZlIGl0LlxuXHRcdGlmICggdGhpcy5fc2luZ2xlICYmICEgdGhpcy5nZXQoIHRoaXMuX3NpbmdsZS5jaWQgKSApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLl9zaW5nbGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5fc2luZ2xlID0gdGhpcy5fc2luZ2xlIHx8IHRoaXMubGFzdCgpO1xuXG5cdFx0Ly8gSWYgc2luZ2xlIGhhcyBjaGFuZ2VkLCBmaXJlIGFuIGV2ZW50LlxuXHRcdGlmICggdGhpcy5fc2luZ2xlICE9PSBwcmV2aW91cyApIHtcblx0XHRcdGlmICggcHJldmlvdXMgKSB7XG5cdFx0XHRcdHByZXZpb3VzLnRyaWdnZXIoICdzZWxlY3Rpb246dW5zaW5nbGUnLCBwcmV2aW91cywgdGhpcyApO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb2RlbCB3YXMgYWxyZWFkeSByZW1vdmVkLCB0cmlnZ2VyIHRoZSBjb2xsZWN0aW9uXG5cdFx0XHRcdC8vIGV2ZW50IG1hbnVhbGx5LlxuXHRcdFx0XHRpZiAoICEgdGhpcy5nZXQoIHByZXZpb3VzLmNpZCApICkge1xuXHRcdFx0XHRcdHRoaXMudHJpZ2dlciggJ3NlbGVjdGlvbjp1bnNpbmdsZScsIHByZXZpb3VzLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggdGhpcy5fc2luZ2xlICkge1xuXHRcdFx0XHR0aGlzLl9zaW5nbGUudHJpZ2dlciggJ3NlbGVjdGlvbjpzaW5nbGUnLCB0aGlzLl9zaW5nbGUsIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIHNpbmdsZSBtb2RlbCwgb3IgdGhlIGxhc3QgbW9kZWwgYXMgYSBmYWxsYmFjay5cblx0XHRyZXR1cm4gdGhpcy5fc2luZ2xlO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Rpb247XG4iXX0=
  • src/wp-includes/js/media-views.js

    diff --git src/wp-includes/js/media-views.js src/wp-includes/js/media-views.js
    index be802d7642..fb60fe4007 100644
    var View = wp.Backbone.View.extend({ 
    85758575
    85768576module.exports = View;
    85778577
    8578 },{}]},{},[19]);
     8578},{}]},{},[19])
     8579//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY29sbGVjdGlvbi1hZGQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY29sbGVjdGlvbi1lZGl0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL2Nyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvY3VzdG9taXplLWltYWdlLWNyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvZWRpdC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9lbWJlZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9mZWF0dXJlZC1pbWFnZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9nYWxsZXJ5LWFkZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9nYWxsZXJ5LWVkaXQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvaW1hZ2UtZGV0YWlscy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9saWJyYXJ5LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL21lZGlhLWxpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvcmVnaW9uLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL2NvbnRyb2xsZXJzL3JlcGxhY2UtaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvc2l0ZS1pY29uLWNyb3BwZXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvY29udHJvbGxlcnMvc3RhdGUtbWFjaGluZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS9jb250cm9sbGVycy9zdGF0ZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS91dGlscy9zZWxlY3Rpb24tc3luYy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy5tYW5pZmVzdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWNvbXBhdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC1maWx0ZXJzL2FsbC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMvZGF0ZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMvdXBsb2FkZWQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50L2RldGFpbHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9lZGl0LWxpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9lZGl0LXNlbGVjdGlvbi5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50L2xpYnJhcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudC9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudHMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYXR0YWNobWVudHMvYnJvd3Nlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9hdHRhY2htZW50cy9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvYnV0dG9uLWdyb3VwLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2J1dHRvbi5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9jcm9wcGVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2VkaXQtaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQvaW1hZ2UuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZW1iZWQvbGluay5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9lbWJlZC91cmwuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZm9jdXMtbWFuYWdlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9mcmFtZS9pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2ZyYW1lL3Bvc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvZnJhbWUvc2VsZWN0LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2lmcmFtZS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9pbWFnZS1kZXRhaWxzLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL2xhYmVsLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21lZGlhLWZyYW1lLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21lbnUtaXRlbS5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9tZW51LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL21vZGFsLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ByaW9yaXR5LWxpc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvcm91dGVyLWl0ZW0uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvcm91dGVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3NlYXJjaC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zZWxlY3Rpb24uanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MvYXR0YWNobWVudC1kaXNwbGF5LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3NldHRpbmdzL2dhbGxlcnkuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2V0dGluZ3MvcGxheWxpc3QuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3Mvc2lkZWJhci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zaXRlLWljb24tY3JvcHBlci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zaXRlLWljb24tcHJldmlldy5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy9zcGlubmVyLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3Rvb2xiYXIuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdG9vbGJhci9lbWJlZC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy90b29sYmFyL3NlbGVjdC5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy91cGxvYWRlci9lZGl0b3IuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdXBsb2FkZXIvaW5saW5lLmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3VwbG9hZGVyL3N0YXR1cy1lcnJvci5qcyIsInNyYy93cC1pbmNsdWRlcy9qcy9tZWRpYS92aWV3cy91cGxvYWRlci9zdGF0dXMuanMiLCJzcmMvd3AtaW5jbHVkZXMvanMvbWVkaWEvdmlld3MvdXBsb2FkZXIvd2luZG93LmpzIiwic3JjL3dwLWluY2x1ZGVzL2pzL21lZGlhL3ZpZXdzL3ZpZXcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25TQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3dEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDektBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ29sbGVjdGlvbkFkZFxuICpcbiAqIEEgc3RhdGUgZm9yIGFkZGluZyBhdHRhY2htZW50cyB0byBhIGNvbGxlY3Rpb24gKGUuZy4gdmlkZW8gcGxheWxpc3QpLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzXSAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5pZD1saWJyYXJ5XSAgICAgIFVuaXF1ZSBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy50aXRsZSAgICAgICAgICAgICAgICAgICAgVGl0bGUgZm9yIHRoZSBzdGF0ZS4gRGlzcGxheXMgaW4gdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9YWRkXSAgICAgICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuIEB0b2RvICdhZGQnIGRvZXNuJ3Qgc2VlbSBkbyBhbnl0aGluZyBzcGVjaWFsLCBhbmQgZ2V0cyB1c2VkIGFzIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFthdHRyaWJ1dGVzLmxpYnJhcnldICAgICAgICAgICAgICAgICBUaGUgYXR0YWNobWVudHMgY29sbGVjdGlvbiB0byBicm93c2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25lIGlzIG5vdCBzdXBwbGllZCwgYSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSAgICAgICAgICAgICBbYXR0cmlidXRlcy5maWx0ZXJhYmxlPXVwbG9hZGVkXSAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBmaWx0ZXJhYmxlLCBhbmQgaWYgc28gd2hhdCBmaWx0ZXJzIHNob3VsZCBiZSBzaG93bi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICdhbGwnLCAndXBsb2FkZWQnLCBvciAndW5hdHRhY2hlZCcuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWdhbGxlcnldICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PXVwbG9hZF0gICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbiBieSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZyBpZiAnY29udGVudFVzZXJTZXR0aW5nJyBpcyB0cnVlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucm91dGVyPWJyb3dzZV0gICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIHJvdXRlciByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPWdhbGxlcnktYWRkXSAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPXRydWVdICAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBzZWFyY2hhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc29ydGFibGU9dHJ1ZV0gICAgICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuYXV0b1NlbGVjdD10cnVlXSAgICAgICAgIFdoZXRoZXIgYW4gdXBsb2FkZWQgYXR0YWNobWVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudFVzZXJTZXR0aW5nPXRydWVdIFdoZXRoZXIgdGhlIGNvbnRlbnQgcmVnaW9uJ3MgbW9kZSBzaG91bGQgYmUgc2V0IGFuZCBwZXJzaXN0ZWQgcGVyIHVzZXIuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT0xMDBdICAgICAgICAgICAgVGhlIHByaW9yaXR5IGZvciB0aGUgc3RhdGUgbGluayBpbiB0aGUgbWVkaWEgbWVudS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnN5bmNTZWxlY3Rpb249ZmFsc2VdICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlIGJlY2F1c2UgZm9yIHRoaXMgc3RhdGUsIGJlY2F1c2UgdGhlIGxpYnJhcnkgb2YgdGhlIEVkaXQgR2FsbGVyeSBzdGF0ZSBpcyB0aGUgc2VsZWN0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy50eXBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uJ3MgbWVkaWEgdHlwZS4gKGUuZy4gJ3ZpZGVvJykuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmNvbGxlY3Rpb25UeXBlICAgICAgICAgVGhlIGNvbGxlY3Rpb24gdHlwZS4gKGUuZy4gJ3BsYXlsaXN0JykuXG4gKi9cbnZhciBTZWxlY3Rpb24gPSB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24sXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdENvbGxlY3Rpb25BZGQ7XG5cbkNvbGxlY3Rpb25BZGQgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiBfLmRlZmF1bHRzKCB7XG5cdFx0Ly8gU2VsZWN0aW9uIGRlZmF1bHRzLiBAc2VlIG1lZGlhLm1vZGVsLlNlbGVjdGlvblxuXHRcdG11bHRpcGxlOiAgICAgICdhZGQnLFxuXHRcdC8vIEF0dGFjaG1lbnRzIGJyb3dzZXIgZGVmYXVsdHMuIEBzZWUgbWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXJcblx0XHRmaWx0ZXJhYmxlOiAgICAndXBsb2FkZWQnLFxuXG5cdFx0cHJpb3JpdHk6ICAgICAgMTAwLFxuXHRcdHN5bmNTZWxlY3Rpb246IGZhbHNlXG5cdH0sIExpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzICksXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvbGxlY3Rpb25UeXBlID0gdGhpcy5nZXQoJ2NvbGxlY3Rpb25UeXBlJyk7XG5cblx0XHRpZiAoICd2aWRlbycgPT09IHRoaXMuZ2V0KCAndHlwZScgKSApIHtcblx0XHRcdGNvbGxlY3Rpb25UeXBlID0gJ3ZpZGVvLScgKyBjb2xsZWN0aW9uVHlwZTtcblx0XHR9XG5cblx0XHR0aGlzLnNldCggJ2lkJywgY29sbGVjdGlvblR5cGUgKyAnLWxpYnJhcnknICk7XG5cdFx0dGhpcy5zZXQoICd0b29sYmFyJywgY29sbGVjdGlvblR5cGUgKyAnLWFkZCcgKTtcblx0XHR0aGlzLnNldCggJ21lbnUnLCBjb2xsZWN0aW9uVHlwZSApO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkIGEgYGxpYnJhcnlgLCBjcmVhdGUgYSBgU2VsZWN0aW9uYC5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIHdwLm1lZGlhLnF1ZXJ5KHsgdHlwZTogdGhpcy5nZXQoJ3R5cGUnKSB9KSApO1xuXHRcdH1cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuOS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpYnJhcnkgPSB0aGlzLmdldCgnbGlicmFyeScpLFxuXHRcdFx0ZWRpdExpYnJhcnkgPSB0aGlzLmdldCgnZWRpdExpYnJhcnknKSxcblx0XHRcdGVkaXQgPSB0aGlzLmZyYW1lLnN0YXRlKCB0aGlzLmdldCgnY29sbGVjdGlvblR5cGUnKSArICctZWRpdCcgKS5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdGlmICggZWRpdExpYnJhcnkgJiYgZWRpdExpYnJhcnkgIT09IGVkaXQgKSB7XG5cdFx0XHRsaWJyYXJ5LnVub2JzZXJ2ZSggZWRpdExpYnJhcnkgKTtcblx0XHR9XG5cblx0XHQvLyBBY2NlcHRzIGF0dGFjaG1lbnRzIHRoYXQgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnkgYW5kXG5cdFx0Ly8gdGhhdCBkbyBub3QgZXhpc3QgaW4gZ2FsbGVyeSdzIGxpYnJhcnkuXG5cdFx0bGlicmFyeS52YWxpZGF0b3IgPSBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHJldHVybiAhISB0aGlzLm1pcnJvcmluZy5nZXQoIGF0dGFjaG1lbnQuY2lkICkgJiYgISBlZGl0LmdldCggYXR0YWNobWVudC5jaWQgKSAmJiBTZWxlY3Rpb24ucHJvdG90eXBlLnZhbGlkYXRvci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFJlc2V0IHRoZSBsaWJyYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBhdHRhY2htZW50cyBhcmUgcmUtYWRkZWRcblx0XHQvLyB0byB0aGUgY29sbGVjdGlvbi4gRG8gc28gc2lsZW50bHksIGFzIGNhbGxpbmcgYG9ic2VydmVgIHdpbGxcblx0XHQvLyB0cmlnZ2VyIHRoZSBgcmVzZXRgIGV2ZW50LlxuXHRcdGxpYnJhcnkucmVzZXQoIGxpYnJhcnkubWlycm9yaW5nLm1vZGVscywgeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0bGlicmFyeS5vYnNlcnZlKCBlZGl0ICk7XG5cdFx0dGhpcy5zZXQoJ2VkaXRMaWJyYXJ5JywgZWRpdCk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxlY3Rpb25BZGQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ29sbGVjdGlvbkVkaXRcbiAqXG4gKiBBIHN0YXRlIGZvciBlZGl0aW5nIGEgY29sbGVjdGlvbiwgd2hpY2ggaXMgdXNlZCBieSBhdWRpbyBhbmQgdmlkZW8gcGxheWxpc3RzLFxuICogYW5kIGNhbiBiZSB1c2VkIGZvciBvdGhlciBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy50aXRsZSAgICAgICAgICAgICAgICAgIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBtZWRpYSBtZW51IGFuZCB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gZWRpdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhbiBlbXB0eSBtZWRpYS5tb2RlbC5TZWxlY3Rpb24gY29sbGVjdGlvbiBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMubXVsdGlwbGU9ZmFsc2VdICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PWJyb3dzZV0gICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLm1lbnUgICAgICAgICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uIEB0b2RvIHRoaXMgbmVlZHMgYSBiZXR0ZXIgZXhwbGFuYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPWZhbHNlXSAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBzZWFyY2hhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc29ydGFibGU9dHJ1ZV0gICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZGF0ZT10cnVlXSAgICAgICAgICAgIFdoZXRoZXIgdG8gc2hvdyB0aGUgZGF0ZSBmaWx0ZXIgaW4gdGhlIGJyb3dzZXIncyB0b29sYmFyLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZGVzY3JpYmU9dHJ1ZV0gICAgICAgIFdoZXRoZXIgdG8gb2ZmZXIgVUkgdG8gZGVzY3JpYmUgdGhlIGF0dGFjaG1lbnRzIC0gZS5nLiBjYXB0aW9uaW5nIGltYWdlcyBpbiBhIGdhbGxlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kcmFnSW5mbz10cnVlXSAgICAgICAgV2hldGhlciB0byBzaG93IGluc3RydWN0aW9uYWwgdGV4dCBhYm91dCB0aGUgYXR0YWNobWVudHMgYmVpbmcgc29ydGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kcmFnSW5mb1RleHRdICAgICAgICAgSW5zdHJ1Y3Rpb25hbCB0ZXh0IGFib3V0IHRoZSBhdHRhY2htZW50cyBiZWluZyBzb3J0YWJsZS5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkZWFsQ29sdW1uV2lkdGg9MTcwXSBUaGUgaWRlYWwgY29sdW1uIHdpZHRoIGluIHBpeGVscyBmb3IgYXR0YWNobWVudHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5lZGl0aW5nPWZhbHNlXSAgICAgICAgV2hldGhlciB0aGUgZ2FsbGVyeSBpcyBiZWluZyBjcmVhdGVkLCBvciBlZGl0aW5nIGFuIGV4aXN0aW5nIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbnR9ICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucHJpb3JpdHk9NjBdICAgICAgICAgIFRoZSBwcmlvcml0eSBmb3IgdGhlIHN0YXRlIGxpbmsgaW4gdGhlIG1lZGlhIG1lbnUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zeW5jU2VsZWN0aW9uPWZhbHNlXSAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2VsZWN0aW9uIHNob3VsZCBiZSBwZXJzaXN0ZWQgZnJvbSB0aGUgbGFzdCBzdGF0ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZSBmb3IgdGhpcyBzdGF0ZSwgYmVjYXVzZSB0aGUgbGlicmFyeSBwYXNzZWQgaW4gICppcyogdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7dmlld30gICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLlNldHRpbmdzVmlld10gICAgICAgICBUaGUgdmlldyB0byBlZGl0IHRoZSBjb2xsZWN0aW9uIGluc3RhbmNlIHNldHRpbmdzIChlLmcuIFBsYXlsaXN0IHNldHRpbmdzIHdpdGggXCJTaG93IHRyYWNrbGlzdFwiIGNoZWNrYm94KS5cbiAqIEBwYXJhbSB7dmlld30gICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLkF0dGFjaG1lbnRWaWV3XSAgICAgICBUaGUgc2luZ2xlIGBBdHRhY2htZW50YCB2aWV3IHRvIGJlIHVzZWQgaW4gdGhlIGBBdHRhY2htZW50c2AuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm9uZSBzdXBwbGllZCwgZGVmYXVsdHMgdG8gd3AubWVkaWEudmlldy5BdHRhY2htZW50LkVkaXRMaWJyYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy50eXBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2xsZWN0aW9uJ3MgbWVkaWEgdHlwZS4gKGUuZy4gJ3ZpZGVvJykuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmNvbGxlY3Rpb25UeXBlICAgICAgICAgVGhlIGNvbGxlY3Rpb24gdHlwZS4gKGUuZy4gJ3BsYXlsaXN0JykuXG4gKi9cbnZhciBMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHQkID0galF1ZXJ5LFxuXHRDb2xsZWN0aW9uRWRpdDtcblxuQ29sbGVjdGlvbkVkaXQgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0bXVsdGlwbGU6ICAgICAgICAgZmFsc2UsXG5cdFx0c29ydGFibGU6ICAgICAgICAgdHJ1ZSxcblx0XHRkYXRlOiAgICAgICAgICAgICBmYWxzZSxcblx0XHRzZWFyY2hhYmxlOiAgICAgICBmYWxzZSxcblx0XHRjb250ZW50OiAgICAgICAgICAnYnJvd3NlJyxcblx0XHRkZXNjcmliZTogICAgICAgICB0cnVlLFxuXHRcdGRyYWdJbmZvOiAgICAgICAgIHRydWUsXG5cdFx0aWRlYWxDb2x1bW5XaWR0aDogMTcwLFxuXHRcdGVkaXRpbmc6ICAgICAgICAgIGZhbHNlLFxuXHRcdHByaW9yaXR5OiAgICAgICAgIDYwLFxuXHRcdFNldHRpbmdzVmlldzogICAgIGZhbHNlLFxuXHRcdHN5bmNTZWxlY3Rpb246ICAgIGZhbHNlXG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvbGxlY3Rpb25UeXBlID0gdGhpcy5nZXQoJ2NvbGxlY3Rpb25UeXBlJyk7XG5cblx0XHRpZiAoICd2aWRlbycgPT09IHRoaXMuZ2V0KCAndHlwZScgKSApIHtcblx0XHRcdGNvbGxlY3Rpb25UeXBlID0gJ3ZpZGVvLScgKyBjb2xsZWN0aW9uVHlwZTtcblx0XHR9XG5cblx0XHR0aGlzLnNldCggJ2lkJywgY29sbGVjdGlvblR5cGUgKyAnLWVkaXQnICk7XG5cdFx0dGhpcy5zZXQoICd0b29sYmFyJywgY29sbGVjdGlvblR5cGUgKyAnLWVkaXQnICk7XG5cblx0XHQvLyBJZiB3ZSBoYXZlbid0IGJlZW4gcHJvdmlkZWQgYSBgbGlicmFyeWAsIGNyZWF0ZSBhIGBTZWxlY3Rpb25gLlxuXHRcdGlmICggISB0aGlzLmdldCgnbGlicmFyeScpICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5JywgbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbigpICk7XG5cdFx0fVxuXHRcdC8vIFRoZSBzaW5nbGUgYEF0dGFjaG1lbnRgIHZpZXcgdG8gYmUgdXNlZCBpbiB0aGUgYEF0dGFjaG1lbnRzYCB2aWV3LlxuXHRcdGlmICggISB0aGlzLmdldCgnQXR0YWNobWVudFZpZXcnKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnQXR0YWNobWVudFZpZXcnLCB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRWRpdExpYnJhcnkgKTtcblx0XHR9XG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdC8vIExpbWl0IHRoZSBsaWJyYXJ5IHRvIGltYWdlcyBvbmx5LlxuXHRcdGxpYnJhcnkucHJvcHMuc2V0KCAndHlwZScsIHRoaXMuZ2V0KCAndHlwZScgKSApO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIHVwbG9hZGVkIGF0dGFjaG1lbnRzLlxuXHRcdHRoaXMuZ2V0KCdsaWJyYXJ5Jykub2JzZXJ2ZSggd3AuVXBsb2FkZXIucXVldWUgKTtcblxuXHRcdHRoaXMuZnJhbWUub24oICdjb250ZW50OnJlbmRlcjpicm93c2UnLCB0aGlzLnJlbmRlclNldHRpbmdzLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU3RvcCB3YXRjaGluZyBmb3IgdXBsb2FkZWQgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5nZXQoJ2xpYnJhcnknKS51bm9ic2VydmUoIHdwLlVwbG9hZGVyLnF1ZXVlICk7XG5cblx0XHR0aGlzLmZyYW1lLm9mZiggJ2NvbnRlbnQ6cmVuZGVyOmJyb3dzZScsIHRoaXMucmVuZGVyU2V0dGluZ3MsIHRoaXMgKTtcblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmRlYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW5kZXIgdGhlIGNvbGxlY3Rpb24gZW1iZWQgc2V0dGluZ3MgdmlldyBpbiB0aGUgYnJvd3NlciBzaWRlYmFyLlxuXHQgKlxuXHQgKiBAdG9kbyBUaGlzIGlzIGFnYWluc3QgdGhlIHBhdHRlcm4gZWxzZXdoZXJlIGluIG1lZGlhLiBUeXBpY2FsbHkgdGhlIGZyYW1lXG5cdCAqICAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgcmVnaW9uIG1vZGUgY2FsbGJhY2tzLiBFeHBsYWluLlxuXHQgKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS52aWV3LmF0dGFjaG1lbnRzQnJvd3Nlcn0gVGhlIGF0dGFjaG1lbnRzIGJyb3dzZXIgdmlldy5cblx0ICovXG5cdHJlbmRlclNldHRpbmdzOiBmdW5jdGlvbiggYXR0YWNobWVudHNCcm93c2VyVmlldyApIHtcblx0XHR2YXIgbGlicmFyeSA9IHRoaXMuZ2V0KCdsaWJyYXJ5JyksXG5cdFx0XHRjb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0KCdjb2xsZWN0aW9uVHlwZScpLFxuXHRcdFx0ZHJhZ0luZm9UZXh0ID0gdGhpcy5nZXQoJ2RyYWdJbmZvVGV4dCcpLFxuXHRcdFx0U2V0dGluZ3NWaWV3ID0gdGhpcy5nZXQoJ1NldHRpbmdzVmlldycpLFxuXHRcdFx0b2JqID0ge307XG5cblx0XHRpZiAoICEgbGlicmFyeSB8fCAhIGF0dGFjaG1lbnRzQnJvd3NlclZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGlicmFyeVsgY29sbGVjdGlvblR5cGUgXSA9IGxpYnJhcnlbIGNvbGxlY3Rpb25UeXBlIF0gfHwgbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cblx0XHRvYmpbIGNvbGxlY3Rpb25UeXBlIF0gPSBuZXcgU2V0dGluZ3NWaWV3KHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRtb2RlbDogICAgICBsaWJyYXJ5WyBjb2xsZWN0aW9uVHlwZSBdLFxuXHRcdFx0cHJpb3JpdHk6ICAgNDBcblx0XHR9KTtcblxuXHRcdGF0dGFjaG1lbnRzQnJvd3NlclZpZXcuc2lkZWJhci5zZXQoIG9iaiApO1xuXG5cdFx0aWYgKCBkcmFnSW5mb1RleHQgKSB7XG5cdFx0XHRhdHRhY2htZW50c0Jyb3dzZXJWaWV3LnRvb2xiYXIuc2V0KCAnZHJhZ0luZm8nLCBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRcdGVsOiAkKCAnPGRpdiBjbGFzcz1cImluc3RydWN0aW9uc1wiPicgKyBkcmFnSW5mb1RleHQgKyAnPC9kaXY+JyApWzBdLFxuXHRcdFx0XHRwcmlvcml0eTogLTQwXG5cdFx0XHR9KSApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgJ1JldmVyc2Ugb3JkZXInIGJ1dHRvbiB0byB0aGUgdG9vbGJhci5cblx0XHRhdHRhY2htZW50c0Jyb3dzZXJWaWV3LnRvb2xiYXIuc2V0KCAncmV2ZXJzZScsIHtcblx0XHRcdHRleHQ6ICAgICBsMTBuLnJldmVyc2VPcmRlcixcblx0XHRcdHByaW9yaXR5OiA4MCxcblxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaWJyYXJ5LnJlc2V0KCBsaWJyYXJ5LnRvQXJyYXkoKS5yZXZlcnNlKCkgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGVjdGlvbkVkaXQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ3JvcHBlclxuICpcbiAqIEEgc3RhdGUgZm9yIGNyb3BwaW5nIGFuIGltYWdlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0Q3JvcHBlcjtcblxuQ3JvcHBlciA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAgICAgJ2Nyb3BwZXInLFxuXHRcdHRpdGxlOiAgICAgICBsMTBuLmNyb3BJbWFnZSxcblx0XHQvLyBSZWdpb24gbW9kZSBkZWZhdWx0cy5cblx0XHR0b29sYmFyOiAgICAgJ2Nyb3AnLFxuXHRcdGNvbnRlbnQ6ICAgICAnY3JvcCcsXG5cdFx0cm91dGVyOiAgICAgIGZhbHNlLFxuXHRcdGNhblNraXBDcm9wOiBmYWxzZSxcblxuXHRcdC8vIERlZmF1bHQgZG9Dcm9wIEFqYXggYXJndW1lbnRzIHRvIGFsbG93IHRoZSBDdXN0b21pemVyIChmb3IgZXhhbXBsZSkgdG8gaW5qZWN0IHN0YXRlLlxuXHRcdGRvQ3JvcEFyZ3M6IHt9XG5cdH0sXG5cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUub24oICdjb250ZW50OmNyZWF0ZTpjcm9wJywgdGhpcy5jcmVhdGVDcm9wQ29udGVudCwgdGhpcyApO1xuXHRcdHRoaXMuZnJhbWUub24oICdjbG9zZScsIHRoaXMucmVtb3ZlQ3JvcHBlciwgdGhpcyApO1xuXHRcdHRoaXMuc2V0KCdzZWxlY3Rpb24nLCBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbih0aGlzLmZyYW1lLl9zZWxlY3Rpb24uc2luZ2xlKSk7XG5cdH0sXG5cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mcmFtZS50b29sYmFyLm1vZGUoJ2Jyb3dzZScpO1xuXHR9LFxuXG5cdGNyZWF0ZUNyb3BDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNyb3BwZXJWaWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuQ3JvcHBlcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5nZXQoJ3NlbGVjdGlvbicpLmZpcnN0KClcblx0XHR9KTtcblx0XHR0aGlzLmNyb3BwZXJWaWV3Lm9uKCdpbWFnZS1sb2FkZWQnLCB0aGlzLmNyZWF0ZUNyb3BUb29sYmFyLCB0aGlzKTtcblx0XHR0aGlzLmZyYW1lLmNvbnRlbnQuc2V0KHRoaXMuY3JvcHBlclZpZXcpO1xuXG5cdH0sXG5cdHJlbW92ZUNyb3BwZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaW1nU2VsZWN0LmNhbmNlbFNlbGVjdGlvbigpO1xuXHRcdHRoaXMuaW1nU2VsZWN0LnNldE9wdGlvbnMoe3JlbW92ZTogdHJ1ZX0pO1xuXHRcdHRoaXMuaW1nU2VsZWN0LnVwZGF0ZSgpO1xuXHRcdHRoaXMuY3JvcHBlclZpZXcucmVtb3ZlKCk7XG5cdH0sXG5cdGNyZWF0ZUNyb3BUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FuU2tpcENyb3AsIHRvb2xiYXJPcHRpb25zO1xuXG5cdFx0Y2FuU2tpcENyb3AgPSB0aGlzLmdldCgnY2FuU2tpcENyb3AnKSB8fCBmYWxzZTtcblxuXHRcdHRvb2xiYXJPcHRpb25zID0ge1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5mcmFtZSxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGluc2VydDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGwxMG4uY3JvcEltYWdlLFxuXHRcdFx0XHRcdHByaW9yaXR5OiA4MCxcblx0XHRcdFx0XHRyZXF1aXJlczogeyBsaWJyYXJ5OiBmYWxzZSwgc2VsZWN0aW9uOiBmYWxzZSB9LFxuXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjtcblxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uID0gY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJykuZmlyc3QoKTtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbi5zZXQoe2Nyb3BEZXRhaWxzOiBjb250cm9sbGVyLnN0YXRlKCkuaW1nU2VsZWN0LmdldFNlbGVjdGlvbigpfSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuJGVsLnRleHQobDEwbi5jcm9wcGluZyk7XG5cdFx0XHRcdFx0XHR0aGlzLiRlbC5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnN0YXRlKCkuZG9Dcm9wKCBzZWxlY3Rpb24gKS5kb25lKCBmdW5jdGlvbiggY3JvcHBlZEltYWdlICkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLnRyaWdnZXIoJ2Nyb3BwZWQnLCBjcm9wcGVkSW1hZ2UgKTtcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fSkuZmFpbCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIudHJpZ2dlcignY29udGVudDplcnJvcjpjcm9wJyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKCBjYW5Ta2lwQ3JvcCApIHtcblx0XHRcdF8uZXh0ZW5kKCB0b29sYmFyT3B0aW9ucy5pdGVtcywge1xuXHRcdFx0XHRza2lwOiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICAgJ3NlY29uZGFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgICAgbDEwbi5za2lwQ3JvcHBpbmcsXG5cdFx0XHRcdFx0cHJpb3JpdHk6ICAgNzAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6ICAgeyBsaWJyYXJ5OiBmYWxzZSwgc2VsZWN0aW9uOiBmYWxzZSB9LFxuXHRcdFx0XHRcdGNsaWNrOiAgICAgIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJykuZmlyc3QoKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmNyb3BwZXJWaWV3LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoJ3NraXBwZWRjcm9wJywgc2VsZWN0aW9uKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5mcmFtZS50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih0b29sYmFyT3B0aW9ucykgKTtcblx0fSxcblxuXHRkb0Nyb3A6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHJldHVybiB3cC5hamF4LnBvc3QoICdjdXN0b20taGVhZGVyLWNyb3AnLCBfLmV4dGVuZChcblx0XHRcdHt9LFxuXHRcdFx0dGhpcy5kZWZhdWx0cy5kb0Nyb3BBcmdzLFxuXHRcdFx0e1xuXHRcdFx0XHRub25jZTogYXR0YWNobWVudC5nZXQoICdub25jZXMnICkuZWRpdCxcblx0XHRcdFx0aWQ6IGF0dGFjaG1lbnQuZ2V0KCAnaWQnICksXG5cdFx0XHRcdGNyb3BEZXRhaWxzOiBhdHRhY2htZW50LmdldCggJ2Nyb3BEZXRhaWxzJyApXG5cdFx0XHR9XG5cdFx0KSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBDcm9wcGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkN1c3RvbWl6ZUltYWdlQ3JvcHBlclxuICpcbiAqIEEgc3RhdGUgZm9yIGNyb3BwaW5nIGFuIGltYWdlLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ3JvcHBlclxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgQ29udHJvbGxlciA9IHdwLm1lZGlhLmNvbnRyb2xsZXIsXG5cdEN1c3RvbWl6ZUltYWdlQ3JvcHBlcjtcblxuQ3VzdG9taXplSW1hZ2VDcm9wcGVyID0gQ29udHJvbGxlci5Dcm9wcGVyLmV4dGVuZCh7XG5cdGRvQ3JvcDogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIGNyb3BEZXRhaWxzID0gYXR0YWNobWVudC5nZXQoICdjcm9wRGV0YWlscycgKSxcblx0XHRcdGNvbnRyb2wgPSB0aGlzLmdldCggJ2NvbnRyb2wnICksXG5cdFx0XHRyYXRpbyA9IGNyb3BEZXRhaWxzLndpZHRoIC8gY3JvcERldGFpbHMuaGVpZ2h0O1xuXG5cdFx0Ly8gVXNlIGNyb3AgbWVhc3VyZW1lbnRzIHdoZW4gZmxleGlibGUgaW4gYm90aCBkaXJlY3Rpb25zLlxuXHRcdGlmICggY29udHJvbC5wYXJhbXMuZmxleF93aWR0aCAmJiBjb250cm9sLnBhcmFtcy5mbGV4X2hlaWdodCApIHtcblx0XHRcdGNyb3BEZXRhaWxzLmRzdF93aWR0aCAgPSBjcm9wRGV0YWlscy53aWR0aDtcblx0XHRcdGNyb3BEZXRhaWxzLmRzdF9oZWlnaHQgPSBjcm9wRGV0YWlscy5oZWlnaHQ7XG5cblx0XHQvLyBDb25zdHJhaW4gZmxleGlibGUgc2lkZSBiYXNlZCBvbiBpbWFnZSByYXRpbyBhbmQgc2l6ZSBvZiB0aGUgZml4ZWQgc2lkZS5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3JvcERldGFpbHMuZHN0X3dpZHRoICA9IGNvbnRyb2wucGFyYW1zLmZsZXhfd2lkdGggID8gY29udHJvbC5wYXJhbXMuaGVpZ2h0ICogcmF0aW8gOiBjb250cm9sLnBhcmFtcy53aWR0aDtcblx0XHRcdGNyb3BEZXRhaWxzLmRzdF9oZWlnaHQgPSBjb250cm9sLnBhcmFtcy5mbGV4X2hlaWdodCA/IGNvbnRyb2wucGFyYW1zLndpZHRoICAvIHJhdGlvIDogY29udHJvbC5wYXJhbXMuaGVpZ2h0O1xuXHRcdH1cblxuXHRcdHJldHVybiB3cC5hamF4LnBvc3QoICdjcm9wLWltYWdlJywge1xuXHRcdFx0d3BfY3VzdG9taXplOiAnb24nLFxuXHRcdFx0bm9uY2U6IGF0dGFjaG1lbnQuZ2V0KCAnbm9uY2VzJyApLmVkaXQsXG5cdFx0XHRpZDogYXR0YWNobWVudC5nZXQoICdpZCcgKSxcblx0XHRcdGNvbnRleHQ6IGNvbnRyb2wuaWQsXG5cdFx0XHRjcm9wRGV0YWlsczogY3JvcERldGFpbHNcblx0XHR9ICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEN1c3RvbWl6ZUltYWdlQ3JvcHBlcjtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2VcbiAqXG4gKiBBIHN0YXRlIGZvciBlZGl0aW5nIChjcm9wcGluZywgZXRjLikgYW4gaW1hZ2UuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudH0gYXR0cmlidXRlcy5tb2RlbCAgICAgICAgICAgICAgICBUaGUgYXR0YWNobWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9ZWRpdC1pbWFnZV0gICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9RWRpdCBJbWFnZV0gICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PWVkaXQtaW1hZ2VdIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPWVkaXQtaW1hZ2VdIEluaXRpYWwgbW9kZSBmb3IgdGhlIHRvb2xiYXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWZhbHNlXSAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy51cmxdICAgICAgICAgICAgICAgIFVudXNlZC4gQHRvZG8gQ29uc2lkZXIgcmVtb3ZhbC5cbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEVkaXRJbWFnZTtcblxuRWRpdEltYWdlID0gd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZS5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICdlZGl0LWltYWdlJyxcblx0XHR0aXRsZTogICBsMTBuLmVkaXRJbWFnZSxcblx0XHRtZW51OiAgICBmYWxzZSxcblx0XHR0b29sYmFyOiAnZWRpdC1pbWFnZScsXG5cdFx0Y29udGVudDogJ2VkaXQtaW1hZ2UnLFxuXHRcdHVybDogICAgICcnXG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUub24oICd0b29sYmFyOnJlbmRlcjplZGl0LWltYWdlJywgXy5iaW5kKCB0aGlzLnRvb2xiYXIsIHRoaXMgKSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICovXG5cdGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUub2ZmKCAndG9vbGJhcjpyZW5kZXI6ZWRpdC1pbWFnZScgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuOS4wXG5cdCAqL1xuXHR0b29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZnJhbWUgPSB0aGlzLmZyYW1lLFxuXHRcdFx0bGFzdFN0YXRlID0gZnJhbWUubGFzdFN0YXRlKCksXG5cdFx0XHRwcmV2aW91cyA9IGxhc3RTdGF0ZSAmJiBsYXN0U3RhdGUuaWQ7XG5cblx0XHRmcmFtZS50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiBmcmFtZSxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGJhY2s6IHtcblx0XHRcdFx0XHRzdHlsZTogJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLmJhY2ssXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDIwLFxuXHRcdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggcHJldmlvdXMgKSB7XG5cdFx0XHRcdFx0XHRcdGZyYW1lLnNldFN0YXRlKCBwcmV2aW91cyApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWUuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0SW1hZ2U7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuRW1iZWRcbiAqXG4gKiBBIHN0YXRlIGZvciBlbWJlZGRpbmcgbWVkaWEgZnJvbSBhIFVSTC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMuaWQ9ZW1iZWRdICAgICAgICAgICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXR0cmlidXRlcy50aXRsZT1JbnNlcnQgRnJvbSBVUkxdIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBtZWRpYSBtZW51IGFuZCB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMuY29udGVudD1lbWJlZF0gICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXR0cmlidXRlcy5tZW51PWRlZmF1bHRdICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVzLnRvb2xiYXI9bWFpbi1lbWJlZF0gICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMubWVudT1mYWxzZV0gICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBtZW51IHJlZ2lvbi5cbiAqIEBwYXJhbSB7aW50fSAgICBbYXR0cmlidXRlcy5wcmlvcml0eT0xMjBdICAgICAgICAgIFRoZSBwcmlvcml0eSBmb3IgdGhlIHN0YXRlIGxpbmsgaW4gdGhlIG1lZGlhIG1lbnUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMudHlwZT1saW5rXSAgICAgICAgICAgICBUaGUgdHlwZSBvZiBlbWJlZC4gQ3VycmVudGx5IG9ubHkgbGluayBpcyBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0dHJpYnV0ZXMudXJsXSAgICAgICAgICAgICAgICAgICBUaGUgZW1iZWQgVVJMLlxuICogQHBhcmFtIHtvYmplY3R9IFthdHRyaWJ1dGVzLm1ldGFkYXRhPXt9XSAgICAgICAgICAgUHJvcGVydGllcyBvZiB0aGUgZW1iZWQsIHdoaWNoIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcy51cmwgaWYgc2V0LlxuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0JCA9IEJhY2tib25lLiQsXG5cdEVtYmVkO1xuXG5FbWJlZCA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAgJ2VtYmVkJyxcblx0XHR0aXRsZTogICAgbDEwbi5pbnNlcnRGcm9tVXJsVGl0bGUsXG5cdFx0Y29udGVudDogICdlbWJlZCcsXG5cdFx0bWVudTogICAgICdkZWZhdWx0Jyxcblx0XHR0b29sYmFyOiAgJ21haW4tZW1iZWQnLFxuXHRcdHByaW9yaXR5OiAxMjAsXG5cdFx0dHlwZTogICAgICdsaW5rJyxcblx0XHR1cmw6ICAgICAgJycsXG5cdFx0bWV0YWRhdGE6IHt9XG5cdH0sXG5cblx0Ly8gVGhlIGFtb3VudCBvZiB0aW1lIHVzZWQgd2hlbiBkZWJvdW5jaW5nIHRoZSBzY2FuLlxuXHRzZW5zaXRpdml0eTogNDAwLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcblx0XHR0aGlzLmRlYm91bmNlZFNjYW4gPSBfLmRlYm91bmNlKCBfLmJpbmQoIHRoaXMuc2NhbiwgdGhpcyApLCB0aGlzLnNlbnNpdGl2aXR5ICk7XG5cdFx0dGhpcy5wcm9wcyA9IG5ldyBCYWNrYm9uZS5Nb2RlbCggdGhpcy5tZXRhZGF0YSB8fCB7IHVybDogJycgfSk7XG5cdFx0dGhpcy5wcm9wcy5vbiggJ2NoYW5nZTp1cmwnLCB0aGlzLmRlYm91bmNlZFNjYW4sIHRoaXMgKTtcblx0XHR0aGlzLnByb3BzLm9uKCAnY2hhbmdlOnVybCcsIHRoaXMucmVmcmVzaCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdzY2FuJywgdGhpcy5zY2FuSW1hZ2UsIHRoaXMgKTtcblx0fSxcblxuXHQvKipcblx0ICogVHJpZ2dlciBhIHNjYW4gb2YgdGhlIGVtYmVkZGVkIFVSTCdzIGNvbnRlbnQgZm9yIG1ldGFkYXRhIHJlcXVpcmVkIHRvIGVtYmVkLlxuXHQgKlxuXHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5FbWJlZCNzY2FuXG5cdCAqL1xuXHRzY2FuOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2Nhbm5lcnMsXG5cdFx0XHRlbWJlZCA9IHRoaXMsXG5cdFx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0XHR0eXBlOiAnbGluaycsXG5cdFx0XHRcdHNjYW5uZXJzOiBbXVxuXHRcdFx0fTtcblxuXHRcdC8vIFNjYW4gaXMgdHJpZ2dlcmVkIHdpdGggdGhlIGxpc3Qgb2YgYGF0dHJpYnV0ZXNgIHRvIHNldCBvbiB0aGVcblx0XHQvLyBzdGF0ZSwgdXNlZnVsIGZvciB0aGUgJ3R5cGUnIGF0dHJpYnV0ZSBhbmQgJ3NjYW5uZXJzJyBhdHRyaWJ1dGUsXG5cdFx0Ly8gYW4gYXJyYXkgb2YgcHJvbWlzZSBvYmplY3RzIGZvciBhc3luY2hyb25vdXMgc2NhbiBvcGVyYXRpb25zLlxuXHRcdGlmICggdGhpcy5wcm9wcy5nZXQoJ3VybCcpICkge1xuXHRcdFx0dGhpcy50cmlnZ2VyKCAnc2NhbicsIGF0dHJpYnV0ZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZXMuc2Nhbm5lcnMubGVuZ3RoICkge1xuXHRcdFx0c2Nhbm5lcnMgPSBhdHRyaWJ1dGVzLnNjYW5uZXJzID0gJC53aGVuLmFwcGx5KCAkLCBhdHRyaWJ1dGVzLnNjYW5uZXJzICk7XG5cdFx0XHRzY2FubmVycy5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGVtYmVkLmdldCgnc2Nhbm5lcnMnKSA9PT0gc2Nhbm5lcnMgKSB7XG5cdFx0XHRcdFx0ZW1iZWQuc2V0KCAnbG9hZGluZycsIGZhbHNlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhdHRyaWJ1dGVzLnNjYW5uZXJzID0gbnVsbDtcblx0XHR9XG5cblx0XHRhdHRyaWJ1dGVzLmxvYWRpbmcgPSAhISBhdHRyaWJ1dGVzLnNjYW5uZXJzO1xuXHRcdHRoaXMuc2V0KCBhdHRyaWJ1dGVzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBUcnkgc2Nhbm5pbmcgdGhlIGVtYmVkIGFzIGFuIGltYWdlIHRvIGRpc2NvdmVyIGl0cyBkaW1lbnNpb25zLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gYXR0cmlidXRlc1xuXHQgKi9cblx0c2NhbkltYWdlOiBmdW5jdGlvbiggYXR0cmlidXRlcyApIHtcblx0XHR2YXIgZnJhbWUgPSB0aGlzLmZyYW1lLFxuXHRcdFx0c3RhdGUgPSB0aGlzLFxuXHRcdFx0dXJsID0gdGhpcy5wcm9wcy5nZXQoJ3VybCcpLFxuXHRcdFx0aW1hZ2UgPSBuZXcgSW1hZ2UoKSxcblx0XHRcdGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG5cdFx0YXR0cmlidXRlcy5zY2FubmVycy5wdXNoKCBkZWZlcnJlZC5wcm9taXNlKCkgKTtcblxuXHRcdC8vIFRyeSB0byBsb2FkIHRoZSBpbWFnZSBhbmQgZmluZCBpdHMgd2lkdGgvaGVpZ2h0LlxuXHRcdGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgpO1xuXG5cdFx0XHRpZiAoIHN0YXRlICE9PSBmcmFtZS5zdGF0ZSgpIHx8IHVybCAhPT0gc3RhdGUucHJvcHMuZ2V0KCd1cmwnKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5zZXQoe1xuXHRcdFx0XHR0eXBlOiAnaW1hZ2UnXG5cdFx0XHR9KTtcblxuXHRcdFx0c3RhdGUucHJvcHMuc2V0KHtcblx0XHRcdFx0d2lkdGg6ICBpbWFnZS53aWR0aCxcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRpbWFnZS5vbmVycm9yID0gZGVmZXJyZWQucmVqZWN0O1xuXHRcdGltYWdlLnNyYyA9IHVybDtcblx0fSxcblxuXHRyZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLnRvb2xiYXIuZ2V0KCkucmVmcmVzaCgpO1xuXHR9LFxuXG5cdHJlc2V0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnByb3BzLmNsZWFyKCkuc2V0KHsgdXJsOiAnJyB9KTtcblxuXHRcdGlmICggdGhpcy5hY3RpdmUgKSB7XG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtYmVkO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkZlYXR1cmVkSW1hZ2VcbiAqXG4gKiBBIHN0YXRlIGZvciBzZWxlY3RpbmcgYSBmZWF0dXJlZCBpbWFnZSBmb3IgYSBwb3N0LlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzXSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9ZmVhdHVyZWQtaW1hZ2VdICAgICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRpdGxlPVNldCBGZWF0dXJlZCBJbWFnZV0gVGl0bGUgZm9yIHRoZSBzdGF0ZS4gRGlzcGxheXMgaW4gdGhlIG1lZGlhIG1lbnUgYW5kIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFthdHRyaWJ1dGVzLmxpYnJhcnldICAgICAgICAgICAgICAgICAgVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gYnJvd3NlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhIGNvbGxlY3Rpb24gb2YgYWxsIGltYWdlcyB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tdWx0aXBsZT1mYWxzZV0gICAgICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50PXVwbG9hZF0gICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVycmlkZGVuIGJ5IHBlcnNpc3RlbnQgdXNlciBzZXR0aW5nIGlmICdjb250ZW50VXNlclNldHRpbmcnIGlzIHRydWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWRlZmF1bHRdICAgICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIG1lbnUgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMucm91dGVyPWJyb3dzZV0gICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSByb3V0ZXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudG9vbGJhcj1mZWF0dXJlZC1pbWFnZV0gICBJbml0aWFsIG1vZGUgZm9yIHRoZSB0b29sYmFyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnByaW9yaXR5PTYwXSAgICAgICAgICAgICAgVGhlIHByaW9yaXR5IGZvciB0aGUgc3RhdGUgbGluayBpbiB0aGUgbWVkaWEgbWVudS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNlYXJjaGFibGU9dHJ1ZV0gICAgICAgICAgV2hldGhlciB0aGUgbGlicmFyeSBpcyBzZWFyY2hhYmxlLlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZmlsdGVyYWJsZT1mYWxzZV0gICAgICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGZpbHRlcmFibGUsIGFuZCBpZiBzbyB3aGF0IGZpbHRlcnMgc2hvdWxkIGJlIHNob3duLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICdhbGwnLCAndXBsb2FkZWQnLCBvciAndW5hdHRhY2hlZCcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zb3J0YWJsZT10cnVlXSAgICAgICAgICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNob3VsZCBiZSBzb3J0YWJsZS4gRGVwZW5kcyBvbiB0aGUgb3JkZXJieSBwcm9wZXJ0eSBiZWluZyBzZXQgdG8gbWVudU9yZGVyIG9uIHRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuYXV0b1NlbGVjdD10cnVlXSAgICAgICAgICBXaGV0aGVyIGFuIHVwbG9hZGVkIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRlc2NyaWJlPWZhbHNlXSAgICAgICAgICAgV2hldGhlciB0byBvZmZlciBVSSB0byBkZXNjcmliZSBhdHRhY2htZW50cyAtIGUuZy4gY2FwdGlvbmluZyBpbWFnZXMgaW4gYSBnYWxsZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudFVzZXJTZXR0aW5nPXRydWVdICBXaGV0aGVyIHRoZSBjb250ZW50IHJlZ2lvbidzIG1vZGUgc2hvdWxkIGJlIHNldCBhbmQgcGVyc2lzdGVkIHBlciB1c2VyLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc3luY1NlbGVjdGlvbj10cnVlXSAgICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICovXG52YXIgQXR0YWNobWVudCA9IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnQsXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEZlYXR1cmVkSW1hZ2U7XG5cbkZlYXR1cmVkSW1hZ2UgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiBfLmRlZmF1bHRzKHtcblx0XHRpZDogICAgICAgICAgICAnZmVhdHVyZWQtaW1hZ2UnLFxuXHRcdHRpdGxlOiAgICAgICAgIGwxMG4uc2V0RmVhdHVyZWRJbWFnZVRpdGxlLFxuXHRcdG11bHRpcGxlOiAgICAgIGZhbHNlLFxuXHRcdGZpbHRlcmFibGU6ICAgICd1cGxvYWRlZCcsXG5cdFx0dG9vbGJhcjogICAgICAgJ2ZlYXR1cmVkLWltYWdlJyxcblx0XHRwcmlvcml0eTogICAgICA2MCxcblx0XHRzeW5jU2VsZWN0aW9uOiB0cnVlXG5cdH0sIExpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzICksXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpYnJhcnksIGNvbXBhcmF0b3I7XG5cblx0XHQvLyBJZiB3ZSBoYXZlbid0IGJlZW4gcHJvdmlkZWQgYSBgbGlicmFyeWAsIGNyZWF0ZSBhIGBTZWxlY3Rpb25gLlxuXHRcdGlmICggISB0aGlzLmdldCgnbGlicmFyeScpICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5Jywgd3AubWVkaWEucXVlcnkoeyB0eXBlOiAnaW1hZ2UnIH0pICk7XG5cdFx0fVxuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHRsaWJyYXJ5ICAgID0gdGhpcy5nZXQoJ2xpYnJhcnknKTtcblx0XHRjb21wYXJhdG9yID0gbGlicmFyeS5jb21wYXJhdG9yO1xuXG5cdFx0Ly8gT3ZlcmxvYWQgdGhlIGxpYnJhcnkncyBjb21wYXJhdG9yIHRvIHB1c2ggaXRlbXMgdGhhdCBhcmUgbm90IGluXG5cdFx0Ly8gdGhlIG1pcnJvcmVkIHF1ZXJ5IHRvIHRoZSBmcm9udCBvZiB0aGUgYWdncmVnYXRlIGNvbGxlY3Rpb24uXG5cdFx0bGlicmFyeS5jb21wYXJhdG9yID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYUluUXVlcnkgPSAhISB0aGlzLm1pcnJvcmluZy5nZXQoIGEuY2lkICksXG5cdFx0XHRcdGJJblF1ZXJ5ID0gISEgdGhpcy5taXJyb3JpbmcuZ2V0KCBiLmNpZCApO1xuXG5cdFx0XHRpZiAoICEgYUluUXVlcnkgJiYgYkluUXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH0gZWxzZSBpZiAoIGFJblF1ZXJ5ICYmICEgYkluUXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBhcmF0b3IuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgYWxsIGl0ZW1zIGluIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGxpYnJhcnksIHNvIGFueSBmZWF0dXJlZFxuXHRcdC8vIGltYWdlcyB0aGF0IGFyZSBub3QgaW5pdGlhbGx5IGxvYWRlZCBzdGlsbCBhcHBlYXIuXG5cdFx0bGlicmFyeS5vYnNlcnZlKCB0aGlzLmdldCgnc2VsZWN0aW9uJykgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGVTZWxlY3Rpb24oKTtcblx0XHR0aGlzLmZyYW1lLm9uKCAnb3BlbicsIHRoaXMudXBkYXRlU2VsZWN0aW9uLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mcmFtZS5vZmYoICdvcGVuJywgdGhpcy51cGRhdGVTZWxlY3Rpb24sIHRoaXMgKTtcblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmRlYWN0aXZhdGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHVwZGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdGlkID0gd3AubWVkaWEudmlldy5zZXR0aW5ncy5wb3N0LmZlYXR1cmVkSW1hZ2VJZCxcblx0XHRcdGF0dGFjaG1lbnQ7XG5cblx0XHRpZiAoICcnICE9PSBpZCAmJiAtMSAhPT0gaWQgKSB7XG5cdFx0XHRhdHRhY2htZW50ID0gQXR0YWNobWVudC5nZXQoIGlkICk7XG5cdFx0XHRhdHRhY2htZW50LmZldGNoKCk7XG5cdFx0fVxuXG5cdFx0c2VsZWN0aW9uLnJlc2V0KCBhdHRhY2htZW50ID8gWyBhdHRhY2htZW50IF0gOiBbXSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBGZWF0dXJlZEltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLkdhbGxlcnlBZGRcbiAqXG4gKiBBIHN0YXRlIGZvciBzZWxlY3RpbmcgbW9yZSBpbWFnZXMgdG8gYWRkIHRvIGEgZ2FsbGVyeS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgaGFzaCBwYXNzZWQgdG8gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9Z2FsbGVyeS1saWJyYXJ5XSAgICAgIFVuaXF1ZSBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9QWRkIHRvIEdhbGxlcnldICAgIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLm11bHRpcGxlPWFkZF0gICAgICAgICAgICBXaGV0aGVyIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkLiBAdG9kbyAnYWRkJyBkb2Vzbid0IHNlZW0gZG8gYW55dGhpbmcgc3BlY2lhbCwgYW5kIGdldHMgdXNlZCBhcyBhIGJvb2xlYW4uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSBbYXR0cmlidXRlcy5saWJyYXJ5XSAgICAgICAgICAgICAgICAgVGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24gdG8gYnJvd3NlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9uZSBpcyBub3Qgc3VwcGxpZWQsIGEgY29sbGVjdGlvbiBvZiBhbGwgaW1hZ2VzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9ICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmZpbHRlcmFibGU9dXBsb2FkZWRdICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGZpbHRlcmFibGUsIGFuZCBpZiBzbyB3aGF0IGZpbHRlcnMgc2hvdWxkIGJlIHNob3duLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ2FsbCcsICd1cGxvYWRlZCcsIG9yICd1bmF0dGFjaGVkJy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLm1lbnU9Z2FsbGVyeV0gICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBtZW51IHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnQ9dXBsb2FkXSAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVycmlkZGVuIGJ5IHBlcnNpc3RlbnQgdXNlciBzZXR0aW5nIGlmICdjb250ZW50VXNlclNldHRpbmcnIGlzIHRydWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5yb3V0ZXI9YnJvd3NlXSAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgcm91dGVyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRvb2xiYXI9Z2FsbGVyeS1hZGRdICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSB0b29sYmFyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNlYXJjaGFibGU9dHJ1ZV0gICAgICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHNlYXJjaGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zb3J0YWJsZT10cnVlXSAgICAgICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2hvdWxkIGJlIHNvcnRhYmxlLiBEZXBlbmRzIG9uIHRoZSBvcmRlcmJ5IHByb3BlcnR5IGJlaW5nIHNldCB0byBtZW51T3JkZXIgb24gdGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5hdXRvU2VsZWN0PXRydWVdICAgICAgICAgV2hldGhlciBhbiB1cGxvYWRlZCBhdHRhY2htZW50IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50VXNlclNldHRpbmc9dHJ1ZV0gV2hldGhlciB0aGUgY29udGVudCByZWdpb24ncyBtb2RlIHNob3VsZCBiZSBzZXQgYW5kIHBlcnNpc3RlZCBwZXIgdXNlci5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnByaW9yaXR5PTEwMF0gICAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoZSBzdGF0ZSBsaW5rIGluIHRoZSBtZWRpYSBtZW51LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc3luY1NlbGVjdGlvbj1mYWxzZV0gICAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNlbGVjdGlvbiBzaG91bGQgYmUgcGVyc2lzdGVkIGZyb20gdGhlIGxhc3Qgc3RhdGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gZmFsc2UgYmVjYXVzZSBmb3IgdGhpcyBzdGF0ZSwgYmVjYXVzZSB0aGUgbGlicmFyeSBvZiB0aGUgRWRpdCBHYWxsZXJ5IHN0YXRlIGlzIHRoZSBzZWxlY3Rpb24uXG4gKi9cbnZhciBTZWxlY3Rpb24gPSB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24sXG5cdExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEdhbGxlcnlBZGQ7XG5cbkdhbGxlcnlBZGQgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiBfLmRlZmF1bHRzKHtcblx0XHRpZDogICAgICAgICAgICAnZ2FsbGVyeS1saWJyYXJ5Jyxcblx0XHR0aXRsZTogICAgICAgICBsMTBuLmFkZFRvR2FsbGVyeVRpdGxlLFxuXHRcdG11bHRpcGxlOiAgICAgICdhZGQnLFxuXHRcdGZpbHRlcmFibGU6ICAgICd1cGxvYWRlZCcsXG5cdFx0bWVudTogICAgICAgICAgJ2dhbGxlcnknLFxuXHRcdHRvb2xiYXI6ICAgICAgICdnYWxsZXJ5LWFkZCcsXG5cdFx0cHJpb3JpdHk6ICAgICAgMTAwLFxuXHRcdHN5bmNTZWxlY3Rpb246IGZhbHNlXG5cdH0sIExpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzICksXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSWYgYSBsaWJyYXJ5IHdhc24ndCBzdXBwbGllZCwgY3JlYXRlIGEgbGlicmFyeSBvZiBpbWFnZXMuXG5cdFx0aWYgKCAhIHRoaXMuZ2V0KCdsaWJyYXJ5JykgKSB7XG5cdFx0XHR0aGlzLnNldCggJ2xpYnJhcnknLCB3cC5tZWRpYS5xdWVyeSh7IHR5cGU6ICdpbWFnZScgfSkgKTtcblx0XHR9XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxpYnJhcnkgPSB0aGlzLmdldCgnbGlicmFyeScpLFxuXHRcdFx0ZWRpdCAgICA9IHRoaXMuZnJhbWUuc3RhdGUoJ2dhbGxlcnktZWRpdCcpLmdldCgnbGlicmFyeScpO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRMaWJyYXJ5ICYmIHRoaXMuZWRpdExpYnJhcnkgIT09IGVkaXQgKSB7XG5cdFx0XHRsaWJyYXJ5LnVub2JzZXJ2ZSggdGhpcy5lZGl0TGlicmFyeSApO1xuXHRcdH1cblxuXHRcdC8vIEFjY2VwdHMgYXR0YWNobWVudHMgdGhhdCBleGlzdCBpbiB0aGUgb3JpZ2luYWwgbGlicmFyeSBhbmRcblx0XHQvLyB0aGF0IGRvIG5vdCBleGlzdCBpbiBnYWxsZXJ5J3MgbGlicmFyeS5cblx0XHRsaWJyYXJ5LnZhbGlkYXRvciA9IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdFx0cmV0dXJuICEhIHRoaXMubWlycm9yaW5nLmdldCggYXR0YWNobWVudC5jaWQgKSAmJiAhIGVkaXQuZ2V0KCBhdHRhY2htZW50LmNpZCApICYmIFNlbGVjdGlvbi5wcm90b3R5cGUudmFsaWRhdG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gUmVzZXQgdGhlIGxpYnJhcnkgdG8gZW5zdXJlIHRoYXQgYWxsIGF0dGFjaG1lbnRzIGFyZSByZS1hZGRlZFxuXHRcdC8vIHRvIHRoZSBjb2xsZWN0aW9uLiBEbyBzbyBzaWxlbnRseSwgYXMgY2FsbGluZyBgb2JzZXJ2ZWAgd2lsbFxuXHRcdC8vIHRyaWdnZXIgdGhlIGByZXNldGAgZXZlbnQuXG5cdFx0bGlicmFyeS5yZXNldCggbGlicmFyeS5taXJyb3JpbmcubW9kZWxzLCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHRsaWJyYXJ5Lm9ic2VydmUoIGVkaXQgKTtcblx0XHR0aGlzLmVkaXRMaWJyYXJ5ID0gZWRpdDtcblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gR2FsbGVyeUFkZDtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5HYWxsZXJ5RWRpdFxuICpcbiAqIEEgc3RhdGUgZm9yIGVkaXRpbmcgYSBnYWxsZXJ5J3MgaW1hZ2VzIGFuZCBzZXR0aW5ncy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnlcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAYXVnbWVudHMgQmFja2JvbmUuTW9kZWxcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPWdhbGxlcnktZWRpdF0gICAgICAgVW5pcXVlIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50aXRsZT1FZGl0IEdhbGxlcnldICAgIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBmcmFtZSdzIHRpdGxlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuQXR0YWNobWVudHN9IFthdHRyaWJ1dGVzLmxpYnJhcnldICAgICAgICAgICAgICAgVGhlIGNvbGxlY3Rpb24gb2YgYXR0YWNobWVudHMgaW4gdGhlIGdhbGxlcnkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9uZSBpcyBub3Qgc3VwcGxpZWQsIGFuIGVtcHR5IG1lZGlhLm1vZGVsLlNlbGVjdGlvbiBjb2xsZWN0aW9uIGlzIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tdWx0aXBsZT1mYWxzZV0gICAgICAgIFdoZXRoZXIgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zZWFyY2hhYmxlPWZhbHNlXSAgICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc2VhcmNoYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNvcnRhYmxlPXRydWVdICAgICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2hvdWxkIGJlIHNvcnRhYmxlLiBEZXBlbmRzIG9uIHRoZSBvcmRlcmJ5IHByb3BlcnR5IGJlaW5nIHNldCB0byBtZW51T3JkZXIgb24gdGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kYXRlPXRydWVdICAgICAgICAgICAgIFdoZXRoZXIgdG8gc2hvdyB0aGUgZGF0ZSBmaWx0ZXIgaW4gdGhlIGJyb3dzZXIncyB0b29sYmFyLlxuICogQHBhcmFtIHtzdHJpbmd8ZmFsc2V9ICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudD1icm93c2VdICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfGZhbHNlfSAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRvb2xiYXI9aW1hZ2UtZGV0YWlsc10gSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5kZXNjcmliZT10cnVlXSAgICAgICAgIFdoZXRoZXIgdG8gb2ZmZXIgVUkgdG8gZGVzY3JpYmUgYXR0YWNobWVudHMgLSBlLmcuIGNhcHRpb25pbmcgaW1hZ2VzIGluIGEgZ2FsbGVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRpc3BsYXlTZXR0aW5ncz10cnVlXSAgV2hldGhlciB0byBzaG93IHRoZSBhdHRhY2htZW50IGRpc3BsYXkgc2V0dGluZ3MgaW50ZXJmYWNlLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZHJhZ0luZm89dHJ1ZV0gICAgICAgICBXaGV0aGVyIHRvIHNob3cgaW5zdHJ1Y3Rpb25hbCB0ZXh0IGFib3V0IHRoZSBhdHRhY2htZW50cyBiZWluZyBzb3J0YWJsZS5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkZWFsQ29sdW1uV2lkdGg9MTcwXSAgVGhlIGlkZWFsIGNvbHVtbiB3aWR0aCBpbiBwaXhlbHMgZm9yIGF0dGFjaG1lbnRzLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZWRpdGluZz1mYWxzZV0gICAgICAgICBXaGV0aGVyIHRoZSBnYWxsZXJ5IGlzIGJlaW5nIGNyZWF0ZWQsIG9yIGVkaXRpbmcgYW4gZXhpc3RpbmcgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5wcmlvcml0eT02MF0gICAgICAgICAgIFRoZSBwcmlvcml0eSBmb3IgdGhlIHN0YXRlIGxpbmsgaW4gdGhlIG1lZGlhIG1lbnUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zeW5jU2VsZWN0aW9uPWZhbHNlXSAgIFdoZXRoZXIgdGhlIEF0dGFjaG1lbnRzIHNlbGVjdGlvbiBzaG91bGQgYmUgcGVyc2lzdGVkIGZyb20gdGhlIGxhc3Qgc3RhdGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlIGZvciB0aGlzIHN0YXRlLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IHBhc3NlZCBpbiAgKmlzKiB0aGUgc2VsZWN0aW9uLlxuICogQHBhcmFtIHt2aWV3fSAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuQXR0YWNobWVudFZpZXddICAgICAgICBUaGUgc2luZ2xlIGBBdHRhY2htZW50YCB2aWV3IHRvIGJlIHVzZWQgaW4gdGhlIGBBdHRhY2htZW50c2AuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vbmUgc3VwcGxpZWQsIGRlZmF1bHRzIHRvIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0TGlicmFyeS5cbiAqL1xudmFyIExpYnJhcnkgPSB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnksXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEdhbGxlcnlFZGl0O1xuXG5HYWxsZXJ5RWRpdCA9IExpYnJhcnkuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAgICAgICAgICAnZ2FsbGVyeS1lZGl0Jyxcblx0XHR0aXRsZTogICAgICAgICAgICBsMTBuLmVkaXRHYWxsZXJ5VGl0bGUsXG5cdFx0bXVsdGlwbGU6ICAgICAgICAgZmFsc2UsXG5cdFx0c2VhcmNoYWJsZTogICAgICAgZmFsc2UsXG5cdFx0c29ydGFibGU6ICAgICAgICAgdHJ1ZSxcblx0XHRkYXRlOiAgICAgICAgICAgICBmYWxzZSxcblx0XHRkaXNwbGF5OiAgICAgICAgICBmYWxzZSxcblx0XHRjb250ZW50OiAgICAgICAgICAnYnJvd3NlJyxcblx0XHR0b29sYmFyOiAgICAgICAgICAnZ2FsbGVyeS1lZGl0Jyxcblx0XHRkZXNjcmliZTogICAgICAgICB0cnVlLFxuXHRcdGRpc3BsYXlTZXR0aW5nczogIHRydWUsXG5cdFx0ZHJhZ0luZm86ICAgICAgICAgdHJ1ZSxcblx0XHRpZGVhbENvbHVtbldpZHRoOiAxNzAsXG5cdFx0ZWRpdGluZzogICAgICAgICAgZmFsc2UsXG5cdFx0cHJpb3JpdHk6ICAgICAgICAgNjAsXG5cdFx0c3luY1NlbGVjdGlvbjogICAgZmFsc2Vcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHQvLyBJZiB3ZSBoYXZlbid0IGJlZW4gcHJvdmlkZWQgYSBgbGlicmFyeWAsIGNyZWF0ZSBhIGBTZWxlY3Rpb25gLlxuXHRcdGlmICggISB0aGlzLmdldCgnbGlicmFyeScpICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5JywgbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbigpICk7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHNpbmdsZSBgQXR0YWNobWVudGAgdmlldyB0byBiZSB1c2VkIGluIHRoZSBgQXR0YWNobWVudHNgIHZpZXcuXG5cdFx0aWYgKCAhIHRoaXMuZ2V0KCdBdHRhY2htZW50VmlldycpICkge1xuXHRcdFx0dGhpcy5zZXQoICdBdHRhY2htZW50VmlldycsIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0TGlicmFyeSApO1xuXHRcdH1cblxuXHRcdExpYnJhcnkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGlicmFyeSA9IHRoaXMuZ2V0KCdsaWJyYXJ5Jyk7XG5cblx0XHQvLyBMaW1pdCB0aGUgbGlicmFyeSB0byBpbWFnZXMgb25seS5cblx0XHRsaWJyYXJ5LnByb3BzLnNldCggJ3R5cGUnLCAnaW1hZ2UnICk7XG5cblx0XHQvLyBXYXRjaCBmb3IgdXBsb2FkZWQgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5nZXQoJ2xpYnJhcnknKS5vYnNlcnZlKCB3cC5VcGxvYWRlci5xdWV1ZSApO1xuXG5cdFx0dGhpcy5mcmFtZS5vbiggJ2NvbnRlbnQ6cmVuZGVyOmJyb3dzZScsIHRoaXMuZ2FsbGVyeVNldHRpbmdzLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU3RvcCB3YXRjaGluZyBmb3IgdXBsb2FkZWQgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5nZXQoJ2xpYnJhcnknKS51bm9ic2VydmUoIHdwLlVwbG9hZGVyLnF1ZXVlICk7XG5cblx0XHR0aGlzLmZyYW1lLm9mZiggJ2NvbnRlbnQ6cmVuZGVyOmJyb3dzZScsIHRoaXMuZ2FsbGVyeVNldHRpbmdzLCB0aGlzICk7XG5cblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSBicm93c2VyXG5cdCAqL1xuXHRnYWxsZXJ5U2V0dGluZ3M6IGZ1bmN0aW9uKCBicm93c2VyICkge1xuXHRcdGlmICggISB0aGlzLmdldCgnZGlzcGxheVNldHRpbmdzJykgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxpYnJhcnkgPSB0aGlzLmdldCgnbGlicmFyeScpO1xuXG5cdFx0aWYgKCAhIGxpYnJhcnkgfHwgISBicm93c2VyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxpYnJhcnkuZ2FsbGVyeSA9IGxpYnJhcnkuZ2FsbGVyeSB8fCBuZXcgQmFja2JvbmUuTW9kZWwoKTtcblxuXHRcdGJyb3dzZXIuc2lkZWJhci5zZXQoe1xuXHRcdFx0Z2FsbGVyeTogbmV3IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuR2FsbGVyeSh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRcdG1vZGVsOiAgICAgIGxpYnJhcnkuZ2FsbGVyeSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgNDBcblx0XHRcdH0pXG5cdFx0fSk7XG5cblx0XHRicm93c2VyLnRvb2xiYXIuc2V0KCAncmV2ZXJzZScsIHtcblx0XHRcdHRleHQ6ICAgICBsMTBuLnJldmVyc2VPcmRlcixcblx0XHRcdHByaW9yaXR5OiA4MCxcblxuXHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsaWJyYXJ5LnJlc2V0KCBsaWJyYXJ5LnRvQXJyYXkoKS5yZXZlcnNlKCkgKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gR2FsbGVyeUVkaXQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuSW1hZ2VEZXRhaWxzXG4gKlxuICogQSBzdGF0ZSBmb3IgZWRpdGluZyB0aGUgYXR0YWNobWVudCBkaXNwbGF5IHNldHRpbmdzIG9mIGFuIGltYWdlIHRoYXQncyBiZWVuXG4gKiBpbnNlcnRlZCBpbnRvIHRoZSBlZGl0b3IuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlc10gICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuaWQ9aW1hZ2UtZGV0YWlsc10gICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9SW1hZ2UgRGV0YWlsc10gICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dHJpYnV0ZXMuaW1hZ2UgICAgICAgICAgICAgICAgICAgVGhlIGltYWdlJ3MgbW9kZWwuXG4gKiBAcGFyYW0ge3N0cmluZ3xmYWxzZX0gICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnQ9aW1hZ2UtZGV0YWlsc10gSW5pdGlhbCBtb2RlIGZvciB0aGUgY29udGVudCByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ3xmYWxzZX0gICAgICAgICAgICAgIFthdHRyaWJ1dGVzLm1lbnU9ZmFsc2VdICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ3xmYWxzZX0gICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnJvdXRlcj1mYWxzZV0gICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgcm91dGVyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfGZhbHNlfSAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudG9vbGJhcj1pbWFnZS1kZXRhaWxzXSBJbml0aWFsIG1vZGUgZm9yIHRoZSB0b29sYmFyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZWRpdGluZz1mYWxzZV0gICAgICAgICBVbnVzZWQuXG4gKiBAcGFyYW0ge2ludH0gICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnByaW9yaXR5PTYwXSAgICAgICAgICAgVW51c2VkLlxuICpcbiAqIEB0b2RvIFRoaXMgc3RhdGUgaW5oZXJpdHMgc29tZSBkZWZhdWx0cyBmcm9tIG1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeS5wcm90b3R5cGUuZGVmYXVsdHMsXG4gKiAgICAgICBob3dldmVyIHRoaXMgbWF5IG5vdCBkbyBhbnl0aGluZy5cbiAqL1xudmFyIFN0YXRlID0gd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSxcblx0TGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0SW1hZ2VEZXRhaWxzO1xuXG5JbWFnZURldGFpbHMgPSBTdGF0ZS5leHRlbmQoe1xuXHRkZWZhdWx0czogXy5kZWZhdWx0cyh7XG5cdFx0aWQ6ICAgICAgICdpbWFnZS1kZXRhaWxzJyxcblx0XHR0aXRsZTogICAgbDEwbi5pbWFnZURldGFpbHNUaXRsZSxcblx0XHRjb250ZW50OiAgJ2ltYWdlLWRldGFpbHMnLFxuXHRcdG1lbnU6ICAgICBmYWxzZSxcblx0XHRyb3V0ZXI6ICAgZmFsc2UsXG5cdFx0dG9vbGJhcjogICdpbWFnZS1kZXRhaWxzJyxcblx0XHRlZGl0aW5nOiAgZmFsc2UsXG5cdFx0cHJpb3JpdHk6IDYwXG5cdH0sIExpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzICksXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBBdHRyaWJ1dGVzXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR0aGlzLmltYWdlID0gb3B0aW9ucy5pbWFnZTtcblx0XHRTdGF0ZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUubW9kYWwuJGVsLmFkZENsYXNzKCdpbWFnZS1kZXRhaWxzJyk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlRGV0YWlscztcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKlxuICogQSBzdGF0ZSBmb3IgY2hvb3NpbmcgYW4gYXR0YWNobWVudCBvciBncm91cCBvZiBhdHRhY2htZW50cyBmcm9tIHRoZSBtZWRpYSBsaWJyYXJ5LlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICogQG1peGVzIG1lZGlhLnNlbGVjdGlvblN5bmNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzXSAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlcyBoYXNoIHBhc3NlZCB0byB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPWxpYnJhcnldICAgICAgICAgICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMudGl0bGU9TWVkaWEgbGlicmFyeV0gICAgIFRpdGxlIGZvciB0aGUgc3RhdGUuIERpc3BsYXlzIGluIHRoZSBtZWRpYSBtZW51IGFuZCB0aGUgZnJhbWUncyB0aXRsZSByZWdpb24uXG4gKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzfSAgICAgIFthdHRyaWJ1dGVzLmxpYnJhcnldICAgICAgICAgICAgICAgICBUaGUgYXR0YWNobWVudHMgY29sbGVjdGlvbiB0byBicm93c2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhIGNvbGxlY3Rpb24gb2YgYWxsIGF0dGFjaG1lbnRzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSB7d3AubWVkaWEubW9kZWwuU2VsZWN0aW9ufG9iamVjdH0gW2F0dHJpYnV0ZXMuc2VsZWN0aW9uXSAgICAgICAgICAgICAgIEEgY29sbGVjdGlvbiB0byBjb250YWluIGF0dGFjaG1lbnQgc2VsZWN0aW9ucyB3aXRoaW4gdGhlIHN0YXRlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlICdzZWxlY3Rpb24nIGF0dHJpYnV0ZSBpcyBhIHBsYWluIEpTIG9iamVjdCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgU2VsZWN0aW9uIHdpbGwgYmUgY3JlYXRlZCB1c2luZyBpdHMgdmFsdWVzIGFzIHRoZSBzZWxlY3Rpb24gaW5zdGFuY2UncyBgcHJvcHNgIG1vZGVsLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBpdCB3aWxsIGNvcHkgdGhlIGxpYnJhcnkncyBgcHJvcHNgIG1vZGVsLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tdWx0aXBsZT1mYWxzZV0gICAgICAgICAgV2hldGhlciBtdWx0aS1zZWxlY3QgaXMgZW5hYmxlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudD11cGxvYWRdICAgICAgICAgIEluaXRpYWwgbW9kZSBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbiBieSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZyBpZiAnY29udGVudFVzZXJTZXR0aW5nJyBpcyB0cnVlLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWRlZmF1bHRdICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnJvdXRlcj1icm93c2VdICAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSByb3V0ZXIgcmVnaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy50b29sYmFyPXNlbGVjdF0gICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgdG9vbGJhciByZWdpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNlYXJjaGFibGU9dHJ1ZV0gICAgICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIHNlYXJjaGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmZpbHRlcmFibGU9ZmFsc2VdICAgICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGZpbHRlcmFibGUsIGFuZCBpZiBzbyB3aGF0IGZpbHRlcnMgc2hvdWxkIGJlIHNob3duLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnYWxsJywgJ3VwbG9hZGVkJywgb3IgJ3VuYXR0YWNoZWQnLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5zb3J0YWJsZT10cnVlXSAgICAgICAgICAgV2hldGhlciB0aGUgQXR0YWNobWVudHMgc2hvdWxkIGJlIHNvcnRhYmxlLiBEZXBlbmRzIG9uIHRoZSBvcmRlcmJ5IHByb3BlcnR5IGJlaW5nIHNldCB0byBtZW51T3JkZXIgb24gdGhlIGF0dGFjaG1lbnRzIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmF1dG9TZWxlY3Q9dHJ1ZV0gICAgICAgICBXaGV0aGVyIGFuIHVwbG9hZGVkIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuZGVzY3JpYmU9ZmFsc2VdICAgICAgICAgIFdoZXRoZXIgdG8gb2ZmZXIgVUkgdG8gZGVzY3JpYmUgYXR0YWNobWVudHMgLSBlLmcuIGNhcHRpb25pbmcgaW1hZ2VzIGluIGEgZ2FsbGVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuY29udGVudFVzZXJTZXR0aW5nPXRydWVdIFdoZXRoZXIgdGhlIGNvbnRlbnQgcmVnaW9uJ3MgbW9kZSBzaG91bGQgYmUgc2V0IGFuZCBwZXJzaXN0ZWQgcGVyIHVzZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnN5bmNTZWxlY3Rpb249dHJ1ZV0gICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0Z2V0VXNlclNldHRpbmcgPSB3aW5kb3cuZ2V0VXNlclNldHRpbmcsXG5cdHNldFVzZXJTZXR0aW5nID0gd2luZG93LnNldFVzZXJTZXR0aW5nLFxuXHRMaWJyYXJ5O1xuXG5MaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZS5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGlkOiAgICAgICAgICAgICAgICAgJ2xpYnJhcnknLFxuXHRcdHRpdGxlOiAgICAgICAgICAgICAgbDEwbi5tZWRpYUxpYnJhcnlUaXRsZSxcblx0XHRtdWx0aXBsZTogICAgICAgICAgIGZhbHNlLFxuXHRcdGNvbnRlbnQ6ICAgICAgICAgICAgJ3VwbG9hZCcsXG5cdFx0bWVudTogICAgICAgICAgICAgICAnZGVmYXVsdCcsXG5cdFx0cm91dGVyOiAgICAgICAgICAgICAnYnJvd3NlJyxcblx0XHR0b29sYmFyOiAgICAgICAgICAgICdzZWxlY3QnLFxuXHRcdHNlYXJjaGFibGU6ICAgICAgICAgdHJ1ZSxcblx0XHRmaWx0ZXJhYmxlOiAgICAgICAgIGZhbHNlLFxuXHRcdHNvcnRhYmxlOiAgICAgICAgICAgdHJ1ZSxcblx0XHRhdXRvU2VsZWN0OiAgICAgICAgIHRydWUsXG5cdFx0ZGVzY3JpYmU6ICAgICAgICAgICBmYWxzZSxcblx0XHRjb250ZW50VXNlclNldHRpbmc6IHRydWUsXG5cdFx0c3luY1NlbGVjdGlvbjogICAgICB0cnVlXG5cdH0sXG5cblx0LyoqXG5cdCAqIElmIGEgbGlicmFyeSBpc24ndCBwcm92aWRlZCwgcXVlcnkgYWxsIG1lZGlhIGl0ZW1zLlxuXHQgKiBJZiBhIHNlbGVjdGlvbiBpbnN0YW5jZSBpc24ndCBwcm92aWRlZCwgY3JlYXRlIG9uZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0cHJvcHM7XG5cblx0XHRpZiAoICEgdGhpcy5nZXQoJ2xpYnJhcnknKSApIHtcblx0XHRcdHRoaXMuc2V0KCAnbGlicmFyeScsIHdwLm1lZGlhLnF1ZXJ5KCkgKTtcblx0XHR9XG5cblx0XHRpZiAoICEgKCBzZWxlY3Rpb24gaW5zdGFuY2VvZiB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24gKSApIHtcblx0XHRcdHByb3BzID0gc2VsZWN0aW9uO1xuXG5cdFx0XHRpZiAoICEgcHJvcHMgKSB7XG5cdFx0XHRcdHByb3BzID0gdGhpcy5nZXQoJ2xpYnJhcnknKS5wcm9wcy50b0pTT04oKTtcblx0XHRcdFx0cHJvcHMgPSBfLm9taXQoIHByb3BzLCAnb3JkZXJieScsICdxdWVyeScgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXQoICdzZWxlY3Rpb24nLCBuZXcgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uKCBudWxsLCB7XG5cdFx0XHRcdG11bHRpcGxlOiB0aGlzLmdldCgnbXVsdGlwbGUnKSxcblx0XHRcdFx0cHJvcHM6IHByb3BzXG5cdFx0XHR9KSApO1xuXHRcdH1cblxuXHRcdHRoaXMucmVzZXREaXNwbGF5cygpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN5bmNTZWxlY3Rpb24oKTtcblxuXHRcdHdwLlVwbG9hZGVyLnF1ZXVlLm9uKCAnYWRkJywgdGhpcy51cGxvYWRpbmcsIHRoaXMgKTtcblxuXHRcdHRoaXMuZ2V0KCdzZWxlY3Rpb24nKS5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnJlZnJlc2hDb250ZW50LCB0aGlzICk7XG5cblx0XHRpZiAoIHRoaXMuZ2V0KCAncm91dGVyJyApICYmIHRoaXMuZ2V0KCdjb250ZW50VXNlclNldHRpbmcnKSApIHtcblx0XHRcdHRoaXMuZnJhbWUub24oICdjb250ZW50OmFjdGl2YXRlJywgdGhpcy5zYXZlQ29udGVudE1vZGUsIHRoaXMgKTtcblx0XHRcdHRoaXMuc2V0KCAnY29udGVudCcsIGdldFVzZXJTZXR0aW5nKCAnbGlicmFyeUNvbnRlbnQnLCB0aGlzLmdldCgnY29udGVudCcpICkgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZWNvcmRTZWxlY3Rpb24oKTtcblxuXHRcdHRoaXMuZnJhbWUub2ZmKCAnY29udGVudDphY3RpdmF0ZScsIHRoaXMuc2F2ZUNvbnRlbnRNb2RlLCB0aGlzICk7XG5cblx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50IGhhbmRsZXJzIHRoYXQgdXNlIHRoaXMgc3RhdGUgYXMgdGhlIGNvbnRleHRcblx0XHQvLyBmcm9tIHRoZSBzZWxlY3Rpb24uXG5cdFx0dGhpcy5nZXQoJ3NlbGVjdGlvbicpLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXG5cdFx0d3AuVXBsb2FkZXIucXVldWUub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlc2V0IHRoZSBsaWJyYXJ5IHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHJlc2V0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldCgnc2VsZWN0aW9uJykucmVzZXQoKTtcblx0XHR0aGlzLnJlc2V0RGlzcGxheXMoKTtcblx0XHR0aGlzLnJlZnJlc2hDb250ZW50KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlc2V0IHRoZSBhdHRhY2htZW50IGRpc3BsYXkgc2V0dGluZ3MgZGVmYXVsdHMgdG8gdGhlIHNpdGUgb3B0aW9ucy5cblx0ICpcblx0ICogSWYgc2l0ZSBvcHRpb25zIGRvbid0IGRlZmluZSB0aGVtLCBmYWxsIGJhY2sgdG8gYSBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZy5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRyZXNldERpc3BsYXlzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZGVmYXVsdFByb3BzID0gd3AubWVkaWEudmlldy5zZXR0aW5ncy5kZWZhdWx0UHJvcHM7XG5cdFx0dGhpcy5fZGlzcGxheXMgPSBbXTtcblx0XHR0aGlzLl9kZWZhdWx0RGlzcGxheVNldHRpbmdzID0ge1xuXHRcdFx0YWxpZ246IGdldFVzZXJTZXR0aW5nKCAnYWxpZ24nLCBkZWZhdWx0UHJvcHMuYWxpZ24gKSB8fCAnbm9uZScsXG5cdFx0XHRzaXplOiAgZ2V0VXNlclNldHRpbmcoICdpbWdzaXplJywgZGVmYXVsdFByb3BzLnNpemUgKSB8fCAnbWVkaXVtJyxcblx0XHRcdGxpbms6ICBnZXRVc2VyU2V0dGluZyggJ3VybGJ1dHRvbicsIGRlZmF1bHRQcm9wcy5saW5rICkgfHwgJ25vbmUnXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgbW9kZWwgdG8gcmVwcmVzZW50IGRpc3BsYXkgc2V0dGluZ3MgKGFsaWdubWVudCwgZXRjLikgZm9yIGFuIGF0dGFjaG1lbnQuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHJldHVybnMge0JhY2tib25lLk1vZGVsfVxuXHQgKi9cblx0ZGlzcGxheTogZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0dmFyIGRpc3BsYXlzID0gdGhpcy5fZGlzcGxheXM7XG5cblx0XHRpZiAoICEgZGlzcGxheXNbIGF0dGFjaG1lbnQuY2lkIF0gKSB7XG5cdFx0XHRkaXNwbGF5c1sgYXR0YWNobWVudC5jaWQgXSA9IG5ldyBCYWNrYm9uZS5Nb2RlbCggdGhpcy5kZWZhdWx0RGlzcGxheVNldHRpbmdzKCBhdHRhY2htZW50ICkgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRpc3BsYXlzWyBhdHRhY2htZW50LmNpZCBdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHaXZlbiBhbiBhdHRhY2htZW50LCBjcmVhdGUgYXR0YWNobWVudCBkaXNwbGF5IHNldHRpbmdzIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjYuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnR9IGF0dGFjaG1lbnRcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdGRlZmF1bHREaXNwbGF5U2V0dGluZ3M6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHZhciBzZXR0aW5ncyA9IF8uY2xvbmUoIHRoaXMuX2RlZmF1bHREaXNwbGF5U2V0dGluZ3MgKTtcblxuXHRcdGlmICggc2V0dGluZ3MuY2FuRW1iZWQgPSB0aGlzLmNhbkVtYmVkKCBhdHRhY2htZW50ICkgKSB7XG5cdFx0XHRzZXR0aW5ncy5saW5rID0gJ2VtYmVkJztcblx0XHR9IGVsc2UgaWYgKCAhIHRoaXMuaXNJbWFnZUF0dGFjaG1lbnQoIGF0dGFjaG1lbnQgKSAmJiBzZXR0aW5ncy5saW5rID09PSAnbm9uZScgKSB7XG5cdFx0XHRzZXR0aW5ncy5saW5rID0gJ2ZpbGUnO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZXR0aW5ncztcblx0fSxcblxuXHQvKipcblx0ICogV2hldGhlciBhbiBhdHRhY2htZW50IGlzIGltYWdlLlxuXHQgKlxuXHQgKiBAc2luY2UgNC40LjFcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKi9cblx0aXNJbWFnZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdC8vIElmIHVwbG9hZGluZywgd2Uga25vdyB0aGUgZmlsZW5hbWUgYnV0IG5vdCB0aGUgbWltZSB0eXBlLlxuXHRcdGlmICggYXR0YWNobWVudC5nZXQoJ3VwbG9hZGluZycpICkge1xuXHRcdFx0cmV0dXJuIC9cXC4oanBlP2d8cG5nfGdpZikkL2kudGVzdCggYXR0YWNobWVudC5nZXQoJ2ZpbGVuYW1lJykgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXR0YWNobWVudC5nZXQoJ3R5cGUnKSA9PT0gJ2ltYWdlJztcblx0fSxcblxuXHQvKipcblx0ICogV2hldGhlciBhbiBhdHRhY2htZW50IGNhbiBiZSBlbWJlZGRlZCAoYXVkaW8gb3IgdmlkZW8pLlxuXHQgKlxuXHQgKiBAc2luY2UgMy42LjBcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKi9cblx0Y2FuRW1iZWQ6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdC8vIElmIHVwbG9hZGluZywgd2Uga25vdyB0aGUgZmlsZW5hbWUgYnV0IG5vdCB0aGUgbWltZSB0eXBlLlxuXHRcdGlmICggISBhdHRhY2htZW50LmdldCgndXBsb2FkaW5nJykgKSB7XG5cdFx0XHR2YXIgdHlwZSA9IGF0dGFjaG1lbnQuZ2V0KCd0eXBlJyk7XG5cdFx0XHRpZiAoIHR5cGUgIT09ICdhdWRpbycgJiYgdHlwZSAhPT0gJ3ZpZGVvJyApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBfLmNvbnRhaW5zKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLmVtYmVkRXh0cywgYXR0YWNobWVudC5nZXQoJ2ZpbGVuYW1lJykuc3BsaXQoJy4nKS5wb3AoKSApO1xuXHR9LFxuXG5cblx0LyoqXG5cdCAqIElmIHRoZSBzdGF0ZSBpcyBhY3RpdmUsIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgYW5kIHRoZSBjdXJyZW50XG5cdCAqIGNvbnRlbnQgbW9kZSBpcyBub3QgYW4gb3B0aW9uIGluIHRoZSBzdGF0ZSdzIHJvdXRlciAocHJvdmlkZWRcblx0ICogdGhlIHN0YXRlIGhhcyBhIHJvdXRlciksIHJlc2V0IHRoZSBjb250ZW50IG1vZGUgdG8gdGhlIGRlZmF1bHQuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0cmVmcmVzaENvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRmcmFtZSA9IHRoaXMuZnJhbWUsXG5cdFx0XHRyb3V0ZXIgPSBmcmFtZS5yb3V0ZXIuZ2V0KCksXG5cdFx0XHRtb2RlID0gZnJhbWUuY29udGVudC5tb2RlKCk7XG5cblx0XHRpZiAoIHRoaXMuYWN0aXZlICYmICEgc2VsZWN0aW9uLmxlbmd0aCAmJiByb3V0ZXIgJiYgISByb3V0ZXIuZ2V0KCBtb2RlICkgKSB7XG5cdFx0XHR0aGlzLmZyYW1lLmNvbnRlbnQucmVuZGVyKCB0aGlzLmdldCgnY29udGVudCcpICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBoYW5kbGVyIHdoZW4gYW4gYXR0YWNobWVudCBpcyB1cGxvYWRlZC5cblx0ICpcblx0ICogU3dpdGNoIHRvIHRoZSBNZWRpYSBMaWJyYXJ5IGlmIHVwbG9hZGVkIGZyb20gdGhlICdVcGxvYWQgRmlsZXMnIHRhYi5cblx0ICpcblx0ICogQWRkcyBhbnkgdXBsb2FkaW5nIGF0dGFjaG1lbnRzIHRvIHRoZSBzZWxlY3Rpb24uXG5cdCAqXG5cdCAqIElmIHRoZSBzdGF0ZSBvbmx5IHN1cHBvcnRzIG9uZSBhdHRhY2htZW50IHRvIGJlIHNlbGVjdGVkIGFuZCBtdWx0aXBsZVxuXHQgKiBhdHRhY2htZW50cyBhcmUgdXBsb2FkZWQsIHRoZSBsYXN0IGF0dGFjaG1lbnQgaW4gdGhlIHVwbG9hZCBxdWV1ZSB3aWxsXG5cdCAqIGJlIHNlbGVjdGVkLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqL1xuXHR1cGxvYWRpbmc6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHZhciBjb250ZW50ID0gdGhpcy5mcmFtZS5jb250ZW50O1xuXG5cdFx0aWYgKCAndXBsb2FkJyA9PT0gY29udGVudC5tb2RlKCkgKSB7XG5cdFx0XHR0aGlzLmZyYW1lLmNvbnRlbnQubW9kZSgnYnJvd3NlJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdldCggJ2F1dG9TZWxlY3QnICkgKSB7XG5cdFx0XHR0aGlzLmdldCgnc2VsZWN0aW9uJykuYWRkKCBhdHRhY2htZW50ICk7XG5cdFx0XHR0aGlzLmZyYW1lLnRyaWdnZXIoICdsaWJyYXJ5OnNlbGVjdGlvbjphZGQnICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQZXJzaXN0IHRoZSBtb2RlIG9mIHRoZSBjb250ZW50IHJlZ2lvbiBhcyBhIHVzZXIgc2V0dGluZy5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRzYXZlQ29udGVudE1vZGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggJ2Jyb3dzZScgIT09IHRoaXMuZ2V0KCdyb3V0ZXInKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgbW9kZSA9IHRoaXMuZnJhbWUuY29udGVudC5tb2RlKCksXG5cdFx0XHR2aWV3ID0gdGhpcy5mcmFtZS5yb3V0ZXIuZ2V0KCk7XG5cblx0XHRpZiAoIHZpZXcgJiYgdmlldy5nZXQoIG1vZGUgKSApIHtcblx0XHRcdHNldFVzZXJTZXR0aW5nKCAnbGlicmFyeUNvbnRlbnQnLCBtb2RlICk7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gTWFrZSBzZWxlY3Rpb25TeW5jIGF2YWlsYWJsZSBvbiBhbnkgTWVkaWEgTGlicmFyeSBzdGF0ZS5cbl8uZXh0ZW5kKCBMaWJyYXJ5LnByb3RvdHlwZSwgd3AubWVkaWEuc2VsZWN0aW9uU3luYyApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpYnJhcnk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLmNvbnRyb2xsZXIuTWVkaWFMaWJyYXJ5XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKi9cbnZhciBMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRNZWRpYUxpYnJhcnk7XG5cbk1lZGlhTGlicmFyeSA9IExpYnJhcnkuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IF8uZGVmYXVsdHMoe1xuXHRcdC8vIEF0dGFjaG1lbnRzIGJyb3dzZXIgZGVmYXVsdHMuIEBzZWUgbWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXJcblx0XHRmaWx0ZXJhYmxlOiAgICAgICd1cGxvYWRlZCcsXG5cblx0XHRkaXNwbGF5U2V0dGluZ3M6IGZhbHNlLFxuXHRcdHByaW9yaXR5OiAgICAgICAgODAsXG5cdFx0c3luY1NlbGVjdGlvbjogICBmYWxzZVxuXHR9LCBMaWJyYXJ5LnByb3RvdHlwZS5kZWZhdWx0cyApLFxuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy45LjBcblx0ICpcblx0ICogQHBhcmFtIG9wdGlvbnNcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHRoaXMubWVkaWEgPSBvcHRpb25zLm1lZGlhO1xuXHRcdHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0XHR0aGlzLnNldCggJ2xpYnJhcnknLCB3cC5tZWRpYS5xdWVyeSh7IHR5cGU6IHRoaXMudHlwZSB9KSApO1xuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEB0b2RvIHRoaXMgc2hvdWxkIHVzZSB0aGlzLmZyYW1lLlxuXHRcdGlmICggd3AubWVkaWEuZnJhbWUubGFzdE1pbWUgKSB7XG5cdFx0XHR0aGlzLnNldCggJ2xpYnJhcnknLCB3cC5tZWRpYS5xdWVyeSh7IHR5cGU6IHdwLm1lZGlhLmZyYW1lLmxhc3RNaW1lIH0pICk7XG5cdFx0XHRkZWxldGUgd3AubWVkaWEuZnJhbWUubGFzdE1pbWU7XG5cdFx0fVxuXHRcdExpYnJhcnkucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVkaWFMaWJyYXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvblxuICpcbiAqIEEgcmVnaW9uIGlzIGEgcGVyc2lzdGVudCBhcHBsaWNhdGlvbiBsYXlvdXQgYXJlYS5cbiAqXG4gKiBBIHJlZ2lvbiBhc3N1bWVzIG9uZSBtb2RlIGF0IGFueSB0aW1lLCBhbmQgY2FuIGJlIHN3aXRjaGVkIHRvIGFub3RoZXIuXG4gKlxuICogV2hlbiBtb2RlIGNoYW5nZXMsIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIG9uIHRoZSByZWdpb24ncyBwYXJlbnQgdmlldy5cbiAqIFRoZSBwYXJlbnQgdmlldyB3aWxsIGxpc3RlbiB0byBzcGVjaWZpYyBldmVudHMgYW5kIGZpbGwgdGhlIHJlZ2lvbiB3aXRoIGFuXG4gKiBhcHByb3ByaWF0ZSB2aWV3IGRlcGVuZGluZyBvbiBtb2RlLiBGb3IgZXhhbXBsZSwgYSBmcmFtZSBsaXN0ZW5zIGZvciB0aGVcbiAqICdicm93c2UnIG1vZGUgdCBiZSBhY3RpdmF0ZWQgb24gdGhlICdjb250ZW50JyB2aWV3IGFuZCB0aGVuIGZpbGxzIHRoZSByZWdpb25cbiAqIHdpdGggYW4gQXR0YWNobWVudHNCcm93c2VyIHZpZXcuXG4gKlxuICogQGNsYXNzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICBvcHRpb25zICAgICAgICAgIE9wdGlvbnMgaGFzaCBmb3IgdGhlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgb3B0aW9ucy5pZCAgICAgICBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlZ2lvbi5cbiAqIEBwYXJhbSB7QmFja2JvbmUuVmlld30gb3B0aW9ucy52aWV3ICAgICBBIHBhcmVudCB2aWV3IHRoZSByZWdpb24gZXhpc3RzIHdpdGhpbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgb3B0aW9ucy5zZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIHRoZSByZWdpb24gd2l0aGluIHRoZSBwYXJlbnQgdmlldy5cbiAqL1xudmFyIFJlZ2lvbiA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRfLmV4dGVuZCggdGhpcywgXy5waWNrKCBvcHRpb25zIHx8IHt9LCAnaWQnLCAndmlldycsICdzZWxlY3RvcicgKSApO1xufTtcblxuLy8gVXNlIEJhY2tib25lJ3Mgc2VsZi1wcm9wYWdhdGluZyBgZXh0ZW5kYCBpbmhlcml0YW5jZSBtZXRob2QuXG5SZWdpb24uZXh0ZW5kID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kO1xuXG5fLmV4dGVuZCggUmVnaW9uLnByb3RvdHlwZSwge1xuXHQvKipcblx0ICogQWN0aXZhdGUgYSBtb2RlLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcblx0ICpcblx0ICogQGZpcmVzIHRoaXMudmlldyN7dGhpcy5pZH06YWN0aXZhdGU6e3RoaXMuX21vZGV9XG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OmFjdGl2YXRlXG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OmRlYWN0aXZhdGU6e3RoaXMuX21vZGV9XG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OmRlYWN0aXZhdGVcblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9ufSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdG1vZGU6IGZ1bmN0aW9uKCBtb2RlICkge1xuXHRcdGlmICggISBtb2RlICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX21vZGU7XG5cdFx0fVxuXHRcdC8vIEJhaWwgaWYgd2UncmUgdHJ5aW5nIHRvIGNoYW5nZSB0byB0aGUgY3VycmVudCBtb2RlLlxuXHRcdGlmICggbW9kZSA9PT0gdGhpcy5fbW9kZSApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJlZ2lvbiBtb2RlIGRlYWN0aXZhdGlvbiBldmVudC5cblx0XHQgKlxuXHRcdCAqIEBldmVudCB0aGlzLnZpZXcje3RoaXMuaWR9OmRlYWN0aXZhdGU6e3RoaXMuX21vZGV9XG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06ZGVhY3RpdmF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMudHJpZ2dlcignZGVhY3RpdmF0ZScpO1xuXG5cdFx0dGhpcy5fbW9kZSA9IG1vZGU7XG5cdFx0dGhpcy5yZW5kZXIoIG1vZGUgKTtcblxuXHRcdC8qKlxuXHRcdCAqIFJlZ2lvbiBtb2RlIGFjdGl2YXRpb24gZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTphY3RpdmF0ZTp7dGhpcy5fbW9kZX1cblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTphY3RpdmF0ZVxuXHRcdCAqL1xuXHRcdHRoaXMudHJpZ2dlcignYWN0aXZhdGUnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIFJlbmRlciBhIG1vZGUuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbW9kZVxuXHQgKlxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpjcmVhdGU6e3RoaXMuX21vZGV9XG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OmNyZWF0ZVxuXHQgKiBAZmlyZXMgdGhpcy52aWV3I3t0aGlzLmlkfTpyZW5kZXI6e3RoaXMuX21vZGV9XG5cdCAqIEBmaXJlcyB0aGlzLnZpZXcje3RoaXMuaWR9OnJlbmRlclxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuY29udHJvbGxlci5SZWdpb259IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCBtb2RlICkge1xuXHRcdC8vIElmIHRoZSBtb2RlIGlzbid0IGFjdGl2ZSwgYWN0aXZhdGUgaXQuXG5cdFx0aWYgKCBtb2RlICYmIG1vZGUgIT09IHRoaXMuX21vZGUgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tb2RlKCBtb2RlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHNldCA9IHsgdmlldzogbnVsbCB9LFxuXHRcdFx0dmlldztcblxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZSByZWdpb24gdmlldyBldmVudC5cblx0XHQgKlxuXHRcdCAqIFJlZ2lvbiB2aWV3IGNyZWF0aW9uIHRha2VzIHBsYWNlIGluIGFuIGV2ZW50IGNhbGxiYWNrIG9uIHRoZSBmcmFtZS5cblx0XHQgKlxuXHRcdCAqIEBldmVudCB0aGlzLnZpZXcje3RoaXMuaWR9OmNyZWF0ZTp7dGhpcy5fbW9kZX1cblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTpjcmVhdGVcblx0XHQgKi9cblx0XHR0aGlzLnRyaWdnZXIoICdjcmVhdGUnLCBzZXQgKTtcblx0XHR2aWV3ID0gc2V0LnZpZXc7XG5cblx0XHQvKipcblx0XHQgKiBSZW5kZXIgcmVnaW9uIHZpZXcgZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBSZWdpb24gdmlldyBjcmVhdGlvbiB0YWtlcyBwbGFjZSBpbiBhbiBldmVudCBjYWxsYmFjayBvbiB0aGUgZnJhbWUuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgdGhpcy52aWV3I3t0aGlzLmlkfTpjcmVhdGU6e3RoaXMuX21vZGV9XG5cdFx0ICogQGV2ZW50IHRoaXMudmlldyN7dGhpcy5pZH06Y3JlYXRlXG5cdFx0ICovXG5cdFx0dGhpcy50cmlnZ2VyKCAncmVuZGVyJywgdmlldyApO1xuXHRcdGlmICggdmlldyApIHtcblx0XHRcdHRoaXMuc2V0KCB2aWV3ICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlZ2lvbidzIHZpZXcuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuVmlld31cblx0ICovXG5cdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMudmlldy52aWV3cy5maXJzdCggdGhpcy5zZWxlY3RvciApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIHJlZ2lvbidzIHZpZXcgYXMgYSBzdWJ2aWV3IG9mIHRoZSBmcmFtZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSB2aWV3c1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEByZXR1cm5zIHt3cC5CYWNrYm9uZS5TdWJ2aWV3c30gU3Vidmlld3MgaXMgcmV0dXJuZWQgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHNldDogZnVuY3Rpb24oIHZpZXdzLCBvcHRpb25zICkge1xuXHRcdGlmICggb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMuYWRkID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnZpZXcudmlld3Muc2V0KCB0aGlzLnNlbGVjdG9yLCB2aWV3cywgb3B0aW9ucyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyIHJlZ2lvbmFsIHZpZXcgZXZlbnRzIG9uIHRoZSBmcmFtZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuXHQgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9ufSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgYmFzZSwgYXJncztcblxuXHRcdGlmICggISB0aGlzLl9tb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGFyZ3MgPSBfLnRvQXJyYXkoIGFyZ3VtZW50cyApO1xuXHRcdGJhc2UgPSB0aGlzLmlkICsgJzonICsgZXZlbnQ7XG5cblx0XHQvLyBUcmlnZ2VyIGB7dGhpcy5pZH06e2V2ZW50fTp7dGhpcy5fbW9kZX1gIGV2ZW50IG9uIHRoZSBmcmFtZS5cblx0XHRhcmdzWzBdID0gYmFzZSArICc6JyArIHRoaXMuX21vZGU7XG5cdFx0dGhpcy52aWV3LnRyaWdnZXIuYXBwbHkoIHRoaXMudmlldywgYXJncyApO1xuXG5cdFx0Ly8gVHJpZ2dlciBge3RoaXMuaWR9OntldmVudH1gIGV2ZW50IG9uIHRoZSBmcmFtZS5cblx0XHRhcmdzWzBdID0gYmFzZTtcblx0XHR0aGlzLnZpZXcudHJpZ2dlci5hcHBseSggdGhpcy52aWV3LCBhcmdzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlZ2lvbjtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5SZXBsYWNlSW1hZ2VcbiAqXG4gKiBBIHN0YXRlIGZvciByZXBsYWNpbmcgYW4gaW1hZ2UuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICogQGF1Z21lbnRzIEJhY2tib25lLk1vZGVsXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXNdICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdHRyaWJ1dGVzIGhhc2ggcGFzc2VkIHRvIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmlkPXJlcGxhY2UtaW1hZ2VdICAgICAgICBVbmlxdWUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRpdGxlPVJlcGxhY2UgSW1hZ2VdICAgICBUaXRsZSBmb3IgdGhlIHN0YXRlLiBEaXNwbGF5cyBpbiB0aGUgbWVkaWEgbWVudSBhbmQgdGhlIGZyYW1lJ3MgdGl0bGUgcmVnaW9uLlxuICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50c30gW2F0dHJpYnV0ZXMubGlicmFyeV0gICAgICAgICAgICAgICAgIFRoZSBhdHRhY2htZW50cyBjb2xsZWN0aW9uIHRvIGJyb3dzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvbmUgaXMgbm90IHN1cHBsaWVkLCBhIGNvbGxlY3Rpb24gb2YgYWxsIGltYWdlcyB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tdWx0aXBsZT1mYWxzZV0gICAgICAgICAgV2hldGhlciBtdWx0aS1zZWxlY3QgaXMgZW5hYmxlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmNvbnRlbnQ9dXBsb2FkXSAgICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSBjb250ZW50IHJlZ2lvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVycmlkZGVuIGJ5IHBlcnNpc3RlbnQgdXNlciBzZXR0aW5nIGlmICdjb250ZW50VXNlclNldHRpbmcnIGlzIHRydWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5tZW51PWRlZmF1bHRdICAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgbWVudSByZWdpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5yb3V0ZXI9YnJvd3NlXSAgICAgICAgICAgSW5pdGlhbCBtb2RlIGZvciB0aGUgcm91dGVyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnRvb2xiYXI9cmVwbGFjZV0gICAgICAgICBJbml0aWFsIG1vZGUgZm9yIHRoZSB0b29sYmFyIHJlZ2lvbi5cbiAqIEBwYXJhbSB7aW50fSAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnByaW9yaXR5PTYwXSAgICAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoZSBzdGF0ZSBsaW5rIGluIHRoZSBtZWRpYSBtZW51LlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZXMuc2VhcmNoYWJsZT10cnVlXSAgICAgICAgIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc2VhcmNoYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9ICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmZpbHRlcmFibGU9dXBsb2FkZWRdICAgICBXaGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGZpbHRlcmFibGUsIGFuZCBpZiBzbyB3aGF0IGZpbHRlcnMgc2hvdWxkIGJlIHNob3duLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ2FsbCcsICd1cGxvYWRlZCcsIG9yICd1bmF0dGFjaGVkJy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnNvcnRhYmxlPXRydWVdICAgICAgICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzaG91bGQgYmUgc29ydGFibGUuIERlcGVuZHMgb24gdGhlIG9yZGVyYnkgcHJvcGVydHkgYmVpbmcgc2V0IHRvIG1lbnVPcmRlciBvbiB0aGUgYXR0YWNobWVudHMgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmF1dG9TZWxlY3Q9dHJ1ZV0gICAgICAgICBXaGV0aGVyIGFuIHVwbG9hZGVkIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLmRlc2NyaWJlPWZhbHNlXSAgICAgICAgICBXaGV0aGVyIHRvIG9mZmVyIFVJIHRvIGRlc2NyaWJlIGF0dGFjaG1lbnRzIC0gZS5nLiBjYXB0aW9uaW5nIGltYWdlcyBpbiBhIGdhbGxlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICBbYXR0cmlidXRlcy5jb250ZW50VXNlclNldHRpbmc9dHJ1ZV0gV2hldGhlciB0aGUgY29udGVudCByZWdpb24ncyBtb2RlIHNob3VsZCBiZSBzZXQgYW5kIHBlcnNpc3RlZCBwZXIgdXNlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzLnN5bmNTZWxlY3Rpb249dHJ1ZV0gICAgICBXaGV0aGVyIHRoZSBBdHRhY2htZW50cyBzZWxlY3Rpb24gc2hvdWxkIGJlIHBlcnNpc3RlZCBmcm9tIHRoZSBsYXN0IHN0YXRlLlxuICovXG52YXIgTGlicmFyeSA9IHdwLm1lZGlhLmNvbnRyb2xsZXIuTGlicmFyeSxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0UmVwbGFjZUltYWdlO1xuXG5SZXBsYWNlSW1hZ2UgPSBMaWJyYXJ5LmV4dGVuZCh7XG5cdGRlZmF1bHRzOiBfLmRlZmF1bHRzKHtcblx0XHRpZDogICAgICAgICAgICAncmVwbGFjZS1pbWFnZScsXG5cdFx0dGl0bGU6ICAgICAgICAgbDEwbi5yZXBsYWNlSW1hZ2VUaXRsZSxcblx0XHRtdWx0aXBsZTogICAgICBmYWxzZSxcblx0XHRmaWx0ZXJhYmxlOiAgICAndXBsb2FkZWQnLFxuXHRcdHRvb2xiYXI6ICAgICAgICdyZXBsYWNlJyxcblx0XHRtZW51OiAgICAgICAgICBmYWxzZSxcblx0XHRwcmlvcml0eTogICAgICA2MCxcblx0XHRzeW5jU2VsZWN0aW9uOiB0cnVlXG5cdH0sIExpYnJhcnkucHJvdG90eXBlLmRlZmF1bHRzICksXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKlxuXHQgKiBAcGFyYW0gb3B0aW9uc1xuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGxpYnJhcnksIGNvbXBhcmF0b3I7XG5cblx0XHR0aGlzLmltYWdlID0gb3B0aW9ucy5pbWFnZTtcblx0XHQvLyBJZiB3ZSBoYXZlbid0IGJlZW4gcHJvdmlkZWQgYSBgbGlicmFyeWAsIGNyZWF0ZSBhIGBTZWxlY3Rpb25gLlxuXHRcdGlmICggISB0aGlzLmdldCgnbGlicmFyeScpICkge1xuXHRcdFx0dGhpcy5zZXQoICdsaWJyYXJ5Jywgd3AubWVkaWEucXVlcnkoeyB0eXBlOiAnaW1hZ2UnIH0pICk7XG5cdFx0fVxuXG5cdFx0TGlicmFyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0XHRsaWJyYXJ5ICAgID0gdGhpcy5nZXQoJ2xpYnJhcnknKTtcblx0XHRjb21wYXJhdG9yID0gbGlicmFyeS5jb21wYXJhdG9yO1xuXG5cdFx0Ly8gT3ZlcmxvYWQgdGhlIGxpYnJhcnkncyBjb21wYXJhdG9yIHRvIHB1c2ggaXRlbXMgdGhhdCBhcmUgbm90IGluXG5cdFx0Ly8gdGhlIG1pcnJvcmVkIHF1ZXJ5IHRvIHRoZSBmcm9udCBvZiB0aGUgYWdncmVnYXRlIGNvbGxlY3Rpb24uXG5cdFx0bGlicmFyeS5jb21wYXJhdG9yID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYUluUXVlcnkgPSAhISB0aGlzLm1pcnJvcmluZy5nZXQoIGEuY2lkICksXG5cdFx0XHRcdGJJblF1ZXJ5ID0gISEgdGhpcy5taXJyb3JpbmcuZ2V0KCBiLmNpZCApO1xuXG5cdFx0XHRpZiAoICEgYUluUXVlcnkgJiYgYkluUXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH0gZWxzZSBpZiAoIGFJblF1ZXJ5ICYmICEgYkluUXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBhcmF0b3IuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgYWxsIGl0ZW1zIGluIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGxpYnJhcnksIHNvIGFueSBmZWF0dXJlZFxuXHRcdC8vIGltYWdlcyB0aGF0IGFyZSBub3QgaW5pdGlhbGx5IGxvYWRlZCBzdGlsbCBhcHBlYXIuXG5cdFx0bGlicmFyeS5vYnNlcnZlKCB0aGlzLmdldCgnc2VsZWN0aW9uJykgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHNpbmNlIDMuOS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGVTZWxlY3Rpb24oKTtcblx0XHRMaWJyYXJ5LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjkuMFxuXHQgKi9cblx0dXBkYXRlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0YXR0YWNobWVudCA9IHRoaXMuaW1hZ2UuYXR0YWNobWVudDtcblxuXHRcdHNlbGVjdGlvbi5yZXNldCggYXR0YWNobWVudCA/IFsgYXR0YWNobWVudCBdIDogW10gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVwbGFjZUltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLlNpdGVJY29uQ3JvcHBlclxuICpcbiAqIEEgc3RhdGUgZm9yIGNyb3BwaW5nIGEgU2l0ZSBJY29uLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuQ3JvcHBlclxuICogQGF1Z21lbnRzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgQ29udHJvbGxlciA9IHdwLm1lZGlhLmNvbnRyb2xsZXIsXG5cdFNpdGVJY29uQ3JvcHBlcjtcblxuU2l0ZUljb25Dcm9wcGVyID0gQ29udHJvbGxlci5Dcm9wcGVyLmV4dGVuZCh7XG5cdGFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZyYW1lLm9uKCAnY29udGVudDpjcmVhdGU6Y3JvcCcsIHRoaXMuY3JlYXRlQ3JvcENvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLmZyYW1lLm9uKCAnY2xvc2UnLCB0aGlzLnJlbW92ZUNyb3BwZXIsIHRoaXMgKTtcblx0XHR0aGlzLnNldCgnc2VsZWN0aW9uJywgbmV3IEJhY2tib25lLkNvbGxlY3Rpb24odGhpcy5mcmFtZS5fc2VsZWN0aW9uLnNpbmdsZSkpO1xuXHR9LFxuXG5cdGNyZWF0ZUNyb3BDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNyb3BwZXJWaWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuU2l0ZUljb25Dcm9wcGVyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRhdHRhY2htZW50OiB0aGlzLmdldCgnc2VsZWN0aW9uJykuZmlyc3QoKVxuXHRcdH0pO1xuXHRcdHRoaXMuY3JvcHBlclZpZXcub24oJ2ltYWdlLWxvYWRlZCcsIHRoaXMuY3JlYXRlQ3JvcFRvb2xiYXIsIHRoaXMpO1xuXHRcdHRoaXMuZnJhbWUuY29udGVudC5zZXQodGhpcy5jcm9wcGVyVmlldyk7XG5cblx0fSxcblxuXHRkb0Nyb3A6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHZhciBjcm9wRGV0YWlscyA9IGF0dGFjaG1lbnQuZ2V0KCAnY3JvcERldGFpbHMnICksXG5cdFx0XHRjb250cm9sID0gdGhpcy5nZXQoICdjb250cm9sJyApO1xuXG5cdFx0Y3JvcERldGFpbHMuZHN0X3dpZHRoICA9IGNvbnRyb2wucGFyYW1zLndpZHRoO1xuXHRcdGNyb3BEZXRhaWxzLmRzdF9oZWlnaHQgPSBjb250cm9sLnBhcmFtcy5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gd3AuYWpheC5wb3N0KCAnY3JvcC1pbWFnZScsIHtcblx0XHRcdG5vbmNlOiBhdHRhY2htZW50LmdldCggJ25vbmNlcycgKS5lZGl0LFxuXHRcdFx0aWQ6IGF0dGFjaG1lbnQuZ2V0KCAnaWQnICksXG5cdFx0XHRjb250ZXh0OiAnc2l0ZS1pY29uJyxcblx0XHRcdGNyb3BEZXRhaWxzOiBjcm9wRGV0YWlsc1xuXHRcdH0gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2l0ZUljb25Dcm9wcGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICpcbiAqIEEgc3RhdGUgbWFjaGluZSBrZWVwcyB0cmFjayBvZiBzdGF0ZS4gSXQgaXMgaW4gb25lIHN0YXRlIGF0IGEgdGltZSxcbiAqIGFuZCBjYW4gY2hhbmdlIGZyb20gb25lIHN0YXRlIHRvIGFub3RoZXIuXG4gKlxuICogU3RhdGVzIGFyZSBzdG9yZWQgYXMgbW9kZWxzIGluIGEgQmFja2JvbmUgY29sbGVjdGlvbi5cbiAqXG4gKiBAc2luY2UgMy41LjBcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICogQG1peGluXG4gKiBAbWl4ZXMgQmFja2JvbmUuRXZlbnRzXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc3RhdGVzXG4gKi9cbnZhciBTdGF0ZU1hY2hpbmUgPSBmdW5jdGlvbiggc3RhdGVzICkge1xuXHQvLyBAdG9kbyBUaGlzIGlzIGRlYWQgY29kZS4gVGhlIHN0YXRlcyBjb2xsZWN0aW9uIGdldHMgY3JlYXRlZCBpbiBtZWRpYS52aWV3LkZyYW1lLl9jcmVhdGVTdGF0ZXMuXG5cdHRoaXMuc3RhdGVzID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oIHN0YXRlcyApO1xufTtcblxuLy8gVXNlIEJhY2tib25lJ3Mgc2VsZi1wcm9wYWdhdGluZyBgZXh0ZW5kYCBpbmhlcml0YW5jZSBtZXRob2QuXG5TdGF0ZU1hY2hpbmUuZXh0ZW5kID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kO1xuXG5fLmV4dGVuZCggU3RhdGVNYWNoaW5lLnByb3RvdHlwZSwgQmFja2JvbmUuRXZlbnRzLCB7XG5cdC8qKlxuXHQgKiBGZXRjaCBhIHN0YXRlLlxuXHQgKlxuXHQgKiBJZiBubyBgaWRgIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBhY3RpdmUgc3RhdGUuXG5cdCAqXG5cdCAqIEltcGxpY2l0bHkgY3JlYXRlcyBzdGF0ZXMuXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGF0IHRoZSBgc3RhdGVzYCBjb2xsZWN0aW9uIGV4aXN0cyBzbyB0aGUgYFN0YXRlTWFjaGluZWBcblx0ICogICBjYW4gYmUgdXNlZCBhcyBhIG1peGluLlxuXHQgKlxuXHQgKiBAc2luY2UgMy41LjBcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlfSBSZXR1cm5zIGEgU3RhdGUgbW9kZWxcblx0ICogICBmcm9tIHRoZSBTdGF0ZU1hY2hpbmUgY29sbGVjdGlvblxuXHQgKi9cblx0c3RhdGU6IGZ1bmN0aW9uKCBpZCApIHtcblx0XHR0aGlzLnN0YXRlcyA9IHRoaXMuc3RhdGVzIHx8IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cblx0XHQvLyBEZWZhdWx0IHRvIHRoZSBhY3RpdmUgc3RhdGUuXG5cdFx0aWQgPSBpZCB8fCB0aGlzLl9zdGF0ZTtcblxuXHRcdGlmICggaWQgJiYgISB0aGlzLnN0YXRlcy5nZXQoIGlkICkgKSB7XG5cdFx0XHR0aGlzLnN0YXRlcy5hZGQoeyBpZDogaWQgfSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnN0YXRlcy5nZXQoIGlkICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZS5cblx0ICpcblx0ICogQmFpbCBpZiB3ZSdyZSB0cnlpbmcgdG8gc2VsZWN0IHRoZSBjdXJyZW50IHN0YXRlLCBpZiB3ZSBoYXZlbid0XG5cdCAqIGNyZWF0ZWQgdGhlIGBzdGF0ZXNgIGNvbGxlY3Rpb24sIG9yIGFyZSB0cnlpbmcgdG8gc2VsZWN0IGEgc3RhdGVcblx0ICogdGhhdCBkb2VzIG5vdCBleGlzdC5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKlxuXHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSNkZWFjdGl2YXRlXG5cdCAqIEBmaXJlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlI2FjdGl2YXRlXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHNldFN0YXRlOiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0dmFyIHByZXZpb3VzID0gdGhpcy5zdGF0ZSgpO1xuXG5cdFx0aWYgKCAoIHByZXZpb3VzICYmIGlkID09PSBwcmV2aW91cy5pZCApIHx8ICEgdGhpcy5zdGF0ZXMgfHwgISB0aGlzLnN0YXRlcy5nZXQoIGlkICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoIHByZXZpb3VzICkge1xuXHRcdFx0cHJldmlvdXMudHJpZ2dlcignZGVhY3RpdmF0ZScpO1xuXHRcdFx0dGhpcy5fbGFzdFN0YXRlID0gcHJldmlvdXMuaWQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5fc3RhdGUgPSBpZDtcblx0XHR0aGlzLnN0YXRlKCkudHJpZ2dlcignYWN0aXZhdGUnKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBhY3RpdmUgc3RhdGUuXG5cdCAqXG5cdCAqIENhbGwgdGhlIGBzdGF0ZSgpYCBtZXRob2Qgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50XG5cdCAqIGFjdGl2ZSBzdGF0ZS5cblx0ICpcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlfSBSZXR1cm5zIGEgU3RhdGUgbW9kZWxcblx0ICogICAgZnJvbSB0aGUgU3RhdGVNYWNoaW5lIGNvbGxlY3Rpb25cblx0ICovXG5cdGxhc3RTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLl9sYXN0U3RhdGUgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdGF0ZSggdGhpcy5fbGFzdFN0YXRlICk7XG5cdFx0fVxuXHR9XG59KTtcblxuLy8gTWFwIGFsbCBldmVudCBiaW5kaW5nIGFuZCB0cmlnZ2VyaW5nIG9uIGEgU3RhdGVNYWNoaW5lIHRvIGl0cyBgc3RhdGVzYCBjb2xsZWN0aW9uLlxuXy5lYWNoKFsgJ29uJywgJ29mZicsICd0cmlnZ2VyJyBdLCBmdW5jdGlvbiggbWV0aG9kICkge1xuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdFN0YXRlTWFjaGluZS5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRW5zdXJlIHRoYXQgdGhlIGBzdGF0ZXNgIGNvbGxlY3Rpb24gZXhpc3RzIHNvIHRoZSBgU3RhdGVNYWNoaW5lYFxuXHRcdC8vIGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4uXG5cdFx0dGhpcy5zdGF0ZXMgPSB0aGlzLnN0YXRlcyB8fCBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbigpO1xuXHRcdC8vIEZvcndhcmQgdGhlIG1ldGhvZCB0byB0aGUgYHN0YXRlc2AgY29sbGVjdGlvbi5cblx0XHR0aGlzLnN0YXRlc1sgbWV0aG9kIF0uYXBwbHkoIHRoaXMuc3RhdGVzLCBhcmd1bWVudHMgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YXRlTWFjaGluZTtcbiIsIi8qKlxuICogd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZVxuICpcbiAqIEEgc3RhdGUgaXMgYSBzdGVwIGluIGEgd29ya2Zsb3cgdGhhdCB3aGVuIHNldCB3aWxsIHRyaWdnZXIgdGhlIGNvbnRyb2xsZXJzXG4gKiBmb3IgdGhlIHJlZ2lvbnMgdG8gYmUgdXBkYXRlZCBhcyBzcGVjaWZpZWQgaW4gdGhlIGZyYW1lLlxuICpcbiAqIEEgc3RhdGUgaGFzIGFuIGV2ZW50LWRyaXZlbiBsaWZlY3ljbGU6XG4gKlxuICogICAgICdyZWFkeScgICAgICB0cmlnZ2VycyB3aGVuIGEgc3RhdGUgaXMgYWRkZWQgdG8gYSBzdGF0ZSBtYWNoaW5lJ3MgY29sbGVjdGlvbi5cbiAqICAgICAnYWN0aXZhdGUnICAgdHJpZ2dlcnMgd2hlbiBhIHN0YXRlIGlzIGFjdGl2YXRlZCBieSBhIHN0YXRlIG1hY2hpbmUuXG4gKiAgICAgJ2RlYWN0aXZhdGUnIHRyaWdnZXJzIHdoZW4gYSBzdGF0ZSBpcyBkZWFjdGl2YXRlZCBieSBhIHN0YXRlIG1hY2hpbmUuXG4gKiAgICAgJ3Jlc2V0JyAgICAgIGlzIG5vdCB0cmlnZ2VyZWQgYXV0b21hdGljYWxseS4gSXQgc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlXG4gKiAgICAgICAgICAgICAgICAgIHByb3BlciBjb250cm9sbGVyIHRvIHJlc2V0IHRoZSBzdGF0ZSB0byBpdHMgZGVmYXVsdC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5Nb2RlbFxuICovXG52YXIgU3RhdGUgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHQvKipcblx0ICogQ29uc3RydWN0b3IuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0Y29uc3RydWN0b3I6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuX3ByZUFjdGl2YXRlLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuX3Bvc3RBY3RpdmF0ZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5fZGVhY3RpdmF0ZSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3Jlc2V0JywgdGhpcy5yZXNldCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdyZWFkeScsIHRoaXMuX3JlYWR5LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3JlYWR5JywgdGhpcy5yZWFkeSwgdGhpcyApO1xuXHRcdC8qKlxuXHRcdCAqIENhbGwgcGFyZW50IGNvbnN0cnVjdG9yIHdpdGggcGFzc2VkIGFyZ3VtZW50c1xuXHRcdCAqL1xuXHRcdEJhY2tib25lLk1vZGVsLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLm9uKCAnY2hhbmdlOm1lbnUnLCB0aGlzLl91cGRhdGVNZW51LCB0aGlzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZWFkeSBldmVudCBjYWxsYmFjay5cblx0ICpcblx0ICogQGFic3RyYWN0XG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0cmVhZHk6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlIGV2ZW50IGNhbGxiYWNrLlxuXHQgKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRhY3RpdmF0ZTogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogRGVhY3RpdmF0ZSBldmVudCBjYWxsYmFjay5cblx0ICpcblx0ICogQGFic3RyYWN0XG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0ZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogUmVzZXQgZXZlbnQgY2FsbGJhY2suXG5cdCAqXG5cdCAqIEBhYnN0cmFjdFxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdHJlc2V0OiBmdW5jdGlvbigpIHt9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfcmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3VwZGF0ZU1lbnUoKTtcblx0fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQqL1xuXHRfcHJlQWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0X3Bvc3RBY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vbiggJ2NoYW5nZTptZW51JywgdGhpcy5fbWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjaGFuZ2U6dGl0bGVNb2RlJywgdGhpcy5fdGl0bGUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY2hhbmdlOmNvbnRlbnQnLCB0aGlzLl9jb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NoYW5nZTp0b29sYmFyJywgdGhpcy5fdG9vbGJhciwgdGhpcyApO1xuXG5cdFx0dGhpcy5mcmFtZS5vbiggJ3RpdGxlOnJlbmRlcjpkZWZhdWx0JywgdGhpcy5fcmVuZGVyVGl0bGUsIHRoaXMgKTtcblxuXHRcdHRoaXMuX3RpdGxlKCk7XG5cdFx0dGhpcy5fbWVudSgpO1xuXHRcdHRoaXMuX3Rvb2xiYXIoKTtcblx0XHR0aGlzLl9jb250ZW50KCk7XG5cdFx0dGhpcy5fcm91dGVyKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdF9kZWFjdGl2YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5mcmFtZS5vZmYoICd0aXRsZTpyZW5kZXI6ZGVmYXVsdCcsIHRoaXMuX3JlbmRlclRpdGxlLCB0aGlzICk7XG5cblx0XHR0aGlzLm9mZiggJ2NoYW5nZTptZW51JywgdGhpcy5fbWVudSwgdGhpcyApO1xuXHRcdHRoaXMub2ZmKCAnY2hhbmdlOnRpdGxlTW9kZScsIHRoaXMuX3RpdGxlLCB0aGlzICk7XG5cdFx0dGhpcy5vZmYoICdjaGFuZ2U6Y29udGVudCcsIHRoaXMuX2NvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9mZiggJ2NoYW5nZTp0b29sYmFyJywgdGhpcy5fdG9vbGJhciwgdGhpcyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfdGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZnJhbWUudGl0bGUucmVuZGVyKCB0aGlzLmdldCgndGl0bGVNb2RlJykgfHwgJ2RlZmF1bHQnICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdF9yZW5kZXJUaXRsZTogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmlldy4kZWwudGV4dCggdGhpcy5nZXQoJ3RpdGxlJykgfHwgJycgKTtcblx0fSxcblxuXHQvKipcblx0ICogQGFjY2VzcyBwcml2YXRlXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0X3JvdXRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJvdXRlciA9IHRoaXMuZnJhbWUucm91dGVyLFxuXHRcdFx0bW9kZSA9IHRoaXMuZ2V0KCdyb3V0ZXInKSxcblx0XHRcdHZpZXc7XG5cblx0XHR0aGlzLmZyYW1lLiRlbC50b2dnbGVDbGFzcyggJ2hpZGUtcm91dGVyJywgISBtb2RlICk7XG5cdFx0aWYgKCAhIG1vZGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5mcmFtZS5yb3V0ZXIucmVuZGVyKCBtb2RlICk7XG5cblx0XHR2aWV3ID0gcm91dGVyLmdldCgpO1xuXHRcdGlmICggdmlldyAmJiB2aWV3LnNlbGVjdCApIHtcblx0XHRcdHZpZXcuc2VsZWN0KCB0aGlzLmZyYW1lLmNvbnRlbnQubW9kZSgpICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRfbWVudTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lbnUgPSB0aGlzLmZyYW1lLm1lbnUsXG5cdFx0XHRtb2RlID0gdGhpcy5nZXQoJ21lbnUnKSxcblx0XHRcdHZpZXc7XG5cblx0XHR0aGlzLmZyYW1lLiRlbC50b2dnbGVDbGFzcyggJ2hpZGUtbWVudScsICEgbW9kZSApO1xuXHRcdGlmICggISBtb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG1lbnUubW9kZSggbW9kZSApO1xuXG5cdFx0dmlldyA9IG1lbnUuZ2V0KCk7XG5cdFx0aWYgKCB2aWV3ICYmIHZpZXcuc2VsZWN0ICkge1xuXHRcdFx0dmlldy5zZWxlY3QoIHRoaXMuaWQgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBhY2Nlc3MgcHJpdmF0ZVxuXHQgKiBAc2luY2UgMy41LjBcblx0ICovXG5cdF91cGRhdGVNZW51OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcHJldmlvdXMgPSB0aGlzLnByZXZpb3VzKCdtZW51JyksXG5cdFx0XHRtZW51ID0gdGhpcy5nZXQoJ21lbnUnKTtcblxuXHRcdGlmICggcHJldmlvdXMgKSB7XG5cdFx0XHR0aGlzLmZyYW1lLm9mZiggJ21lbnU6cmVuZGVyOicgKyBwcmV2aW91cywgdGhpcy5fcmVuZGVyTWVudSwgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggbWVudSApIHtcblx0XHRcdHRoaXMuZnJhbWUub24oICdtZW51OnJlbmRlcjonICsgbWVudSwgdGhpcy5fcmVuZGVyTWVudSwgdGhpcyApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgdmlldyBpbiB0aGUgbWVkaWEgbWVudSBmb3IgdGhlIHN0YXRlLlxuXHQgKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7bWVkaWEudmlldy5NZW51fSB2aWV3IFRoZSBtZW51IHZpZXcuXG5cdCAqL1xuXHRfcmVuZGVyTWVudTogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIG1lbnVJdGVtID0gdGhpcy5nZXQoJ21lbnVJdGVtJyksXG5cdFx0XHR0aXRsZSA9IHRoaXMuZ2V0KCd0aXRsZScpLFxuXHRcdFx0cHJpb3JpdHkgPSB0aGlzLmdldCgncHJpb3JpdHknKTtcblxuXHRcdGlmICggISBtZW51SXRlbSAmJiB0aXRsZSApIHtcblx0XHRcdG1lbnVJdGVtID0geyB0ZXh0OiB0aXRsZSB9O1xuXG5cdFx0XHRpZiAoIHByaW9yaXR5ICkge1xuXHRcdFx0XHRtZW51SXRlbS5wcmlvcml0eSA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggISBtZW51SXRlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2aWV3LnNldCggdGhpcy5pZCwgbWVudUl0ZW0gKTtcblx0fVxufSk7XG5cbl8uZWFjaChbJ3Rvb2xiYXInLCdjb250ZW50J10sIGZ1bmN0aW9uKCByZWdpb24gKSB7XG5cdC8qKlxuXHQgKiBAYWNjZXNzIHByaXZhdGVcblx0ICovXG5cdFN0YXRlLnByb3RvdHlwZVsgJ18nICsgcmVnaW9uIF0gPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgbW9kZSA9IHRoaXMuZ2V0KCByZWdpb24gKTtcblx0XHRpZiAoIG1vZGUgKSB7XG5cdFx0XHR0aGlzLmZyYW1lWyByZWdpb24gXS5yZW5kZXIoIG1vZGUgKTtcblx0XHR9XG5cdH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0ZTtcbiIsIi8qKlxuICogd3AubWVkaWEuc2VsZWN0aW9uU3luY1xuICpcbiAqIFN5bmMgYW4gYXR0YWNobWVudHMgc2VsZWN0aW9uIGluIGEgc3RhdGUgd2l0aCBhbm90aGVyIHN0YXRlLlxuICpcbiAqIEFsbG93cyBmb3Igc2VsZWN0aW5nIG11bHRpcGxlIGltYWdlcyBpbiB0aGUgSW5zZXJ0IE1lZGlhIHdvcmtmbG93LCBhbmQgdGhlblxuICogc3dpdGNoaW5nIHRvIHRoZSBJbnNlcnQgR2FsbGVyeSB3b3JrZmxvdyB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBhdHRhY2htZW50cyBzZWxlY3Rpb24uXG4gKlxuICogQG1peGluXG4gKi9cbnZhciBzZWxlY3Rpb25TeW5jID0ge1xuXHQvKipcblx0ICogQHNpbmNlIDMuNS4wXG5cdCAqL1xuXHRzeW5jU2VsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0bWFuYWdlciA9IHRoaXMuZnJhbWUuX3NlbGVjdGlvbjtcblxuXHRcdGlmICggISB0aGlzLmdldCgnc3luY1NlbGVjdGlvbicpIHx8ICEgbWFuYWdlciB8fCAhIHNlbGVjdGlvbiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgc2VsZWN0aW9uIHN1cHBvcnRzIG11bHRpcGxlIGl0ZW1zLCB2YWxpZGF0ZSB0aGUgc3RvcmVkXG5cdFx0Ly8gYXR0YWNobWVudHMgYmFzZWQgb24gdGhlIG5ldyBzZWxlY3Rpb24ncyBjb25kaXRpb25zLiBSZWNvcmRcblx0XHQvLyB0aGUgYXR0YWNobWVudHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkOyB3ZSdsbCBtYWludGFpbiBhXG5cdFx0Ly8gcmVmZXJlbmNlIHRvIHRob3NlLiBPdGhlciBhdHRhY2htZW50cyBhcmUgY29uc2lkZXJlZCBpbiBmbHV4LlxuXHRcdGlmICggc2VsZWN0aW9uLm11bHRpcGxlICkge1xuXHRcdFx0c2VsZWN0aW9uLnJlc2V0KCBbXSwgeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0XHRzZWxlY3Rpb24udmFsaWRhdGVBbGwoIG1hbmFnZXIuYXR0YWNobWVudHMgKTtcblx0XHRcdG1hbmFnZXIuZGlmZmVyZW5jZSA9IF8uZGlmZmVyZW5jZSggbWFuYWdlci5hdHRhY2htZW50cy5tb2RlbHMsIHNlbGVjdGlvbi5tb2RlbHMgKTtcblx0XHR9XG5cblx0XHQvLyBTeW5jIHRoZSBzZWxlY3Rpb24ncyBzaW5nbGUgaXRlbSB3aXRoIHRoZSBtYXN0ZXIuXG5cdFx0c2VsZWN0aW9uLnNpbmdsZSggbWFuYWdlci5zaW5nbGUgKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVjb3JkIHRoZSBjdXJyZW50bHkgYWN0aXZlIGF0dGFjaG1lbnRzLCB3aGljaCBpcyBhIGNvbWJpbmF0aW9uXG5cdCAqIG9mIHRoZSBzZWxlY3Rpb24ncyBhdHRhY2htZW50cyBhbmQgdGhlIHNldCBvZiBzZWxlY3RlZFxuXHQgKiBhdHRhY2htZW50cyB0aGF0IHRoaXMgc3BlY2lmaWMgc2VsZWN0aW9uIGNvbnNpZGVyZWQgaW52YWxpZC5cblx0ICogUmVzZXQgdGhlIGRpZmZlcmVuY2UgYW5kIHJlY29yZCB0aGUgc2luZ2xlIGF0dGFjaG1lbnQuXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjUuMFxuXHQgKi9cblx0cmVjb3JkU2VsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0bWFuYWdlciA9IHRoaXMuZnJhbWUuX3NlbGVjdGlvbjtcblxuXHRcdGlmICggISB0aGlzLmdldCgnc3luY1NlbGVjdGlvbicpIHx8ICEgbWFuYWdlciB8fCAhIHNlbGVjdGlvbiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdGlvbi5tdWx0aXBsZSApIHtcblx0XHRcdG1hbmFnZXIuYXR0YWNobWVudHMucmVzZXQoIHNlbGVjdGlvbi50b0FycmF5KCkuY29uY2F0KCBtYW5hZ2VyLmRpZmZlcmVuY2UgKSApO1xuXHRcdFx0bWFuYWdlci5kaWZmZXJlbmNlID0gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hbmFnZXIuYXR0YWNobWVudHMuYWRkKCBzZWxlY3Rpb24udG9BcnJheSgpICk7XG5cdFx0fVxuXG5cdFx0bWFuYWdlci5zaW5nbGUgPSBzZWxlY3Rpb24uX3NpbmdsZTtcblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZWxlY3Rpb25TeW5jO1xuIiwidmFyIG1lZGlhID0gd3AubWVkaWEsXG5cdCQgPSBqUXVlcnksXG5cdGwxMG47XG5cbm1lZGlhLmlzVG91Y2hEZXZpY2UgPSAoICdvbnRvdWNoZW5kJyBpbiBkb2N1bWVudCApO1xuXG4vLyBMaW5rIGFueSBsb2NhbGl6ZWQgc3RyaW5ncy5cbmwxMG4gPSBtZWRpYS52aWV3LmwxMG4gPSB3aW5kb3cuX3dwTWVkaWFWaWV3c0wxMG4gfHwge307XG5cbi8vIExpbmsgYW55IHNldHRpbmdzLlxubWVkaWEudmlldy5zZXR0aW5ncyA9IGwxMG4uc2V0dGluZ3MgfHwge307XG5kZWxldGUgbDEwbi5zZXR0aW5ncztcblxuLy8gQ29weSB0aGUgYHBvc3RgIHNldHRpbmcgb3ZlciB0byB0aGUgbW9kZWwgc2V0dGluZ3MuXG5tZWRpYS5tb2RlbC5zZXR0aW5ncy5wb3N0ID0gbWVkaWEudmlldy5zZXR0aW5ncy5wb3N0O1xuXG4vLyBDaGVjayBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBDU1MgMy4wIHRyYW5zaXRpb25zXG4kLnN1cHBvcnQudHJhbnNpdGlvbiA9IChmdW5jdGlvbigpe1xuXHR2YXIgc3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsXG5cdFx0dHJhbnNpdGlvbnMgPSB7XG5cdFx0XHRXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG5cdFx0XHRNb3pUcmFuc2l0aW9uOiAgICAndHJhbnNpdGlvbmVuZCcsXG5cdFx0XHRPVHJhbnNpdGlvbjogICAgICAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxuXHRcdFx0dHJhbnNpdGlvbjogICAgICAgJ3RyYW5zaXRpb25lbmQnXG5cdFx0fSwgdHJhbnNpdGlvbjtcblxuXHR0cmFuc2l0aW9uID0gXy5maW5kKCBfLmtleXMoIHRyYW5zaXRpb25zICksIGZ1bmN0aW9uKCB0cmFuc2l0aW9uICkge1xuXHRcdHJldHVybiAhIF8uaXNVbmRlZmluZWQoIHN0eWxlWyB0cmFuc2l0aW9uIF0gKTtcblx0fSk7XG5cblx0cmV0dXJuIHRyYW5zaXRpb24gJiYge1xuXHRcdGVuZDogdHJhbnNpdGlvbnNbIHRyYW5zaXRpb24gXVxuXHR9O1xufSgpKTtcblxuLyoqXG4gKiBBIHNoYXJlZCBldmVudCBidXMgdXNlZCB0byBwcm92aWRlIGV2ZW50cyBpbnRvXG4gKiB0aGUgbWVkaWEgd29ya2Zsb3dzIHRoYXQgM3JkLXBhcnR5IGRldnMgY2FuIHVzZSB0byBob29rXG4gKiBpbi5cbiAqL1xubWVkaWEuZXZlbnRzID0gXy5leHRlbmQoIHt9LCBCYWNrYm9uZS5FdmVudHMgKTtcblxuLyoqXG4gKiBNYWtlcyBpdCBlYXNpZXIgdG8gYmluZCBldmVudHMgdXNpbmcgdHJhbnNpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gc2Vuc2l0aXZpdHlcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5tZWRpYS50cmFuc2l0aW9uID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBzZW5zaXRpdml0eSApIHtcblx0dmFyIGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG5cdHNlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHkgfHwgMjAwMDtcblxuXHRpZiAoICQuc3VwcG9ydC50cmFuc2l0aW9uICkge1xuXHRcdGlmICggISAoc2VsZWN0b3IgaW5zdGFuY2VvZiAkKSApIHtcblx0XHRcdHNlbGVjdG9yID0gJCggc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBSZXNvbHZlIHRoZSBkZWZlcnJlZCB3aGVuIHRoZSBmaXJzdCBlbGVtZW50IGZpbmlzaGVzIGFuaW1hdGluZy5cblx0XHRzZWxlY3Rvci5maXJzdCgpLm9uZSggJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBkZWZlcnJlZC5yZXNvbHZlICk7XG5cblx0XHQvLyBKdXN0IGluIGNhc2UgdGhlIGV2ZW50IGRvZXNuJ3QgdHJpZ2dlciwgZmlyZSBhIGNhbGxiYWNrLlxuXHRcdF8uZGVsYXkoIGRlZmVycmVkLnJlc29sdmUsIHNlbnNpdGl2aXR5ICk7XG5cblx0Ly8gT3RoZXJ3aXNlLCBleGVjdXRlIG9uIHRoZSBzcG90LlxuXHR9IGVsc2Uge1xuXHRcdGRlZmVycmVkLnJlc29sdmUoKTtcblx0fVxuXG5cdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG59O1xuXG5tZWRpYS5jb250cm9sbGVyLlJlZ2lvbiA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL3JlZ2lvbi5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvc3RhdGUtbWFjaGluZS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9zdGF0ZS5qcycgKTtcblxubWVkaWEuc2VsZWN0aW9uU3luYyA9IHJlcXVpcmUoICcuL3V0aWxzL3NlbGVjdGlvbi1zeW5jLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5ID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvbGlicmFyeS5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuSW1hZ2VEZXRhaWxzID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvaW1hZ2UtZGV0YWlscy5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuR2FsbGVyeUVkaXQgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9nYWxsZXJ5LWVkaXQuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkdhbGxlcnlBZGQgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9nYWxsZXJ5LWFkZC5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuQ29sbGVjdGlvbkVkaXQgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9jb2xsZWN0aW9uLWVkaXQuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25BZGQgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9jb2xsZWN0aW9uLWFkZC5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuRmVhdHVyZWRJbWFnZSA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2ZlYXR1cmVkLWltYWdlLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5SZXBsYWNlSW1hZ2UgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9yZXBsYWNlLWltYWdlLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2UgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9lZGl0LWltYWdlLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5NZWRpYUxpYnJhcnkgPSByZXF1aXJlKCAnLi9jb250cm9sbGVycy9tZWRpYS1saWJyYXJ5LmpzJyApO1xubWVkaWEuY29udHJvbGxlci5FbWJlZCA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL2VtYmVkLmpzJyApO1xubWVkaWEuY29udHJvbGxlci5Dcm9wcGVyID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvY3JvcHBlci5qcycgKTtcbm1lZGlhLmNvbnRyb2xsZXIuQ3VzdG9taXplSW1hZ2VDcm9wcGVyID0gcmVxdWlyZSggJy4vY29udHJvbGxlcnMvY3VzdG9taXplLWltYWdlLWNyb3BwZXIuanMnICk7XG5tZWRpYS5jb250cm9sbGVyLlNpdGVJY29uQ3JvcHBlciA9IHJlcXVpcmUoICcuL2NvbnRyb2xsZXJzL3NpdGUtaWNvbi1jcm9wcGVyLmpzJyApO1xuXG5tZWRpYS5WaWV3ID0gcmVxdWlyZSggJy4vdmlld3Mvdmlldy5qcycgKTtcbm1lZGlhLnZpZXcuRnJhbWUgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZSA9IHJlcXVpcmUoICcuL3ZpZXdzL21lZGlhLWZyYW1lLmpzJyApO1xubWVkaWEudmlldy5NZWRpYUZyYW1lLlNlbGVjdCA9IHJlcXVpcmUoICcuL3ZpZXdzL2ZyYW1lL3NlbGVjdC5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5Qb3N0ID0gcmVxdWlyZSggJy4vdmlld3MvZnJhbWUvcG9zdC5qcycgKTtcbm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5JbWFnZURldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9mcmFtZS9pbWFnZS1kZXRhaWxzLmpzJyApO1xubWVkaWEudmlldy5Nb2RhbCA9IHJlcXVpcmUoICcuL3ZpZXdzL21vZGFsLmpzJyApO1xubWVkaWEudmlldy5Gb2N1c01hbmFnZXIgPSByZXF1aXJlKCAnLi92aWV3cy9mb2N1cy1tYW5hZ2VyLmpzJyApO1xubWVkaWEudmlldy5VcGxvYWRlcldpbmRvdyA9IHJlcXVpcmUoICcuL3ZpZXdzL3VwbG9hZGVyL3dpbmRvdy5qcycgKTtcbm1lZGlhLnZpZXcuRWRpdG9yVXBsb2FkZXIgPSByZXF1aXJlKCAnLi92aWV3cy91cGxvYWRlci9lZGl0b3IuanMnICk7XG5tZWRpYS52aWV3LlVwbG9hZGVySW5saW5lID0gcmVxdWlyZSggJy4vdmlld3MvdXBsb2FkZXIvaW5saW5lLmpzJyApO1xubWVkaWEudmlldy5VcGxvYWRlclN0YXR1cyA9IHJlcXVpcmUoICcuL3ZpZXdzL3VwbG9hZGVyL3N0YXR1cy5qcycgKTtcbm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNFcnJvciA9IHJlcXVpcmUoICcuL3ZpZXdzL3VwbG9hZGVyL3N0YXR1cy1lcnJvci5qcycgKTtcbm1lZGlhLnZpZXcuVG9vbGJhciA9IHJlcXVpcmUoICcuL3ZpZXdzL3Rvb2xiYXIuanMnICk7XG5tZWRpYS52aWV3LlRvb2xiYXIuU2VsZWN0ID0gcmVxdWlyZSggJy4vdmlld3MvdG9vbGJhci9zZWxlY3QuanMnICk7XG5tZWRpYS52aWV3LlRvb2xiYXIuRW1iZWQgPSByZXF1aXJlKCAnLi92aWV3cy90b29sYmFyL2VtYmVkLmpzJyApO1xubWVkaWEudmlldy5CdXR0b24gPSByZXF1aXJlKCAnLi92aWV3cy9idXR0b24uanMnICk7XG5tZWRpYS52aWV3LkJ1dHRvbkdyb3VwID0gcmVxdWlyZSggJy4vdmlld3MvYnV0dG9uLWdyb3VwLmpzJyApO1xubWVkaWEudmlldy5Qcmlvcml0eUxpc3QgPSByZXF1aXJlKCAnLi92aWV3cy9wcmlvcml0eS1saXN0LmpzJyApO1xubWVkaWEudmlldy5NZW51SXRlbSA9IHJlcXVpcmUoICcuL3ZpZXdzL21lbnUtaXRlbS5qcycgKTtcbm1lZGlhLnZpZXcuTWVudSA9IHJlcXVpcmUoICcuL3ZpZXdzL21lbnUuanMnICk7XG5tZWRpYS52aWV3LlJvdXRlckl0ZW0gPSByZXF1aXJlKCAnLi92aWV3cy9yb3V0ZXItaXRlbS5qcycgKTtcbm1lZGlhLnZpZXcuUm91dGVyID0gcmVxdWlyZSggJy4vdmlld3Mvcm91dGVyLmpzJyApO1xubWVkaWEudmlldy5TaWRlYmFyID0gcmVxdWlyZSggJy4vdmlld3Mvc2lkZWJhci5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudCA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQuanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnQuTGlicmFyeSA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQvbGlicmFyeS5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0TGlicmFyeSA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnQvZWRpdC1saWJyYXJ5LmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50cyA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnRzLmpzJyApO1xubWVkaWEudmlldy5TZWFyY2ggPSByZXF1aXJlKCAnLi92aWV3cy9zZWFyY2guanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC1maWx0ZXJzLmpzJyApO1xubWVkaWEudmlldy5EYXRlRmlsdGVyID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC1maWx0ZXJzL2RhdGUuanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLlVwbG9hZGVkID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC1maWx0ZXJzL3VwbG9hZGVkLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVycy5BbGwgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50LWZpbHRlcnMvYWxsLmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXIgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50cy9icm93c2VyLmpzJyApO1xubWVkaWEudmlldy5TZWxlY3Rpb24gPSByZXF1aXJlKCAnLi92aWV3cy9zZWxlY3Rpb24uanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnQuU2VsZWN0aW9uID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC9zZWxlY3Rpb24uanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLlNlbGVjdGlvbiA9IHJlcXVpcmUoICcuL3ZpZXdzL2F0dGFjaG1lbnRzL3NlbGVjdGlvbi5qcycgKTtcbm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0U2VsZWN0aW9uID0gcmVxdWlyZSggJy4vdmlld3MvYXR0YWNobWVudC9lZGl0LXNlbGVjdGlvbi5qcycgKTtcbm1lZGlhLnZpZXcuU2V0dGluZ3MgPSByZXF1aXJlKCAnLi92aWV3cy9zZXR0aW5ncy5qcycgKTtcbm1lZGlhLnZpZXcuU2V0dGluZ3MuQXR0YWNobWVudERpc3BsYXkgPSByZXF1aXJlKCAnLi92aWV3cy9zZXR0aW5ncy9hdHRhY2htZW50LWRpc3BsYXkuanMnICk7XG5tZWRpYS52aWV3LlNldHRpbmdzLkdhbGxlcnkgPSByZXF1aXJlKCAnLi92aWV3cy9zZXR0aW5ncy9nYWxsZXJ5LmpzJyApO1xubWVkaWEudmlldy5TZXR0aW5ncy5QbGF5bGlzdCA9IHJlcXVpcmUoICcuL3ZpZXdzL3NldHRpbmdzL3BsYXlsaXN0LmpzJyApO1xubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50L2RldGFpbHMuanMnICk7XG5tZWRpYS52aWV3LkF0dGFjaG1lbnRDb21wYXQgPSByZXF1aXJlKCAnLi92aWV3cy9hdHRhY2htZW50LWNvbXBhdC5qcycgKTtcbm1lZGlhLnZpZXcuSWZyYW1lID0gcmVxdWlyZSggJy4vdmlld3MvaWZyYW1lLmpzJyApO1xubWVkaWEudmlldy5FbWJlZCA9IHJlcXVpcmUoICcuL3ZpZXdzL2VtYmVkLmpzJyApO1xubWVkaWEudmlldy5MYWJlbCA9IHJlcXVpcmUoICcuL3ZpZXdzL2xhYmVsLmpzJyApO1xubWVkaWEudmlldy5FbWJlZFVybCA9IHJlcXVpcmUoICcuL3ZpZXdzL2VtYmVkL3VybC5qcycgKTtcbm1lZGlhLnZpZXcuRW1iZWRMaW5rID0gcmVxdWlyZSggJy4vdmlld3MvZW1iZWQvbGluay5qcycgKTtcbm1lZGlhLnZpZXcuRW1iZWRJbWFnZSA9IHJlcXVpcmUoICcuL3ZpZXdzL2VtYmVkL2ltYWdlLmpzJyApO1xubWVkaWEudmlldy5JbWFnZURldGFpbHMgPSByZXF1aXJlKCAnLi92aWV3cy9pbWFnZS1kZXRhaWxzLmpzJyApO1xubWVkaWEudmlldy5Dcm9wcGVyID0gcmVxdWlyZSggJy4vdmlld3MvY3JvcHBlci5qcycgKTtcbm1lZGlhLnZpZXcuU2l0ZUljb25Dcm9wcGVyID0gcmVxdWlyZSggJy4vdmlld3Mvc2l0ZS1pY29uLWNyb3BwZXIuanMnICk7XG5tZWRpYS52aWV3LlNpdGVJY29uUHJldmlldyA9IHJlcXVpcmUoICcuL3ZpZXdzL3NpdGUtaWNvbi1wcmV2aWV3LmpzJyApO1xubWVkaWEudmlldy5FZGl0SW1hZ2UgPSByZXF1aXJlKCAnLi92aWV3cy9lZGl0LWltYWdlLmpzJyApO1xubWVkaWEudmlldy5TcGlubmVyID0gcmVxdWlyZSggJy4vdmlld3Mvc3Bpbm5lci5qcycgKTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50Q29tcGF0XG4gKlxuICogQSB2aWV3IHRvIGRpc3BsYXkgZmllbGRzIGFkZGVkIHZpYSB0aGUgYGF0dGFjaG1lbnRfZmllbGRzX3RvX2VkaXRgIGZpbHRlci5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHRBdHRhY2htZW50Q29tcGF0O1xuXG5BdHRhY2htZW50Q29tcGF0ID0gVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdmb3JtJyxcblx0Y2xhc3NOYW1lOiAnY29tcGF0LWl0ZW0nLFxuXG5cdGV2ZW50czoge1xuXHRcdCdzdWJtaXQnOiAgICAgICAgICAncHJldmVudERlZmF1bHQnLFxuXHRcdCdjaGFuZ2UgaW5wdXQnOiAgICAnc2F2ZScsXG5cdFx0J2NoYW5nZSBzZWxlY3QnOiAgICdzYXZlJyxcblx0XHQnY2hhbmdlIHRleHRhcmVhJzogJ3NhdmUnXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTpjb21wYXQnLCB0aGlzLnJlbmRlciApO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuQXR0YWNobWVudENvbXBhdH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy4kKCc6Zm9jdXMnKS5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLnNhdmUoKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAnZGlzcG9zZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdHJldHVybiBWaWV3LnByb3RvdHlwZS5kaXNwb3NlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRDb21wYXR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjb21wYXQgPSB0aGlzLm1vZGVsLmdldCgnY29tcGF0Jyk7XG5cdFx0aWYgKCAhIGNvbXBhdCB8fCAhIGNvbXBhdC5pdGVtICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudmlld3MuZGV0YWNoKCk7XG5cdFx0dGhpcy4kZWwuaHRtbCggY29tcGF0Lml0ZW0gKTtcblx0XHR0aGlzLnZpZXdzLnJlbmRlcigpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdHNhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgZGF0YSA9IHt9O1xuXG5cdFx0aWYgKCBldmVudCApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXG5cdFx0Xy5lYWNoKCB0aGlzLiRlbC5zZXJpYWxpemVBcnJheSgpLCBmdW5jdGlvbiggcGFpciApIHtcblx0XHRcdGRhdGFbIHBhaXIubmFtZSBdID0gcGFpci52YWx1ZTtcblx0XHR9KTtcblxuXHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnYXR0YWNobWVudDpjb21wYXQ6d2FpdGluZycsIFsnd2FpdGluZyddICk7XG5cdFx0dGhpcy5tb2RlbC5zYXZlQ29tcGF0KCBkYXRhICkuYWx3YXlzKCBfLmJpbmQoIHRoaXMucG9zdFNhdmUsIHRoaXMgKSApO1xuXHR9LFxuXG5cdHBvc3RTYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2F0dGFjaG1lbnQ6Y29tcGF0OnJlYWR5JywgWydyZWFkeSddICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dGFjaG1lbnRDb21wYXQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyICQgPSBqUXVlcnksXG5cdEF0dGFjaG1lbnRGaWx0ZXJzO1xuXG5BdHRhY2htZW50RmlsdGVycyA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnc2VsZWN0Jyxcblx0Y2xhc3NOYW1lOiAnYXR0YWNobWVudC1maWx0ZXJzJyxcblx0aWQ6ICAgICAgICAnbWVkaWEtYXR0YWNobWVudC1maWx0ZXJzJyxcblxuXHRldmVudHM6IHtcblx0XHRjaGFuZ2U6ICdjaGFuZ2UnXG5cdH0sXG5cblx0a2V5czogW10sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jcmVhdGVGaWx0ZXJzKCk7XG5cdFx0Xy5leHRlbmQoIHRoaXMuZmlsdGVycywgdGhpcy5vcHRpb25zLmZpbHRlcnMgKTtcblxuXHRcdC8vIEJ1aWxkIGA8b3B0aW9uPmAgZWxlbWVudHMuXG5cdFx0dGhpcy4kZWwuaHRtbCggXy5jaGFpbiggdGhpcy5maWx0ZXJzICkubWFwKCBmdW5jdGlvbiggZmlsdGVyLCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGVsOiAkKCAnPG9wdGlvbj48L29wdGlvbj4nICkudmFsKCB2YWx1ZSApLmh0bWwoIGZpbHRlci50ZXh0IClbMF0sXG5cdFx0XHRcdHByaW9yaXR5OiBmaWx0ZXIucHJpb3JpdHkgfHwgNTBcblx0XHRcdH07XG5cdFx0fSwgdGhpcyApLnNvcnRCeSgncHJpb3JpdHknKS5wbHVjaygnZWwnKS52YWx1ZSgpICk7XG5cblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlJywgdGhpcy5zZWxlY3QgKTtcblx0XHR0aGlzLnNlbGVjdCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAYWJzdHJhY3Rcblx0ICovXG5cdGNyZWF0ZUZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZmlsdGVycyA9IHt9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSBzZWxlY3RlZCBmaWx0ZXIgY2hhbmdlcywgdXBkYXRlIHRoZSBBdHRhY2htZW50IFF1ZXJ5IHByb3BlcnRpZXMgdG8gbWF0Y2guXG5cdCAqL1xuXHRjaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmaWx0ZXIgPSB0aGlzLmZpbHRlcnNbIHRoaXMuZWwudmFsdWUgXTtcblx0XHRpZiAoIGZpbHRlciApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCBmaWx0ZXIucHJvcHMgKTtcblx0XHR9XG5cdH0sXG5cblx0c2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLFxuXHRcdFx0dmFsdWUgPSAnYWxsJyxcblx0XHRcdHByb3BzID0gbW9kZWwudG9KU09OKCk7XG5cblx0XHRfLmZpbmQoIHRoaXMuZmlsdGVycywgZnVuY3Rpb24oIGZpbHRlciwgaWQgKSB7XG5cdFx0XHR2YXIgZXF1YWwgPSBfLmFsbCggZmlsdGVyLnByb3BzLCBmdW5jdGlvbiggcHJvcCwga2V5ICkge1xuXHRcdFx0XHRyZXR1cm4gcHJvcCA9PT0gKCBfLmlzVW5kZWZpbmVkKCBwcm9wc1sga2V5IF0gKSA/IG51bGwgOiBwcm9wc1sga2V5IF0gKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoIGVxdWFsICkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPSBpZDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuJGVsLnZhbCggdmFsdWUgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0YWNobWVudEZpbHRlcnM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnMuQWxsXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVyc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0QWxsO1xuXG5BbGwgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLmV4dGVuZCh7XG5cdGNyZWF0ZUZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmaWx0ZXJzID0ge307XG5cblx0XHRfLmVhY2goIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubWltZVR5cGVzIHx8IHt9LCBmdW5jdGlvbiggdGV4dCwga2V5ICkge1xuXHRcdFx0ZmlsdGVyc1sga2V5IF0gPSB7XG5cdFx0XHRcdHRleHQ6IHRleHQsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0c3RhdHVzOiAgbnVsbCxcblx0XHRcdFx0XHR0eXBlOiAgICBrZXksXG5cdFx0XHRcdFx0dXBsb2FkZWRUbzogbnVsbCxcblx0XHRcdFx0XHRvcmRlcmJ5OiAnZGF0ZScsXG5cdFx0XHRcdFx0b3JkZXI6ICAgJ0RFU0MnXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRmaWx0ZXJzLmFsbCA9IHtcblx0XHRcdHRleHQ6ICBsMTBuLmFsbE1lZGlhSXRlbXMsXG5cdFx0XHRwcm9wczoge1xuXHRcdFx0XHRzdGF0dXM6ICBudWxsLFxuXHRcdFx0XHR0eXBlOiAgICBudWxsLFxuXHRcdFx0XHR1cGxvYWRlZFRvOiBudWxsLFxuXHRcdFx0XHRvcmRlcmJ5OiAnZGF0ZScsXG5cdFx0XHRcdG9yZGVyOiAgICdERVNDJ1xuXHRcdFx0fSxcblx0XHRcdHByaW9yaXR5OiAxMFxuXHRcdH07XG5cblx0XHRpZiAoIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MucG9zdC5pZCApIHtcblx0XHRcdGZpbHRlcnMudXBsb2FkZWQgPSB7XG5cdFx0XHRcdHRleHQ6ICBsMTBuLnVwbG9hZGVkVG9UaGlzUG9zdCxcblx0XHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0XHRzdGF0dXM6ICBudWxsLFxuXHRcdFx0XHRcdHR5cGU6ICAgIG51bGwsXG5cdFx0XHRcdFx0dXBsb2FkZWRUbzogd3AubWVkaWEudmlldy5zZXR0aW5ncy5wb3N0LmlkLFxuXHRcdFx0XHRcdG9yZGVyYnk6ICdtZW51T3JkZXInLFxuXHRcdFx0XHRcdG9yZGVyOiAgICdBU0MnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByaW9yaXR5OiAyMFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRmaWx0ZXJzLnVuYXR0YWNoZWQgPSB7XG5cdFx0XHR0ZXh0OiAgbDEwbi51bmF0dGFjaGVkLFxuXHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0c3RhdHVzOiAgICAgbnVsbCxcblx0XHRcdFx0dXBsb2FkZWRUbzogMCxcblx0XHRcdFx0dHlwZTogICAgICAgbnVsbCxcblx0XHRcdFx0b3JkZXJieTogICAgJ21lbnVPcmRlcicsXG5cdFx0XHRcdG9yZGVyOiAgICAgICdBU0MnXG5cdFx0XHR9LFxuXHRcdFx0cHJpb3JpdHk6IDUwXG5cdFx0fTtcblxuXHRcdGlmICggd3AubWVkaWEudmlldy5zZXR0aW5ncy5tZWRpYVRyYXNoICYmXG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnZ3JpZCcgKSApIHtcblxuXHRcdFx0ZmlsdGVycy50cmFzaCA9IHtcblx0XHRcdFx0dGV4dDogIGwxMG4udHJhc2gsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0dXBsb2FkZWRUbzogbnVsbCxcblx0XHRcdFx0XHRzdGF0dXM6ICAgICAndHJhc2gnLFxuXHRcdFx0XHRcdHR5cGU6ICAgICAgIG51bGwsXG5cdFx0XHRcdFx0b3JkZXJieTogICAgJ2RhdGUnLFxuXHRcdFx0XHRcdG9yZGVyOiAgICAgICdERVNDJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogNTBcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXJzID0gZmlsdGVycztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQWxsO1xuIiwiLyoqXG4gKiBBIGZpbHRlciBkcm9wZG93biBmb3IgbW9udGgvZGF0ZXMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVyc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0RGF0ZUZpbHRlcjtcblxuRGF0ZUZpbHRlciA9IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnMuZXh0ZW5kKHtcblx0aWQ6ICdtZWRpYS1hdHRhY2htZW50LWRhdGUtZmlsdGVycycsXG5cblx0Y3JlYXRlRmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbHRlcnMgPSB7fTtcblx0XHRfLmVhY2goIHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MubW9udGhzIHx8IHt9LCBmdW5jdGlvbiggdmFsdWUsIGluZGV4ICkge1xuXHRcdFx0ZmlsdGVyc1sgaW5kZXggXSA9IHtcblx0XHRcdFx0dGV4dDogdmFsdWUudGV4dCxcblx0XHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0XHR5ZWFyOiB2YWx1ZS55ZWFyLFxuXHRcdFx0XHRcdG1vbnRobnVtOiB2YWx1ZS5tb250aFxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGZpbHRlcnMuYWxsID0ge1xuXHRcdFx0dGV4dDogIGwxMG4uYWxsRGF0ZXMsXG5cdFx0XHRwcm9wczoge1xuXHRcdFx0XHRtb250aG51bTogZmFsc2UsXG5cdFx0XHRcdHllYXI6ICBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHByaW9yaXR5OiAxMFxuXHRcdH07XG5cdFx0dGhpcy5maWx0ZXJzID0gZmlsdGVycztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0ZUZpbHRlcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50RmlsdGVycy5VcGxvYWRlZFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFVwbG9hZGVkO1xuXG5VcGxvYWRlZCA9IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudEZpbHRlcnMuZXh0ZW5kKHtcblx0Y3JlYXRlRmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHR5cGUgPSB0aGlzLm1vZGVsLmdldCgndHlwZScpLFxuXHRcdFx0dHlwZXMgPSB3cC5tZWRpYS52aWV3LnNldHRpbmdzLm1pbWVUeXBlcyxcblx0XHRcdHRleHQ7XG5cblx0XHRpZiAoIHR5cGVzICYmIHR5cGUgKSB7XG5cdFx0XHR0ZXh0ID0gdHlwZXNbIHR5cGUgXTtcblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlcnMgPSB7XG5cdFx0XHRhbGw6IHtcblx0XHRcdFx0dGV4dDogIHRleHQgfHwgbDEwbi5hbGxNZWRpYUl0ZW1zLFxuXHRcdFx0XHRwcm9wczoge1xuXHRcdFx0XHRcdHVwbG9hZGVkVG86IG51bGwsXG5cdFx0XHRcdFx0b3JkZXJieTogJ2RhdGUnLFxuXHRcdFx0XHRcdG9yZGVyOiAgICdERVNDJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogMTBcblx0XHRcdH0sXG5cblx0XHRcdHVwbG9hZGVkOiB7XG5cdFx0XHRcdHRleHQ6ICBsMTBuLnVwbG9hZGVkVG9UaGlzUG9zdCxcblx0XHRcdFx0cHJvcHM6IHtcblx0XHRcdFx0XHR1cGxvYWRlZFRvOiB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnBvc3QuaWQsXG5cdFx0XHRcdFx0b3JkZXJieTogJ21lbnVPcmRlcicsXG5cdFx0XHRcdFx0b3JkZXI6ICAgJ0FTQydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6IDIwXG5cdFx0XHR9LFxuXG5cdFx0XHR1bmF0dGFjaGVkOiB7XG5cdFx0XHRcdHRleHQ6ICBsMTBuLnVuYXR0YWNoZWQsXG5cdFx0XHRcdHByb3BzOiB7XG5cdFx0XHRcdFx0dXBsb2FkZWRUbzogMCxcblx0XHRcdFx0XHRvcmRlcmJ5OiAnbWVudU9yZGVyJyxcblx0XHRcdFx0XHRvcmRlcjogICAnQVNDJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogNTBcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBVcGxvYWRlZDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0JCA9IGpRdWVyeSxcblx0QXR0YWNobWVudDtcblxuQXR0YWNobWVudCA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnbGknLFxuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50Jyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnYXR0YWNobWVudCcpLFxuXG5cdGF0dHJpYnV0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHQndGFiSW5kZXgnOiAgICAgMCxcblx0XHRcdCdyb2xlJzogICAgICAgICAnY2hlY2tib3gnLFxuXHRcdFx0J2FyaWEtbGFiZWwnOiAgIHRoaXMubW9kZWwuZ2V0KCAndGl0bGUnICksXG5cdFx0XHQnYXJpYS1jaGVja2VkJzogZmFsc2UsXG5cdFx0XHQnZGF0YS1pZCc6ICAgICAgdGhpcy5tb2RlbC5nZXQoICdpZCcgKVxuXHRcdH07XG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrIC5qcy0tc2VsZWN0LWF0dGFjaG1lbnQnOiAgICd0b2dnbGVTZWxlY3Rpb25IYW5kbGVyJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddJzogICAgICAgICAgJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjaGFuZ2UgW2RhdGEtc2V0dGluZ10gaW5wdXQnOiAgICAndXBkYXRlU2V0dGluZycsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSBzZWxlY3QnOiAgICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddIHRleHRhcmVhJzogJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjbGljayAuYXR0YWNobWVudC1jbG9zZSc6ICAgICAgICAncmVtb3ZlRnJvbUxpYnJhcnknLFxuXHRcdCdjbGljayAuY2hlY2snOiAgICAgICAgICAgICAgICAgICAnY2hlY2tDbGlja0hhbmRsZXInLFxuXHRcdCdrZXlkb3duJzogICAgICAgICAgICAgICAgICAgICAgICAndG9nZ2xlU2VsZWN0aW9uSGFuZGxlcidcblx0fSxcblxuXHRidXR0b25zOiB7fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbixcblx0XHRcdG9wdGlvbnMgPSBfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdFx0cmVyZW5kZXJPbk1vZGVsQ2hhbmdlOiB0cnVlXG5cdFx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMucmVyZW5kZXJPbk1vZGVsQ2hhbmdlICkge1xuXHRcdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZScsIHRoaXMucmVuZGVyICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6cGVyY2VudCcsIHRoaXMucHJvZ3Jlc3MgKTtcblx0XHR9XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTp0aXRsZScsIHRoaXMuX3N5bmNUaXRsZSApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6Y2FwdGlvbicsIHRoaXMuX3N5bmNDYXB0aW9uICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTphcnRpc3QnLCB0aGlzLl9zeW5jQXJ0aXN0ICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTphbGJ1bScsIHRoaXMuX3N5bmNBbGJ1bSApO1xuXG5cdFx0Ly8gVXBkYXRlIHRoZSBzZWxlY3Rpb24uXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2FkZCcsIHRoaXMuc2VsZWN0ICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ3JlbW92ZScsIHRoaXMuZGVzZWxlY3QgKTtcblx0XHRpZiAoIHNlbGVjdGlvbiApIHtcblx0XHRcdHNlbGVjdGlvbi5vbiggJ3Jlc2V0JywgdGhpcy51cGRhdGVTZWxlY3QsIHRoaXMgKTtcblx0XHRcdC8vIFVwZGF0ZSB0aGUgbW9kZWwncyBkZXRhaWxzIHZpZXcuXG5cdFx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnc2VsZWN0aW9uOnNpbmdsZSBzZWxlY3Rpb246dW5zaW5nbGUnLCB0aGlzLmRldGFpbHMgKTtcblx0XHRcdHRoaXMuZGV0YWlscyggdGhpcy5tb2RlbCwgdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdzZWxlY3Rpb24nKSApO1xuXHRcdH1cblxuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMuY29udHJvbGxlciwgJ2F0dGFjaG1lbnQ6Y29tcGF0OndhaXRpbmcgYXR0YWNobWVudDpjb21wYXQ6cmVhZHknLCB0aGlzLnVwZGF0ZVNhdmUgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbjtcblxuXHRcdC8vIE1ha2Ugc3VyZSBhbGwgc2V0dGluZ3MgYXJlIHNhdmVkIGJlZm9yZSByZW1vdmluZyB0aGUgdmlldy5cblx0XHR0aGlzLnVwZGF0ZUFsbCgpO1xuXG5cdFx0aWYgKCBzZWxlY3Rpb24gKSB7XG5cdFx0XHRzZWxlY3Rpb24ub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2Rpc3Bvc2UnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRWaWV3LnByb3RvdHlwZS5kaXNwb3NlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gXy5kZWZhdWx0cyggdGhpcy5tb2RlbC50b0pTT04oKSwge1xuXHRcdFx0XHRvcmllbnRhdGlvbjogICAnbGFuZHNjYXBlJyxcblx0XHRcdFx0dXBsb2FkaW5nOiAgICAgZmFsc2UsXG5cdFx0XHRcdHR5cGU6ICAgICAgICAgICcnLFxuXHRcdFx0XHRzdWJ0eXBlOiAgICAgICAnJyxcblx0XHRcdFx0aWNvbjogICAgICAgICAgJycsXG5cdFx0XHRcdGZpbGVuYW1lOiAgICAgICcnLFxuXHRcdFx0XHRjYXB0aW9uOiAgICAgICAnJyxcblx0XHRcdFx0dGl0bGU6ICAgICAgICAgJycsXG5cdFx0XHRcdGRhdGVGb3JtYXR0ZWQ6ICcnLFxuXHRcdFx0XHR3aWR0aDogICAgICAgICAnJyxcblx0XHRcdFx0aGVpZ2h0OiAgICAgICAgJycsXG5cdFx0XHRcdGNvbXBhdDogICAgICAgIGZhbHNlLFxuXHRcdFx0XHRhbHQ6ICAgICAgICAgICAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICAgJydcblx0XHRcdH0sIHRoaXMub3B0aW9ucyApO1xuXG5cdFx0b3B0aW9ucy5idXR0b25zICA9IHRoaXMuYnV0dG9ucztcblx0XHRvcHRpb25zLmRlc2NyaWJlID0gdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdkZXNjcmliZScpO1xuXG5cdFx0aWYgKCAnaW1hZ2UnID09PSBvcHRpb25zLnR5cGUgKSB7XG5cdFx0XHRvcHRpb25zLnNpemUgPSB0aGlzLmltYWdlU2l6ZSgpO1xuXHRcdH1cblxuXHRcdG9wdGlvbnMuY2FuID0ge307XG5cdFx0aWYgKCBvcHRpb25zLm5vbmNlcyApIHtcblx0XHRcdG9wdGlvbnMuY2FuLnJlbW92ZSA9ICEhIG9wdGlvbnMubm9uY2VzWydkZWxldGUnXTtcblx0XHRcdG9wdGlvbnMuY2FuLnNhdmUgPSAhISBvcHRpb25zLm5vbmNlcy51cGRhdGU7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ2FsbG93TG9jYWxFZGl0cycpICkge1xuXHRcdFx0b3B0aW9ucy5hbGxvd0xvY2FsRWRpdHMgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy51cGxvYWRpbmcgJiYgISBvcHRpb25zLnBlcmNlbnQgKSB7XG5cdFx0XHRvcHRpb25zLnBlcmNlbnQgPSAwO1xuXHRcdH1cblxuXHRcdHRoaXMudmlld3MuZGV0YWNoKCk7XG5cdFx0dGhpcy4kZWwuaHRtbCggdGhpcy50ZW1wbGF0ZSggb3B0aW9ucyApICk7XG5cblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ3VwbG9hZGluZycsIG9wdGlvbnMudXBsb2FkaW5nICk7XG5cblx0XHRpZiAoIG9wdGlvbnMudXBsb2FkaW5nICkge1xuXHRcdFx0dGhpcy4kYmFyID0gdGhpcy4kKCcubWVkaWEtcHJvZ3Jlc3MtYmFyIGRpdicpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgdGhpcy4kYmFyO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHRoZSBtb2RlbCBpcyBzZWxlY3RlZC5cblx0XHR0aGlzLnVwZGF0ZVNlbGVjdCgpO1xuXG5cdFx0Ly8gVXBkYXRlIHRoZSBzYXZlIHN0YXR1cy5cblx0XHR0aGlzLnVwZGF0ZVNhdmUoKTtcblxuXHRcdHRoaXMudmlld3MucmVuZGVyKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRwcm9ncmVzczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLiRiYXIgJiYgdGhpcy4kYmFyLmxlbmd0aCApIHtcblx0XHRcdHRoaXMuJGJhci53aWR0aCggdGhpcy5tb2RlbC5nZXQoJ3BlcmNlbnQnKSArICclJyApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR0b2dnbGVTZWxlY3Rpb25IYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIG1ldGhvZDtcblxuXHRcdC8vIERvbid0IGRvIGFueXRoaW5nIGluc2lkZSBpbnB1dHMgYW5kIG9uIHRoZSBhdHRhY2htZW50IGNoZWNrIGFuZCByZW1vdmUgYnV0dG9ucy5cblx0XHRpZiAoICdJTlBVVCcgPT09IGV2ZW50LnRhcmdldC5ub2RlTmFtZSB8fCAnQlVUVE9OJyA9PT0gZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhdGNoIGFycm93IGV2ZW50c1xuXHRcdGlmICggMzcgPT09IGV2ZW50LmtleUNvZGUgfHwgMzggPT09IGV2ZW50LmtleUNvZGUgfHwgMzkgPT09IGV2ZW50LmtleUNvZGUgfHwgNDAgPT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2F0dGFjaG1lbnQ6a2V5ZG93bjphcnJvdycsIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2F0Y2ggZW50ZXIgYW5kIHNwYWNlIGV2ZW50c1xuXHRcdGlmICggJ2tleWRvd24nID09PSBldmVudC50eXBlICYmIDEzICE9PSBldmVudC5rZXlDb2RlICYmIDMyICE9PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHQvLyBJbiB0aGUgZ3JpZCB2aWV3LCBidWJibGUgdXAgYW4gZWRpdDphdHRhY2htZW50IGV2ZW50IHRvIHRoZSBjb250cm9sbGVyLlxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cdFx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdlZGl0JyApICkge1xuXHRcdFx0XHQvLyBQYXNzIHRoZSBjdXJyZW50IHRhcmdldCB0byByZXN0b3JlIGZvY3VzIHdoZW4gY2xvc2luZ1xuXHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ2VkaXQ6YXR0YWNobWVudCcsIHRoaXMubW9kZWwsIGV2ZW50LmN1cnJlbnRUYXJnZXQgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdzZWxlY3QnICkgKSB7XG5cdFx0XHRcdG1ldGhvZCA9ICd0b2dnbGUnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZXZlbnQuc2hpZnRLZXkgKSB7XG5cdFx0XHRtZXRob2QgPSAnYmV0d2Vlbic7XG5cdFx0fSBlbHNlIGlmICggZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5ICkge1xuXHRcdFx0bWV0aG9kID0gJ3RvZ2dsZSc7XG5cdFx0fVxuXG5cdFx0dGhpcy50b2dnbGVTZWxlY3Rpb24oe1xuXHRcdFx0bWV0aG9kOiBtZXRob2Rcblx0XHR9KTtcblxuXHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOnRvZ2dsZScgKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqL1xuXHR0b2dnbGVTZWxlY3Rpb246IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBjb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0c2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbixcblx0XHRcdG1vZGVsID0gdGhpcy5tb2RlbCxcblx0XHRcdG1ldGhvZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tZXRob2QsXG5cdFx0XHRzaW5nbGUsIG1vZGVscywgc2luZ2xlSW5kZXgsIG1vZGVsSW5kZXg7XG5cblx0XHRpZiAoICEgc2VsZWN0aW9uICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHNpbmdsZSA9IHNlbGVjdGlvbi5zaW5nbGUoKTtcblx0XHRtZXRob2QgPSBfLmlzVW5kZWZpbmVkKCBtZXRob2QgKSA/IHNlbGVjdGlvbi5tdWx0aXBsZSA6IG1ldGhvZDtcblxuXHRcdC8vIElmIHRoZSBgbWV0aG9kYCBpcyBzZXQgdG8gYGJldHdlZW5gLCBzZWxlY3QgYWxsIG1vZGVscyB0aGF0XG5cdFx0Ly8gZXhpc3QgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIHNlbGVjdGVkIG1vZGVsLlxuXHRcdGlmICggJ2JldHdlZW4nID09PSBtZXRob2QgJiYgc2luZ2xlICYmIHNlbGVjdGlvbi5tdWx0aXBsZSApIHtcblx0XHRcdC8vIElmIHRoZSBtb2RlbHMgYXJlIHRoZSBzYW1lLCBzaG9ydC1jaXJjdWl0LlxuXHRcdFx0aWYgKCBzaW5nbGUgPT09IG1vZGVsICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHNpbmdsZUluZGV4ID0gY29sbGVjdGlvbi5pbmRleE9mKCBzaW5nbGUgKTtcblx0XHRcdG1vZGVsSW5kZXggID0gY29sbGVjdGlvbi5pbmRleE9mKCB0aGlzLm1vZGVsICk7XG5cblx0XHRcdGlmICggc2luZ2xlSW5kZXggPCBtb2RlbEluZGV4ICkge1xuXHRcdFx0XHRtb2RlbHMgPSBjb2xsZWN0aW9uLm1vZGVscy5zbGljZSggc2luZ2xlSW5kZXgsIG1vZGVsSW5kZXggKyAxICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb2RlbHMgPSBjb2xsZWN0aW9uLm1vZGVscy5zbGljZSggbW9kZWxJbmRleCwgc2luZ2xlSW5kZXggKyAxICk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdGlvbi5hZGQoIG1vZGVscyApO1xuXHRcdFx0c2VsZWN0aW9uLnNpbmdsZSggbW9kZWwgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdC8vIElmIHRoZSBgbWV0aG9kYCBpcyBzZXQgdG8gYHRvZ2dsZWAsIGp1c3QgZmxpcCB0aGUgc2VsZWN0aW9uXG5cdFx0Ly8gc3RhdHVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG1vZGVsIGlzIHRoZSBzaW5nbGUgbW9kZWwuXG5cdFx0fSBlbHNlIGlmICggJ3RvZ2dsZScgPT09IG1ldGhvZCApIHtcblx0XHRcdHNlbGVjdGlvblsgdGhpcy5zZWxlY3RlZCgpID8gJ3JlbW92ZScgOiAnYWRkJyBdKCBtb2RlbCApO1xuXHRcdFx0c2VsZWN0aW9uLnNpbmdsZSggbW9kZWwgKTtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKCAnYWRkJyA9PT0gbWV0aG9kICkge1xuXHRcdFx0c2VsZWN0aW9uLmFkZCggbW9kZWwgKTtcblx0XHRcdHNlbGVjdGlvbi5zaW5nbGUoIG1vZGVsICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRml4ZXMgYnVnIHRoYXQgbG9zZXMgZm9jdXMgd2hlbiBzZWxlY3RpbmcgYSBmZWF0dXJlZCBpbWFnZVxuXHRcdGlmICggISBtZXRob2QgKSB7XG5cdFx0XHRtZXRob2QgPSAnYWRkJztcblx0XHR9XG5cblx0XHRpZiAoIG1ldGhvZCAhPT0gJ2FkZCcgKSB7XG5cdFx0XHRtZXRob2QgPSAncmVzZXQnO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zZWxlY3RlZCgpICkge1xuXHRcdFx0Ly8gSWYgdGhlIG1vZGVsIGlzIHRoZSBzaW5nbGUgbW9kZWwsIHJlbW92ZSBpdC5cblx0XHRcdC8vIElmIGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2luZ2xlIG1vZGVsLFxuXHRcdFx0Ly8gaXQgbm93IGJlY29tZXMgdGhlIHNpbmdsZSBtb2RlbC5cblx0XHRcdHNlbGVjdGlvblsgc2luZ2xlID09PSBtb2RlbCA/ICdyZW1vdmUnIDogJ3NpbmdsZScgXSggbW9kZWwgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgdGhlIG1vZGVsIGlzIG5vdCBzZWxlY3RlZCwgcnVuIHRoZSBgbWV0aG9kYCBvbiB0aGVcblx0XHRcdC8vIHNlbGVjdGlvbi4gQnkgZGVmYXVsdCwgd2UgYHJlc2V0YCB0aGUgc2VsZWN0aW9uLCBidXQgdGhlXG5cdFx0XHQvLyBgbWV0aG9kYCBjYW4gYmUgc2V0IHRvIGBhZGRgIHRoZSBtb2RlbCB0byB0aGUgc2VsZWN0aW9uLlxuXHRcdFx0c2VsZWN0aW9uWyBtZXRob2QgXSggbW9kZWwgKTtcblx0XHRcdHNlbGVjdGlvbi5zaW5nbGUoIG1vZGVsICk7XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZVNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpc1sgdGhpcy5zZWxlY3RlZCgpID8gJ3NlbGVjdCcgOiAnZGVzZWxlY3QnIF0oKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt1bnJlc29sdmVkfEJvb2xlYW59XG5cdCAqL1xuXHRzZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb247XG5cdFx0aWYgKCBzZWxlY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm4gISEgc2VsZWN0aW9uLmdldCggdGhpcy5tb2RlbC5jaWQgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBtb2RlbFxuXHQgKiBAcGFyYW0ge0JhY2tib25lLkNvbGxlY3Rpb259IGNvbGxlY3Rpb25cblx0ICovXG5cdHNlbGVjdDogZnVuY3Rpb24oIG1vZGVsLCBjb2xsZWN0aW9uICkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0Y29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcjtcblxuXHRcdC8vIENoZWNrIGlmIGEgc2VsZWN0aW9uIGV4aXN0cyBhbmQgaWYgaXQncyB0aGUgY29sbGVjdGlvbiBwcm92aWRlZC5cblx0XHQvLyBJZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSBjb2xsZWN0aW9uLCBiYWlsOyB3ZSdyZSBpbiBhbm90aGVyXG5cdFx0Ly8gc2VsZWN0aW9uJ3MgZXZlbnQgbG9vcC5cblx0XHRpZiAoICEgc2VsZWN0aW9uIHx8ICggY29sbGVjdGlvbiAmJiBjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBCYWlsIGlmIHRoZSBtb2RlbCBpcyBhbHJlYWR5IHNlbGVjdGVkLlxuXHRcdGlmICggdGhpcy4kZWwuaGFzQ2xhc3MoICdzZWxlY3RlZCcgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBZGQgJ3NlbGVjdGVkJyBjbGFzcyB0byBtb2RlbCwgc2V0IGFyaWEtY2hlY2tlZCB0byB0cnVlLlxuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnc2VsZWN0ZWQnICkuYXR0ciggJ2FyaWEtY2hlY2tlZCcsIHRydWUgKTtcblx0XHQvLyAgTWFrZSB0aGUgY2hlY2tib3ggdGFiYWJsZSwgZXhjZXB0IGluIG1lZGlhIGdyaWQgKGJ1bGsgc2VsZWN0IG1vZGUpLlxuXHRcdGlmICggISAoIGNvbnRyb2xsZXIuaXNNb2RlQWN0aXZlKCAnZ3JpZCcgKSAmJiBjb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ3NlbGVjdCcgKSApICkge1xuXHRcdFx0dGhpcy4kKCAnLmNoZWNrJyApLmF0dHIoICd0YWJpbmRleCcsICcwJyApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuQ29sbGVjdGlvbn0gY29sbGVjdGlvblxuXHQgKi9cblx0ZGVzZWxlY3Q6IGZ1bmN0aW9uKCBtb2RlbCwgY29sbGVjdGlvbiApIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbjtcblxuXHRcdC8vIENoZWNrIGlmIGEgc2VsZWN0aW9uIGV4aXN0cyBhbmQgaWYgaXQncyB0aGUgY29sbGVjdGlvbiBwcm92aWRlZC5cblx0XHQvLyBJZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSBjb2xsZWN0aW9uLCBiYWlsOyB3ZSdyZSBpbiBhbm90aGVyXG5cdFx0Ly8gc2VsZWN0aW9uJ3MgZXZlbnQgbG9vcC5cblx0XHRpZiAoICEgc2VsZWN0aW9uIHx8ICggY29sbGVjdGlvbiAmJiBjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoICdzZWxlY3RlZCcgKS5hdHRyKCAnYXJpYS1jaGVja2VkJywgZmFsc2UgKVxuXHRcdFx0LmZpbmQoICcuY2hlY2snICkuYXR0ciggJ3RhYmluZGV4JywgJy0xJyApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Db2xsZWN0aW9ufSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRkZXRhaWxzOiBmdW5jdGlvbiggbW9kZWwsIGNvbGxlY3Rpb24gKSB7XG5cdFx0dmFyIHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRkZXRhaWxzO1xuXG5cdFx0aWYgKCBzZWxlY3Rpb24gIT09IGNvbGxlY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZGV0YWlscyA9IHNlbGVjdGlvbi5zaW5nbGUoKTtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2RldGFpbHMnLCBkZXRhaWxzID09PSB0aGlzLm1vZGVsICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2l6ZVxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fVxuXHQgKi9cblx0aW1hZ2VTaXplOiBmdW5jdGlvbiggc2l6ZSApIHtcblx0XHR2YXIgc2l6ZXMgPSB0aGlzLm1vZGVsLmdldCgnc2l6ZXMnKSwgbWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0c2l6ZSA9IHNpemUgfHwgJ21lZGl1bSc7XG5cblx0XHQvLyBVc2UgdGhlIHByb3ZpZGVkIGltYWdlIHNpemUgaWYgcG9zc2libGUuXG5cdFx0aWYgKCBzaXplcyApIHtcblx0XHRcdGlmICggc2l6ZXNbIHNpemUgXSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IHNpemVzWyBzaXplIF07XG5cdFx0XHR9IGVsc2UgaWYgKCBzaXplcy5sYXJnZSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IHNpemVzLmxhcmdlO1xuXHRcdFx0fSBlbHNlIGlmICggc2l6ZXMudGh1bWJuYWlsICkge1xuXHRcdFx0XHRtYXRjaGVkID0gc2l6ZXMudGh1bWJuYWlsO1xuXHRcdFx0fSBlbHNlIGlmICggc2l6ZXMuZnVsbCApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IHNpemVzLmZ1bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0Y2hlZCApIHtcblx0XHRcdFx0cmV0dXJuIF8uY2xvbmUoIG1hdGNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXJsOiAgICAgICAgIHRoaXMubW9kZWwuZ2V0KCd1cmwnKSxcblx0XHRcdHdpZHRoOiAgICAgICB0aGlzLm1vZGVsLmdldCgnd2lkdGgnKSxcblx0XHRcdGhlaWdodDogICAgICB0aGlzLm1vZGVsLmdldCgnaGVpZ2h0JyksXG5cdFx0XHRvcmllbnRhdGlvbjogdGhpcy5tb2RlbC5nZXQoJ29yaWVudGF0aW9uJylcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR1cGRhdGVTZXR0aW5nOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyICRzZXR0aW5nID0gJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCgnW2RhdGEtc2V0dGluZ10nKSxcblx0XHRcdHNldHRpbmcsIHZhbHVlO1xuXG5cdFx0aWYgKCAhICRzZXR0aW5nLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZXR0aW5nID0gJHNldHRpbmcuZGF0YSgnc2V0dGluZycpO1xuXHRcdHZhbHVlICAgPSBldmVudC50YXJnZXQudmFsdWU7XG5cblx0XHRpZiAoIHRoaXMubW9kZWwuZ2V0KCBzZXR0aW5nICkgIT09IHZhbHVlICkge1xuXHRcdFx0dGhpcy5zYXZlKCBzZXR0aW5nLCB2YWx1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGFzcyBhbGwgdGhlIGFyZ3VtZW50cyB0byB0aGUgbW9kZWwncyBzYXZlIG1ldGhvZC5cblx0ICpcblx0ICogUmVjb3JkcyB0aGUgYWdncmVnYXRlIHN0YXR1cyBvZiBhbGwgc2F2ZSByZXF1ZXN0cyBhbmQgdXBkYXRlcyB0aGVcblx0ICogdmlldydzIGNsYXNzZXMgYWNjb3JkaW5nbHkuXG5cdCAqL1xuXHRzYXZlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlldyA9IHRoaXMsXG5cdFx0XHRzYXZlID0gdGhpcy5fc2F2ZSA9IHRoaXMuX3NhdmUgfHwgeyBzdGF0dXM6ICdyZWFkeScgfSxcblx0XHRcdHJlcXVlc3QgPSB0aGlzLm1vZGVsLnNhdmUuYXBwbHkoIHRoaXMubW9kZWwsIGFyZ3VtZW50cyApLFxuXHRcdFx0cmVxdWVzdHMgPSBzYXZlLnJlcXVlc3RzID8gJC53aGVuKCByZXF1ZXN0LCBzYXZlLnJlcXVlc3RzICkgOiByZXF1ZXN0O1xuXG5cdFx0Ly8gSWYgd2UncmUgd2FpdGluZyB0byByZW1vdmUgJ1NhdmVkLicsIHN0b3AuXG5cdFx0aWYgKCBzYXZlLnNhdmVkVGltZXIgKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQoIHNhdmUuc2F2ZWRUaW1lciApO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlU2F2ZSgnd2FpdGluZycpO1xuXHRcdHNhdmUucmVxdWVzdHMgPSByZXF1ZXN0cztcblx0XHRyZXF1ZXN0cy5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gSWYgd2UndmUgcGVyZm9ybWVkIGFub3RoZXIgcmVxdWVzdCBzaW5jZSB0aGlzIG9uZSwgYmFpbC5cblx0XHRcdGlmICggc2F2ZS5yZXF1ZXN0cyAhPT0gcmVxdWVzdHMgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmlldy51cGRhdGVTYXZlKCByZXF1ZXN0cy5zdGF0ZSgpID09PSAncmVzb2x2ZWQnID8gJ2NvbXBsZXRlJyA6ICdlcnJvcicgKTtcblx0XHRcdHNhdmUuc2F2ZWRUaW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2aWV3LnVwZGF0ZVNhdmUoJ3JlYWR5Jyk7XG5cdFx0XHRcdGRlbGV0ZSBzYXZlLnNhdmVkVGltZXI7XG5cdFx0XHR9LCAyMDAwICk7XG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHR1cGRhdGVTYXZlOiBmdW5jdGlvbiggc3RhdHVzICkge1xuXHRcdHZhciBzYXZlID0gdGhpcy5fc2F2ZSA9IHRoaXMuX3NhdmUgfHwgeyBzdGF0dXM6ICdyZWFkeScgfTtcblxuXHRcdGlmICggc3RhdHVzICYmIHN0YXR1cyAhPT0gc2F2ZS5zdGF0dXMgKSB7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyggJ3NhdmUtJyArIHNhdmUuc3RhdHVzICk7XG5cdFx0XHRzYXZlLnN0YXR1cyA9IHN0YXR1cztcblx0XHR9XG5cblx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ3NhdmUtJyArIHNhdmUuc3RhdHVzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dXBkYXRlQWxsOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJHNldHRpbmdzID0gdGhpcy4kKCdbZGF0YS1zZXR0aW5nXScpLFxuXHRcdFx0bW9kZWwgPSB0aGlzLm1vZGVsLFxuXHRcdFx0Y2hhbmdlZDtcblxuXHRcdGNoYW5nZWQgPSBfLmNoYWluKCAkc2V0dGluZ3MgKS5tYXAoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdHZhciAkaW5wdXQgPSAkKCdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgW3ZhbHVlXScsIGVsICksXG5cdFx0XHRcdHNldHRpbmcsIHZhbHVlO1xuXG5cdFx0XHRpZiAoICEgJGlucHV0Lmxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzZXR0aW5nID0gJChlbCkuZGF0YSgnc2V0dGluZycpO1xuXHRcdFx0dmFsdWUgPSAkaW5wdXQudmFsKCk7XG5cblx0XHRcdC8vIFJlY29yZCB0aGUgdmFsdWUgaWYgaXQgY2hhbmdlZC5cblx0XHRcdGlmICggbW9kZWwuZ2V0KCBzZXR0aW5nICkgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm4gWyBzZXR0aW5nLCB2YWx1ZSBdO1xuXHRcdFx0fVxuXHRcdH0pLmNvbXBhY3QoKS5vYmplY3QoKS52YWx1ZSgpO1xuXG5cdFx0aWYgKCAhIF8uaXNFbXB0eSggY2hhbmdlZCApICkge1xuXHRcdFx0bW9kZWwuc2F2ZSggY2hhbmdlZCApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0cmVtb3ZlRnJvbUxpYnJhcnk6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHQvLyBDYXRjaCBlbnRlciBhbmQgc3BhY2UgZXZlbnRzXG5cdFx0aWYgKCAna2V5ZG93bicgPT09IGV2ZW50LnR5cGUgJiYgMTMgIT09IGV2ZW50LmtleUNvZGUgJiYgMzIgIT09IGV2ZW50LmtleUNvZGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcCBwcm9wYWdhdGlvbiBzbyB0aGUgbW9kZWwgaXNuJ3Qgc2VsZWN0ZWQuXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24ucmVtb3ZlKCB0aGlzLm1vZGVsICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZCB0aGUgbW9kZWwgaWYgaXQgaXNuJ3QgaW4gdGhlIHNlbGVjdGlvbiwgaWYgaXQgaXMgaW4gdGhlIHNlbGVjdGlvbixcblx0ICogcmVtb3ZlIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtbdHlwZV19IGV2ZW50IFtkZXNjcmlwdGlvbl1cblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgICBbZGVzY3JpcHRpb25dXG5cdCAqL1xuXHRjaGVja0NsaWNrSGFuZGxlcjogZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHR2YXIgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbjtcblx0XHRpZiAoICEgc2VsZWN0aW9uICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRpZiAoIHNlbGVjdGlvbi53aGVyZSggeyBpZDogdGhpcy5tb2RlbC5nZXQoICdpZCcgKSB9ICkubGVuZ3RoICkge1xuXHRcdFx0c2VsZWN0aW9uLnJlbW92ZSggdGhpcy5tb2RlbCApO1xuXHRcdFx0Ly8gTW92ZSBmb2N1cyBiYWNrIHRvIHRoZSBhdHRhY2htZW50IHRpbGUgKGZyb20gdGhlIGNoZWNrKS5cblx0XHRcdHRoaXMuJGVsLmZvY3VzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGlvbi5hZGQoIHRoaXMubW9kZWwgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG4vLyBFbnN1cmUgc2V0dGluZ3MgcmVtYWluIGluIHN5bmMgYmV0d2VlbiBhdHRhY2htZW50IHZpZXdzLlxuXy5lYWNoKHtcblx0Y2FwdGlvbjogJ19zeW5jQ2FwdGlvbicsXG5cdHRpdGxlOiAgICdfc3luY1RpdGxlJyxcblx0YXJ0aXN0OiAgJ19zeW5jQXJ0aXN0Jyxcblx0YWxidW06ICAgJ19zeW5jQWxidW0nXG59LCBmdW5jdGlvbiggbWV0aG9kLCBzZXR0aW5nICkge1xuXHQvKipcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnR9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRBdHRhY2htZW50LnByb3RvdHlwZVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggbW9kZWwsIHZhbHVlICkge1xuXHRcdHZhciAkc2V0dGluZyA9IHRoaXMuJCgnW2RhdGEtc2V0dGluZz1cIicgKyBzZXR0aW5nICsgJ1wiXScpO1xuXG5cdFx0aWYgKCAhICRzZXR0aW5nLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSB1cGRhdGVkIHZhbHVlIGlzIGluIHN5bmMgd2l0aCB0aGUgdmFsdWUgaW4gdGhlIERPTSwgdGhlcmVcblx0XHQvLyBpcyBubyBuZWVkIHRvIHJlLXJlbmRlci4gSWYgd2UncmUgY3VycmVudGx5IGVkaXRpbmcgdGhlIHZhbHVlLFxuXHRcdC8vIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBpbiBzeW5jLCBzdXBwcmVzc2luZyB0aGUgcmUtcmVuZGVyIGZvclxuXHRcdC8vIHRoZSB2aWV3IHdlJ3JlIGVkaXRpbmcsIHdoaWxlIHVwZGF0aW5nIGFueSBvdGhlcnMuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gJHNldHRpbmcuZmluZCgnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIFt2YWx1ZV0nKS52YWwoKSApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlbmRlcigpO1xuXHR9O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0YWNobWVudDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50LkRldGFpbHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEF0dGFjaG1lbnQgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdERldGFpbHM7XG5cbkRldGFpbHMgPSBBdHRhY2htZW50LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ2F0dGFjaG1lbnQtZGV0YWlscycsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ2F0dGFjaG1lbnQtZGV0YWlscycpLFxuXG5cdGF0dHJpYnV0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHQndGFiSW5kZXgnOiAgICAgMCxcblx0XHRcdCdkYXRhLWlkJzogICAgICB0aGlzLm1vZGVsLmdldCggJ2lkJyApXG5cdFx0fTtcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddJzogICAgICAgICAgJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjaGFuZ2UgW2RhdGEtc2V0dGluZ10gaW5wdXQnOiAgICAndXBkYXRlU2V0dGluZycsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nXSBzZWxlY3QnOiAgICd1cGRhdGVTZXR0aW5nJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmddIHRleHRhcmVhJzogJ3VwZGF0ZVNldHRpbmcnLFxuXHRcdCdjbGljayAuZGVsZXRlLWF0dGFjaG1lbnQnOiAgICAgICAnZGVsZXRlQXR0YWNobWVudCcsXG5cdFx0J2NsaWNrIC50cmFzaC1hdHRhY2htZW50JzogICAgICAgICd0cmFzaEF0dGFjaG1lbnQnLFxuXHRcdCdjbGljayAudW50cmFzaC1hdHRhY2htZW50JzogICAgICAndW50cmFzaEF0dGFjaG1lbnQnLFxuXHRcdCdjbGljayAuZWRpdC1hdHRhY2htZW50JzogICAgICAgICAnZWRpdEF0dGFjaG1lbnQnLFxuXHRcdCdrZXlkb3duJzogICAgICAgICAgICAgICAgICAgICAgICAndG9nZ2xlU2VsZWN0aW9uSGFuZGxlcidcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHJlcmVuZGVyT25Nb2RlbENoYW5nZTogZmFsc2Vcblx0XHR9KTtcblxuXHRcdHRoaXMub24oICdyZWFkeScsIHRoaXMuaW5pdGlhbEZvY3VzICk7XG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRBdHRhY2htZW50LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRpbml0aWFsRm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggISB3cC5tZWRpYS5pc1RvdWNoRGV2aWNlICkge1xuXHRcdFx0Lypcblx0XHRcdFByZXZpb3VzbHkgZm9jdXNlZCB0aGUgZmlyc3QgJzppbnB1dCcgKHRoZSByZWFkb25seSBVUkwgdGV4dCBmaWVsZCkuXG5cdFx0XHRTaW5jZSB0aGUgZmlyc3QgJzppbnB1dCcgaXMgbm93IGEgYnV0dG9uIChkZWxldGUvdHJhc2gpOiB3aGVuIHByZXNzaW5nXG5cdFx0XHRzcGFjZWJhciBvbiBhbiBhdHRhY2htZW50LCBGaXJlZm94IGZpcmVzIGRlbGV0ZUF0dGFjaG1lbnQvdHJhc2hBdHRhY2htZW50XG5cdFx0XHRhcyBzb29uIGFzIGZvY3VzIGlzIG1vdmVkLiBFeHBsaWNpdGx5IHRhcmdldCB0aGUgZmlyc3QgdGV4dCBmaWVsZCBmb3Igbm93LlxuXHRcdFx0QHRvZG8gY2hhbmdlIGluaXRpYWwgZm9jdXMgbG9naWMsIGFsc28gZm9yIGFjY2Vzc2liaWxpdHkuXG5cdFx0XHQqL1xuXHRcdFx0dGhpcy4kKCAnaW5wdXRbdHlwZT1cInRleHRcIl0nICkuZXEoIDAgKS5mb2N1cygpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0ZGVsZXRlQXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIHdpbmRvdy5jb25maXJtKCBsMTBuLndhcm5EZWxldGUgKSApIHtcblx0XHRcdHRoaXMubW9kZWwuZGVzdHJveSgpO1xuXHRcdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHRcdC8vIGFmdGVyIGltYWdlIGlzIGRlbGV0ZWRcblx0XHRcdHRoaXMuY29udHJvbGxlci5tb2RhbC5mb2N1c01hbmFnZXIuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdHRyYXNoQXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5jb250cm9sbGVyLmxpYnJhcnk7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGlmICggd3AubWVkaWEudmlldy5zZXR0aW5ncy5tZWRpYVRyYXNoICYmXG5cdFx0XHQnZWRpdC1tZXRhZGF0YScgPT09IHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoKSApIHtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoICdzdGF0dXMnLCAndHJhc2gnICk7XG5cdFx0XHR0aGlzLm1vZGVsLnNhdmUoKS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0bGlicmFyeS5fcmVxdWVyeSggdHJ1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0gIGVsc2Uge1xuXHRcdFx0dGhpcy5tb2RlbC5kZXN0cm95KCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR1bnRyYXNoQXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBsaWJyYXJ5ID0gdGhpcy5jb250cm9sbGVyLmxpYnJhcnk7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KCAnc3RhdHVzJywgJ2luaGVyaXQnICk7XG5cdFx0dGhpcy5tb2RlbC5zYXZlKCkuZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRsaWJyYXJ5Ll9yZXF1ZXJ5KCB0cnVlICk7XG5cdFx0fSApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRlZGl0QXR0YWNobWVudDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBlZGl0U3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGVzLmdldCggJ2VkaXQtaW1hZ2UnICk7XG5cdFx0aWYgKCB3aW5kb3cuaW1hZ2VFZGl0ICYmIGVkaXRTdGF0ZSApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdGVkaXRTdGF0ZS5zZXQoICdpbWFnZScsIHRoaXMubW9kZWwgKTtcblx0XHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggJ2VkaXQtaW1hZ2UnICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKCduZWVkcy1yZWZyZXNoJyk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogV2hlbiByZXZlcnNlIHRhYmJpbmcoc2hpZnQrdGFiKSBvdXQgb2YgdGhlIHJpZ2h0IGRldGFpbHMgcGFuZWwsIGRlbGl2ZXJcblx0ICogdGhlIGZvY3VzIHRvIHRoZSBpdGVtIGluIHRoZSBsaXN0IHRoYXQgd2FzIGJlaW5nIGVkaXRlZC5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR0b2dnbGVTZWxlY3Rpb25IYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCAna2V5ZG93bicgPT09IGV2ZW50LnR5cGUgJiYgOSA9PT0gZXZlbnQua2V5Q29kZSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC50YXJnZXQgPT09IHRoaXMuJCggJzp0YWJiYWJsZScgKS5nZXQoIDAgKSApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnYXR0YWNobWVudDpkZXRhaWxzOnNoaWZ0LXRhYicsIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCAzNyA9PT0gZXZlbnQua2V5Q29kZSB8fCAzOCA9PT0gZXZlbnQua2V5Q29kZSB8fCAzOSA9PT0gZXZlbnQua2V5Q29kZSB8fCA0MCA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnYXR0YWNobWVudDprZXlkb3duOmFycm93JywgZXZlbnQgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5FZGl0TGlicmFyeVxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgRWRpdExpYnJhcnkgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuZXh0ZW5kKHtcblx0YnV0dG9uczoge1xuXHRcdGNsb3NlOiB0cnVlXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVkaXRMaWJyYXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLkVkaXRTZWxlY3Rpb25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuU2VsZWN0aW9uXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5BdHRhY2htZW50XG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBFZGl0U2VsZWN0aW9uID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50LlNlbGVjdGlvbi5leHRlbmQoe1xuXHRidXR0b25zOiB7XG5cdFx0Y2xvc2U6IHRydWVcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdFNlbGVjdGlvbjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50LkxpYnJhcnlcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIExpYnJhcnkgPSB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuZXh0ZW5kKHtcblx0YnV0dG9uczoge1xuXHRcdGNoZWNrOiB0cnVlXG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpYnJhcnk7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5TZWxlY3Rpb25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFNlbGVjdGlvbiA9IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50IHNlbGVjdGlvbicsXG5cblx0Ly8gT24gY2xpY2ssIGp1c3Qgc2VsZWN0IHRoZSBtb2RlbCwgaW5zdGVhZCBvZiByZW1vdmluZyB0aGUgbW9kZWwgZnJvbVxuXHQvLyB0aGUgc2VsZWN0aW9uLlxuXHR0b2dnbGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub3B0aW9ucy5zZWxlY3Rpb24uc2luZ2xlKCB0aGlzLm1vZGVsICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdGlvbjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50c1xuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdCQgPSBqUXVlcnksXG5cdEF0dGFjaG1lbnRzO1xuXG5BdHRhY2htZW50cyA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAndWwnLFxuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50cycsXG5cblx0YXR0cmlidXRlczoge1xuXHRcdHRhYkluZGV4OiAtMVxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZWwuaWQgPSBfLnVuaXF1ZUlkKCdfX2F0dGFjaG1lbnRzLXZpZXctJyk7XG5cblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHJlZnJlc2hTZW5zaXRpdml0eTogd3AubWVkaWEuaXNUb3VjaERldmljZSA/IDMwMCA6IDIwMCxcblx0XHRcdHJlZnJlc2hUaHJlc2hvbGQ6ICAgMyxcblx0XHRcdEF0dGFjaG1lbnRWaWV3OiAgICAgd3AubWVkaWEudmlldy5BdHRhY2htZW50LFxuXHRcdFx0c29ydGFibGU6ICAgICAgICAgICBmYWxzZSxcblx0XHRcdHJlc2l6ZTogICAgICAgICAgICAgdHJ1ZSxcblx0XHRcdGlkZWFsQ29sdW1uV2lkdGg6ICAgJCggd2luZG93ICkud2lkdGgoKSA8IDY0MCA/IDEzNSA6IDE1MFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fdmlld3NCeUNpZCA9IHt9O1xuXHRcdHRoaXMuJHdpbmRvdyA9ICQoIHdpbmRvdyApO1xuXHRcdHRoaXMucmVzaXplRXZlbnQgPSAncmVzaXplLm1lZGlhLW1vZGFsLWNvbHVtbnMnO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLm9uKCAnYWRkJywgZnVuY3Rpb24oIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHR0aGlzLnZpZXdzLmFkZCggdGhpcy5jcmVhdGVBdHRhY2htZW50VmlldyggYXR0YWNobWVudCApLCB7XG5cdFx0XHRcdGF0OiB0aGlzLmNvbGxlY3Rpb24uaW5kZXhPZiggYXR0YWNobWVudCApXG5cdFx0XHR9KTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24ub24oICdyZW1vdmUnLCBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdHZhciB2aWV3ID0gdGhpcy5fdmlld3NCeUNpZFsgYXR0YWNobWVudC5jaWQgXTtcblx0XHRcdGRlbGV0ZSB0aGlzLl92aWV3c0J5Q2lkWyBhdHRhY2htZW50LmNpZCBdO1xuXG5cdFx0XHRpZiAoIHZpZXcgKSB7XG5cdFx0XHRcdHZpZXcucmVtb3ZlKCk7XG5cdFx0XHR9XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLm9uKCAncmVzZXQnLCB0aGlzLnJlbmRlciwgdGhpcyApO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5jb250cm9sbGVyLCAnbGlicmFyeTpzZWxlY3Rpb246YWRkJywgICAgdGhpcy5hdHRhY2htZW50Rm9jdXMgKTtcblxuXHRcdC8vIFRocm90dGxlIHRoZSBzY3JvbGwgaGFuZGxlciBhbmQgYmluZCB0aGlzLlxuXHRcdHRoaXMuc2Nyb2xsID0gXy5jaGFpbiggdGhpcy5zY3JvbGwgKS5iaW5kKCB0aGlzICkudGhyb3R0bGUoIHRoaXMub3B0aW9ucy5yZWZyZXNoU2Vuc2l0aXZpdHkgKS52YWx1ZSgpO1xuXG5cdFx0dGhpcy5vcHRpb25zLnNjcm9sbEVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuc2Nyb2xsRWxlbWVudCB8fCB0aGlzLmVsO1xuXHRcdCQoIHRoaXMub3B0aW9ucy5zY3JvbGxFbGVtZW50ICkub24oICdzY3JvbGwnLCB0aGlzLnNjcm9sbCApO1xuXG5cdFx0dGhpcy5pbml0U29ydGFibGUoKTtcblxuXHRcdF8uYmluZEFsbCggdGhpcywgJ3NldENvbHVtbnMnICk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5yZXNpemUgKSB7XG5cdFx0XHR0aGlzLm9uKCAncmVhZHknLCB0aGlzLmJpbmRFdmVudHMgKTtcblx0XHRcdHRoaXMuY29udHJvbGxlci5vbiggJ29wZW4nLCB0aGlzLnNldENvbHVtbnMgKTtcblxuXHRcdFx0Ly8gQ2FsbCB0aGlzLnNldENvbHVtbnMoKSBhZnRlciB0aGlzIHZpZXcgaGFzIGJlZW4gcmVuZGVyZWQgaW4gdGhlIERPTSBzb1xuXHRcdFx0Ly8gYXR0YWNobWVudHMgZ2V0IHByb3BlciB3aWR0aCBhcHBsaWVkLlxuXHRcdFx0Xy5kZWZlciggdGhpcy5zZXRDb2x1bW5zLCB0aGlzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGJpbmRFdmVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJHdpbmRvdy5vZmYoIHRoaXMucmVzaXplRXZlbnQgKS5vbiggdGhpcy5yZXNpemVFdmVudCwgXy5kZWJvdW5jZSggdGhpcy5zZXRDb2x1bW5zLCA1MCApICk7XG5cdH0sXG5cblx0YXR0YWNobWVudEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiQoICdsaTpmaXJzdCcgKS5mb2N1cygpO1xuXHR9LFxuXG5cdHJlc3RvcmVGb2N1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kKCAnbGkuc2VsZWN0ZWQ6Zmlyc3QnICkuZm9jdXMoKTtcblx0fSxcblxuXHRhcnJvd0V2ZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGF0dGFjaG1lbnRzID0gdGhpcy4kZWwuY2hpbGRyZW4oICdsaScgKSxcblx0XHRcdHBlclJvdyA9IHRoaXMuY29sdW1ucyxcblx0XHRcdGluZGV4ID0gYXR0YWNobWVudHMuZmlsdGVyKCAnOmZvY3VzJyApLmluZGV4KCksXG5cdFx0XHRyb3cgPSAoIGluZGV4ICsgMSApIDw9IHBlclJvdyA/IDEgOiBNYXRoLmNlaWwoICggaW5kZXggKyAxICkgLyBwZXJSb3cgKTtcblxuXHRcdGlmICggaW5kZXggPT09IC0xICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIExlZnQgYXJyb3dcblx0XHRpZiAoIDM3ID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0aWYgKCAwID09PSBpbmRleCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0YXR0YWNobWVudHMuZXEoIGluZGV4IC0gMSApLmZvY3VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gVXAgYXJyb3dcblx0XHRpZiAoIDM4ID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0aWYgKCAxID09PSByb3cgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGF0dGFjaG1lbnRzLmVxKCBpbmRleCAtIHBlclJvdyApLmZvY3VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gUmlnaHQgYXJyb3dcblx0XHRpZiAoIDM5ID09PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0aWYgKCBhdHRhY2htZW50cy5sZW5ndGggPT09IGluZGV4ICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhdHRhY2htZW50cy5lcSggaW5kZXggKyAxICkuZm9jdXMoKTtcblx0XHR9XG5cblx0XHQvLyBEb3duIGFycm93XG5cdFx0aWYgKCA0MCA9PT0gZXZlbnQua2V5Q29kZSApIHtcblx0XHRcdGlmICggTWF0aC5jZWlsKCBhdHRhY2htZW50cy5sZW5ndGggLyBwZXJSb3cgKSA9PT0gcm93ICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhdHRhY2htZW50cy5lcSggaW5kZXggKyBwZXJSb3cgKS5mb2N1cygpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24ucHJvcHMub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMucmVzaXplICkge1xuXHRcdFx0dGhpcy4kd2luZG93Lm9mZiggdGhpcy5yZXNpemVFdmVudCApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ2Rpc3Bvc2UnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRWaWV3LnByb3RvdHlwZS5kaXNwb3NlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRzZXRDb2x1bW5zOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcHJldiA9IHRoaXMuY29sdW1ucyxcblx0XHRcdHdpZHRoID0gdGhpcy4kZWwud2lkdGgoKTtcblxuXHRcdGlmICggd2lkdGggKSB7XG5cdFx0XHR0aGlzLmNvbHVtbnMgPSBNYXRoLm1pbiggTWF0aC5yb3VuZCggd2lkdGggLyB0aGlzLm9wdGlvbnMuaWRlYWxDb2x1bW5XaWR0aCApLCAxMiApIHx8IDE7XG5cblx0XHRcdGlmICggISBwcmV2IHx8IHByZXYgIT09IHRoaXMuY29sdW1ucyApIHtcblx0XHRcdFx0dGhpcy4kZWwuY2xvc2VzdCggJy5tZWRpYS1mcmFtZS1jb250ZW50JyApLmF0dHIoICdkYXRhLWNvbHVtbnMnLCB0aGlzLmNvbHVtbnMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0aW5pdFNvcnRhYmxlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbjtcblxuXHRcdGlmICggISB0aGlzLm9wdGlvbnMuc29ydGFibGUgfHwgISAkLmZuLnNvcnRhYmxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLnNvcnRhYmxlKCBfLmV4dGVuZCh7XG5cdFx0XHQvLyBJZiB0aGUgYGNvbGxlY3Rpb25gIGhhcyBhIGBjb21wYXJhdG9yYCwgZGlzYWJsZSBzb3J0aW5nLlxuXHRcdFx0ZGlzYWJsZWQ6ICEhIGNvbGxlY3Rpb24uY29tcGFyYXRvcixcblxuXHRcdFx0Ly8gQ2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYXR0YWNobWVudCBhcyBzb29uIGFzIHRoZVxuXHRcdFx0Ly8gbW91c2UgcG9pbnRlciBvdmVybGFwcyBhIHRodW1ibmFpbC5cblx0XHRcdHRvbGVyYW5jZTogJ3BvaW50ZXInLFxuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIGluaXRpYWwgYGluZGV4YCBvZiB0aGUgZHJhZ2dlZCBtb2RlbC5cblx0XHRcdHN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpICkge1xuXHRcdFx0XHR1aS5pdGVtLmRhdGEoJ3NvcnRhYmxlSW5kZXhTdGFydCcsIHVpLml0ZW0uaW5kZXgoKSk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIG1vZGVsJ3MgaW5kZXggaW4gdGhlIGNvbGxlY3Rpb24uXG5cdFx0XHQvLyBEbyBzbyBzaWxlbnRseSwgYXMgdGhlIHZpZXcgaXMgYWxyZWFkeSBhY2N1cmF0ZS5cblx0XHRcdHVwZGF0ZTogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHtcblx0XHRcdFx0dmFyIG1vZGVsID0gY29sbGVjdGlvbi5hdCggdWkuaXRlbS5kYXRhKCdzb3J0YWJsZUluZGV4U3RhcnQnKSApLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3IgPSBjb2xsZWN0aW9uLmNvbXBhcmF0b3I7XG5cblx0XHRcdFx0Ly8gVGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgY29tcGFyYXRvciB0byBwcmV2ZW50IGBhZGRgXG5cdFx0XHRcdC8vIGZyb20gcmUtc29ydGluZy5cblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb24uY29tcGFyYXRvcjtcblxuXHRcdFx0XHQvLyBTaWxlbnRseSBzaGlmdCB0aGUgbW9kZWwgdG8gaXRzIG5ldyBpbmRleC5cblx0XHRcdFx0Y29sbGVjdGlvbi5yZW1vdmUoIG1vZGVsLCB7XG5cdFx0XHRcdFx0c2lsZW50OiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb2xsZWN0aW9uLmFkZCggbW9kZWwsIHtcblx0XHRcdFx0XHRzaWxlbnQ6IHRydWUsXG5cdFx0XHRcdFx0YXQ6ICAgICB1aS5pdGVtLmluZGV4KClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgY29tcGFyYXRvci5cblx0XHRcdFx0Y29sbGVjdGlvbi5jb21wYXJhdG9yID0gY29tcGFyYXRvcjtcblxuXHRcdFx0XHQvLyBGaXJlIHRoZSBgcmVzZXRgIGV2ZW50IHRvIGVuc3VyZSBvdGhlciBjb2xsZWN0aW9ucyBzeW5jLlxuXHRcdFx0XHRjb2xsZWN0aW9uLnRyaWdnZXIoICdyZXNldCcsIGNvbGxlY3Rpb24gKTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgY29sbGVjdGlvbiBpcyBzb3J0ZWQgYnkgbWVudSBvcmRlcixcblx0XHRcdFx0Ly8gdXBkYXRlIHRoZSBtZW51IG9yZGVyLlxuXHRcdFx0XHRjb2xsZWN0aW9uLnNhdmVNZW51T3JkZXIoKTtcblx0XHRcdH1cblx0XHR9LCB0aGlzLm9wdGlvbnMuc29ydGFibGUgKSApO1xuXG5cdFx0Ly8gSWYgdGhlIGBvcmRlcmJ5YCBwcm9wZXJ0eSBpcyBjaGFuZ2VkIG9uIHRoZSBgY29sbGVjdGlvbmAsXG5cdFx0Ly8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBgY29tcGFyYXRvcmAuIElmIHNvLCBkaXNhYmxlIHNvcnRpbmcuXG5cdFx0Y29sbGVjdGlvbi5wcm9wcy5vbiggJ2NoYW5nZTpvcmRlcmJ5JywgZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLiRlbC5zb3J0YWJsZSggJ29wdGlvbicsICdkaXNhYmxlZCcsICEhIGNvbGxlY3Rpb24uY29tcGFyYXRvciApO1xuXHRcdH0sIHRoaXMgKTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5wcm9wcy5vbiggJ2NoYW5nZTpvcmRlcmJ5JywgdGhpcy5yZWZyZXNoU29ydGFibGUsIHRoaXMgKTtcblx0XHR0aGlzLnJlZnJlc2hTb3J0YWJsZSgpO1xuXHR9LFxuXG5cdHJlZnJlc2hTb3J0YWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMub3B0aW9ucy5zb3J0YWJsZSB8fCAhICQuZm4uc29ydGFibGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGBjb2xsZWN0aW9uYCBoYXMgYSBgY29tcGFyYXRvcmAsIGRpc2FibGUgc29ydGluZy5cblx0XHR2YXIgY29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbixcblx0XHRcdG9yZGVyYnkgPSBjb2xsZWN0aW9uLnByb3BzLmdldCgnb3JkZXJieScpLFxuXHRcdFx0ZW5hYmxlZCA9ICdtZW51T3JkZXInID09PSBvcmRlcmJ5IHx8ICEgY29sbGVjdGlvbi5jb21wYXJhdG9yO1xuXG5cdFx0dGhpcy4kZWwuc29ydGFibGUoICdvcHRpb24nLCAnZGlzYWJsZWQnLCAhIGVuYWJsZWQgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHt3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50fSBhdHRhY2htZW50XG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5WaWV3fVxuXHQgKi9cblx0Y3JlYXRlQXR0YWNobWVudFZpZXc6IGZ1bmN0aW9uKCBhdHRhY2htZW50ICkge1xuXHRcdHZhciB2aWV3ID0gbmV3IHRoaXMub3B0aW9ucy5BdHRhY2htZW50Vmlldyh7XG5cdFx0XHRjb250cm9sbGVyOiAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0bW9kZWw6ICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQsXG5cdFx0XHRjb2xsZWN0aW9uOiAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0c2VsZWN0aW9uOiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZWxlY3Rpb25cblx0XHR9KTtcblxuXHRcdHJldHVybiB0aGlzLl92aWV3c0J5Q2lkWyBhdHRhY2htZW50LmNpZCBdID0gdmlldztcblx0fSxcblxuXHRwcmVwYXJlOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDcmVhdGUgYWxsIG9mIHRoZSBBdHRhY2htZW50IHZpZXdzLCBhbmQgcmVwbGFjZVxuXHRcdC8vIHRoZSBsaXN0IGluIGEgc2luZ2xlIERPTSBvcGVyYXRpb24uXG5cdFx0aWYgKCB0aGlzLmNvbGxlY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0dGhpcy52aWV3cy5zZXQoIHRoaXMuY29sbGVjdGlvbi5tYXAoIHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcsIHRoaXMgKSApO1xuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzLCBjbGVhciB0aGUgdmlld3MgYW5kIGxvYWQgc29tZS5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy52aWV3cy51bnNldCgpO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLm1vcmUoKS5kb25lKCB0aGlzLnNjcm9sbCApO1xuXHRcdH1cblx0fSxcblxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVHJpZ2dlciB0aGUgc2Nyb2xsIGV2ZW50IHRvIGNoZWNrIGlmIHdlJ3JlIHdpdGhpbiB0aGVcblx0XHQvLyB0aHJlc2hvbGQgdG8gcXVlcnkgZm9yIGFkZGl0aW9uYWwgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5zY3JvbGwoKTtcblx0fSxcblxuXHRzY3JvbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2aWV3ID0gdGhpcyxcblx0XHRcdGVsID0gdGhpcy5vcHRpb25zLnNjcm9sbEVsZW1lbnQsXG5cdFx0XHRzY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3AsXG5cdFx0XHR0b29sYmFyO1xuXG5cdFx0Ly8gVGhlIHNjcm9sbCBldmVudCBvY2N1cnMgb24gdGhlIGRvY3VtZW50LCBidXQgdGhlIGVsZW1lbnRcblx0XHQvLyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGlzIHRoZSBkb2N1bWVudCBib2R5LlxuXHRcdGlmICggZWwgPT09IGRvY3VtZW50ICkge1xuXHRcdFx0ZWwgPSBkb2N1bWVudC5ib2R5O1xuXHRcdFx0c2Nyb2xsVG9wID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhICQoZWwpLmlzKCc6dmlzaWJsZScpIHx8ICEgdGhpcy5jb2xsZWN0aW9uLmhhc01vcmUoKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0b29sYmFyID0gdGhpcy52aWV3cy5wYXJlbnQudG9vbGJhcjtcblxuXHRcdC8vIFNob3cgdGhlIHNwaW5uZXIgb25seSBpZiB3ZSBhcmUgY2xvc2UgdG8gdGhlIGJvdHRvbS5cblx0XHRpZiAoIGVsLnNjcm9sbEhlaWdodCAtICggc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0ICkgPCBlbC5jbGllbnRIZWlnaHQgLyAzICkge1xuXHRcdFx0dG9vbGJhci5nZXQoJ3NwaW5uZXInKS5zaG93KCk7XG5cdFx0fVxuXG5cdFx0aWYgKCBlbC5zY3JvbGxIZWlnaHQgPCBzY3JvbGxUb3AgKyAoIGVsLmNsaWVudEhlaWdodCAqIHRoaXMub3B0aW9ucy5yZWZyZXNoVGhyZXNob2xkICkgKSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24ubW9yZSgpLmRvbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZpZXcuc2Nyb2xsKCk7XG5cdFx0XHRcdHRvb2xiYXIuZ2V0KCdzcGlubmVyJykuaGlkZSgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdHRhY2htZW50cztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgICBbb3B0aW9uc10gICAgICAgICAgICAgICBUaGUgb3B0aW9ucyBoYXNoIHBhc3NlZCB0byB0aGUgdmlldy5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IFtvcHRpb25zLmZpbHRlcnM9ZmFsc2VdIFdoaWNoIGZpbHRlcnMgdG8gc2hvdyBpbiB0aGUgYnJvd3NlcidzIHRvb2xiYXIuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRzICd1cGxvYWRlZCcgYW5kICdhbGwnLlxuICogQHBhcmFtIHtib29sZWFufSAgICAgICAgW29wdGlvbnMuc2VhcmNoPXRydWVdICAgV2hldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW50ZXJmYWNlIGluIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcidzIHRvb2xiYXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICBbb3B0aW9ucy5kYXRlPXRydWVdICAgICBXaGV0aGVyIHRvIHNob3cgdGhlIGRhdGUgZmlsdGVyIGluIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcidzIHRvb2xiYXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICBbb3B0aW9ucy5kaXNwbGF5PWZhbHNlXSBXaGV0aGVyIHRvIHNob3cgdGhlIGF0dGFjaG1lbnRzIGRpc3BsYXkgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgaW4gdGhlIHNpZGViYXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBbb3B0aW9ucy5zaWRlYmFyPXRydWVdICBXaGV0aGVyIHRvIGNyZWF0ZSBhIHNpZGViYXIgZm9yIHRoZSBicm93c2VyLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyB0cnVlLCBmYWxzZSwgYW5kICdlcnJvcnMnLlxuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdG1lZGlhVHJhc2ggPSB3cC5tZWRpYS52aWV3LnNldHRpbmdzLm1lZGlhVHJhc2gsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdCQgPSBqUXVlcnksXG5cdEF0dGFjaG1lbnRzQnJvd3NlcjtcblxuQXR0YWNobWVudHNCcm93c2VyID0gVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50cy1icm93c2VyJyxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdGZpbHRlcnM6IGZhbHNlLFxuXHRcdFx0c2VhcmNoOiAgdHJ1ZSxcblx0XHRcdGRhdGU6ICAgIHRydWUsXG5cdFx0XHRkaXNwbGF5OiBmYWxzZSxcblx0XHRcdHNpZGViYXI6IHRydWUsXG5cdFx0XHRBdHRhY2htZW50Vmlldzogd3AubWVkaWEudmlldy5BdHRhY2htZW50LkxpYnJhcnlcblx0XHR9KTtcblxuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ3RvZ2dsZTp1cGxvYWQ6YXR0YWNobWVudCcsIHRoaXMudG9nZ2xlVXBsb2FkZXIsIHRoaXMgKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdlZGl0OnNlbGVjdGlvbicsIHRoaXMuZWRpdFNlbGVjdGlvbiApO1xuXG5cdFx0Ly8gSW4gdGhlIE1lZGlhIExpYnJhcnksIHRoZSBzaWRlYmFyIGlzIHVzZWQgdG8gZGlzcGxheSBlcnJvcnMgYmVmb3JlIHRoZSBhdHRhY2htZW50cyBncmlkLlxuXHRcdGlmICggdGhpcy5vcHRpb25zLnNpZGViYXIgJiYgJ2Vycm9ycycgPT09IHRoaXMub3B0aW9ucy5zaWRlYmFyICkge1xuXHRcdFx0dGhpcy5jcmVhdGVTaWRlYmFyKCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBGb3IgYWNjZXNzaWJpbGl0eSByZWFzb25zLCBwbGFjZSB0aGUgSW5saW5lIFVwbG9hZGVyIGJlZm9yZSBvdGhlciBzZWN0aW9ucy5cblx0XHQgKiBUaGlzIHdheSwgaW4gdGhlIE1lZGlhIExpYnJhcnksIGl0J3MgcmlnaHQgYWZ0ZXIgdGhlIEFkZCBOZXcgYnV0dG9uLCBzZWUgdGlja2V0ICMzNzE4OC5cblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZVVwbG9hZGVyKCk7XG5cblx0XHQvKlxuXHRcdCAqIENyZWF0ZSBhIG11bHRpLXB1cnBvc2UgdG9vbGJhci4gVXNlZCBhcyBtYWluIHRvb2xiYXIgaW4gdGhlIE1lZGlhIExpYnJhcnlcblx0XHQgKiBhbmQgYWxzbyBmb3Igb3RoZXIgdGhpbmdzLCBmb3IgZXhhbXBsZSB0aGUgXCJEcmFnIGFuZCBkcm9wIHRvIHJlb3JkZXJcIiBhbmRcblx0XHQgKiBcIlN1Z2dlc3RlZCBkaW1lbnNpb25zXCIgaW5mbyBpbiB0aGUgbWVkaWEgbW9kYWwuXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVUb29sYmFyKCk7XG5cblx0XHQvLyBDcmVhdGUgdGhlIGxpc3Qgb2YgYXR0YWNobWVudHMuXG5cdFx0dGhpcy5jcmVhdGVBdHRhY2htZW50cygpO1xuXG5cdFx0Ly8gRm9yIGFjY2Vzc2liaWxpdHkgcmVhc29ucywgcGxhY2UgdGhlIG5vcm1hbCBzaWRlYmFyIGFmdGVyIHRoZSBhdHRhY2htZW50cywgc2VlIHRpY2tldCAjMzY5MDkuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc2lkZWJhciAmJiAnZXJyb3JzJyAhPT0gdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZVNpZGViYXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcblxuXHRcdGlmICggISB0aGlzLm9wdGlvbnMuc2lkZWJhciB8fCAnZXJyb3JzJyA9PT0gdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ2hpZGUtc2lkZWJhcicgKTtcblxuXHRcdFx0aWYgKCAnZXJyb3JzJyA9PT0gdGhpcy5vcHRpb25zLnNpZGViYXIgKSB7XG5cdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnc2lkZWJhci1mb3ItZXJyb3JzJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdGlvbi5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnVwZGF0ZUNvbnRlbnQsIHRoaXMgKTtcblx0fSxcblxuXHRlZGl0U2VsZWN0aW9uOiBmdW5jdGlvbiggbW9kYWwgKSB7XG5cdFx0bW9kYWwuJCggJy5tZWRpYS1idXR0b24tYmFja1RvTGlicmFyeScgKS5mb2N1cygpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdFZpZXcucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNyZWF0ZVRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBMaWJyYXJ5Vmlld1N3aXRjaGVyLCBGaWx0ZXJzLCB0b29sYmFyT3B0aW9ucztcblxuXHRcdHRvb2xiYXJPcHRpb25zID0ge1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cdFx0XHR0b29sYmFyT3B0aW9ucy5jbGFzc05hbWUgPSAnbWVkaWEtdG9vbGJhciB3cC1maWx0ZXInO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCogQG1lbWJlciB7d3AubWVkaWEudmlldy5Ub29sYmFyfVxuXHRcdCovXG5cdFx0dGhpcy50b29sYmFyID0gbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhciggdG9vbGJhck9wdGlvbnMgKTtcblxuXHRcdHRoaXMudmlld3MuYWRkKCB0aGlzLnRvb2xiYXIgKTtcblxuXHRcdHRoaXMudG9vbGJhci5zZXQoICdzcGlubmVyJywgbmV3IHdwLm1lZGlhLnZpZXcuU3Bpbm5lcih7XG5cdFx0XHRwcmlvcml0eTogLTYwXG5cdFx0fSkgKTtcblxuXHRcdGlmICggLTEgIT09ICQuaW5BcnJheSggdGhpcy5vcHRpb25zLmZpbHRlcnMsIFsgJ3VwbG9hZGVkJywgJ2FsbCcgXSApICkge1xuXHRcdFx0Ly8gXCJGaWx0ZXJzXCIgd2lsbCByZXR1cm4gYSA8c2VsZWN0PiwgbmVlZCB0byByZW5kZXJcblx0XHRcdC8vIHNjcmVlbiByZWFkZXIgdGV4dCBiZWZvcmVcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdmaWx0ZXJzTGFiZWwnLCBuZXcgd3AubWVkaWEudmlldy5MYWJlbCh7XG5cdFx0XHRcdHZhbHVlOiBsMTBuLmZpbHRlckJ5VHlwZSxcblx0XHRcdFx0YXR0cmlidXRlczoge1xuXHRcdFx0XHRcdCdmb3InOiAgJ21lZGlhLWF0dGFjaG1lbnQtZmlsdGVycydcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgLTgwXG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXG5cdFx0XHRpZiAoICd1cGxvYWRlZCcgPT09IHRoaXMub3B0aW9ucy5maWx0ZXJzICkge1xuXHRcdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZmlsdGVycycsIG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLlVwbG9hZGVkKHtcblx0XHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0bW9kZWw6ICAgICAgdGhpcy5jb2xsZWN0aW9uLnByb3BzLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAgIC04MFxuXHRcdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0RmlsdGVycyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRGaWx0ZXJzLkFsbCh7XG5cdFx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdG1vZGVsOiAgICAgIHRoaXMuY29sbGVjdGlvbi5wcm9wcyxcblx0XHRcdFx0XHRwcmlvcml0eTogICAtODBcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2ZpbHRlcnMnLCBGaWx0ZXJzLnJlbmRlcigpICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmVlbHMgb2RkIHRvIGJyaW5nIHRoZSBnbG9iYWwgbWVkaWEgbGlicmFyeSBzd2l0Y2hlciBpbnRvIHRoZSBBdHRhY2htZW50XG5cdFx0Ly8gYnJvd3NlciB2aWV3LiBJcyB0aGlzIGEgdXNlIGNhc2UgZm9yIGRvQWN0aW9uKCAnYWRkOnRvb2xiYXItaXRlbXM6YXR0YWNobWVudHMtYnJvd3NlcicsIHRoaXMudG9vbGJhciApO1xuXHRcdC8vIHdoaWNoIHRoZSBjb250cm9sbGVyIGNhbiB0YXAgaW50byBhbmQgYWRkIHRoaXMgdmlldz9cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApICkge1xuXHRcdFx0TGlicmFyeVZpZXdTd2l0Y2hlciA9IFZpZXcuZXh0ZW5kKHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAndmlldy1zd2l0Y2ggbWVkaWEtZ3JpZC12aWV3LXN3aXRjaCcsXG5cdFx0XHRcdHRlbXBsYXRlOiB3cC50ZW1wbGF0ZSggJ21lZGlhLWxpYnJhcnktdmlldy1zd2l0Y2hlcicpXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2xpYnJhcnlWaWV3U3dpdGNoZXInLCBuZXcgTGlicmFyeVZpZXdTd2l0Y2hlcih7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC05MFxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0Ly8gRGF0ZUZpbHRlciBpcyBhIDxzZWxlY3Q+LCBzY3JlZW4gcmVhZGVyIHRleHQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgYmVmb3JlXG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGF0ZUZpbHRlckxhYmVsJywgbmV3IHdwLm1lZGlhLnZpZXcuTGFiZWwoe1xuXHRcdFx0XHR2YWx1ZTogbDEwbi5maWx0ZXJCeURhdGUsXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdFx0XHQnZm9yJzogJ21lZGlhLWF0dGFjaG1lbnQtZGF0ZS1maWx0ZXJzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogLTc1XG5cdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RhdGVGaWx0ZXInLCBuZXcgd3AubWVkaWEudmlldy5EYXRlRmlsdGVyKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRtb2RlbDogICAgICB0aGlzLmNvbGxlY3Rpb24ucHJvcHMsXG5cdFx0XHRcdHByaW9yaXR5OiAtNzVcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cblx0XHRcdC8vIEJ1bGtTZWxlY3Rpb24gaXMgYSA8ZGl2PiB3aXRoIHN1YnZpZXdzLCBpbmNsdWRpbmcgc2NyZWVuIHJlYWRlciB0ZXh0XG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnc2VsZWN0TW9kZVRvZ2dsZUJ1dHRvbicsIG5ldyB3cC5tZWRpYS52aWV3LlNlbGVjdE1vZGVUb2dnbGVCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsMTBuLmJ1bGtTZWxlY3QsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC03MFxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ2RlbGV0ZVNlbGVjdGVkQnV0dG9uJywgbmV3IHdwLm1lZGlhLnZpZXcuRGVsZXRlU2VsZWN0ZWRCdXR0b24oe1xuXHRcdFx0XHRmaWx0ZXJzOiBGaWx0ZXJzLFxuXHRcdFx0XHRzdHlsZTogJ3ByaW1hcnknLFxuXHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcblx0XHRcdFx0dGV4dDogbWVkaWFUcmFzaCA/IGwxMG4udHJhc2hTZWxlY3RlZCA6IGwxMG4uZGVsZXRlU2VsZWN0ZWQsXG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0cHJpb3JpdHk6IC02MCxcblx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciBjaGFuZ2VkID0gW10sIHJlbW92ZWQgPSBbXSxcblx0XHRcdFx0XHRcdHNlbGVjdGlvbiA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLmdldCggJ3NlbGVjdGlvbicgKSxcblx0XHRcdFx0XHRcdGxpYnJhcnkgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoICdsaWJyYXJ5JyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIHNlbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIG1lZGlhVHJhc2ggJiYgISB3aW5kb3cuY29uZmlybSggbDEwbi53YXJuQnVsa0RlbGV0ZSApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggbWVkaWFUcmFzaCAmJlxuXHRcdFx0XHRcdFx0J3RyYXNoJyAhPT0gc2VsZWN0aW9uLmF0KCAwICkuZ2V0KCAnc3RhdHVzJyApICYmXG5cdFx0XHRcdFx0XHQhIHdpbmRvdy5jb25maXJtKCBsMTBuLndhcm5CdWxrVHJhc2ggKSApIHtcblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNlbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICEgbW9kZWwuZ2V0KCAnbm9uY2VzJyApWydkZWxldGUnXSApIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlZC5wdXNoKCBtb2RlbCApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICggbWVkaWFUcmFzaCAmJiAndHJhc2gnID09PSBtb2RlbC5nZXQoICdzdGF0dXMnICkgKSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsLnNldCggJ3N0YXR1cycsICdpbmhlcml0JyApO1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VkLnB1c2goIG1vZGVsLnNhdmUoKSApO1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVkLnB1c2goIG1vZGVsICk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBtZWRpYVRyYXNoICkge1xuXHRcdFx0XHRcdFx0XHRtb2RlbC5zZXQoICdzdGF0dXMnLCAndHJhc2gnICk7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZWQucHVzaCggbW9kZWwuc2F2ZSgpICk7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZWQucHVzaCggbW9kZWwgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsLmRlc3Ryb3koe3dhaXQ6IHRydWV9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHRpZiAoIGNoYW5nZWQubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLnJlbW92ZSggcmVtb3ZlZCApO1xuXG5cdFx0XHRcdFx0XHQkLndoZW4uYXBwbHkoIG51bGwsIGNoYW5nZWQgKS50aGVuKCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRsaWJyYXJ5Ll9yZXF1ZXJ5KCB0cnVlICk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJyApO1xuXHRcdFx0XHRcdFx0fSwgdGhpcyApICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCAnc2VsZWN0aW9uOmFjdGlvbjpkb25lJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblxuXHRcdFx0aWYgKCBtZWRpYVRyYXNoICkge1xuXHRcdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGVsZXRlU2VsZWN0ZWRQZXJtYW5lbnRseUJ1dHRvbicsIG5ldyB3cC5tZWRpYS52aWV3LkRlbGV0ZVNlbGVjdGVkUGVybWFuZW50bHlCdXR0b24oe1xuXHRcdFx0XHRcdGZpbHRlcnM6IEZpbHRlcnMsXG5cdFx0XHRcdFx0c3R5bGU6ICdwcmltYXJ5Jyxcblx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHR0ZXh0OiBsMTBuLmRlbGV0ZVNlbGVjdGVkLFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRwcmlvcml0eTogLTU1LFxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciByZW1vdmVkID0gW10sXG5cdFx0XHRcdFx0XHRcdGRlc3Ryb3kgPSBbXSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uID0gdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCAnc2VsZWN0aW9uJyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoICEgc2VsZWN0aW9uLmxlbmd0aCB8fCAhIHdpbmRvdy5jb25maXJtKCBsMTBuLndhcm5CdWxrRGVsZXRlICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBtb2RlbCApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhIG1vZGVsLmdldCggJ25vbmNlcycgKVsnZGVsZXRlJ10gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVtb3ZlZC5wdXNoKCBtb2RlbCApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGRlc3Ryb3kucHVzaCggbW9kZWwgKTtcblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdFx0aWYgKCByZW1vdmVkLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uLnJlbW92ZSggcmVtb3ZlZCApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIGRlc3Ryb3kubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHQkLndoZW4uYXBwbHkoIG51bGwsIGRlc3Ryb3kubWFwKCBmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fSApICkudGhlbiggXy5iaW5kKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIudHJpZ2dlciggJ3NlbGVjdGlvbjphY3Rpb246ZG9uZScgKTtcblx0XHRcdFx0XHRcdFx0fSwgdGhpcyApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5yZW5kZXIoKSApO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5vcHRpb25zLmRhdGUgKSB7XG5cdFx0XHQvLyBEYXRlRmlsdGVyIGlzIGEgPHNlbGVjdD4sIHNjcmVlbiByZWFkZXIgdGV4dCBuZWVkcyB0byBiZSByZW5kZXJlZCBiZWZvcmVcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdkYXRlRmlsdGVyTGFiZWwnLCBuZXcgd3AubWVkaWEudmlldy5MYWJlbCh7XG5cdFx0XHRcdHZhbHVlOiBsMTBuLmZpbHRlckJ5RGF0ZSxcblx0XHRcdFx0YXR0cmlidXRlczoge1xuXHRcdFx0XHRcdCdmb3InOiAnbWVkaWEtYXR0YWNobWVudC1kYXRlLWZpbHRlcnMnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByaW9yaXR5OiAtNzVcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZGF0ZUZpbHRlcicsIG5ldyB3cC5tZWRpYS52aWV3LkRhdGVGaWx0ZXIoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdG1vZGVsOiAgICAgIHRoaXMuY29sbGVjdGlvbi5wcm9wcyxcblx0XHRcdFx0cHJpb3JpdHk6IC03NVxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zZWFyY2ggKSB7XG5cdFx0XHQvLyBTZWFyY2ggaXMgYW4gaW5wdXQsIHNjcmVlbiByZWFkZXIgdGV4dCBuZWVkcyB0byBiZSByZW5kZXJlZCBiZWZvcmVcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdzZWFyY2hMYWJlbCcsIG5ldyB3cC5tZWRpYS52aWV3LkxhYmVsKHtcblx0XHRcdFx0dmFsdWU6IGwxMG4uc2VhcmNoTWVkaWFMYWJlbCxcblx0XHRcdFx0YXR0cmlidXRlczoge1xuXHRcdFx0XHRcdCdmb3InOiAnbWVkaWEtc2VhcmNoLWlucHV0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcmlvcml0eTogICA2MFxuXHRcdFx0fSkucmVuZGVyKCkgKTtcblx0XHRcdHRoaXMudG9vbGJhci5zZXQoICdzZWFyY2gnLCBuZXcgd3AubWVkaWEudmlldy5TZWFyY2goe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdG1vZGVsOiAgICAgIHRoaXMuY29sbGVjdGlvbi5wcm9wcyxcblx0XHRcdFx0cHJpb3JpdHk6ICAgNjBcblx0XHRcdH0pLnJlbmRlcigpICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHJhZ0luZm8gKSB7XG5cdFx0XHR0aGlzLnRvb2xiYXIuc2V0KCAnZHJhZ0luZm8nLCBuZXcgVmlldyh7XG5cdFx0XHRcdGVsOiAkKCAnPGRpdiBjbGFzcz1cImluc3RydWN0aW9uc1wiPicgKyBsMTBuLmRyYWdJbmZvICsgJzwvZGl2PicgKVswXSxcblx0XHRcdFx0cHJpb3JpdHk6IC00MFxuXHRcdFx0fSkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdWdnZXN0ZWRXaWR0aCAmJiB0aGlzLm9wdGlvbnMuc3VnZ2VzdGVkSGVpZ2h0ICkge1xuXHRcdFx0dGhpcy50b29sYmFyLnNldCggJ3N1Z2dlc3RlZERpbWVuc2lvbnMnLCBuZXcgVmlldyh7XG5cdFx0XHRcdGVsOiAkKCAnPGRpdiBjbGFzcz1cImluc3RydWN0aW9uc1wiPicgKyBsMTBuLnN1Z2dlc3RlZERpbWVuc2lvbnMgKyAnICcgKyB0aGlzLm9wdGlvbnMuc3VnZ2VzdGVkV2lkdGggKyAnICZ0aW1lczsgJyArIHRoaXMub3B0aW9ucy5zdWdnZXN0ZWRIZWlnaHQgKyAnPC9kaXY+JyApWzBdLFxuXHRcdFx0XHRwcmlvcml0eTogLTQwXG5cdFx0XHR9KSApO1xuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlldyA9IHRoaXMsXG5cdFx0XHRub0l0ZW1zVmlldztcblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLmlzTW9kZUFjdGl2ZSggJ2dyaWQnICkgKSB7XG5cdFx0XHRub0l0ZW1zVmlldyA9IHZpZXcuYXR0YWNobWVudHNOb1Jlc3VsdHM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vSXRlbXNWaWV3ID0gdmlldy51cGxvYWRlcjtcblx0XHR9XG5cblx0XHRpZiAoICEgdGhpcy5jb2xsZWN0aW9uLmxlbmd0aCApIHtcblx0XHRcdHRoaXMudG9vbGJhci5nZXQoICdzcGlubmVyJyApLnNob3coKTtcblx0XHRcdHRoaXMuZGZkID0gdGhpcy5jb2xsZWN0aW9uLm1vcmUoKS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhIHZpZXcuY29sbGVjdGlvbi5sZW5ndGggKSB7XG5cdFx0XHRcdFx0bm9JdGVtc1ZpZXcuJGVsLnJlbW92ZUNsYXNzKCAnaGlkZGVuJyApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5vSXRlbXNWaWV3LiRlbC5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2aWV3LnRvb2xiYXIuZ2V0KCAnc3Bpbm5lcicgKS5oaWRlKCk7XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vSXRlbXNWaWV3LiRlbC5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0XHRcdHZpZXcudG9vbGJhci5nZXQoICdzcGlubmVyJyApLmhpZGUoKTtcblx0XHR9XG5cdH0sXG5cblx0Y3JlYXRlVXBsb2FkZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBsb2FkZXIgPSBuZXcgd3AubWVkaWEudmlldy5VcGxvYWRlcklubGluZSh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRzdGF0dXM6ICAgICBmYWxzZSxcblx0XHRcdG1lc3NhZ2U6ICAgIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApID8gJycgOiBsMTBuLm5vSXRlbXNGb3VuZCxcblx0XHRcdGNhbkNsb3NlOiAgIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVwbG9hZGVyLiRlbC5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0XHR0aGlzLnZpZXdzLmFkZCggdGhpcy51cGxvYWRlciApO1xuXHR9LFxuXG5cdHRvZ2dsZVVwbG9hZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMudXBsb2FkZXIuJGVsLmhhc0NsYXNzKCAnaGlkZGVuJyApICkge1xuXHRcdFx0dGhpcy51cGxvYWRlci5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudXBsb2FkZXIuaGlkZSgpO1xuXHRcdH1cblx0fSxcblxuXHRjcmVhdGVBdHRhY2htZW50czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hdHRhY2htZW50cyA9IG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzKHtcblx0XHRcdGNvbnRyb2xsZXI6ICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRjb2xsZWN0aW9uOiAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0c2VsZWN0aW9uOiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZWxlY3Rpb24sXG5cdFx0XHRtb2RlbDogICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcblx0XHRcdHNvcnRhYmxlOiAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc29ydGFibGUsXG5cdFx0XHRzY3JvbGxFbGVtZW50OiAgICAgICAgdGhpcy5vcHRpb25zLnNjcm9sbEVsZW1lbnQsXG5cdFx0XHRpZGVhbENvbHVtbldpZHRoOiAgICAgdGhpcy5vcHRpb25zLmlkZWFsQ29sdW1uV2lkdGgsXG5cblx0XHRcdC8vIFRoZSBzaW5nbGUgYEF0dGFjaG1lbnRgIHZpZXcgdG8gYmUgdXNlZCBpbiB0aGUgYEF0dGFjaG1lbnRzYCB2aWV3LlxuXHRcdFx0QXR0YWNobWVudFZpZXc6IHRoaXMub3B0aW9ucy5BdHRhY2htZW50Vmlld1xuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGtleWRvd24gbGlzdGVuZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoZSBBdHRhY2htZW50cyB2aWV3XG5cdFx0dGhpcy5jb250cm9sbGVyLm9uKCAnYXR0YWNobWVudDprZXlkb3duOmFycm93JywgICAgIF8uYmluZCggdGhpcy5hdHRhY2htZW50cy5hcnJvd0V2ZW50LCB0aGlzLmF0dGFjaG1lbnRzICkgKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdhdHRhY2htZW50OmRldGFpbHM6c2hpZnQtdGFiJywgXy5iaW5kKCB0aGlzLmF0dGFjaG1lbnRzLnJlc3RvcmVGb2N1cywgdGhpcy5hdHRhY2htZW50cyApICk7XG5cblx0XHR0aGlzLnZpZXdzLmFkZCggdGhpcy5hdHRhY2htZW50cyApO1xuXG5cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci5pc01vZGVBY3RpdmUoICdncmlkJyApICkge1xuXHRcdFx0dGhpcy5hdHRhY2htZW50c05vUmVzdWx0cyA9IG5ldyBWaWV3KHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHR0YWdOYW1lOiAncCdcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmF0dGFjaG1lbnRzTm9SZXN1bHRzLiRlbC5hZGRDbGFzcyggJ2hpZGRlbiBuby1tZWRpYScgKTtcblx0XHRcdHRoaXMuYXR0YWNobWVudHNOb1Jlc3VsdHMuJGVsLmh0bWwoIGwxMG4ubm9NZWRpYSApO1xuXG5cdFx0XHR0aGlzLnZpZXdzLmFkZCggdGhpcy5hdHRhY2htZW50c05vUmVzdWx0cyApO1xuXHRcdH1cblx0fSxcblxuXHRjcmVhdGVTaWRlYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcblx0XHRcdHNlbGVjdGlvbiA9IG9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0c2lkZWJhciA9IHRoaXMuc2lkZWJhciA9IG5ldyB3cC5tZWRpYS52aWV3LlNpZGViYXIoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXJcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy52aWV3cy5hZGQoIHNpZGViYXIgKTtcblxuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLnVwbG9hZGVyICkge1xuXHRcdFx0c2lkZWJhci5zZXQoICd1cGxvYWRzJywgbmV3IHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXMoe1xuXHRcdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdHByaW9yaXR5OiAgIDQwXG5cdFx0XHR9KSApO1xuXHRcdH1cblxuXHRcdHNlbGVjdGlvbi5vbiggJ3NlbGVjdGlvbjpzaW5nbGUnLCB0aGlzLmNyZWF0ZVNpbmdsZSwgdGhpcyApO1xuXHRcdHNlbGVjdGlvbi5vbiggJ3NlbGVjdGlvbjp1bnNpbmdsZScsIHRoaXMuZGlzcG9zZVNpbmdsZSwgdGhpcyApO1xuXG5cdFx0aWYgKCBzZWxlY3Rpb24uc2luZ2xlKCkgKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZVNpbmdsZSgpO1xuXHRcdH1cblx0fSxcblxuXHRjcmVhdGVTaW5nbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzaWRlYmFyID0gdGhpcy5zaWRlYmFyLFxuXHRcdFx0c2luZ2xlID0gdGhpcy5vcHRpb25zLnNlbGVjdGlvbi5zaW5nbGUoKTtcblxuXHRcdHNpZGViYXIuc2V0KCAnZGV0YWlscycsIG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnQuRGV0YWlscyh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRtb2RlbDogICAgICBzaW5nbGUsXG5cdFx0XHRwcmlvcml0eTogICA4MFxuXHRcdH0pICk7XG5cblx0XHRzaWRlYmFyLnNldCggJ2NvbXBhdCcsIG5ldyB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRDb21wYXQoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0bW9kZWw6ICAgICAgc2luZ2xlLFxuXHRcdFx0cHJpb3JpdHk6ICAgMTIwXG5cdFx0fSkgKTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgKSB7XG5cdFx0XHRzaWRlYmFyLnNldCggJ2Rpc3BsYXknLCBuZXcgd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheSh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6ICAgdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRtb2RlbDogICAgICAgIHRoaXMubW9kZWwuZGlzcGxheSggc2luZ2xlICksXG5cdFx0XHRcdGF0dGFjaG1lbnQ6ICAgc2luZ2xlLFxuXHRcdFx0XHRwcmlvcml0eTogICAgIDE2MCxcblx0XHRcdFx0dXNlclNldHRpbmdzOiB0aGlzLm1vZGVsLmdldCgnZGlzcGxheVVzZXJTZXR0aW5ncycpXG5cdFx0XHR9KSApO1xuXHRcdH1cblxuXHRcdC8vIFNob3cgdGhlIHNpZGViYXIgb24gbW9iaWxlXG5cdFx0aWYgKCB0aGlzLm1vZGVsLmlkID09PSAnaW5zZXJ0JyApIHtcblx0XHRcdHNpZGViYXIuJGVsLmFkZENsYXNzKCAndmlzaWJsZScgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcG9zZVNpbmdsZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNpZGViYXIgPSB0aGlzLnNpZGViYXI7XG5cdFx0c2lkZWJhci51bnNldCgnZGV0YWlscycpO1xuXHRcdHNpZGViYXIudW5zZXQoJ2NvbXBhdCcpO1xuXHRcdHNpZGViYXIudW5zZXQoJ2Rpc3BsYXknKTtcblx0XHQvLyBIaWRlIHRoZSBzaWRlYmFyIG9uIG1vYmlsZVxuXHRcdHNpZGViYXIuJGVsLnJlbW92ZUNsYXNzKCAndmlzaWJsZScgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXR0YWNobWVudHNCcm93c2VyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkF0dGFjaG1lbnRzLlNlbGVjdGlvblxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudHNcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEF0dGFjaG1lbnRzID0gd3AubWVkaWEudmlldy5BdHRhY2htZW50cyxcblx0U2VsZWN0aW9uO1xuXG5TZWxlY3Rpb24gPSBBdHRhY2htZW50cy5leHRlbmQoe1xuXHRldmVudHM6IHt9LFxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHNvcnRhYmxlOiAgIGZhbHNlLFxuXHRcdFx0cmVzaXplOiAgICAgZmFsc2UsXG5cblx0XHRcdC8vIFRoZSBzaW5nbGUgYEF0dGFjaG1lbnRgIHZpZXcgdG8gYmUgdXNlZCBpbiB0aGUgYEF0dGFjaG1lbnRzYCB2aWV3LlxuXHRcdFx0QXR0YWNobWVudFZpZXc6IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudC5TZWxlY3Rpb25cblx0XHR9KTtcblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdHJldHVybiBBdHRhY2htZW50cy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdGlvbjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5CdXR0b25Hcm91cFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgJCA9IEJhY2tib25lLiQsXG5cdEJ1dHRvbkdyb3VwO1xuXG5CdXR0b25Hcm91cCA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZGl2Jyxcblx0Y2xhc3NOYW1lOiAnYnV0dG9uLWdyb3VwIGJ1dHRvbi1sYXJnZSBtZWRpYS1idXR0b24tZ3JvdXAnLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZW1iZXIge3dwLm1lZGlhLnZpZXcuQnV0dG9uW119XG5cdFx0ICovXG5cdFx0dGhpcy5idXR0b25zID0gXy5tYXAoIHRoaXMub3B0aW9ucy5idXR0b25zIHx8IFtdLCBmdW5jdGlvbiggYnV0dG9uICkge1xuXHRcdFx0aWYgKCBidXR0b24gaW5zdGFuY2VvZiBCYWNrYm9uZS5WaWV3ICkge1xuXHRcdFx0XHRyZXR1cm4gYnV0dG9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG5ldyB3cC5tZWRpYS52aWV3LkJ1dHRvbiggYnV0dG9uICkucmVuZGVyKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRkZWxldGUgdGhpcy5vcHRpb25zLmJ1dHRvbnM7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5jbGFzc2VzICkge1xuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoIHRoaXMub3B0aW9ucy5jbGFzc2VzICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5CdXR0b25Hcm91cH1cblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuaHRtbCggJCggXy5wbHVjayggdGhpcy5idXR0b25zLCAnZWwnICkgKS5kZXRhY2goKSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCdXR0b25Hcm91cDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5CdXR0b25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEJ1dHRvbiA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAgJ2J1dHRvbicsXG5cdGNsYXNzTmFtZTogICdtZWRpYS1idXR0b24nLFxuXHRhdHRyaWJ1dGVzOiB7IHR5cGU6ICdidXR0b24nIH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrJzogJ2NsaWNrJ1xuXHR9LFxuXG5cdGRlZmF1bHRzOiB7XG5cdFx0dGV4dDogICAgICcnLFxuXHRcdHN0eWxlOiAgICAnJyxcblx0XHRzaXplOiAgICAgJ2xhcmdlJyxcblx0XHRkaXNhYmxlZDogZmFsc2Vcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHQvKipcblx0XHQgKiBDcmVhdGUgYSBtb2RlbCB3aXRoIHRoZSBwcm92aWRlZCBgZGVmYXVsdHNgLlxuXHRcdCAqXG5cdFx0ICogQG1lbWJlciB7QmFja2JvbmUuTW9kZWx9XG5cdFx0ICovXG5cdFx0dGhpcy5tb2RlbCA9IG5ldyBCYWNrYm9uZS5Nb2RlbCggdGhpcy5kZWZhdWx0cyApO1xuXG5cdFx0Ly8gSWYgYW55IG9mIHRoZSBgb3B0aW9uc2AgaGF2ZSBhIGtleSBmcm9tIGBkZWZhdWx0c2AsIGFwcGx5IGl0c1xuXHRcdC8vIHZhbHVlIHRvIHRoZSBgbW9kZWxgIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYG9wdGlvbnMgb2JqZWN0LlxuXHRcdF8uZWFjaCggdGhpcy5kZWZhdWx0cywgZnVuY3Rpb24oIGRlZiwga2V5ICkge1xuXHRcdFx0dmFyIHZhbHVlID0gdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdGlmICggXy5pc1VuZGVmaW5lZCggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vZGVsLnNldCgga2V5LCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHRoaXMub3B0aW9uc1sga2V5IF07XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZScsIHRoaXMucmVuZGVyICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5CdXR0b259IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjbGFzc2VzID0gWyAnYnV0dG9uJywgdGhpcy5jbGFzc05hbWUgXSxcblx0XHRcdG1vZGVsID0gdGhpcy5tb2RlbC50b0pTT04oKTtcblxuXHRcdGlmICggbW9kZWwuc3R5bGUgKSB7XG5cdFx0XHRjbGFzc2VzLnB1c2goICdidXR0b24tJyArIG1vZGVsLnN0eWxlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBtb2RlbC5zaXplICkge1xuXHRcdFx0Y2xhc3Nlcy5wdXNoKCAnYnV0dG9uLScgKyBtb2RlbC5zaXplICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IF8udW5pcSggY2xhc3Nlcy5jb25jYXQoIHRoaXMub3B0aW9ucy5jbGFzc2VzICkgKTtcblx0XHR0aGlzLmVsLmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpO1xuXG5cdFx0dGhpcy4kZWwuYXR0ciggJ2Rpc2FibGVkJywgbW9kZWwuZGlzYWJsZWQgKTtcblx0XHR0aGlzLiRlbC50ZXh0KCB0aGlzLm1vZGVsLmdldCgndGV4dCcpICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0Y2xpY2s6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoICcjJyA9PT0gdGhpcy5hdHRyaWJ1dGVzLmhyZWYgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmNsaWNrICYmICEgdGhpcy5tb2RlbC5nZXQoJ2Rpc2FibGVkJykgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuY2xpY2suYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQnV0dG9uO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkNyb3BwZXJcbiAqXG4gKiBVc2VzIHRoZSBpbWdBcmVhU2VsZWN0IHBsdWdpbiB0byBhbGxvdyBhIHVzZXIgdG8gY3JvcCBhbiBpbWFnZS5cbiAqXG4gKiBUYWtlcyBpbWdBcmVhU2VsZWN0IG9wdGlvbnMgZnJvbVxuICogd3AuY3VzdG9taXplLkhlYWRlckNvbnRyb2wuY2FsY3VsYXRlSW1hZ2VTZWxlY3RPcHRpb25zIHZpYVxuICogd3AuY3VzdG9taXplLkhlYWRlckNvbnRyb2wub3Blbk1NLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdFVwbG9hZGVyU3RhdHVzID0gd3AubWVkaWEudmlldy5VcGxvYWRlclN0YXR1cyxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0JCA9IGpRdWVyeSxcblx0Q3JvcHBlcjtcblxuQ3JvcHBlciA9IFZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnY3JvcC1jb250ZW50Jyxcblx0dGVtcGxhdGU6IHdwLnRlbXBsYXRlKCdjcm9wLWNvbnRlbnQnKSxcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMsICdvbkltYWdlTG9hZCcpO1xuXHR9LFxuXHRyZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLmZyYW1lLm9uKCdjb250ZW50OmVycm9yOmNyb3AnLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuXHRcdHRoaXMuJGltYWdlID0gdGhpcy4kZWwuZmluZCgnLmNyb3AtaW1hZ2UnKTtcblx0XHR0aGlzLiRpbWFnZS5vbignbG9hZCcsIHRoaXMub25JbWFnZUxvYWQpO1xuXHRcdCQod2luZG93KS5vbigncmVzaXplLmNyb3BwZXInLCBfLmRlYm91bmNlKHRoaXMub25JbWFnZUxvYWQsIDI1MCkpO1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdCQod2luZG93KS5vZmYoJ3Jlc2l6ZS5jcm9wcGVyJyk7XG5cdFx0dGhpcy4kZWwucmVtb3ZlKCk7XG5cdFx0dGhpcy4kZWwub2ZmKCk7XG5cdFx0Vmlldy5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogbDEwbi5jcm9wWW91ckltYWdlLFxuXHRcdFx0dXJsOiB0aGlzLm9wdGlvbnMuYXR0YWNobWVudC5nZXQoJ3VybCcpXG5cdFx0fTtcblx0fSxcblx0b25JbWFnZUxvYWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbWdPcHRpb25zID0gdGhpcy5jb250cm9sbGVyLmdldCgnaW1nU2VsZWN0T3B0aW9ucycpO1xuXHRcdGlmICh0eXBlb2YgaW1nT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0aW1nT3B0aW9ucyA9IGltZ09wdGlvbnModGhpcy5vcHRpb25zLmF0dGFjaG1lbnQsIHRoaXMuY29udHJvbGxlcik7XG5cdFx0fVxuXG5cdFx0aW1nT3B0aW9ucyA9IF8uZXh0ZW5kKGltZ09wdGlvbnMsIHtwYXJlbnQ6IHRoaXMuJGVsfSk7XG5cdFx0dGhpcy50cmlnZ2VyKCdpbWFnZS1sb2FkZWQnKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIuaW1nU2VsZWN0ID0gdGhpcy4kaW1hZ2UuaW1nQXJlYVNlbGVjdChpbWdPcHRpb25zKTtcblx0fSxcblx0b25FcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbGVuYW1lID0gdGhpcy5vcHRpb25zLmF0dGFjaG1lbnQuZ2V0KCdmaWxlbmFtZScpO1xuXG5cdFx0dGhpcy52aWV3cy5hZGQoICcudXBsb2FkLWVycm9ycycsIG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzRXJyb3Ioe1xuXHRcdFx0ZmlsZW5hbWU6IFVwbG9hZGVyU3RhdHVzLnByb3RvdHlwZS5maWxlbmFtZShmaWxlbmFtZSksXG5cdFx0XHRtZXNzYWdlOiB3aW5kb3cuX3dwTWVkaWFWaWV3c0wxMG4uY3JvcEVycm9yXG5cdFx0fSksIHsgYXQ6IDAgfSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENyb3BwZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuRWRpdEltYWdlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0RWRpdEltYWdlO1xuXG5FZGl0SW1hZ2UgPSBWaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ2ltYWdlLWVkaXRvcicsXG5cdHRlbXBsYXRlOiB3cC50ZW1wbGF0ZSgnaW1hZ2UtZWRpdG9yJyksXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5lZGl0b3IgPSB3aW5kb3cuaW1hZ2VFZGl0O1xuXHRcdHRoaXMuY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlcjtcblx0XHRWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRwcmVwYXJlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oKTtcblx0fSxcblxuXHRsb2FkRWRpdG9yOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZGZkID0gdGhpcy5lZGl0b3Iub3BlbiggdGhpcy5tb2RlbC5nZXQoJ2lkJyksIHRoaXMubW9kZWwuZ2V0KCdub25jZXMnKS5lZGl0LCB0aGlzICk7XG5cdFx0ZGZkLmRvbmUoIF8uYmluZCggdGhpcy5mb2N1cywgdGhpcyApICk7XG5cdH0sXG5cblx0Zm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCggJy5pbWdlZGl0LXN1Ym1pdCAuYnV0dG9uJyApLmVxKCAwICkuZm9jdXMoKTtcblx0fSxcblxuXHRiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGFzdFN0YXRlID0gdGhpcy5jb250cm9sbGVyLmxhc3RTdGF0ZSgpO1xuXHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggbGFzdFN0YXRlICk7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5mZXRjaCgpO1xuXHR9LFxuXG5cdHNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsYXN0U3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIubGFzdFN0YXRlKCk7XG5cblx0XHR0aGlzLm1vZGVsLmZldGNoKCkuZG9uZSggXy5iaW5kKCBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggbGFzdFN0YXRlICk7XG5cdFx0fSwgdGhpcyApICk7XG5cdH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRWRpdEltYWdlO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LkVtYmVkXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBFbWJlZCA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnbWVkaWEtZW1iZWQnLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZW1iZXIge3dwLm1lZGlhLnZpZXcuRW1iZWRVcmx9XG5cdFx0ICovXG5cdFx0dGhpcy51cmwgPSBuZXcgd3AubWVkaWEudmlldy5FbWJlZFVybCh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRtb2RlbDogICAgICB0aGlzLm1vZGVsLnByb3BzXG5cdFx0fSkucmVuZGVyKCk7XG5cblx0XHR0aGlzLnZpZXdzLnNldChbIHRoaXMudXJsIF0pO1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6dHlwZScsIHRoaXMucmVmcmVzaCApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6bG9hZGluZycsIHRoaXMubG9hZGluZyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmlld1xuXHQgKi9cblx0c2V0dGluZ3M6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdGlmICggdGhpcy5fc2V0dGluZ3MgKSB7XG5cdFx0XHR0aGlzLl9zZXR0aW5ncy5yZW1vdmUoKTtcblx0XHR9XG5cdFx0dGhpcy5fc2V0dGluZ3MgPSB2aWV3O1xuXHRcdHRoaXMudmlld3MuYWRkKCB2aWV3ICk7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHR5cGUgPSB0aGlzLm1vZGVsLmdldCgndHlwZScpLFxuXHRcdFx0Y29uc3RydWN0b3I7XG5cblx0XHRpZiAoICdpbWFnZScgPT09IHR5cGUgKSB7XG5cdFx0XHRjb25zdHJ1Y3RvciA9IHdwLm1lZGlhLnZpZXcuRW1iZWRJbWFnZTtcblx0XHR9IGVsc2UgaWYgKCAnbGluaycgPT09IHR5cGUgKSB7XG5cdFx0XHRjb25zdHJ1Y3RvciA9IHdwLm1lZGlhLnZpZXcuRW1iZWRMaW5rO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXR0aW5ncyggbmV3IGNvbnN0cnVjdG9yKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlcixcblx0XHRcdG1vZGVsOiAgICAgIHRoaXMubW9kZWwucHJvcHMsXG5cdFx0XHRwcmlvcml0eTogICA0MFxuXHRcdH0pICk7XG5cdH0sXG5cblx0bG9hZGluZzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwudG9nZ2xlQ2xhc3MoICdlbWJlZC1sb2FkaW5nJywgdGhpcy5tb2RlbC5nZXQoJ2xvYWRpbmcnKSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWJlZDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5FbWJlZEltYWdlXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEF0dGFjaG1lbnREaXNwbGF5ID0gd3AubWVkaWEudmlldy5TZXR0aW5ncy5BdHRhY2htZW50RGlzcGxheSxcblx0RW1iZWRJbWFnZTtcblxuRW1iZWRJbWFnZSA9IEF0dGFjaG1lbnREaXNwbGF5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ2VtYmVkLW1lZGlhLXNldHRpbmdzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnZW1iZWQtaW1hZ2Utc2V0dGluZ3MnKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHQvKipcblx0XHQgKiBDYWxsIGBpbml0aWFsaXplYCBkaXJlY3RseSBvbiBwYXJlbnQgY2xhc3Mgd2l0aCBwYXNzZWQgYXJndW1lbnRzXG5cdFx0ICovXG5cdFx0QXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6dXJsJywgdGhpcy51cGRhdGVJbWFnZSApO1xuXHR9LFxuXG5cdHVwZGF0ZUltYWdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiQoJ2ltZycpLmF0dHIoICdzcmMnLCB0aGlzLm1vZGVsLmdldCgndXJsJykgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1iZWRJbWFnZTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5FbWJlZExpbmtcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciAkID0galF1ZXJ5LFxuXHRFbWJlZExpbms7XG5cbkVtYmVkTGluayA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnZW1iZWQtbGluay1zZXR0aW5ncycsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ2VtYmVkLWxpbmstc2V0dGluZ3MnKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOnVybCcsIHRoaXMudXBkYXRlb0VtYmVkICk7XG5cdH0sXG5cblx0dXBkYXRlb0VtYmVkOiBfLmRlYm91bmNlKCBmdW5jdGlvbigpIHtcblx0XHR2YXIgdXJsID0gdGhpcy5tb2RlbC5nZXQoICd1cmwnICk7XG5cblx0XHQvLyBjbGVhciBvdXQgcHJldmlvdXMgcmVzdWx0c1xuXHRcdHRoaXMuJCgnLmVtYmVkLWNvbnRhaW5lcicpLmhpZGUoKS5maW5kKCcuZW1iZWQtcHJldmlldycpLmVtcHR5KCk7XG5cdFx0dGhpcy4kKCAnLnNldHRpbmcnICkuaGlkZSgpO1xuXG5cdFx0Ly8gb25seSBwcm9jZWVkIHdpdGggZW1iZWQgaWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiAxMSBjaGFyYWN0ZXJzXG5cdFx0Ly8gRXhhbXBsZTogaHR0cDovL2EuaW8gaXMgMTEgY2hhcnNcblx0XHRpZiAoIHVybCAmJiAoIHVybC5sZW5ndGggPCAxMSB8fCAhIHVybC5tYXRjaCgvXmh0dHAocyk/OlxcL1xcLy8pICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5mZXRjaCgpO1xuXHR9LCB3cC5tZWRpYS5jb250cm9sbGVyLkVtYmVkLnNlbnNpdGl2aXR5ICksXG5cblx0ZmV0Y2g6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbWJlZDtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZXkgaGF2ZW4ndCB0eXBlZCBpbiA1MDAgbXNcblx0XHRpZiAoICQoJyNlbWJlZC11cmwtZmllbGQnKS52YWwoKSAhPT0gdGhpcy5tb2RlbC5nZXQoJ3VybCcpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5kZmQgJiYgJ3BlbmRpbmcnID09PSB0aGlzLmRmZC5zdGF0ZSgpICkge1xuXHRcdFx0dGhpcy5kZmQuYWJvcnQoKTtcblx0XHR9XG5cblx0XHRlbWJlZCA9IG5ldyB3cC5zaG9ydGNvZGUoe1xuXHRcdFx0dGFnOiAnZW1iZWQnLFxuXHRcdFx0YXR0cnM6IF8ucGljayggdGhpcy5tb2RlbC5hdHRyaWJ1dGVzLCBbICd3aWR0aCcsICdoZWlnaHQnLCAnc3JjJyBdICksXG5cdFx0XHRjb250ZW50OiB0aGlzLm1vZGVsLmdldCgndXJsJylcblx0XHR9KTtcblxuXHRcdHRoaXMuZGZkID0gJC5hamF4KHtcblx0XHRcdHR5cGU6ICAgICdQT1NUJyxcblx0XHRcdHVybDogICAgIHdwLmFqYXguc2V0dGluZ3MudXJsLFxuXHRcdFx0Y29udGV4dDogdGhpcyxcblx0XHRcdGRhdGE6ICAgIHtcblx0XHRcdFx0YWN0aW9uOiAncGFyc2UtZW1iZWQnLFxuXHRcdFx0XHRwb3N0X0lEOiB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnBvc3QuaWQsXG5cdFx0XHRcdHNob3J0Y29kZTogZW1iZWQuc3RyaW5nKClcblx0XHRcdH1cblx0XHR9KVxuXHRcdFx0LmRvbmUoIHRoaXMucmVuZGVyb0VtYmVkIClcblx0XHRcdC5mYWlsKCB0aGlzLnJlbmRlckZhaWwgKTtcblx0fSxcblxuXHRyZW5kZXJGYWlsOiBmdW5jdGlvbiAoIHJlc3BvbnNlLCBzdGF0dXMgKSB7XG5cdFx0aWYgKCAnYWJvcnQnID09PSBzdGF0dXMgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuJCggJy5saW5rLXRleHQnICkuc2hvdygpO1xuXHR9LFxuXG5cdHJlbmRlcm9FbWJlZDogZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdHZhciBodG1sID0gKCByZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEuYm9keSApIHx8ICcnO1xuXG5cdFx0aWYgKCBodG1sICkge1xuXHRcdFx0dGhpcy4kKCcuZW1iZWQtY29udGFpbmVyJykuc2hvdygpLmZpbmQoJy5lbWJlZC1wcmV2aWV3JykuaHRtbCggaHRtbCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnJlbmRlckZhaWwoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtYmVkTGluaztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5FbWJlZFVybFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdCQgPSBqUXVlcnksXG5cdEVtYmVkVXJsO1xuXG5FbWJlZFVybCA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnbGFiZWwnLFxuXHRjbGFzc05hbWU6ICdlbWJlZC11cmwnLFxuXG5cdGV2ZW50czoge1xuXHRcdCdpbnB1dCc6ICAndXJsJyxcblx0XHQna2V5dXAnOiAgJ3VybCcsXG5cdFx0J2NoYW5nZSc6ICd1cmwnXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kaW5wdXQgPSAkKCc8aW5wdXQgaWQ9XCJlbWJlZC11cmwtZmllbGRcIiB0eXBlPVwidXJsXCIgLz4nKS52YWwoIHRoaXMubW9kZWwuZ2V0KCd1cmwnKSApO1xuXHRcdHRoaXMuaW5wdXQgPSB0aGlzLiRpbnB1dFswXTtcblxuXHRcdHRoaXMuc3Bpbm5lciA9ICQoJzxzcGFuIGNsYXNzPVwic3Bpbm5lclwiIC8+JylbMF07XG5cdFx0dGhpcy4kZWwuYXBwZW5kKFsgdGhpcy5pbnB1dCwgdGhpcy5zcGlubmVyIF0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTp1cmwnLCB0aGlzLnJlbmRlciApO1xuXG5cdFx0aWYgKCB0aGlzLm1vZGVsLmdldCggJ3VybCcgKSApIHtcblx0XHRcdF8uZGVsYXkoIF8uYmluZCggZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoICdjaGFuZ2U6dXJsJyApO1xuXHRcdFx0fSwgdGhpcyApLCA1MDAgKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5FbWJlZFVybH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRpbnB1dCA9IHRoaXMuJGlucHV0O1xuXG5cdFx0aWYgKCAkaW5wdXQuaXMoJzpmb2N1cycpICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5wdXQudmFsdWUgPSB0aGlzLm1vZGVsLmdldCgndXJsJykgfHwgJ2h0dHA6Ly8nO1xuXHRcdC8qKlxuXHRcdCAqIENhbGwgYHJlbmRlcmAgZGlyZWN0bHkgb24gcGFyZW50IGNsYXNzIHdpdGggcGFzc2VkIGFyZ3VtZW50c1xuXHRcdCAqL1xuXHRcdFZpZXcucHJvdG90eXBlLnJlbmRlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggISB3cC5tZWRpYS5pc1RvdWNoRGV2aWNlICkge1xuXHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdH1cblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR0aGlzLm1vZGVsLnNldCggJ3VybCcsIGV2ZW50LnRhcmdldC52YWx1ZSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgaW5wdXQgaXMgdmlzaWJsZSwgZm9jdXMgYW5kIHNlbGVjdCBpdHMgY29udGVudHMuXG5cdCAqL1xuXHRmb2N1czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRpbnB1dCA9IHRoaXMuJGlucHV0O1xuXHRcdGlmICggJGlucHV0LmlzKCc6dmlzaWJsZScpICkge1xuXHRcdFx0JGlucHV0LmZvY3VzKClbMF0uc2VsZWN0KCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWJlZFVybDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5Gb2N1c01hbmFnZXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIEZvY3VzTWFuYWdlciA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblxuXHRldmVudHM6IHtcblx0XHQna2V5ZG93bic6ICdjb25zdHJhaW5UYWJiaW5nJ1xuXHR9LFxuXG5cdGZvY3VzOiBmdW5jdGlvbigpIHsgLy8gUmVzZXQgZm9jdXMgb24gZmlyc3QgbGVmdCBtZW51IGl0ZW1cblx0XHR0aGlzLiQoJy5tZWRpYS1tZW51LWl0ZW0nKS5maXJzdCgpLmZvY3VzKCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdGNvbnN0cmFpblRhYmJpbmc6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGFiYmFibGVzO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIHRhYiBrZXkuXG5cdFx0aWYgKCA5ICE9PSBldmVudC5rZXlDb2RlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNraXAgdGhlIGZpbGUgaW5wdXQgYWRkZWQgYnkgUGx1cGxvYWQuXG5cdFx0dGFiYmFibGVzID0gdGhpcy4kKCAnOnRhYmJhYmxlJyApLm5vdCggJy5tb3hpZS1zaGltIGlucHV0W3R5cGU9XCJmaWxlXCJdJyApO1xuXG5cdFx0Ly8gS2VlcCB0YWIgZm9jdXMgd2l0aGluIG1lZGlhIG1vZGFsIHdoaWxlIGl0J3Mgb3BlblxuXHRcdGlmICggdGFiYmFibGVzLmxhc3QoKVswXSA9PT0gZXZlbnQudGFyZ2V0ICYmICEgZXZlbnQuc2hpZnRLZXkgKSB7XG5cdFx0XHR0YWJiYWJsZXMuZmlyc3QoKS5mb2N1cygpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoIHRhYmJhYmxlcy5maXJzdCgpWzBdID09PSBldmVudC50YXJnZXQgJiYgZXZlbnQuc2hpZnRLZXkgKSB7XG5cdFx0XHR0YWJiYWJsZXMubGFzdCgpLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZvY3VzTWFuYWdlcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5GcmFtZVxuICpcbiAqIEEgZnJhbWUgaXMgYSBjb21wb3NpdGUgdmlldyBjb25zaXN0aW5nIG9mIG9uZSBvciBtb3JlIHJlZ2lvbnMgYW5kIG9uZSBvciBtb3JlXG4gKiBzdGF0ZXMuXG4gKlxuICogQHNlZSB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG4gKiBAc2VlIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKiBAbWl4ZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcbiAqL1xudmFyIEZyYW1lID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdG1vZGU6IFsgJ3NlbGVjdCcgXVxuXHRcdH0pO1xuXHRcdHRoaXMuX2NyZWF0ZVJlZ2lvbnMoKTtcblx0XHR0aGlzLl9jcmVhdGVTdGF0ZXMoKTtcblx0XHR0aGlzLl9jcmVhdGVNb2RlcygpO1xuXHR9LFxuXG5cdF9jcmVhdGVSZWdpb25zOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDbG9uZSB0aGUgcmVnaW9ucyBhcnJheS5cblx0XHR0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMgPyB0aGlzLnJlZ2lvbnMuc2xpY2UoKSA6IFtdO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSByZWdpb25zLlxuXHRcdF8uZWFjaCggdGhpcy5yZWdpb25zLCBmdW5jdGlvbiggcmVnaW9uICkge1xuXHRcdFx0dGhpc1sgcmVnaW9uIF0gPSBuZXcgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb24oe1xuXHRcdFx0XHR2aWV3OiAgICAgdGhpcyxcblx0XHRcdFx0aWQ6ICAgICAgIHJlZ2lvbixcblx0XHRcdFx0c2VsZWN0b3I6ICcubWVkaWEtZnJhbWUtJyArIHJlZ2lvblxuXHRcdFx0fSk7XG5cdFx0fSwgdGhpcyApO1xuXHR9LFxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBmcmFtZSdzIHN0YXRlcy5cblx0ICpcblx0ICogQHNlZSB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG5cdCAqIEBzZWUgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmVcblx0ICpcblx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjcmVhZHlcblx0ICovXG5cdF9jcmVhdGVTdGF0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZGVmYXVsdCBgc3RhdGVzYCBjb2xsZWN0aW9uLlxuXHRcdHRoaXMuc3RhdGVzID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oIG51bGwsIHtcblx0XHRcdG1vZGVsOiB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlXG5cdFx0fSk7XG5cblx0XHQvLyBFbnN1cmUgc3RhdGVzIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGZyYW1lLlxuXHRcdHRoaXMuc3RhdGVzLm9uKCAnYWRkJywgZnVuY3Rpb24oIG1vZGVsICkge1xuXHRcdFx0bW9kZWwuZnJhbWUgPSB0aGlzO1xuXHRcdFx0bW9kZWwudHJpZ2dlcigncmVhZHknKTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGF0ZXMgKSB7XG5cdFx0XHR0aGlzLnN0YXRlcy5hZGQoIHRoaXMub3B0aW9ucy5zdGF0ZXMgKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEEgZnJhbWUgY2FuIGJlIGluIGEgbW9kZSBvciBtdWx0aXBsZSBtb2RlcyBhdCBvbmUgdGltZS5cblx0ICpcblx0ICogRm9yIGV4YW1wbGUsIHRoZSBtYW5hZ2UgbWVkaWEgZnJhbWUgY2FuIGJlIGluIHRoZSBgQnVsayBTZWxlY3RgIG9yIGBFZGl0YCBtb2RlLlxuXHQgKi9cblx0X2NyZWF0ZU1vZGVzOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTdG9yZSBhY3RpdmUgXCJtb2Rlc1wiIHRoYXQgdGhlIGZyYW1lIGlzIGluLiBVbnJlbGF0ZWQgdG8gcmVnaW9uIG1vZGVzLlxuXHRcdHRoaXMuYWN0aXZlTW9kZXMgPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbigpO1xuXHRcdHRoaXMuYWN0aXZlTW9kZXMub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgXy5iaW5kKCB0aGlzLnRyaWdnZXJNb2RlRXZlbnRzLCB0aGlzICkgKTtcblxuXHRcdF8uZWFjaCggdGhpcy5vcHRpb25zLm1vZGUsIGZ1bmN0aW9uKCBtb2RlICkge1xuXHRcdFx0dGhpcy5hY3RpdmF0ZU1vZGUoIG1vZGUgKTtcblx0XHR9LCB0aGlzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXNldCBhbGwgc3RhdGVzIG9uIHRoZSBmcmFtZSB0byB0aGVpciBkZWZhdWx0cy5cblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuRnJhbWV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZXNldDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdGF0ZXMuaW52b2tlKCAndHJpZ2dlcicsICdyZXNldCcgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIE1hcCBhY3RpdmVNb2RlIGNvbGxlY3Rpb24gZXZlbnRzIHRvIHRoZSBmcmFtZS5cblx0ICovXG5cdHRyaWdnZXJNb2RlRXZlbnRzOiBmdW5jdGlvbiggbW9kZWwsIGNvbGxlY3Rpb24sIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGNvbGxlY3Rpb25FdmVudCxcblx0XHRcdG1vZGVFdmVudE1hcCA9IHtcblx0XHRcdFx0YWRkOiAnYWN0aXZhdGUnLFxuXHRcdFx0XHRyZW1vdmU6ICdkZWFjdGl2YXRlJ1xuXHRcdFx0fSxcblx0XHRcdGV2ZW50VG9UcmlnZ2VyO1xuXHRcdC8vIFByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLlxuXHRcdF8uZWFjaCggb3B0aW9ucywgZnVuY3Rpb24oIHZhbHVlLCBrZXkgKSB7XG5cdFx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0XHRjb2xsZWN0aW9uRXZlbnQgPSBrZXk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0aWYgKCAhIF8uaGFzKCBtb2RlRXZlbnRNYXAsIGNvbGxlY3Rpb25FdmVudCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGV2ZW50VG9UcmlnZ2VyID0gbW9kZWwuZ2V0KCdpZCcpICsgJzonICsgbW9kZUV2ZW50TWFwW2NvbGxlY3Rpb25FdmVudF07XG5cdFx0dGhpcy50cmlnZ2VyKCBldmVudFRvVHJpZ2dlciApO1xuXHR9LFxuXHQvKipcblx0ICogQWN0aXZhdGUgYSBtb2RlIG9uIHRoZSBmcmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHN0cmluZyBtb2RlIE1vZGUgSUQuXG5cdCAqIEByZXR1cm5zIHt0aGlzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZy5cblx0ICovXG5cdGFjdGl2YXRlTW9kZTogZnVuY3Rpb24oIG1vZGUgKSB7XG5cdFx0Ly8gQmFpbCBpZiB0aGUgbW9kZSBpcyBhbHJlYWR5IGFjdGl2ZS5cblx0XHRpZiAoIHRoaXMuaXNNb2RlQWN0aXZlKCBtb2RlICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuYWN0aXZlTW9kZXMuYWRkKCBbIHsgaWQ6IG1vZGUgfSBdICk7XG5cdFx0Ly8gQWRkIGEgQ1NTIGNsYXNzIHRvIHRoZSBmcmFtZSBzbyBlbGVtZW50cyBjYW4gYmUgc3R5bGVkIGZvciB0aGUgbW9kZS5cblx0XHR0aGlzLiRlbC5hZGRDbGFzcyggJ21vZGUtJyArIG1vZGUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogRGVhY3RpdmF0ZSBhIG1vZGUgb24gdGhlIGZyYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RyaW5nIG1vZGUgTW9kZSBJRC5cblx0ICogQHJldHVybnMge3RoaXN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nLlxuXHQgKi9cblx0ZGVhY3RpdmF0ZU1vZGU6IGZ1bmN0aW9uKCBtb2RlICkge1xuXHRcdC8vIEJhaWwgaWYgdGhlIG1vZGUgaXNuJ3QgYWN0aXZlLlxuXHRcdGlmICggISB0aGlzLmlzTW9kZUFjdGl2ZSggbW9kZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdHRoaXMuYWN0aXZlTW9kZXMucmVtb3ZlKCB0aGlzLmFjdGl2ZU1vZGVzLndoZXJlKCB7IGlkOiBtb2RlIH0gKSApO1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCAnbW9kZS0nICsgbW9kZSApO1xuXHRcdC8qKlxuXHRcdCAqIEZyYW1lIG1vZGUgZGVhY3RpdmF0aW9uIGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IHRoaXMje21vZGV9OmRlYWN0aXZhdGVcblx0XHQgKi9cblx0XHR0aGlzLnRyaWdnZXIoIG1vZGUgKyAnOmRlYWN0aXZhdGUnICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgbW9kZSBpcyBlbmFibGVkIG9uIHRoZSBmcmFtZS5cblx0ICpcblx0ICogQHBhcmFtICBzdHJpbmcgbW9kZSBNb2RlIElELlxuXHQgKiBAcmV0dXJuIGJvb2xcblx0ICovXG5cdGlzTW9kZUFjdGl2ZTogZnVuY3Rpb24oIG1vZGUgKSB7XG5cdFx0cmV0dXJuIEJvb2xlYW4oIHRoaXMuYWN0aXZlTW9kZXMud2hlcmUoIHsgaWQ6IG1vZGUgfSApLmxlbmd0aCApO1xuXHR9XG59KTtcblxuLy8gTWFrZSB0aGUgYEZyYW1lYCBhIGBTdGF0ZU1hY2hpbmVgLlxuXy5leHRlbmQoIEZyYW1lLnByb3RvdHlwZSwgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZU1hY2hpbmUucHJvdG90eXBlICk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5JbWFnZURldGFpbHNcbiAqXG4gKiBBIG1lZGlhIGZyYW1lIGZvciBtYW5pcHVsYXRpbmcgYW4gaW1hZ2UgdGhhdCdzIGFscmVhZHkgYmVlbiBpbnNlcnRlZFxuICogaW50byBhIHBvc3QuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLlNlbGVjdFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqIEBtaXhlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICovXG52YXIgU2VsZWN0ID0gd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLlNlbGVjdCxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0SW1hZ2VEZXRhaWxzO1xuXG5JbWFnZURldGFpbHMgPSBTZWxlY3QuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRpZDogICAgICAnaW1hZ2UnLFxuXHRcdHVybDogICAgICcnLFxuXHRcdG1lbnU6ICAgICdpbWFnZS1kZXRhaWxzJyxcblx0XHRjb250ZW50OiAnaW1hZ2UtZGV0YWlscycsXG5cdFx0dG9vbGJhcjogJ2ltYWdlLWRldGFpbHMnLFxuXHRcdHR5cGU6ICAgICdsaW5rJyxcblx0XHR0aXRsZTogICAgbDEwbi5pbWFnZURldGFpbHNUaXRsZSxcblx0XHRwcmlvcml0eTogMTIwXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5pbWFnZSA9IG5ldyB3cC5tZWRpYS5tb2RlbC5Qb3N0SW1hZ2UoIG9wdGlvbnMubWV0YWRhdGEgKTtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0aW9uID0gbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggdGhpcy5pbWFnZS5hdHRhY2htZW50LCB7IG11bHRpcGxlOiBmYWxzZSB9ICk7XG5cdFx0U2VsZWN0LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fSxcblxuXHRiaW5kSGFuZGxlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFNlbGVjdC5wcm90b3R5cGUuYmluZEhhbmRsZXJzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpjcmVhdGU6aW1hZ2UtZGV0YWlscycsIHRoaXMuY3JlYXRlTWVudSwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjb250ZW50OmNyZWF0ZTppbWFnZS1kZXRhaWxzJywgdGhpcy5pbWFnZURldGFpbHNDb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6cmVuZGVyOmVkaXQtaW1hZ2UnLCB0aGlzLmVkaXRJbWFnZUNvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpyZW5kZXI6aW1hZ2UtZGV0YWlscycsIHRoaXMucmVuZGVySW1hZ2VEZXRhaWxzVG9vbGJhciwgdGhpcyApO1xuXHRcdC8vIG92ZXJyaWRlIHRoZSBzZWxlY3QgdG9vbGJhclxuXHRcdHRoaXMub24oICd0b29sYmFyOnJlbmRlcjpyZXBsYWNlJywgdGhpcy5yZW5kZXJSZXBsYWNlSW1hZ2VUb29sYmFyLCB0aGlzICk7XG5cdH0sXG5cblx0Y3JlYXRlU3RhdGVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0YXRlcy5hZGQoW1xuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuSW1hZ2VEZXRhaWxzKHtcblx0XHRcdFx0aW1hZ2U6IHRoaXMuaW1hZ2UsXG5cdFx0XHRcdGVkaXRhYmxlOiBmYWxzZVxuXHRcdFx0fSksXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5SZXBsYWNlSW1hZ2Uoe1xuXHRcdFx0XHRpZDogJ3JlcGxhY2UtaW1hZ2UnLFxuXHRcdFx0XHRsaWJyYXJ5OiB3cC5tZWRpYS5xdWVyeSggeyB0eXBlOiAnaW1hZ2UnIH0gKSxcblx0XHRcdFx0aW1hZ2U6IHRoaXMuaW1hZ2UsXG5cdFx0XHRcdG11bHRpcGxlOiAgZmFsc2UsXG5cdFx0XHRcdHRpdGxlOiAgICAgbDEwbi5pbWFnZVJlcGxhY2VUaXRsZSxcblx0XHRcdFx0dG9vbGJhcjogJ3JlcGxhY2UnLFxuXHRcdFx0XHRwcmlvcml0eTogIDgwLFxuXHRcdFx0XHRkaXNwbGF5U2V0dGluZ3M6IHRydWVcblx0XHRcdH0pLFxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuRWRpdEltYWdlKCB7XG5cdFx0XHRcdGltYWdlOiB0aGlzLmltYWdlLFxuXHRcdFx0XHRzZWxlY3Rpb246IHRoaXMub3B0aW9ucy5zZWxlY3Rpb25cblx0XHRcdH0gKVxuXHRcdF0pO1xuXHR9LFxuXG5cdGltYWdlRGV0YWlsc0NvbnRlbnQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdG9wdGlvbnMudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkltYWdlRGV0YWlscyh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0bW9kZWw6IHRoaXMuc3RhdGUoKS5pbWFnZSxcblx0XHRcdGF0dGFjaG1lbnQ6IHRoaXMuc3RhdGUoKS5pbWFnZS5hdHRhY2htZW50XG5cdFx0fSk7XG5cdH0sXG5cblx0ZWRpdEltYWdlQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHN0YXRlID0gdGhpcy5zdGF0ZSgpLFxuXHRcdFx0bW9kZWwgPSBzdGF0ZS5nZXQoJ2ltYWdlJyksXG5cdFx0XHR2aWV3O1xuXG5cdFx0aWYgKCAhIG1vZGVsICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5FZGl0SW1hZ2UoIHsgbW9kZWw6IG1vZGVsLCBjb250cm9sbGVyOiB0aGlzIH0gKS5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblxuXHRcdC8vIGFmdGVyIGJyaW5naW5nIGluIHRoZSBmcmFtZSwgbG9hZCB0aGUgYWN0dWFsIGVkaXRvciB2aWEgYW4gYWpheCBjYWxsXG5cdFx0dmlldy5sb2FkRWRpdG9yKCk7XG5cblx0fSxcblxuXHRyZW5kZXJJbWFnZURldGFpbHNUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRzZWxlY3Q6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLnVwZGF0ZSxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cblx0XHRcdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSBjb250cm9sbGVyLnN0YXRlKCk7XG5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcblxuXHRcdFx0XHRcdFx0Ly8gbm90IHN1cmUgaWYgd2Ugd2FudCB0byB1c2Ugd3AubWVkaWEuc3RyaW5nLmltYWdlIHdoaWNoIHdpbGwgY3JlYXRlIGEgc2hvcnRjb2RlIG9yXG5cdFx0XHRcdFx0XHQvLyBwZXJoYXBzIHdwLmh0bWwuc3RyaW5nIHRvIGF0IGxlYXN0IHRvIGJ1aWxkIHRoZSA8aW1nIC8+XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCAndXBkYXRlJywgY29udHJvbGxlci5pbWFnZS50b0pTT04oKSApO1xuXG5cdFx0XHRcdFx0XHQvLyBSZXN0b3JlIGFuZCByZXNldCB0aGUgZGVmYXVsdCBzdGF0ZS5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuc2V0U3RhdGUoIGNvbnRyb2xsZXIub3B0aW9ucy5zdGF0ZSApO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5yZXNldCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pICk7XG5cdH0sXG5cblx0cmVuZGVyUmVwbGFjZUltYWdlVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZyYW1lID0gdGhpcyxcblx0XHRcdGxhc3RTdGF0ZSA9IGZyYW1lLmxhc3RTdGF0ZSgpLFxuXHRcdFx0cHJldmlvdXMgPSBsYXN0U3RhdGUgJiYgbGFzdFN0YXRlLmlkO1xuXG5cdFx0dGhpcy50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0YmFjazoge1xuXHRcdFx0XHRcdHRleHQ6ICAgICBsMTBuLmJhY2ssXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDIwLFxuXHRcdFx0XHRcdGNsaWNrOiAgICBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggcHJldmlvdXMgKSB7XG5cdFx0XHRcdFx0XHRcdGZyYW1lLnNldFN0YXRlKCBwcmV2aW91cyApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWUuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0cmVwbGFjZToge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGwxMG4ucmVwbGFjZSxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cblx0XHRcdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSBjb250cm9sbGVyLnN0YXRlKCksXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbiA9IHN0YXRlLmdldCggJ3NlbGVjdGlvbicgKSxcblx0XHRcdFx0XHRcdFx0YXR0YWNobWVudCA9IHNlbGVjdGlvbi5zaW5nbGUoKTtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLmltYWdlLmNoYW5nZUF0dGFjaG1lbnQoIGF0dGFjaG1lbnQsIHN0YXRlLmRpc3BsYXkoIGF0dGFjaG1lbnQgKSApO1xuXG5cdFx0XHRcdFx0XHQvLyBub3Qgc3VyZSBpZiB3ZSB3YW50IHRvIHVzZSB3cC5tZWRpYS5zdHJpbmcuaW1hZ2Ugd2hpY2ggd2lsbCBjcmVhdGUgYSBzaG9ydGNvZGUgb3Jcblx0XHRcdFx0XHRcdC8vIHBlcmhhcHMgd3AuaHRtbC5zdHJpbmcgdG8gYXQgbGVhc3QgdG8gYnVpbGQgdGhlIDxpbWcgLz5cblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoICdyZXBsYWNlJywgY29udHJvbGxlci5pbWFnZS50b0pTT04oKSApO1xuXG5cdFx0XHRcdFx0XHQvLyBSZXN0b3JlIGFuZCByZXNldCB0aGUgZGVmYXVsdCBzdGF0ZS5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuc2V0U3RhdGUoIGNvbnRyb2xsZXIub3B0aW9ucy5zdGF0ZSApO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5yZXNldCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pICk7XG5cdH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VEZXRhaWxzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuUG9zdFxuICpcbiAqIFRoZSBmcmFtZSBmb3IgbWFuaXB1bGF0aW5nIG1lZGlhIG9uIHRoZSBFZGl0IFBvc3QgcGFnZS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5NZWRpYUZyYW1lXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBTZWxlY3QgPSB3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWUuU2VsZWN0LFxuXHRMaWJyYXJ5ID0gd3AubWVkaWEuY29udHJvbGxlci5MaWJyYXJ5LFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRQb3N0O1xuXG5Qb3N0ID0gU2VsZWN0LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY291bnRzID0ge1xuXHRcdFx0YXVkaW86IHtcblx0XHRcdFx0Y291bnQ6IHdwLm1lZGlhLnZpZXcuc2V0dGluZ3MuYXR0YWNobWVudENvdW50cy5hdWRpbyxcblx0XHRcdFx0c3RhdGU6ICdwbGF5bGlzdCdcblx0XHRcdH0sXG5cdFx0XHR2aWRlbzoge1xuXHRcdFx0XHRjb3VudDogd3AubWVkaWEudmlldy5zZXR0aW5ncy5hdHRhY2htZW50Q291bnRzLnZpZGVvLFxuXHRcdFx0XHRzdGF0ZTogJ3ZpZGVvLXBsYXlsaXN0J1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdG11bHRpcGxlOiAgdHJ1ZSxcblx0XHRcdGVkaXRpbmc6ICAgZmFsc2UsXG5cdFx0XHRzdGF0ZTogICAgJ2luc2VydCcsXG5cdFx0XHRtZXRhZGF0YTogIHt9XG5cdFx0fSk7XG5cblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdFNlbGVjdC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5jcmVhdGVJZnJhbWVTdGF0ZXMoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGRlZmF1bHQgc3RhdGVzLlxuXHQgKi9cblx0Y3JlYXRlU3RhdGVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHQvLyBNYWluIHN0YXRlcy5cblx0XHRcdG5ldyBMaWJyYXJ5KHtcblx0XHRcdFx0aWQ6ICAgICAgICAgJ2luc2VydCcsXG5cdFx0XHRcdHRpdGxlOiAgICAgIGwxMG4uaW5zZXJ0TWVkaWFUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6ICAgMjAsXG5cdFx0XHRcdHRvb2xiYXI6ICAgICdtYWluLWluc2VydCcsXG5cdFx0XHRcdGZpbHRlcmFibGU6ICdhbGwnLFxuXHRcdFx0XHRsaWJyYXJ5OiAgICB3cC5tZWRpYS5xdWVyeSggb3B0aW9ucy5saWJyYXJ5ICksXG5cdFx0XHRcdG11bHRpcGxlOiAgIG9wdGlvbnMubXVsdGlwbGUgPyAncmVzZXQnIDogZmFsc2UsXG5cdFx0XHRcdGVkaXRhYmxlOiAgIHRydWUsXG5cblx0XHRcdFx0Ly8gSWYgdGhlIHVzZXIgaXNuJ3QgYWxsb3dlZCB0byBlZGl0IGZpZWxkcyxcblx0XHRcdFx0Ly8gY2FuIHRoZXkgc3RpbGwgZWRpdCBpdCBsb2NhbGx5P1xuXHRcdFx0XHRhbGxvd0xvY2FsRWRpdHM6IHRydWUsXG5cblx0XHRcdFx0Ly8gU2hvdyB0aGUgYXR0YWNobWVudCBkaXNwbGF5IHNldHRpbmdzLlxuXHRcdFx0XHRkaXNwbGF5U2V0dGluZ3M6IHRydWUsXG5cdFx0XHRcdC8vIFVwZGF0ZSB1c2VyIHNldHRpbmdzIHdoZW4gdXNlcnMgYWRqdXN0IHRoZVxuXHRcdFx0XHQvLyBhdHRhY2htZW50IGRpc3BsYXkgc2V0dGluZ3MuXG5cdFx0XHRcdGRpc3BsYXlVc2VyU2V0dGluZ3M6IHRydWVcblx0XHRcdH0pLFxuXG5cdFx0XHRuZXcgTGlicmFyeSh7XG5cdFx0XHRcdGlkOiAgICAgICAgICdnYWxsZXJ5Jyxcblx0XHRcdFx0dGl0bGU6ICAgICAgbDEwbi5jcmVhdGVHYWxsZXJ5VGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAgIDQwLFxuXHRcdFx0XHR0b29sYmFyOiAgICAnbWFpbi1nYWxsZXJ5Jyxcblx0XHRcdFx0ZmlsdGVyYWJsZTogJ3VwbG9hZGVkJyxcblx0XHRcdFx0bXVsdGlwbGU6ICAgJ2FkZCcsXG5cdFx0XHRcdGVkaXRhYmxlOiAgIGZhbHNlLFxuXG5cdFx0XHRcdGxpYnJhcnk6ICB3cC5tZWRpYS5xdWVyeSggXy5kZWZhdWx0cyh7XG5cdFx0XHRcdFx0dHlwZTogJ2ltYWdlJ1xuXHRcdFx0XHR9LCBvcHRpb25zLmxpYnJhcnkgKSApXG5cdFx0XHR9KSxcblxuXHRcdFx0Ly8gRW1iZWQgc3RhdGVzLlxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuRW1iZWQoIHsgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEgfSApLFxuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5FZGl0SW1hZ2UoIHsgbW9kZWw6IG9wdGlvbnMuZWRpdEltYWdlIH0gKSxcblxuXHRcdFx0Ly8gR2FsbGVyeSBzdGF0ZXMuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5HYWxsZXJ5RWRpdCh7XG5cdFx0XHRcdGxpYnJhcnk6IG9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0XHRlZGl0aW5nOiBvcHRpb25zLmVkaXRpbmcsXG5cdFx0XHRcdG1lbnU6ICAgICdnYWxsZXJ5J1xuXHRcdFx0fSksXG5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkdhbGxlcnlBZGQoKSxcblxuXHRcdFx0bmV3IExpYnJhcnkoe1xuXHRcdFx0XHRpZDogICAgICAgICAncGxheWxpc3QnLFxuXHRcdFx0XHR0aXRsZTogICAgICBsMTBuLmNyZWF0ZVBsYXlsaXN0VGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAgIDYwLFxuXHRcdFx0XHR0b29sYmFyOiAgICAnbWFpbi1wbGF5bGlzdCcsXG5cdFx0XHRcdGZpbHRlcmFibGU6ICd1cGxvYWRlZCcsXG5cdFx0XHRcdG11bHRpcGxlOiAgICdhZGQnLFxuXHRcdFx0XHRlZGl0YWJsZTogICBmYWxzZSxcblxuXHRcdFx0XHRsaWJyYXJ5OiAgd3AubWVkaWEucXVlcnkoIF8uZGVmYXVsdHMoe1xuXHRcdFx0XHRcdHR5cGU6ICdhdWRpbydcblx0XHRcdFx0fSwgb3B0aW9ucy5saWJyYXJ5ICkgKVxuXHRcdFx0fSksXG5cblx0XHRcdC8vIFBsYXlsaXN0IHN0YXRlcy5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkNvbGxlY3Rpb25FZGl0KHtcblx0XHRcdFx0dHlwZTogJ2F1ZGlvJyxcblx0XHRcdFx0Y29sbGVjdGlvblR5cGU6ICdwbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiAgICAgICAgICBsMTBuLmVkaXRQbGF5bGlzdFRpdGxlLFxuXHRcdFx0XHRTZXR0aW5nc1ZpZXc6ICAgd3AubWVkaWEudmlldy5TZXR0aW5ncy5QbGF5bGlzdCxcblx0XHRcdFx0bGlicmFyeTogICAgICAgIG9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0XHRlZGl0aW5nOiAgICAgICAgb3B0aW9ucy5lZGl0aW5nLFxuXHRcdFx0XHRtZW51OiAgICAgICAgICAgJ3BsYXlsaXN0Jyxcblx0XHRcdFx0ZHJhZ0luZm9UZXh0OiAgIGwxMG4ucGxheWxpc3REcmFnSW5mbyxcblx0XHRcdFx0ZHJhZ0luZm86ICAgICAgIGZhbHNlXG5cdFx0XHR9KSxcblxuXHRcdFx0bmV3IHdwLm1lZGlhLmNvbnRyb2xsZXIuQ29sbGVjdGlvbkFkZCh7XG5cdFx0XHRcdHR5cGU6ICdhdWRpbycsXG5cdFx0XHRcdGNvbGxlY3Rpb25UeXBlOiAncGxheWxpc3QnLFxuXHRcdFx0XHR0aXRsZTogbDEwbi5hZGRUb1BsYXlsaXN0VGl0bGVcblx0XHRcdH0pLFxuXG5cdFx0XHRuZXcgTGlicmFyeSh7XG5cdFx0XHRcdGlkOiAgICAgICAgICd2aWRlby1wbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiAgICAgIGwxMG4uY3JlYXRlVmlkZW9QbGF5bGlzdFRpdGxlLFxuXHRcdFx0XHRwcmlvcml0eTogICA2MCxcblx0XHRcdFx0dG9vbGJhcjogICAgJ21haW4tdmlkZW8tcGxheWxpc3QnLFxuXHRcdFx0XHRmaWx0ZXJhYmxlOiAndXBsb2FkZWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogICAnYWRkJyxcblx0XHRcdFx0ZWRpdGFibGU6ICAgZmFsc2UsXG5cblx0XHRcdFx0bGlicmFyeTogIHdwLm1lZGlhLnF1ZXJ5KCBfLmRlZmF1bHRzKHtcblx0XHRcdFx0XHR0eXBlOiAndmlkZW8nXG5cdFx0XHRcdH0sIG9wdGlvbnMubGlicmFyeSApIClcblx0XHRcdH0pLFxuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5Db2xsZWN0aW9uRWRpdCh7XG5cdFx0XHRcdHR5cGU6ICd2aWRlbycsXG5cdFx0XHRcdGNvbGxlY3Rpb25UeXBlOiAncGxheWxpc3QnLFxuXHRcdFx0XHR0aXRsZTogICAgICAgICAgbDEwbi5lZGl0VmlkZW9QbGF5bGlzdFRpdGxlLFxuXHRcdFx0XHRTZXR0aW5nc1ZpZXc6ICAgd3AubWVkaWEudmlldy5TZXR0aW5ncy5QbGF5bGlzdCxcblx0XHRcdFx0bGlicmFyeTogICAgICAgIG9wdGlvbnMuc2VsZWN0aW9uLFxuXHRcdFx0XHRlZGl0aW5nOiAgICAgICAgb3B0aW9ucy5lZGl0aW5nLFxuXHRcdFx0XHRtZW51OiAgICAgICAgICAgJ3ZpZGVvLXBsYXlsaXN0Jyxcblx0XHRcdFx0ZHJhZ0luZm9UZXh0OiAgIGwxMG4udmlkZW9QbGF5bGlzdERyYWdJbmZvLFxuXHRcdFx0XHRkcmFnSW5mbzogICAgICAgZmFsc2Vcblx0XHRcdH0pLFxuXG5cdFx0XHRuZXcgd3AubWVkaWEuY29udHJvbGxlci5Db2xsZWN0aW9uQWRkKHtcblx0XHRcdFx0dHlwZTogJ3ZpZGVvJyxcblx0XHRcdFx0Y29sbGVjdGlvblR5cGU6ICdwbGF5bGlzdCcsXG5cdFx0XHRcdHRpdGxlOiBsMTBuLmFkZFRvVmlkZW9QbGF5bGlzdFRpdGxlXG5cdFx0XHR9KVxuXHRcdF0pO1xuXG5cdFx0aWYgKCB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnBvc3QuZmVhdHVyZWRJbWFnZUlkICkge1xuXHRcdFx0dGhpcy5zdGF0ZXMuYWRkKCBuZXcgd3AubWVkaWEuY29udHJvbGxlci5GZWF0dXJlZEltYWdlKCkgKTtcblx0XHR9XG5cdH0sXG5cblx0YmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlcnMsIGNoZWNrQ291bnRzO1xuXG5cdFx0U2VsZWN0LnByb3RvdHlwZS5iaW5kSGFuZGxlcnMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZSwgdGhpcyApO1xuXG5cdFx0Ly8gT25seSBib3RoZXIgY2hlY2tpbmcgbWVkaWEgdHlwZSBjb3VudHMgaWYgb25lIG9mIHRoZSBjb3VudHMgaXMgemVyb1xuXHRcdGNoZWNrQ291bnRzID0gXy5maW5kKCB0aGlzLmNvdW50cywgZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRyZXR1cm4gdHlwZS5jb3VudCA9PT0gMDtcblx0XHR9ICk7XG5cblx0XHRpZiAoIHR5cGVvZiBjaGVja0NvdW50cyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKCB3cC5tZWRpYS5tb2RlbC5BdHRhY2htZW50cy5hbGwsICdjaGFuZ2U6dHlwZScsIHRoaXMubWVkaWFUeXBlQ291bnRzICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5vbiggJ21lbnU6Y3JlYXRlOmdhbGxlcnknLCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpjcmVhdGU6cGxheWxpc3QnLCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnbWVudTpjcmVhdGU6dmlkZW8tcGxheWxpc3QnLCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6bWFpbi1pbnNlcnQnLCB0aGlzLmNyZWF0ZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6bWFpbi1nYWxsZXJ5JywgdGhpcy5jcmVhdGVUb29sYmFyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ3Rvb2xiYXI6Y3JlYXRlOm1haW4tcGxheWxpc3QnLCB0aGlzLmNyZWF0ZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6bWFpbi12aWRlby1wbGF5bGlzdCcsIHRoaXMuY3JlYXRlVG9vbGJhciwgdGhpcyApO1xuXHRcdHRoaXMub24oICd0b29sYmFyOmNyZWF0ZTpmZWF0dXJlZC1pbWFnZScsIHRoaXMuZmVhdHVyZWRJbWFnZVRvb2xiYXIsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6bWFpbi1lbWJlZCcsIHRoaXMubWFpbkVtYmVkVG9vbGJhciwgdGhpcyApO1xuXG5cdFx0aGFuZGxlcnMgPSB7XG5cdFx0XHRtZW51OiB7XG5cdFx0XHRcdCdkZWZhdWx0JzogJ21haW5NZW51Jyxcblx0XHRcdFx0J2dhbGxlcnknOiAnZ2FsbGVyeU1lbnUnLFxuXHRcdFx0XHQncGxheWxpc3QnOiAncGxheWxpc3RNZW51Jyxcblx0XHRcdFx0J3ZpZGVvLXBsYXlsaXN0JzogJ3ZpZGVvUGxheWxpc3RNZW51J1xuXHRcdFx0fSxcblxuXHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHQnZW1iZWQnOiAgICAgICAgICAnZW1iZWRDb250ZW50Jyxcblx0XHRcdFx0J2VkaXQtaW1hZ2UnOiAgICAgJ2VkaXRJbWFnZUNvbnRlbnQnLFxuXHRcdFx0XHQnZWRpdC1zZWxlY3Rpb24nOiAnZWRpdFNlbGVjdGlvbkNvbnRlbnQnXG5cdFx0XHR9LFxuXG5cdFx0XHR0b29sYmFyOiB7XG5cdFx0XHRcdCdtYWluLWluc2VydCc6ICAgICAgJ21haW5JbnNlcnRUb29sYmFyJyxcblx0XHRcdFx0J21haW4tZ2FsbGVyeSc6ICAgICAnbWFpbkdhbGxlcnlUb29sYmFyJyxcblx0XHRcdFx0J2dhbGxlcnktZWRpdCc6ICAgICAnZ2FsbGVyeUVkaXRUb29sYmFyJyxcblx0XHRcdFx0J2dhbGxlcnktYWRkJzogICAgICAnZ2FsbGVyeUFkZFRvb2xiYXInLFxuXHRcdFx0XHQnbWFpbi1wbGF5bGlzdCc6XHQnbWFpblBsYXlsaXN0VG9vbGJhcicsXG5cdFx0XHRcdCdwbGF5bGlzdC1lZGl0JzpcdCdwbGF5bGlzdEVkaXRUb29sYmFyJyxcblx0XHRcdFx0J3BsYXlsaXN0LWFkZCc6XHRcdCdwbGF5bGlzdEFkZFRvb2xiYXInLFxuXHRcdFx0XHQnbWFpbi12aWRlby1wbGF5bGlzdCc6ICdtYWluVmlkZW9QbGF5bGlzdFRvb2xiYXInLFxuXHRcdFx0XHQndmlkZW8tcGxheWxpc3QtZWRpdCc6ICd2aWRlb1BsYXlsaXN0RWRpdFRvb2xiYXInLFxuXHRcdFx0XHQndmlkZW8tcGxheWxpc3QtYWRkJzogJ3ZpZGVvUGxheWxpc3RBZGRUb29sYmFyJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRfLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggcmVnaW9uSGFuZGxlcnMsIHJlZ2lvbiApIHtcblx0XHRcdF8uZWFjaCggcmVnaW9uSGFuZGxlcnMsIGZ1bmN0aW9uKCBjYWxsYmFjaywgaGFuZGxlciApIHtcblx0XHRcdFx0dGhpcy5vbiggcmVnaW9uICsgJzpyZW5kZXI6JyArIGhhbmRsZXIsIHRoaXNbIGNhbGxiYWNrIF0sIHRoaXMgKTtcblx0XHRcdH0sIHRoaXMgKTtcblx0XHR9LCB0aGlzICk7XG5cdH0sXG5cblx0YWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEhpZGUgbWVudSBpdGVtcyBmb3Igc3RhdGVzIHRpZWQgdG8gcGFydGljdWxhciBtZWRpYSB0eXBlcyBpZiB0aGVyZSBhcmUgbm8gaXRlbXNcblx0XHRfLmVhY2goIHRoaXMuY291bnRzLCBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdGlmICggdHlwZS5jb3VudCA8IDEgKSB7XG5cdFx0XHRcdHRoaXMubWVudUl0ZW1WaXNpYmlsaXR5KCB0eXBlLnN0YXRlLCAnaGlkZScgKTtcblx0XHRcdH1cblx0XHR9LCB0aGlzICk7XG5cdH0sXG5cblx0bWVkaWFUeXBlQ291bnRzOiBmdW5jdGlvbiggbW9kZWwsIGF0dHIgKSB7XG5cdFx0aWYgKCB0eXBlb2YgdGhpcy5jb3VudHNbIGF0dHIgXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jb3VudHNbIGF0dHIgXS5jb3VudCA8IDEgKSB7XG5cdFx0XHR0aGlzLmNvdW50c1sgYXR0ciBdLmNvdW50Kys7XG5cdFx0XHR0aGlzLm1lbnVJdGVtVmlzaWJpbGl0eSggdGhpcy5jb3VudHNbIGF0dHIgXS5zdGF0ZSwgJ3Nob3cnICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE1lbnVzXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3dwLkJhY2tib25lLlZpZXd9IHZpZXdcblx0ICovXG5cdG1haW5NZW51OiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2aWV3LnNldCh7XG5cdFx0XHQnbGlicmFyeS1zZXBhcmF0b3InOiBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRcdGNsYXNzTmFtZTogJ3NlcGFyYXRvcicsXG5cdFx0XHRcdHByaW9yaXR5OiAxMDBcblx0XHRcdH0pXG5cdFx0fSk7XG5cdH0sXG5cblx0bWVudUl0ZW1WaXNpYmlsaXR5OiBmdW5jdGlvbiggc3RhdGUsIHZpc2liaWxpdHkgKSB7XG5cdFx0dmFyIG1lbnUgPSB0aGlzLm1lbnUuZ2V0KCk7XG5cdFx0aWYgKCB2aXNpYmlsaXR5ID09PSAnaGlkZScgKSB7XG5cdFx0XHRtZW51LmhpZGUoIHN0YXRlICk7XG5cdFx0fSBlbHNlIGlmICggdmlzaWJpbGl0eSA9PT0gJ3Nob3cnICkge1xuXHRcdFx0bWVudS5zaG93KCBzdGF0ZSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7d3AuQmFja2JvbmUuVmlld30gdmlld1xuXHQgKi9cblx0Z2FsbGVyeU1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBsYXN0U3RhdGUgPSB0aGlzLmxhc3RTdGF0ZSgpLFxuXHRcdFx0cHJldmlvdXMgPSBsYXN0U3RhdGUgJiYgbGFzdFN0YXRlLmlkLFxuXHRcdFx0ZnJhbWUgPSB0aGlzO1xuXG5cdFx0dmlldy5zZXQoe1xuXHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdHRleHQ6ICAgICBsMTBuLmNhbmNlbEdhbGxlcnlUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6IDIwLFxuXHRcdFx0XHRjbGljazogICAgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdFx0XHRcdGZyYW1lLnNldFN0YXRlKCBwcmV2aW91cyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmcmFtZS5jbG9zZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEtlZXAgZm9jdXMgaW5zaWRlIG1lZGlhIG1vZGFsXG5cdFx0XHRcdFx0Ly8gYWZ0ZXIgY2FuY2VsaW5nIGEgZ2FsbGVyeVxuXHRcdFx0XHRcdHRoaXMuY29udHJvbGxlci5tb2RhbC5mb2N1c01hbmFnZXIuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNlcGFyYXRlQ2FuY2VsOiBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRcdGNsYXNzTmFtZTogJ3NlcGFyYXRvcicsXG5cdFx0XHRcdHByaW9yaXR5OiA0MFxuXHRcdFx0fSlcblx0XHR9KTtcblx0fSxcblxuXHRwbGF5bGlzdE1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBsYXN0U3RhdGUgPSB0aGlzLmxhc3RTdGF0ZSgpLFxuXHRcdFx0cHJldmlvdXMgPSBsYXN0U3RhdGUgJiYgbGFzdFN0YXRlLmlkLFxuXHRcdFx0ZnJhbWUgPSB0aGlzO1xuXG5cdFx0dmlldy5zZXQoe1xuXHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdHRleHQ6ICAgICBsMTBuLmNhbmNlbFBsYXlsaXN0VGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAyMCxcblx0XHRcdFx0Y2xpY2s6ICAgIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggcHJldmlvdXMgKSB7XG5cdFx0XHRcdFx0XHRmcmFtZS5zZXRTdGF0ZSggcHJldmlvdXMgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZnJhbWUuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzZXBhcmF0ZUNhbmNlbDogbmV3IHdwLm1lZGlhLlZpZXcoe1xuXHRcdFx0XHRjbGFzc05hbWU6ICdzZXBhcmF0b3InLFxuXHRcdFx0XHRwcmlvcml0eTogNDBcblx0XHRcdH0pXG5cdFx0fSk7XG5cdH0sXG5cblx0dmlkZW9QbGF5bGlzdE1lbnU6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBsYXN0U3RhdGUgPSB0aGlzLmxhc3RTdGF0ZSgpLFxuXHRcdFx0cHJldmlvdXMgPSBsYXN0U3RhdGUgJiYgbGFzdFN0YXRlLmlkLFxuXHRcdFx0ZnJhbWUgPSB0aGlzO1xuXG5cdFx0dmlldy5zZXQoe1xuXHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdHRleHQ6ICAgICBsMTBuLmNhbmNlbFZpZGVvUGxheWxpc3RUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6IDIwLFxuXHRcdFx0XHRjbGljazogICAgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCBwcmV2aW91cyApIHtcblx0XHRcdFx0XHRcdGZyYW1lLnNldFN0YXRlKCBwcmV2aW91cyApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmcmFtZS5jbG9zZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNlcGFyYXRlQ2FuY2VsOiBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRcdGNsYXNzTmFtZTogJ3NlcGFyYXRvcicsXG5cdFx0XHRcdHByaW9yaXR5OiA0MFxuXHRcdFx0fSlcblx0XHR9KTtcblx0fSxcblxuXHQvLyBDb250ZW50XG5cdGVtYmVkQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5FbWJlZCh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0bW9kZWw6ICAgICAgdGhpcy5zdGF0ZSgpXG5cdFx0fSkucmVuZGVyKCk7XG5cblx0XHR0aGlzLmNvbnRlbnQuc2V0KCB2aWV3ICk7XG5cblx0XHRpZiAoICEgd3AubWVkaWEuaXNUb3VjaERldmljZSApIHtcblx0XHRcdHZpZXcudXJsLmZvY3VzKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGVkaXRTZWxlY3Rpb25Db250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLnN0YXRlKCksXG5cdFx0XHRzZWxlY3Rpb24gPSBzdGF0ZS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0dmlldztcblxuXHRcdHZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50c0Jyb3dzZXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGNvbGxlY3Rpb246IHNlbGVjdGlvbixcblx0XHRcdHNlbGVjdGlvbjogIHNlbGVjdGlvbixcblx0XHRcdG1vZGVsOiAgICAgIHN0YXRlLFxuXHRcdFx0c29ydGFibGU6ICAgdHJ1ZSxcblx0XHRcdHNlYXJjaDogICAgIGZhbHNlLFxuXHRcdFx0ZGF0ZTogICAgICAgZmFsc2UsXG5cdFx0XHRkcmFnSW5mbzogICB0cnVlLFxuXG5cdFx0XHRBdHRhY2htZW50Vmlldzogd3AubWVkaWEudmlldy5BdHRhY2htZW50cy5FZGl0U2VsZWN0aW9uXG5cdFx0fSkucmVuZGVyKCk7XG5cblx0XHR2aWV3LnRvb2xiYXIuc2V0KCAnYmFja1RvTGlicmFyeScsIHtcblx0XHRcdHRleHQ6ICAgICBsMTBuLnJldHVyblRvTGlicmFyeSxcblx0XHRcdHByaW9yaXR5OiAtMTAwLFxuXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoJ2Jyb3dzZScpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gQnJvd3NlIG91ciBsaWJyYXJ5IG9mIGF0dGFjaG1lbnRzLlxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblxuXHRcdC8vIFRyaWdnZXIgdGhlIGNvbnRyb2xsZXIgdG8gc2V0IGZvY3VzXG5cdFx0dGhpcy50cmlnZ2VyKCAnZWRpdDpzZWxlY3Rpb24nLCB0aGlzICk7XG5cdH0sXG5cblx0ZWRpdEltYWdlQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGltYWdlID0gdGhpcy5zdGF0ZSgpLmdldCgnaW1hZ2UnKSxcblx0XHRcdHZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5FZGl0SW1hZ2UoIHsgbW9kZWw6IGltYWdlLCBjb250cm9sbGVyOiB0aGlzIH0gKS5yZW5kZXIoKTtcblxuXHRcdHRoaXMuY29udGVudC5zZXQoIHZpZXcgKTtcblxuXHRcdC8vIGFmdGVyIGNyZWF0aW5nIHRoZSB3cmFwcGVyIHZpZXcsIGxvYWQgdGhlIGFjdHVhbCBlZGl0b3IgdmlhIGFuIGFqYXggY2FsbFxuXHRcdHZpZXcubG9hZEVkaXRvcigpO1xuXG5cdH0sXG5cblx0Ly8gVG9vbGJhcnNcblxuXHQvKipcblx0ICogQHBhcmFtIHt3cC5CYWNrYm9uZS5WaWV3fSB2aWV3XG5cdCAqL1xuXHRzZWxlY3Rpb25TdGF0dXNUb29sYmFyOiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgZWRpdGFibGUgPSB0aGlzLnN0YXRlKCkuZ2V0KCdlZGl0YWJsZScpO1xuXG5cdFx0dmlldy5zZXQoICdzZWxlY3Rpb24nLCBuZXcgd3AubWVkaWEudmlldy5TZWxlY3Rpb24oe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0cHJpb3JpdHk6ICAgLTQwLFxuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVkaXRhYmxlLCBwYXNzIHRoZSBjYWxsYmFjayB0b1xuXHRcdFx0Ly8gc3dpdGNoIHRoZSBjb250ZW50IG1vZGUuXG5cdFx0XHRlZGl0YWJsZTogZWRpdGFibGUgJiYgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoJ2VkaXQtc2VsZWN0aW9uJyk7XG5cdFx0XHR9XG5cdFx0fSkucmVuZGVyKCkgKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHt3cC5CYWNrYm9uZS5WaWV3fSB2aWV3XG5cdCAqL1xuXHRtYWluSW5zZXJ0VG9vbGJhcjogZnVuY3Rpb24oIHZpZXcgKSB7XG5cdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzO1xuXG5cdFx0dGhpcy5zZWxlY3Rpb25TdGF0dXNUb29sYmFyKCB2aWV3ICk7XG5cblx0XHR2aWV3LnNldCggJ2luc2VydCcsIHtcblx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5pbnNlcnRJbnRvUG9zdCxcblx0XHRcdHJlcXVpcmVzOiB7IHNlbGVjdGlvbjogdHJ1ZSB9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBmaXJlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlI2luc2VydFxuXHRcdFx0ICovXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdFx0XHRzZWxlY3Rpb24gPSBzdGF0ZS5nZXQoJ3NlbGVjdGlvbicpO1xuXG5cdFx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcblx0XHRcdFx0c3RhdGUudHJpZ2dlciggJ2luc2VydCcsIHNlbGVjdGlvbiApLnJlc2V0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7d3AuQmFja2JvbmUuVmlld30gdmlld1xuXHQgKi9cblx0bWFpbkdhbGxlcnlUb29sYmFyOiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgY29udHJvbGxlciA9IHRoaXM7XG5cblx0XHR0aGlzLnNlbGVjdGlvblN0YXR1c1Rvb2xiYXIoIHZpZXcgKTtcblxuXHRcdHZpZXcuc2V0KCAnZ2FsbGVyeScsIHtcblx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5jcmVhdGVOZXdHYWxsZXJ5LFxuXHRcdFx0cHJpb3JpdHk6IDYwLFxuXHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0XHRcdGVkaXQgPSBjb250cm9sbGVyLnN0YXRlKCdnYWxsZXJ5LWVkaXQnKSxcblx0XHRcdFx0XHRtb2RlbHMgPSBzZWxlY3Rpb24ud2hlcmUoeyB0eXBlOiAnaW1hZ2UnIH0pO1xuXG5cdFx0XHRcdGVkaXQuc2V0KCAnbGlicmFyeScsIG5ldyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24oIG1vZGVscywge1xuXHRcdFx0XHRcdHByb3BzOiAgICBzZWxlY3Rpb24ucHJvcHMudG9KU09OKCksXG5cdFx0XHRcdFx0bXVsdGlwbGU6IHRydWVcblx0XHRcdFx0fSkgKTtcblxuXHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIuc2V0U3RhdGUoJ2dhbGxlcnktZWRpdCcpO1xuXG5cdFx0XHRcdC8vIEtlZXAgZm9jdXMgaW5zaWRlIG1lZGlhIG1vZGFsXG5cdFx0XHRcdC8vIGFmdGVyIGp1bXBpbmcgdG8gZ2FsbGVyeSB2aWV3XG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5tb2RhbC5mb2N1c01hbmFnZXIuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRtYWluUGxheWxpc3RUb29sYmFyOiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgY29udHJvbGxlciA9IHRoaXM7XG5cblx0XHR0aGlzLnNlbGVjdGlvblN0YXR1c1Rvb2xiYXIoIHZpZXcgKTtcblxuXHRcdHZpZXcuc2V0KCAncGxheWxpc3QnLCB7XG5cdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0dGV4dDogICAgIGwxMG4uY3JlYXRlTmV3UGxheWxpc3QsXG5cdFx0XHRwcmlvcml0eTogMTAwLFxuXHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NlbGVjdGlvbicpLFxuXHRcdFx0XHRcdGVkaXQgPSBjb250cm9sbGVyLnN0YXRlKCdwbGF5bGlzdC1lZGl0JyksXG5cdFx0XHRcdFx0bW9kZWxzID0gc2VsZWN0aW9uLndoZXJlKHsgdHlwZTogJ2F1ZGlvJyB9KTtcblxuXHRcdFx0XHRlZGl0LnNldCggJ2xpYnJhcnknLCBuZXcgd3AubWVkaWEubW9kZWwuU2VsZWN0aW9uKCBtb2RlbHMsIHtcblx0XHRcdFx0XHRwcm9wczogICAgc2VsZWN0aW9uLnByb3BzLnRvSlNPTigpLFxuXHRcdFx0XHRcdG11bHRpcGxlOiB0cnVlXG5cdFx0XHRcdH0pICk7XG5cblx0XHRcdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCdwbGF5bGlzdC1lZGl0Jyk7XG5cblx0XHRcdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHRcdFx0Ly8gYWZ0ZXIganVtcGluZyB0byBwbGF5bGlzdCB2aWV3XG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5tb2RhbC5mb2N1c01hbmFnZXIuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRtYWluVmlkZW9QbGF5bGlzdFRvb2xiYXI6IGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdHZhciBjb250cm9sbGVyID0gdGhpcztcblxuXHRcdHRoaXMuc2VsZWN0aW9uU3RhdHVzVG9vbGJhciggdmlldyApO1xuXG5cdFx0dmlldy5zZXQoICd2aWRlby1wbGF5bGlzdCcsIHtcblx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHR0ZXh0OiAgICAgbDEwbi5jcmVhdGVOZXdWaWRlb1BsYXlsaXN0LFxuXHRcdFx0cHJpb3JpdHk6IDEwMCxcblx0XHRcdHJlcXVpcmVzOiB7IHNlbGVjdGlvbjogdHJ1ZSB9LFxuXG5cdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBzZWxlY3Rpb24gPSBjb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdFx0XHRlZGl0ID0gY29udHJvbGxlci5zdGF0ZSgndmlkZW8tcGxheWxpc3QtZWRpdCcpLFxuXHRcdFx0XHRcdG1vZGVscyA9IHNlbGVjdGlvbi53aGVyZSh7IHR5cGU6ICd2aWRlbycgfSk7XG5cblx0XHRcdFx0ZWRpdC5zZXQoICdsaWJyYXJ5JywgbmV3IHdwLm1lZGlhLm1vZGVsLlNlbGVjdGlvbiggbW9kZWxzLCB7XG5cdFx0XHRcdFx0cHJvcHM6ICAgIHNlbGVjdGlvbi5wcm9wcy50b0pTT04oKSxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZVxuXHRcdFx0XHR9KSApO1xuXG5cdFx0XHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSgndmlkZW8tcGxheWxpc3QtZWRpdCcpO1xuXG5cdFx0XHRcdC8vIEtlZXAgZm9jdXMgaW5zaWRlIG1lZGlhIG1vZGFsXG5cdFx0XHRcdC8vIGFmdGVyIGp1bXBpbmcgdG8gdmlkZW8gcGxheWxpc3Qgdmlld1xuXHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIubW9kYWwuZm9jdXNNYW5hZ2VyLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0ZmVhdHVyZWRJbWFnZVRvb2xiYXI6IGZ1bmN0aW9uKCB0b29sYmFyICkge1xuXHRcdHRoaXMuY3JlYXRlU2VsZWN0VG9vbGJhciggdG9vbGJhciwge1xuXHRcdFx0dGV4dDogIGwxMG4uc2V0RmVhdHVyZWRJbWFnZSxcblx0XHRcdHN0YXRlOiB0aGlzLm9wdGlvbnMuc3RhdGVcblx0XHR9KTtcblx0fSxcblxuXHRtYWluRW1iZWRUb29sYmFyOiBmdW5jdGlvbiggdG9vbGJhciApIHtcblx0XHR0b29sYmFyLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyLkVtYmVkKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXNcblx0XHR9KTtcblx0fSxcblxuXHRnYWxsZXJ5RWRpdFRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlZGl0aW5nID0gdGhpcy5zdGF0ZSgpLmdldCgnZWRpdGluZycpO1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGluc2VydDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGVkaXRpbmcgPyBsMTBuLnVwZGF0ZUdhbGxlcnkgOiBsMTBuLmluc2VydEdhbGxlcnksXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRcdHJlcXVpcmVzOiB7IGxpYnJhcnk6IHRydWUgfSxcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEBmaXJlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlI3VwZGF0ZVxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKTtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0c3RhdGUudHJpZ2dlciggJ3VwZGF0ZScsIHN0YXRlLmdldCgnbGlicmFyeScpICk7XG5cblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRnYWxsZXJ5QWRkVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0aW5zZXJ0OiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5hZGRUb0dhbGxlcnksXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRcdHJlcXVpcmVzOiB7IHNlbGVjdGlvbjogdHJ1ZSB9LFxuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogQGZpcmVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGUjcmVzZXRcblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0c3RhdGUgPSBjb250cm9sbGVyLnN0YXRlKCksXG5cdFx0XHRcdFx0XHRcdGVkaXQgPSBjb250cm9sbGVyLnN0YXRlKCdnYWxsZXJ5LWVkaXQnKTtcblxuXHRcdFx0XHRcdFx0ZWRpdC5nZXQoJ2xpYnJhcnknKS5hZGQoIHN0YXRlLmdldCgnc2VsZWN0aW9uJykubW9kZWxzICk7XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCdyZXNldCcpO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSgnZ2FsbGVyeS1lZGl0Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRwbGF5bGlzdEVkaXRUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWRpdGluZyA9IHRoaXMuc3RhdGUoKS5nZXQoJ2VkaXRpbmcnKTtcblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRpbnNlcnQ6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBlZGl0aW5nID8gbDEwbi51cGRhdGVQbGF5bGlzdCA6IGwxMG4uaW5zZXJ0UGxheWxpc3QsXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDgwLFxuXHRcdFx0XHRcdHJlcXVpcmVzOiB7IGxpYnJhcnk6IHRydWUgfSxcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEBmaXJlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlI3VwZGF0ZVxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKTtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0c3RhdGUudHJpZ2dlciggJ3VwZGF0ZScsIHN0YXRlLmdldCgnbGlicmFyeScpICk7XG5cblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHRwbGF5bGlzdEFkZFRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9vbGJhci5zZXQoIG5ldyB3cC5tZWRpYS52aWV3LlRvb2xiYXIoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdGluc2VydDoge1xuXHRcdFx0XHRcdHN0eWxlOiAgICAncHJpbWFyeScsXG5cdFx0XHRcdFx0dGV4dDogICAgIGwxMG4uYWRkVG9QbGF5bGlzdCxcblx0XHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgc2VsZWN0aW9uOiB0cnVlIH0sXG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBAZmlyZXMgd3AubWVkaWEuY29udHJvbGxlci5TdGF0ZSNyZXNldFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdFx0XHRcdFx0ZWRpdCA9IGNvbnRyb2xsZXIuc3RhdGUoJ3BsYXlsaXN0LWVkaXQnKTtcblxuXHRcdFx0XHRcdFx0ZWRpdC5nZXQoJ2xpYnJhcnknKS5hZGQoIHN0YXRlLmdldCgnc2VsZWN0aW9uJykubW9kZWxzICk7XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCdyZXNldCcpO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSgncGxheWxpc3QtZWRpdCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pICk7XG5cdH0sXG5cblx0dmlkZW9QbGF5bGlzdEVkaXRUb29sYmFyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWRpdGluZyA9IHRoaXMuc3RhdGUoKS5nZXQoJ2VkaXRpbmcnKTtcblx0XHR0aGlzLnRvb2xiYXIuc2V0KCBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRpdGVtczoge1xuXHRcdFx0XHRpbnNlcnQ6IHtcblx0XHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHRcdHRleHQ6ICAgICBlZGl0aW5nID8gbDEwbi51cGRhdGVWaWRlb1BsYXlsaXN0IDogbDEwbi5pbnNlcnRWaWRlb1BsYXlsaXN0LFxuXHRcdFx0XHRcdHByaW9yaXR5OiAxNDAsXG5cdFx0XHRcdFx0cmVxdWlyZXM6IHsgbGlicmFyeTogdHJ1ZSB9LFxuXG5cdFx0XHRcdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdHN0YXRlID0gY29udHJvbGxlci5zdGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRsaWJyYXJ5ID0gc3RhdGUuZ2V0KCdsaWJyYXJ5Jyk7XG5cblx0XHRcdFx0XHRcdGxpYnJhcnkudHlwZSA9ICd2aWRlbyc7XG5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHN0YXRlLnRyaWdnZXIoICd1cGRhdGUnLCBsaWJyYXJ5ICk7XG5cblx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgYW5kIHJlc2V0IHRoZSBkZWZhdWx0IHN0YXRlLlxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSggY29udHJvbGxlci5vcHRpb25zLnN0YXRlICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkgKTtcblx0fSxcblxuXHR2aWRlb1BsYXlsaXN0QWRkVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50b29sYmFyLnNldCggbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0aW5zZXJ0OiB7XG5cdFx0XHRcdFx0c3R5bGU6ICAgICdwcmltYXJ5Jyxcblx0XHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5hZGRUb1ZpZGVvUGxheWxpc3QsXG5cdFx0XHRcdFx0cHJpb3JpdHk6IDE0MCxcblx0XHRcdFx0XHRyZXF1aXJlczogeyBzZWxlY3Rpb246IHRydWUgfSxcblxuXHRcdFx0XHRcdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHZhciBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IGNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdFx0XHRcdFx0ZWRpdCA9IGNvbnRyb2xsZXIuc3RhdGUoJ3ZpZGVvLXBsYXlsaXN0LWVkaXQnKTtcblxuXHRcdFx0XHRcdFx0ZWRpdC5nZXQoJ2xpYnJhcnknKS5hZGQoIHN0YXRlLmdldCgnc2VsZWN0aW9uJykubW9kZWxzICk7XG5cdFx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKCdyZXNldCcpO1xuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5zZXRTdGF0ZSgndmlkZW8tcGxheWxpc3QtZWRpdCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvc3Q7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZS5TZWxlY3RcbiAqXG4gKiBBIGZyYW1lIGZvciBzZWxlY3RpbmcgYW4gaXRlbSBvciBpdGVtcyBmcm9tIHRoZSBtZWRpYSBsaWJyYXJ5LlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuRnJhbWVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqIEBtaXhlcyB3cC5tZWRpYS5jb250cm9sbGVyLlN0YXRlTWFjaGluZVxuICovXG5cbnZhciBNZWRpYUZyYW1lID0gd3AubWVkaWEudmlldy5NZWRpYUZyYW1lLFxuXHRsMTBuID0gd3AubWVkaWEudmlldy5sMTBuLFxuXHRTZWxlY3Q7XG5cblNlbGVjdCA9IE1lZGlhRnJhbWUuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRNZWRpYUZyYW1lLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0c2VsZWN0aW9uOiBbXSxcblx0XHRcdGxpYnJhcnk6ICAge30sXG5cdFx0XHRtdWx0aXBsZTogIGZhbHNlLFxuXHRcdFx0c3RhdGU6ICAgICdsaWJyYXJ5J1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5jcmVhdGVTZWxlY3Rpb24oKTtcblx0XHR0aGlzLmNyZWF0ZVN0YXRlcygpO1xuXHRcdHRoaXMuYmluZEhhbmRsZXJzKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEF0dGFjaCBhIHNlbGVjdGlvbiBjb2xsZWN0aW9uIHRvIHRoZSBmcmFtZS5cblx0ICpcblx0ICogQSBzZWxlY3Rpb24gaXMgYSBjb2xsZWN0aW9uIG9mIGF0dGFjaG1lbnRzIHVzZWQgZm9yIGEgc3BlY2lmaWMgcHVycG9zZVxuXHQgKiBieSBhIG1lZGlhIGZyYW1lLiBlLmcuIFNlbGVjdGluZyBhbiBhdHRhY2htZW50IChvciBtYW55KSB0byBpbnNlcnQgaW50b1xuXHQgKiBwb3N0IGNvbnRlbnQuXG5cdCAqXG5cdCAqIEBzZWUgbWVkaWEubW9kZWwuU2VsZWN0aW9uXG5cdCAqL1xuXHRjcmVhdGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxlY3Rpb24gPSB0aGlzLm9wdGlvbnMuc2VsZWN0aW9uO1xuXG5cdFx0aWYgKCAhIChzZWxlY3Rpb24gaW5zdGFuY2VvZiB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24pICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnNlbGVjdGlvbiA9IG5ldyB3cC5tZWRpYS5tb2RlbC5TZWxlY3Rpb24oIHNlbGVjdGlvbiwge1xuXHRcdFx0XHRtdWx0aXBsZTogdGhpcy5vcHRpb25zLm11bHRpcGxlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLl9zZWxlY3Rpb24gPSB7XG5cdFx0XHRhdHRhY2htZW50czogbmV3IHdwLm1lZGlhLm1vZGVsLkF0dGFjaG1lbnRzKCksXG5cdFx0XHRkaWZmZXJlbmNlOiBbXVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgZGVmYXVsdCBzdGF0ZXMgb24gdGhlIGZyYW1lLlxuXHQgKi9cblx0Y3JlYXRlU3RhdGVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0YXRlcyApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIGRlZmF1bHQgc3RhdGVzLlxuXHRcdHRoaXMuc3RhdGVzLmFkZChbXG5cdFx0XHQvLyBNYWluIHN0YXRlcy5cblx0XHRcdG5ldyB3cC5tZWRpYS5jb250cm9sbGVyLkxpYnJhcnkoe1xuXHRcdFx0XHRsaWJyYXJ5OiAgIHdwLm1lZGlhLnF1ZXJ5KCBvcHRpb25zLmxpYnJhcnkgKSxcblx0XHRcdFx0bXVsdGlwbGU6ICBvcHRpb25zLm11bHRpcGxlLFxuXHRcdFx0XHR0aXRsZTogICAgIG9wdGlvbnMudGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAgMjBcblx0XHRcdH0pXG5cdFx0XSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJpbmQgcmVnaW9uIG1vZGUgZXZlbnQgY2FsbGJhY2tzLlxuXHQgKlxuXHQgKiBAc2VlIG1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uLnJlbmRlclxuXHQgKi9cblx0YmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm9uKCAncm91dGVyOmNyZWF0ZTpicm93c2UnLCB0aGlzLmNyZWF0ZVJvdXRlciwgdGhpcyApO1xuXHRcdHRoaXMub24oICdyb3V0ZXI6cmVuZGVyOmJyb3dzZScsIHRoaXMuYnJvd3NlUm91dGVyLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6Y3JlYXRlOmJyb3dzZScsIHRoaXMuYnJvd3NlQ29udGVudCwgdGhpcyApO1xuXHRcdHRoaXMub24oICdjb250ZW50OnJlbmRlcjp1cGxvYWQnLCB0aGlzLnVwbG9hZENvbnRlbnQsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAndG9vbGJhcjpjcmVhdGU6c2VsZWN0JywgdGhpcy5jcmVhdGVTZWxlY3RUb29sYmFyLCB0aGlzICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbmRlciBjYWxsYmFjayBmb3IgdGhlIHJvdXRlciByZWdpb24gaW4gdGhlIGBicm93c2VgIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7d3AubWVkaWEudmlldy5Sb3V0ZXJ9IHJvdXRlclZpZXdcblx0ICovXG5cdGJyb3dzZVJvdXRlcjogZnVuY3Rpb24oIHJvdXRlclZpZXcgKSB7XG5cdFx0cm91dGVyVmlldy5zZXQoe1xuXHRcdFx0dXBsb2FkOiB7XG5cdFx0XHRcdHRleHQ6ICAgICBsMTBuLnVwbG9hZEZpbGVzVGl0bGUsXG5cdFx0XHRcdHByaW9yaXR5OiAyMFxuXHRcdFx0fSxcblx0XHRcdGJyb3dzZToge1xuXHRcdFx0XHR0ZXh0OiAgICAgbDEwbi5tZWRpYUxpYnJhcnlUaXRsZSxcblx0XHRcdFx0cHJpb3JpdHk6IDQwXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbmRlciBjYWxsYmFjayBmb3IgdGhlIGNvbnRlbnQgcmVnaW9uIGluIHRoZSBgYnJvd3NlYCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9ufSBjb250ZW50UmVnaW9uXG5cdCAqL1xuXHRicm93c2VDb250ZW50OiBmdW5jdGlvbiggY29udGVudFJlZ2lvbiApIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XG5cblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcygnaGlkZS10b29sYmFyJyk7XG5cblx0XHQvLyBCcm93c2Ugb3VyIGxpYnJhcnkgb2YgYXR0YWNobWVudHMuXG5cdFx0Y29udGVudFJlZ2lvbi52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuQXR0YWNobWVudHNCcm93c2VyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRjb2xsZWN0aW9uOiBzdGF0ZS5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdHNlbGVjdGlvbjogIHN0YXRlLmdldCgnc2VsZWN0aW9uJyksXG5cdFx0XHRtb2RlbDogICAgICBzdGF0ZSxcblx0XHRcdHNvcnRhYmxlOiAgIHN0YXRlLmdldCgnc29ydGFibGUnKSxcblx0XHRcdHNlYXJjaDogICAgIHN0YXRlLmdldCgnc2VhcmNoYWJsZScpLFxuXHRcdFx0ZmlsdGVyczogICAgc3RhdGUuZ2V0KCdmaWx0ZXJhYmxlJyksXG5cdFx0XHRkYXRlOiAgICAgICBzdGF0ZS5nZXQoJ2RhdGUnKSxcblx0XHRcdGRpc3BsYXk6ICAgIHN0YXRlLmhhcygnZGlzcGxheScpID8gc3RhdGUuZ2V0KCdkaXNwbGF5JykgOiBzdGF0ZS5nZXQoJ2Rpc3BsYXlTZXR0aW5ncycpLFxuXHRcdFx0ZHJhZ0luZm86ICAgc3RhdGUuZ2V0KCdkcmFnSW5mbycpLFxuXG5cdFx0XHRpZGVhbENvbHVtbldpZHRoOiBzdGF0ZS5nZXQoJ2lkZWFsQ29sdW1uV2lkdGgnKSxcblx0XHRcdHN1Z2dlc3RlZFdpZHRoOiAgIHN0YXRlLmdldCgnc3VnZ2VzdGVkV2lkdGgnKSxcblx0XHRcdHN1Z2dlc3RlZEhlaWdodDogIHN0YXRlLmdldCgnc3VnZ2VzdGVkSGVpZ2h0JyksXG5cblx0XHRcdEF0dGFjaG1lbnRWaWV3OiBzdGF0ZS5nZXQoJ0F0dGFjaG1lbnRWaWV3Jylcblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogUmVuZGVyIGNhbGxiYWNrIGZvciB0aGUgY29udGVudCByZWdpb24gaW4gdGhlIGB1cGxvYWRgIG1vZGUuXG5cdCAqL1xuXHR1cGxvYWRDb250ZW50OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyggJ2hpZGUtdG9vbGJhcicgKTtcblx0XHR0aGlzLmNvbnRlbnQuc2V0KCBuZXcgd3AubWVkaWEudmlldy5VcGxvYWRlcklubGluZSh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzXG5cdFx0fSkgKTtcblx0fSxcblxuXHQvKipcblx0ICogVG9vbGJhcnNcblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IHRvb2xiYXJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKiBAdGhpcyB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvblxuXHQgKi9cblx0Y3JlYXRlU2VsZWN0VG9vbGJhcjogZnVuY3Rpb24oIHRvb2xiYXIsIG9wdGlvbnMgKSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmJ1dHRvbiB8fCB7fTtcblx0XHRvcHRpb25zLmNvbnRyb2xsZXIgPSB0aGlzO1xuXG5cdFx0dG9vbGJhci52aWV3ID0gbmV3IHdwLm1lZGlhLnZpZXcuVG9vbGJhci5TZWxlY3QoIG9wdGlvbnMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LklmcmFtZVxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgSWZyYW1lID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS1pZnJhbWUnLFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuSWZyYW1lfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnZpZXdzLmRldGFjaCgpO1xuXHRcdHRoaXMuJGVsLmh0bWwoICc8aWZyYW1lIHNyYz1cIicgKyB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKS5nZXQoJ3NyYycpICsgJ1wiIC8+JyApO1xuXHRcdHRoaXMudmlld3MucmVuZGVyKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IElmcmFtZTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5JbWFnZURldGFpbHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5XG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgQXR0YWNobWVudERpc3BsYXkgPSB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5LFxuXHQkID0galF1ZXJ5LFxuXHRJbWFnZURldGFpbHM7XG5cbkltYWdlRGV0YWlscyA9IEF0dGFjaG1lbnREaXNwbGF5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ2ltYWdlLWRldGFpbHMnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdpbWFnZS1kZXRhaWxzJyksXG5cdGV2ZW50czogXy5kZWZhdWx0cyggQXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLmV2ZW50cywge1xuXHRcdCdjbGljayAuZWRpdC1hdHRhY2htZW50JzogJ2VkaXRBdHRhY2htZW50Jyxcblx0XHQnY2xpY2sgLnJlcGxhY2UtYXR0YWNobWVudCc6ICdyZXBsYWNlQXR0YWNobWVudCcsXG5cdFx0J2NsaWNrIC5hZHZhbmNlZC10b2dnbGUnOiAnb25Ub2dnbGVBZHZhbmNlZCcsXG5cdFx0J2NoYW5nZSBbZGF0YS1zZXR0aW5nPVwiY3VzdG9tV2lkdGhcIl0nOiAnb25DdXN0b21TaXplJyxcblx0XHQnY2hhbmdlIFtkYXRhLXNldHRpbmc9XCJjdXN0b21IZWlnaHRcIl0nOiAnb25DdXN0b21TaXplJyxcblx0XHQna2V5dXAgW2RhdGEtc2V0dGluZz1cImN1c3RvbVdpZHRoXCJdJzogJ29uQ3VzdG9tU2l6ZScsXG5cdFx0J2tleXVwIFtkYXRhLXNldHRpbmc9XCJjdXN0b21IZWlnaHRcIl0nOiAnb25DdXN0b21TaXplJ1xuXHR9ICksXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIHVzZWQgaW4gQXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUxpbmtUb1xuXHRcdHRoaXMub3B0aW9ucy5hdHRhY2htZW50ID0gdGhpcy5tb2RlbC5hdHRhY2htZW50O1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6dXJsJywgdGhpcy51cGRhdGVVcmwgKTtcblx0XHR0aGlzLmxpc3RlblRvKCB0aGlzLm1vZGVsLCAnY2hhbmdlOmxpbmsnLCB0aGlzLnRvZ2dsZUxpbmtTZXR0aW5ncyApO1xuXHRcdHRoaXMubGlzdGVuVG8oIHRoaXMubW9kZWwsICdjaGFuZ2U6c2l6ZScsIHRoaXMudG9nZ2xlQ3VzdG9tU2l6ZSApO1xuXG5cdFx0QXR0YWNobWVudERpc3BsYXkucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhdHRhY2htZW50ID0gZmFsc2U7XG5cblx0XHRpZiAoIHRoaXMubW9kZWwuYXR0YWNobWVudCApIHtcblx0XHRcdGF0dGFjaG1lbnQgPSB0aGlzLm1vZGVsLmF0dGFjaG1lbnQudG9KU09OKCk7XG5cdFx0fVxuXHRcdHJldHVybiBfLmRlZmF1bHRzKHtcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLnRvSlNPTigpLFxuXHRcdFx0YXR0YWNobWVudDogYXR0YWNobWVudFxuXHRcdH0sIHRoaXMub3B0aW9ucyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cblx0XHRpZiAoIHRoaXMubW9kZWwuYXR0YWNobWVudCAmJiAncGVuZGluZycgPT09IHRoaXMubW9kZWwuZGZkLnN0YXRlKCkgKSB7XG5cdFx0XHR0aGlzLm1vZGVsLmRmZFxuXHRcdFx0XHQuZG9uZSggXy5iaW5kKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRBdHRhY2htZW50RGlzcGxheS5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmdzICk7XG5cdFx0XHRcdFx0dGhpcy5wb3N0UmVuZGVyKCk7XG5cdFx0XHRcdH0sIHRoaXMgKSApXG5cdFx0XHRcdC5mYWlsKCBfLmJpbmQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHRoaXMubW9kZWwuYXR0YWNobWVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcblx0XHRcdFx0XHR0aGlzLnBvc3RSZW5kZXIoKTtcblx0XHRcdFx0fSwgdGhpcyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEF0dGFjaG1lbnREaXNwbGF5LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0dGhpcy5wb3N0UmVuZGVyKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cG9zdFJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0c2V0VGltZW91dCggXy5iaW5kKCB0aGlzLnJlc2V0Rm9jdXMsIHRoaXMgKSwgMTAgKTtcblx0XHR0aGlzLnRvZ2dsZUxpbmtTZXR0aW5ncygpO1xuXHRcdGlmICggd2luZG93LmdldFVzZXJTZXR0aW5nKCAnYWR2SW1nRGV0YWlscycgKSA9PT0gJ3Nob3cnICkge1xuXHRcdFx0dGhpcy50b2dnbGVBZHZhbmNlZCggdHJ1ZSApO1xuXHRcdH1cblx0XHR0aGlzLnRyaWdnZXIoICdwb3N0LXJlbmRlcicgKTtcblx0fSxcblxuXHRyZXNldEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiQoICcubGluay10by1jdXN0b20nICkuYmx1cigpO1xuXHRcdHRoaXMuJCggJy5lbWJlZC1tZWRpYS1zZXR0aW5ncycgKS5zY3JvbGxUb3AoIDAgKTtcblx0fSxcblxuXHR1cGRhdGVVcmw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJCggJy5pbWFnZSBpbWcnICkuYXR0ciggJ3NyYycsIHRoaXMubW9kZWwuZ2V0KCAndXJsJyApICk7XG5cdFx0dGhpcy4kKCAnLnVybCcgKS52YWwoIHRoaXMubW9kZWwuZ2V0KCAndXJsJyApICk7XG5cdH0sXG5cblx0dG9nZ2xlTGlua1NldHRpbmdzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMubW9kZWwuZ2V0KCAnbGluaycgKSA9PT0gJ25vbmUnICkge1xuXHRcdFx0dGhpcy4kKCAnLmxpbmstc2V0dGluZ3MnICkuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLiQoICcubGluay1zZXR0aW5ncycgKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cdFx0fVxuXHR9LFxuXG5cdHRvZ2dsZUN1c3RvbVNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5tb2RlbC5nZXQoICdzaXplJyApICE9PSAnY3VzdG9tJyApIHtcblx0XHRcdHRoaXMuJCggJy5jdXN0b20tc2l6ZScgKS5hZGRDbGFzcygnaGlkZGVuJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuJCggJy5jdXN0b20tc2l6ZScgKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQ3VzdG9tU2l6ZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBkaW1lbnNpb24gPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCdzZXR0aW5nJyksXG5cdFx0XHRudW0gPSAkKCBldmVudC50YXJnZXQgKS52YWwoKSxcblx0XHRcdHZhbHVlO1xuXG5cdFx0Ly8gSWdub3JlIGJvZ3VzIGlucHV0XG5cdFx0aWYgKCAhIC9eXFxkKy8udGVzdCggbnVtICkgfHwgcGFyc2VJbnQoIG51bSwgMTAgKSA8IDEgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggZGltZW5zaW9uID09PSAnY3VzdG9tV2lkdGgnICkge1xuXHRcdFx0dmFsdWUgPSBNYXRoLnJvdW5kKCAxIC8gdGhpcy5tb2RlbC5nZXQoICdhc3BlY3RSYXRpbycgKSAqIG51bSApO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoICdjdXN0b21IZWlnaHQnLCB2YWx1ZSwgeyBzaWxlbnQ6IHRydWUgfSApO1xuXHRcdFx0dGhpcy4kKCAnW2RhdGEtc2V0dGluZz1cImN1c3RvbUhlaWdodFwiXScgKS52YWwoIHZhbHVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbHVlID0gTWF0aC5yb3VuZCggdGhpcy5tb2RlbC5nZXQoICdhc3BlY3RSYXRpbycgKSAqIG51bSApO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoICdjdXN0b21XaWR0aCcsIHZhbHVlLCB7IHNpbGVudDogdHJ1ZSAgfSApO1xuXHRcdFx0dGhpcy4kKCAnW2RhdGEtc2V0dGluZz1cImN1c3RvbVdpZHRoXCJdJyApLnZhbCggdmFsdWUgKTtcblx0XHR9XG5cdH0sXG5cblx0b25Ub2dnbGVBZHZhbmNlZDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy50b2dnbGVBZHZhbmNlZCgpO1xuXHR9LFxuXG5cdHRvZ2dsZUFkdmFuY2VkOiBmdW5jdGlvbiggc2hvdyApIHtcblx0XHR2YXIgJGFkdmFuY2VkID0gdGhpcy4kZWwuZmluZCggJy5hZHZhbmNlZC1zZWN0aW9uJyApLFxuXHRcdFx0bW9kZTtcblxuXHRcdGlmICggJGFkdmFuY2VkLmhhc0NsYXNzKCdhZHZhbmNlZC12aXNpYmxlJykgfHwgc2hvdyA9PT0gZmFsc2UgKSB7XG5cdFx0XHQkYWR2YW5jZWQucmVtb3ZlQ2xhc3MoJ2FkdmFuY2VkLXZpc2libGUnKTtcblx0XHRcdCRhZHZhbmNlZC5maW5kKCcuYWR2YW5jZWQtc2V0dGluZ3MnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG5cdFx0XHRtb2RlID0gJ2hpZGUnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkYWR2YW5jZWQuYWRkQ2xhc3MoJ2FkdmFuY2VkLXZpc2libGUnKTtcblx0XHRcdCRhZHZhbmNlZC5maW5kKCcuYWR2YW5jZWQtc2V0dGluZ3MnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG5cdFx0XHRtb2RlID0gJ3Nob3cnO1xuXHRcdH1cblxuXHRcdHdpbmRvdy5zZXRVc2VyU2V0dGluZyggJ2FkdkltZ0RldGFpbHMnLCBtb2RlICk7XG5cdH0sXG5cblx0ZWRpdEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgZWRpdFN0YXRlID0gdGhpcy5jb250cm9sbGVyLnN0YXRlcy5nZXQoICdlZGl0LWltYWdlJyApO1xuXG5cdFx0aWYgKCB3aW5kb3cuaW1hZ2VFZGl0ICYmIGVkaXRTdGF0ZSApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRlZGl0U3RhdGUuc2V0KCAnaW1hZ2UnLCB0aGlzLm1vZGVsLmF0dGFjaG1lbnQgKTtcblx0XHRcdHRoaXMuY29udHJvbGxlci5zZXRTdGF0ZSggJ2VkaXQtaW1hZ2UnICk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlcGxhY2VBdHRhY2htZW50OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIuc2V0U3RhdGUoICdyZXBsYWNlLWltYWdlJyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZURldGFpbHM7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTGFiZWxcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIExhYmVsID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAnbGFiZWwnLFxuXHRjbGFzc05hbWU6ICdzY3JlZW4tcmVhZGVyLXRleHQnLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmFsdWUgPSB0aGlzLm9wdGlvbnMudmFsdWU7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5odG1sKCB0aGlzLnZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGFiZWw7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZVxuICpcbiAqIFRoZSBmcmFtZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVkaWEgbW9kYWwuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5GcmFtZVxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICogQG1peGVzIHdwLm1lZGlhLmNvbnRyb2xsZXIuU3RhdGVNYWNoaW5lXG4gKi9cbnZhciBGcmFtZSA9IHdwLm1lZGlhLnZpZXcuRnJhbWUsXG5cdCQgPSBqUXVlcnksXG5cdE1lZGlhRnJhbWU7XG5cbk1lZGlhRnJhbWUgPSBGcmFtZS5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS1mcmFtZScsXG5cdHRlbXBsYXRlOiAgd3AudGVtcGxhdGUoJ21lZGlhLWZyYW1lJyksXG5cdHJlZ2lvbnM6ICAgWydtZW51JywndGl0bGUnLCdjb250ZW50JywndG9vbGJhcicsJ3JvdXRlciddLFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayBkaXYubWVkaWEtZnJhbWUtdGl0bGUgaDEnOiAndG9nZ2xlTWVudSdcblx0fSxcblxuXHQvKipcblx0ICogQGdsb2JhbCB3cC5VcGxvYWRlclxuXHQgKi9cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0RnJhbWUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHR0aXRsZTogICAgJycsXG5cdFx0XHRtb2RhbDogICAgdHJ1ZSxcblx0XHRcdHVwbG9hZGVyOiB0cnVlXG5cdFx0fSk7XG5cblx0XHQvLyBFbnN1cmUgY29yZSBVSSBpcyBlbmFibGVkLlxuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCd3cC1jb3JlLXVpJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIG1vZGFsIGNvbnRhaW5lciB2aWV3LlxuXHRcdGlmICggdGhpcy5vcHRpb25zLm1vZGFsICkge1xuXHRcdFx0dGhpcy5tb2RhbCA9IG5ldyB3cC5tZWRpYS52aWV3Lk1vZGFsKHtcblx0XHRcdFx0Y29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0dGl0bGU6ICAgICAgdGhpcy5vcHRpb25zLnRpdGxlXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tb2RhbC5jb250ZW50KCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2UgdGhlIHVwbG9hZGVyIG9mZiBpZiB0aGUgdXBsb2FkIGxpbWl0IGhhcyBiZWVuIGV4Y2VlZGVkIG9yXG5cdFx0Ly8gaWYgdGhlIGJyb3dzZXIgaXNuJ3Qgc3VwcG9ydGVkLlxuXHRcdGlmICggd3AuVXBsb2FkZXIubGltaXRFeGNlZWRlZCB8fCAhIHdwLlVwbG9hZGVyLmJyb3dzZXIuc3VwcG9ydGVkICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnVwbG9hZGVyID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB3aW5kb3ctd2lkZSB1cGxvYWRlci5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy51cGxvYWRlciApIHtcblx0XHRcdHRoaXMudXBsb2FkZXIgPSBuZXcgd3AubWVkaWEudmlldy5VcGxvYWRlcldpbmRvdyh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMsXG5cdFx0XHRcdHVwbG9hZGVyOiB7XG5cdFx0XHRcdFx0ZHJvcHpvbmU6ICB0aGlzLm1vZGFsID8gdGhpcy5tb2RhbC4kZWwgOiB0aGlzLiRlbCxcblx0XHRcdFx0XHRjb250YWluZXI6IHRoaXMuJGVsXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0dGhpcy52aWV3cy5zZXQoICcubWVkaWEtZnJhbWUtdXBsb2FkZXInLCB0aGlzLnVwbG9hZGVyICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5vbiggJ2F0dGFjaCcsIF8uYmluZCggdGhpcy52aWV3cy5yZWFkeSwgdGhpcy52aWV3cyApLCB0aGlzICk7XG5cblx0XHQvLyBCaW5kIGRlZmF1bHQgdGl0bGUgY3JlYXRpb24uXG5cdFx0dGhpcy5vbiggJ3RpdGxlOmNyZWF0ZTpkZWZhdWx0JywgdGhpcy5jcmVhdGVUaXRsZSwgdGhpcyApO1xuXHRcdHRoaXMudGl0bGUubW9kZSgnZGVmYXVsdCcpO1xuXG5cdFx0dGhpcy5vbiggJ3RpdGxlOnJlbmRlcicsIGZ1bmN0aW9uKCB2aWV3ICkge1xuXHRcdFx0dmlldy4kZWwuYXBwZW5kKCAnPHNwYW4gY2xhc3M9XCJkYXNoaWNvbnMgZGFzaGljb25zLWFycm93LWRvd25cIj48L3NwYW4+JyApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQmluZCBkZWZhdWx0IG1lbnUuXG5cdFx0dGhpcy5vbiggJ21lbnU6Y3JlYXRlOmRlZmF1bHQnLCB0aGlzLmNyZWF0ZU1lbnUsIHRoaXMgKTtcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1lZGlhRnJhbWV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEFjdGl2YXRlIHRoZSBkZWZhdWx0IHN0YXRlIGlmIG5vIGFjdGl2ZSBzdGF0ZSBleGlzdHMuXG5cdFx0aWYgKCAhIHRoaXMuc3RhdGUoKSAmJiB0aGlzLm9wdGlvbnMuc3RhdGUgKSB7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB0aGlzLm9wdGlvbnMuc3RhdGUgKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAncmVuZGVyJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0cmV0dXJuIEZyYW1lLnByb3RvdHlwZS5yZW5kZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IHRpdGxlXG5cdCAqIEB0aGlzIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG5cdCAqL1xuXHRjcmVhdGVUaXRsZTogZnVuY3Rpb24oIHRpdGxlICkge1xuXHRcdHRpdGxlLnZpZXcgPSBuZXcgd3AubWVkaWEuVmlldyh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0dGFnTmFtZTogJ2gxJ1xuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IG1lbnVcblx0ICogQHRoaXMgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cblx0ICovXG5cdGNyZWF0ZU1lbnU6IGZ1bmN0aW9uKCBtZW51ICkge1xuXHRcdG1lbnUudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3Lk1lbnUoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpc1xuXHRcdH0pO1xuXHR9LFxuXG5cdHRvZ2dsZU1lbnU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmZpbmQoICcubWVkaWEtbWVudScgKS50b2dnbGVDbGFzcyggJ3Zpc2libGUnICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0b29sYmFyXG5cdCAqIEB0aGlzIHdwLm1lZGlhLmNvbnRyb2xsZXIuUmVnaW9uXG5cdCAqL1xuXHRjcmVhdGVUb29sYmFyOiBmdW5jdGlvbiggdG9vbGJhciApIHtcblx0XHR0b29sYmFyLnZpZXcgPSBuZXcgd3AubWVkaWEudmlldy5Ub29sYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXNcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByb3V0ZXJcblx0ICogQHRoaXMgd3AubWVkaWEuY29udHJvbGxlci5SZWdpb25cblx0ICovXG5cdGNyZWF0ZVJvdXRlcjogZnVuY3Rpb24oIHJvdXRlciApIHtcblx0XHRyb3V0ZXIudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LlJvdXRlcih7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzXG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHQgKi9cblx0Y3JlYXRlSWZyYW1lU3RhdGVzOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIgc2V0dGluZ3MgPSB3cC5tZWRpYS52aWV3LnNldHRpbmdzLFxuXHRcdFx0dGFicyA9IHNldHRpbmdzLnRhYnMsXG5cdFx0XHR0YWJVcmwgPSBzZXR0aW5ncy50YWJVcmwsXG5cdFx0XHQkcG9zdElkO1xuXG5cdFx0aWYgKCAhIHRhYnMgfHwgISB0YWJVcmwgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSBwb3N0IElEIHRvIHRoZSB0YWIgVVJMIGlmIGl0IGV4aXN0cy5cblx0XHQkcG9zdElkID0gJCgnI3Bvc3RfSUQnKTtcblx0XHRpZiAoICRwb3N0SWQubGVuZ3RoICkge1xuXHRcdFx0dGFiVXJsICs9ICcmcG9zdF9pZD0nICsgJHBvc3RJZC52YWwoKTtcblx0XHR9XG5cblx0XHQvLyBHZW5lcmF0ZSB0aGUgdGFiIHN0YXRlcy5cblx0XHRfLmVhY2goIHRhYnMsIGZ1bmN0aW9uKCB0aXRsZSwgaWQgKSB7XG5cdFx0XHR0aGlzLnN0YXRlKCAnaWZyYW1lOicgKyBpZCApLnNldCggXy5kZWZhdWx0cyh7XG5cdFx0XHRcdHRhYjogICAgIGlkLFxuXHRcdFx0XHRzcmM6ICAgICB0YWJVcmwgKyAnJnRhYj0nICsgaWQsXG5cdFx0XHRcdHRpdGxlOiAgIHRpdGxlLFxuXHRcdFx0XHRjb250ZW50OiAnaWZyYW1lJyxcblx0XHRcdFx0bWVudTogICAgJ2RlZmF1bHQnXG5cdFx0XHR9LCBvcHRpb25zICkgKTtcblx0XHR9LCB0aGlzICk7XG5cblx0XHR0aGlzLm9uKCAnY29udGVudDpjcmVhdGU6aWZyYW1lJywgdGhpcy5pZnJhbWVDb250ZW50LCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ2NvbnRlbnQ6ZGVhY3RpdmF0ZTppZnJhbWUnLCB0aGlzLmlmcmFtZUNvbnRlbnRDbGVhbnVwLCB0aGlzICk7XG5cdFx0dGhpcy5vbiggJ21lbnU6cmVuZGVyOmRlZmF1bHQnLCB0aGlzLmlmcmFtZU1lbnUsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnb3BlbicsIHRoaXMuaGlqYWNrVGhpY2tib3gsIHRoaXMgKTtcblx0XHR0aGlzLm9uKCAnY2xvc2UnLCB0aGlzLnJlc3RvcmVUaGlja2JveCwgdGhpcyApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29udGVudFxuXHQgKiBAdGhpcyB3cC5tZWRpYS5jb250cm9sbGVyLlJlZ2lvblxuXHQgKi9cblx0aWZyYW1lQ29udGVudDogZnVuY3Rpb24oIGNvbnRlbnQgKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoJ2hpZGUtdG9vbGJhcicpO1xuXHRcdGNvbnRlbnQudmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LklmcmFtZSh7XG5cdFx0XHRjb250cm9sbGVyOiB0aGlzXG5cdFx0fSk7XG5cdH0sXG5cblx0aWZyYW1lQ29udGVudENsZWFudXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCdoaWRlLXRvb2xiYXInKTtcblx0fSxcblxuXHRpZnJhbWVNZW51OiBmdW5jdGlvbiggdmlldyApIHtcblx0XHR2YXIgdmlld3MgPSB7fTtcblxuXHRcdGlmICggISB2aWV3ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdF8uZWFjaCggd3AubWVkaWEudmlldy5zZXR0aW5ncy50YWJzLCBmdW5jdGlvbiggdGl0bGUsIGlkICkge1xuXHRcdFx0dmlld3NbICdpZnJhbWU6JyArIGlkIF0gPSB7XG5cdFx0XHRcdHRleHQ6IHRoaXMuc3RhdGUoICdpZnJhbWU6JyArIGlkICkuZ2V0KCd0aXRsZScpLFxuXHRcdFx0XHRwcmlvcml0eTogMjAwXG5cdFx0XHR9O1xuXHRcdH0sIHRoaXMgKTtcblxuXHRcdHZpZXcuc2V0KCB2aWV3cyApO1xuXHR9LFxuXG5cdGhpamFja1RoaWNrYm94OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZnJhbWUgPSB0aGlzO1xuXG5cdFx0aWYgKCAhIHdpbmRvdy50Yl9yZW1vdmUgfHwgdGhpcy5fdGJfcmVtb3ZlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3RiX3JlbW92ZSA9IHdpbmRvdy50Yl9yZW1vdmU7XG5cdFx0d2luZG93LnRiX3JlbW92ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnJhbWUuY2xvc2UoKTtcblx0XHRcdGZyYW1lLnJlc2V0KCk7XG5cdFx0XHRmcmFtZS5zZXRTdGF0ZSggZnJhbWUub3B0aW9ucy5zdGF0ZSApO1xuXHRcdFx0ZnJhbWUuX3RiX3JlbW92ZS5jYWxsKCB3aW5kb3cgKTtcblx0XHR9O1xuXHR9LFxuXG5cdHJlc3RvcmVUaGlja2JveDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhIHRoaXMuX3RiX3JlbW92ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR3aW5kb3cudGJfcmVtb3ZlID0gdGhpcy5fdGJfcmVtb3ZlO1xuXHRcdGRlbGV0ZSB0aGlzLl90Yl9yZW1vdmU7XG5cdH1cbn0pO1xuXG4vLyBNYXAgc29tZSBvZiB0aGUgbW9kYWwncyBtZXRob2RzIHRvIHRoZSBmcmFtZS5cbl8uZWFjaChbJ29wZW4nLCdjbG9zZScsJ2F0dGFjaCcsJ2RldGFjaCcsJ2VzY2FwZSddLCBmdW5jdGlvbiggbWV0aG9kICkge1xuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTWVkaWFGcmFtZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdE1lZGlhRnJhbWUucHJvdG90eXBlWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggdGhpcy5tb2RhbCApIHtcblx0XHRcdHRoaXMubW9kYWxbIG1ldGhvZCBdLmFwcGx5KCB0aGlzLm1vZGFsLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZWRpYUZyYW1lO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lbnVJdGVtXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciAkID0galF1ZXJ5LFxuXHRNZW51SXRlbTtcblxuTWVudUl0ZW0gPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2EnLFxuXHRjbGFzc05hbWU6ICdtZWRpYS1tZW51LWl0ZW0nLFxuXG5cdGF0dHJpYnV0ZXM6IHtcblx0XHRocmVmOiAnIydcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2snOiAnX2NsaWNrJ1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRfY2xpY2s6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgY2xpY2tPdmVycmlkZSA9IHRoaXMub3B0aW9ucy5jbGljaztcblxuXHRcdGlmICggZXZlbnQgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdGlmICggY2xpY2tPdmVycmlkZSApIHtcblx0XHRcdGNsaWNrT3ZlcnJpZGUuY2FsbCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiBzZWxlY3RpbmcgYSB0YWIgYWxvbmcgdGhlIGxlZnQgc2lkZSxcblx0XHQvLyBmb2N1cyBzaG91bGQgYmUgdHJhbnNmZXJyZWQgaW50byB0aGUgbWFpbiBwYW5lbFxuXHRcdGlmICggISB3cC5tZWRpYS5pc1RvdWNoRGV2aWNlICkge1xuXHRcdFx0JCgnLm1lZGlhLWZyYW1lLWNvbnRlbnQgaW5wdXQnKS5maXJzdCgpLmZvY3VzKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLm9wdGlvbnMuc3RhdGU7XG5cblx0XHRpZiAoIHN0YXRlICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLnNldFN0YXRlKCBzdGF0ZSApO1xuXHRcdFx0dGhpcy52aWV3cy5wYXJlbnQuJGVsLnJlbW92ZUNsYXNzKCAndmlzaWJsZScgKTsgLy8gVE9ETzogb3IgaGlkZSBvbiBhbnkgY2xpY2ssIHNlZSBiZWxvd1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1lbnVJdGVtfSByZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdGlmICggb3B0aW9ucy50ZXh0ICkge1xuXHRcdFx0dGhpcy4kZWwudGV4dCggb3B0aW9ucy50ZXh0ICk7XG5cdFx0fSBlbHNlIGlmICggb3B0aW9ucy5odG1sICkge1xuXHRcdFx0dGhpcy4kZWwuaHRtbCggb3B0aW9ucy5odG1sICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnVJdGVtO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1lbnVcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgTWVudUl0ZW0gPSB3cC5tZWRpYS52aWV3Lk1lbnVJdGVtLFxuXHRQcmlvcml0eUxpc3QgPSB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdCxcblx0TWVudTtcblxuTWVudSA9IFByaW9yaXR5TGlzdC5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdtZWRpYS1tZW51Jyxcblx0cHJvcGVydHk6ICAnc3RhdGUnLFxuXHRJdGVtVmlldzogIE1lbnVJdGVtLFxuXHRyZWdpb246ICAgICdtZW51JyxcblxuXHQvKiBUT0RPOiBhbHRlcm5hdGl2ZWx5IGhpZGUgb24gYW55IGNsaWNrIGFueXdoZXJlXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayc6ICdjbGljaydcblx0fSxcblxuXHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoICd2aXNpYmxlJyApO1xuXHR9LFxuXHQqL1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWRcblx0ICogQHJldHVybnMge3dwLm1lZGlhLlZpZXd9XG5cdCAqL1xuXHR0b1ZpZXc6IGZ1bmN0aW9uKCBvcHRpb25zLCBpZCApIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRvcHRpb25zWyB0aGlzLnByb3BlcnR5IF0gPSBvcHRpb25zWyB0aGlzLnByb3BlcnR5IF0gfHwgaWQ7XG5cdFx0cmV0dXJuIG5ldyB0aGlzLkl0ZW1WaWV3KCBvcHRpb25zICkucmVuZGVyKCk7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ3JlYWR5JyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0UHJpb3JpdHlMaXN0LnByb3RvdHlwZS5yZWFkeS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy52aXNpYmlsaXR5KCk7XG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbigpIHtcblx0XHQvKipcblx0XHQgKiBjYWxsICdzZXQnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRQcmlvcml0eUxpc3QucHJvdG90eXBlLnNldC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy52aXNpYmlsaXR5KCk7XG5cdH0sXG5cblx0dW5zZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ3Vuc2V0JyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0UHJpb3JpdHlMaXN0LnByb3RvdHlwZS51bnNldC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy52aXNpYmlsaXR5KCk7XG5cdH0sXG5cblx0dmlzaWJpbGl0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHJlZ2lvbiA9IHRoaXMucmVnaW9uLFxuXHRcdFx0dmlldyA9IHRoaXMuY29udHJvbGxlclsgcmVnaW9uIF0uZ2V0KCksXG5cdFx0XHR2aWV3cyA9IHRoaXMudmlld3MuZ2V0KCksXG5cdFx0XHRoaWRlID0gISB2aWV3cyB8fCB2aWV3cy5sZW5ndGggPCAyO1xuXG5cdFx0aWYgKCB0aGlzID09PSB2aWV3ICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLiRlbC50b2dnbGVDbGFzcyggJ2hpZGUtJyArIHJlZ2lvbiwgaGlkZSApO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKi9cblx0c2VsZWN0OiBmdW5jdGlvbiggaWQgKSB7XG5cdFx0dmFyIHZpZXcgPSB0aGlzLmdldCggaWQgKTtcblxuXHRcdGlmICggISB2aWV3ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZGVzZWxlY3QoKTtcblx0XHR2aWV3LiRlbC5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdH0sXG5cblx0ZGVzZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXHR9LFxuXG5cdGhpZGU6IGZ1bmN0aW9uKCBpZCApIHtcblx0XHR2YXIgdmlldyA9IHRoaXMuZ2V0KCBpZCApO1xuXG5cdFx0aWYgKCAhIHZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmlldy4kZWwuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCBpZCApIHtcblx0XHR2YXIgdmlldyA9IHRoaXMuZ2V0KCBpZCApO1xuXG5cdFx0aWYgKCAhIHZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmlldy4kZWwucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZW51O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3Lk1vZGFsXG4gKlxuICogQSBtb2RhbCB2aWV3LCB3aGljaCB0aGUgbWVkaWEgbW9kYWwgdXNlcyBhcyBpdHMgZGVmYXVsdCBjb250YWluZXIuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciAkID0galF1ZXJ5LFxuXHRNb2RhbDtcblxuTW9kYWwgPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAnZGl2Jyxcblx0dGVtcGxhdGU6IHdwLnRlbXBsYXRlKCdtZWRpYS1tb2RhbCcpLFxuXG5cdGF0dHJpYnV0ZXM6IHtcblx0XHR0YWJpbmRleDogMFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdCdjbGljayAubWVkaWEtbW9kYWwtYmFja2Ryb3AsIC5tZWRpYS1tb2RhbC1jbG9zZSc6ICdlc2NhcGVIYW5kbGVyJyxcblx0XHQna2V5ZG93bic6ICdrZXlkb3duJ1xuXHR9LFxuXG5cdGNsaWNrZWRPcGVuZXJFbDogbnVsbCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keSxcblx0XHRcdHRpdGxlOiAgICAgJycsXG5cdFx0XHRwcm9wYWdhdGU6IHRydWUsXG5cdFx0XHRmcmVlemU6ICAgIHRydWVcblx0XHR9KTtcblxuXHRcdHRoaXMuZm9jdXNNYW5hZ2VyID0gbmV3IHdwLm1lZGlhLnZpZXcuRm9jdXNNYW5hZ2VyKHtcblx0XHRcdGVsOiB0aGlzLmVsXG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fVxuXHQgKi9cblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGVcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdGF0dGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLnZpZXdzLmF0dGFjaGVkICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMudmlld3MucmVuZGVyZWQgKSB7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLmFwcGVuZFRvKCB0aGlzLm9wdGlvbnMuY29udGFpbmVyICk7XG5cblx0XHQvLyBNYW51YWxseSBtYXJrIHRoZSB2aWV3IGFzIGF0dGFjaGVkIGFuZCB0cmlnZ2VyIHJlYWR5LlxuXHRcdHRoaXMudmlld3MuYXR0YWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlld3MucmVhZHkoKTtcblxuXHRcdHJldHVybiB0aGlzLnByb3BhZ2F0ZSgnYXR0YWNoJyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3Lk1vZGFsfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZGV0YWNoOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuJGVsLmlzKCc6dmlzaWJsZScpICkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLmRldGFjaCgpO1xuXHRcdHRoaXMudmlld3MuYXR0YWNoZWQgPSBmYWxzZTtcblx0XHRyZXR1cm4gdGhpcy5wcm9wYWdhdGUoJ2RldGFjaCcpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdG9wZW46IGZ1bmN0aW9uKCkge1xuXHRcdHZhciAkZWwgPSB0aGlzLiRlbCxcblx0XHRcdG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG5cdFx0XHRtY2VFZGl0b3I7XG5cblx0XHRpZiAoICRlbC5pcygnOnZpc2libGUnKSApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHRoaXMuY2xpY2tlZE9wZW5lckVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuXHRcdGlmICggISB0aGlzLnZpZXdzLmF0dGFjaGVkICkge1xuXHRcdFx0dGhpcy5hdHRhY2goKTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgYGZyZWV6ZWAgb3B0aW9uIGlzIHNldCwgcmVjb3JkIHRoZSB3aW5kb3cncyBzY3JvbGwgcG9zaXRpb24uXG5cdFx0aWYgKCBvcHRpb25zLmZyZWV6ZSApIHtcblx0XHRcdHRoaXMuX2ZyZWV6ZSA9IHtcblx0XHRcdFx0c2Nyb2xsVG9wOiAkKCB3aW5kb3cgKS5zY3JvbGxUb3AoKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBEaXNhYmxlIHBhZ2Ugc2Nyb2xsaW5nLlxuXHRcdCQoICdib2R5JyApLmFkZENsYXNzKCAnbW9kYWwtb3BlbicgKTtcblxuXHRcdCRlbC5zaG93KCk7XG5cblx0XHQvLyBUcnkgdG8gY2xvc2UgdGhlIG9uc2NyZWVuIGtleWJvYXJkXG5cdFx0aWYgKCAnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQgKSB7XG5cdFx0XHRpZiAoICggbWNlRWRpdG9yID0gd2luZG93LnRpbnltY2UgJiYgd2luZG93LnRpbnltY2UuYWN0aXZlRWRpdG9yICkgICYmICEgbWNlRWRpdG9yLmlzSGlkZGVuKCkgJiYgbWNlRWRpdG9yLmlmcmFtZUVsZW1lbnQgKSB7XG5cdFx0XHRcdG1jZUVkaXRvci5pZnJhbWVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHRcdG1jZUVkaXRvci5pZnJhbWVFbGVtZW50LmJsdXIoKTtcblxuXHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRtY2VFZGl0b3IuaWZyYW1lRWxlbWVudC5ibHVyKCk7XG5cdFx0XHRcdH0sIDEwMCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuJGVsLmZvY3VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9wYWdhdGUoJ29wZW4nKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTW9kYWx9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRjbG9zZTogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGZyZWV6ZSA9IHRoaXMuX2ZyZWV6ZTtcblxuXHRcdGlmICggISB0aGlzLnZpZXdzLmF0dGFjaGVkIHx8ICEgdGhpcy4kZWwuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBFbmFibGUgcGFnZSBzY3JvbGxpbmcuXG5cdFx0JCggJ2JvZHknICkucmVtb3ZlQ2xhc3MoICdtb2RhbC1vcGVuJyApO1xuXG5cdFx0Ly8gSGlkZSBtb2RhbCBhbmQgcmVtb3ZlIHJlc3RyaWN0ZWQgbWVkaWEgbW9kYWwgdGFiIGZvY3VzIG9uY2UgaXQncyBjbG9zZWRcblx0XHR0aGlzLiRlbC5oaWRlKCkudW5kZWxlZ2F0ZSggJ2tleWRvd24nICk7XG5cblx0XHQvLyBQdXQgZm9jdXMgYmFjayBpbiB1c2VmdWwgbG9jYXRpb24gb25jZSBtb2RhbCBpcyBjbG9zZWQuXG5cdFx0aWYgKCBudWxsICE9PSB0aGlzLmNsaWNrZWRPcGVuZXJFbCApIHtcblx0XHRcdHRoaXMuY2xpY2tlZE9wZW5lckVsLmZvY3VzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoICcjd3Bib2R5LWNvbnRlbnQnICkuZm9jdXMoKTtcblx0XHR9XG5cblx0XHR0aGlzLnByb3BhZ2F0ZSgnY2xvc2UnKTtcblxuXHRcdC8vIElmIHRoZSBgZnJlZXplYCBvcHRpb24gaXMgc2V0LCByZXN0b3JlIHRoZSBjb250YWluZXIncyBzY3JvbGwgcG9zaXRpb24uXG5cdFx0aWYgKCBmcmVlemUgKSB7XG5cdFx0XHQkKCB3aW5kb3cgKS5zY3JvbGxUb3AoIGZyZWV6ZS5zY3JvbGxUb3AgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy5lc2NhcGUgKSB7XG5cdFx0XHR0aGlzLnByb3BhZ2F0ZSgnZXNjYXBlJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdGVzY2FwZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2UoeyBlc2NhcGU6IHRydWUgfSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcblx0ICovXG5cdGVzY2FwZUhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuZXNjYXBlKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb250ZW50IFZpZXdzIHRvIHJlZ2lzdGVyIHRvICcubWVkaWEtbW9kYWwtY29udGVudCdcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuTW9kYWx9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRjb250ZW50OiBmdW5jdGlvbiggY29udGVudCApIHtcblx0XHR0aGlzLnZpZXdzLnNldCggJy5tZWRpYS1tb2RhbC1jb250ZW50JywgY29udGVudCApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIG1vZGFsIGV2ZW50IGFuZCBpZiB0aGUgYHByb3BhZ2F0ZWAgb3B0aW9uIGlzIHNldCxcblx0ICogZm9yd2FyZHMgZXZlbnRzIHRvIHRoZSBtb2RhbCdzIGNvbnRyb2xsZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Nb2RhbH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHByb3BhZ2F0ZTogZnVuY3Rpb24oIGlkICkge1xuXHRcdHRoaXMudHJpZ2dlciggaWQgKTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnByb3BhZ2F0ZSApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci50cmlnZ2VyKCBpZCApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHRrZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0Ly8gQ2xvc2UgdGhlIG1vZGFsIHdoZW4gZXNjYXBlIGlzIHByZXNzZWQuXG5cdFx0aWYgKCAyNyA9PT0gZXZlbnQud2hpY2ggJiYgdGhpcy4kZWwuaXMoJzp2aXNpYmxlJykgKSB7XG5cdFx0XHR0aGlzLmVzY2FwZSgpO1xuXHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb2RhbDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5Qcmlvcml0eUxpc3RcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFByaW9yaXR5TGlzdCA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZGl2JyxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl92aWV3cyA9IHt9O1xuXG5cdFx0dGhpcy5zZXQoIF8uZXh0ZW5kKCB7fSwgdGhpcy5fdmlld3MsIHRoaXMub3B0aW9ucy52aWV3cyApLCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHRkZWxldGUgdGhpcy5vcHRpb25zLnZpZXdzO1xuXG5cdFx0aWYgKCAhIHRoaXMub3B0aW9ucy5zaWxlbnQgKSB7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcGFyYW0ge3dwLm1lZGlhLlZpZXd8T2JqZWN0fSB2aWV3XG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHNldDogZnVuY3Rpb24oIGlkLCB2aWV3LCBvcHRpb25zICkge1xuXHRcdHZhciBwcmlvcml0eSwgdmlld3MsIGluZGV4O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvLyBBY2NlcHQgYW4gb2JqZWN0IHdpdGggYW4gYGlkYCA6IGB2aWV3YCBtYXBwaW5nLlxuXHRcdGlmICggXy5pc09iamVjdCggaWQgKSApIHtcblx0XHRcdF8uZWFjaCggaWQsIGZ1bmN0aW9uKCB2aWV3LCBpZCApIHtcblx0XHRcdFx0dGhpcy5zZXQoIGlkLCB2aWV3ICk7XG5cdFx0XHR9LCB0aGlzICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoICEgKHZpZXcgaW5zdGFuY2VvZiBCYWNrYm9uZS5WaWV3KSApIHtcblx0XHRcdHZpZXcgPSB0aGlzLnRvVmlldyggdmlldywgaWQsIG9wdGlvbnMgKTtcblx0XHR9XG5cdFx0dmlldy5jb250cm9sbGVyID0gdmlldy5jb250cm9sbGVyIHx8IHRoaXMuY29udHJvbGxlcjtcblxuXHRcdHRoaXMudW5zZXQoIGlkICk7XG5cblx0XHRwcmlvcml0eSA9IHZpZXcub3B0aW9ucy5wcmlvcml0eSB8fCAxMDtcblx0XHR2aWV3cyA9IHRoaXMudmlld3MuZ2V0KCkgfHwgW107XG5cblx0XHRfLmZpbmQoIHZpZXdzLCBmdW5jdGlvbiggZXhpc3RpbmcsIGkgKSB7XG5cdFx0XHRpZiAoIGV4aXN0aW5nLm9wdGlvbnMucHJpb3JpdHkgPiBwcmlvcml0eSApIHtcblx0XHRcdFx0aW5kZXggPSBpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX3ZpZXdzWyBpZCBdID0gdmlldztcblx0XHR0aGlzLnZpZXdzLmFkZCggdmlldywge1xuXHRcdFx0YXQ6IF8uaXNOdW1iZXIoIGluZGV4ICkgPyBpbmRleCA6IHZpZXdzLmxlbmd0aCB8fCAwXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEuVmlld31cblx0ICovXG5cdGdldDogZnVuY3Rpb24oIGlkICkge1xuXHRcdHJldHVybiB0aGlzLl92aWV3c1sgaWQgXTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Qcmlvcml0eUxpc3R9XG5cdCAqL1xuXHR1bnNldDogZnVuY3Rpb24oIGlkICkge1xuXHRcdHZhciB2aWV3ID0gdGhpcy5nZXQoIGlkICk7XG5cblx0XHRpZiAoIHZpZXcgKSB7XG5cdFx0XHR2aWV3LnJlbW92ZSgpO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSB0aGlzLl92aWV3c1sgaWQgXTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5WaWV3fVxuXHQgKi9cblx0dG9WaWV3OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRyZXR1cm4gbmV3IHdwLm1lZGlhLlZpZXcoIG9wdGlvbnMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlMaXN0O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlJvdXRlckl0ZW1cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lbnVJdGVtXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBSb3V0ZXJJdGVtID0gd3AubWVkaWEudmlldy5NZW51SXRlbS5leHRlbmQoe1xuXHQvKipcblx0ICogT24gY2xpY2sgaGFuZGxlciB0byBhY3RpdmF0ZSB0aGUgY29udGVudCByZWdpb24ncyBjb3JyZXNwb25kaW5nIG1vZGUuXG5cdCAqL1xuXHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNvbnRlbnRNb2RlID0gdGhpcy5vcHRpb25zLmNvbnRlbnRNb2RlO1xuXHRcdGlmICggY29udGVudE1vZGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xsZXIuY29udGVudC5tb2RlKCBjb250ZW50TW9kZSApO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUm91dGVySXRlbTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5Sb3V0ZXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3Lk1lbnVcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdFxuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgTWVudSA9IHdwLm1lZGlhLnZpZXcuTWVudSxcblx0Um91dGVyO1xuXG5Sb3V0ZXIgPSBNZW51LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2RpdicsXG5cdGNsYXNzTmFtZTogJ21lZGlhLXJvdXRlcicsXG5cdHByb3BlcnR5OiAgJ2NvbnRlbnRNb2RlJyxcblx0SXRlbVZpZXc6ICB3cC5tZWRpYS52aWV3LlJvdXRlckl0ZW0sXG5cdHJlZ2lvbjogICAgJ3JvdXRlcicsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLm9uKCAnY29udGVudDpyZW5kZXInLCB0aGlzLnVwZGF0ZSwgdGhpcyApO1xuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0TWVudS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbW9kZSA9IHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoKTtcblx0XHRpZiAoIG1vZGUgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdCggbW9kZSApO1xuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUm91dGVyO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNlYXJjaFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgbDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0U2VhcmNoO1xuXG5TZWFyY2ggPSB3cC5tZWRpYS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6ICAgJ2lucHV0Jyxcblx0Y2xhc3NOYW1lOiAnc2VhcmNoJyxcblx0aWQ6ICAgICAgICAnbWVkaWEtc2VhcmNoLWlucHV0JyxcblxuXHRhdHRyaWJ1dGVzOiB7XG5cdFx0dHlwZTogICAgICAgICdzZWFyY2gnLFxuXHRcdHBsYWNlaG9sZGVyOiBsMTBuLnNlYXJjaE1lZGlhUGxhY2Vob2xkZXJcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHQnaW5wdXQnOiAgJ3NlYXJjaCcsXG5cdFx0J2tleXVwJzogICdzZWFyY2gnXG5cdH0sXG5cblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlNlYXJjaH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbC52YWx1ZSA9IHRoaXMubW9kZWwuZXNjYXBlKCdzZWFyY2gnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzZWFyY2g6IF8uZGVib3VuY2UoIGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoIGV2ZW50LnRhcmdldC52YWx1ZSApIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KCAnc2VhcmNoJywgZXZlbnQudGFyZ2V0LnZhbHVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwudW5zZXQoJ3NlYXJjaCcpO1xuXHRcdH1cblx0fSwgMzAwIClcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlYXJjaDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TZWxlY3Rpb25cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFNlbGVjdGlvbjtcblxuU2VsZWN0aW9uID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdtZWRpYS1zZWxlY3Rpb24nLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdtZWRpYS1zZWxlY3Rpb24nKSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2sgLmVkaXQtc2VsZWN0aW9uJzogICdlZGl0Jyxcblx0XHQnY2xpY2sgLmNsZWFyLXNlbGVjdGlvbic6ICdjbGVhcidcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdGVkaXRhYmxlOiAgZmFsc2UsXG5cdFx0XHRjbGVhcmFibGU6IHRydWVcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZW1iZXIge3dwLm1lZGlhLnZpZXcuQXR0YWNobWVudHMuU2VsZWN0aW9ufVxuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNobWVudHMgPSBuZXcgd3AubWVkaWEudmlldy5BdHRhY2htZW50cy5TZWxlY3Rpb24oe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0c2VsZWN0aW9uOiAgdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0bW9kZWw6ICAgICAgbmV3IEJhY2tib25lLk1vZGVsKClcblx0XHR9KTtcblxuXHRcdHRoaXMudmlld3Muc2V0KCAnLnNlbGVjdGlvbi12aWV3JywgdGhpcy5hdHRhY2htZW50cyApO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5vbiggJ2FkZCByZW1vdmUgcmVzZXQnLCB0aGlzLnJlZnJlc2gsIHRoaXMgKTtcblx0XHR0aGlzLmNvbnRyb2xsZXIub24oICdjb250ZW50OmFjdGl2YXRlJywgdGhpcy5yZWZyZXNoLCB0aGlzICk7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIElmIHRoZSBzZWxlY3Rpb24gaGFzbid0IGJlZW4gcmVuZGVyZWQsIGJhaWwuXG5cdFx0aWYgKCAhIHRoaXMuJGVsLmNoaWxkcmVuKCkubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0ZWRpdGluZyA9ICdlZGl0LXNlbGVjdGlvbicgPT09IHRoaXMuY29udHJvbGxlci5jb250ZW50Lm1vZGUoKTtcblxuXHRcdC8vIElmIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIGRpc3BsYXkgbm90aGluZy5cblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2VtcHR5JywgISBjb2xsZWN0aW9uLmxlbmd0aCApO1xuXHRcdHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCAnb25lJywgMSA9PT0gY29sbGVjdGlvbi5sZW5ndGggKTtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2VkaXRpbmcnLCBlZGl0aW5nICk7XG5cblx0XHR0aGlzLiQoJy5jb3VudCcpLnRleHQoIGwxMG4uc2VsZWN0ZWQucmVwbGFjZSgnJWQnLCBjb2xsZWN0aW9uLmxlbmd0aCkgKTtcblx0fSxcblxuXHRlZGl0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAoIHRoaXMub3B0aW9ucy5lZGl0YWJsZSApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5lZGl0YWJsZS5jYWxsKCB0aGlzLCB0aGlzLmNvbGxlY3Rpb24gKTtcblx0XHR9XG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5yZXNldCgpO1xuXG5cdFx0Ly8gS2VlcCBmb2N1cyBpbnNpZGUgbWVkaWEgbW9kYWxcblx0XHQvLyBhZnRlciBjbGVhciBsaW5rIGlzIHNlbGVjdGVkXG5cdFx0dGhpcy5jb250cm9sbGVyLm1vZGFsLmZvY3VzTWFuYWdlci5mb2N1cygpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Rpb247XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuU2V0dGluZ3NcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHQkID0gQmFja2JvbmUuJCxcblx0U2V0dGluZ3M7XG5cblNldHRpbmdzID0gVmlldy5leHRlbmQoe1xuXHRldmVudHM6IHtcblx0XHQnY2xpY2sgYnV0dG9uJzogICAgJ3VwZGF0ZUhhbmRsZXInLFxuXHRcdCdjaGFuZ2UgaW5wdXQnOiAgICAndXBkYXRlSGFuZGxlcicsXG5cdFx0J2NoYW5nZSBzZWxlY3QnOiAgICd1cGRhdGVIYW5kbGVyJyxcblx0XHQnY2hhbmdlIHRleHRhcmVhJzogJ3VwZGF0ZUhhbmRsZXInXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbCA9IHRoaXMubW9kZWwgfHwgbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZScsIHRoaXMudXBkYXRlQ2hhbmdlcyApO1xuXHR9LFxuXG5cdHByZXBhcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLmRlZmF1bHRzKHtcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLnRvSlNPTigpXG5cdFx0fSwgdGhpcy5vcHRpb25zICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5TZXR0aW5nc30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgY2hhaW5pbmdcblx0ICovXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Vmlldy5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHQvLyBTZWxlY3QgdGhlIGNvcnJlY3QgdmFsdWVzLlxuXHRcdF8oIHRoaXMubW9kZWwuYXR0cmlidXRlcyApLmNoYWluKCkua2V5cygpLmVhY2goIHRoaXMudXBkYXRlLCB0aGlzICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG5cdCAqL1xuXHR1cGRhdGU6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0dmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoIGtleSApLFxuXHRcdFx0JHNldHRpbmcgPSB0aGlzLiQoJ1tkYXRhLXNldHRpbmc9XCInICsga2V5ICsgJ1wiXScpLFxuXHRcdFx0JGJ1dHRvbnMsICR2YWx1ZTtcblxuXHRcdC8vIEJhaWwgaWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaGluZyBzZXR0aW5nLlxuXHRcdGlmICggISAkc2V0dGluZy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQXR0ZW1wdCB0byBkZXRlcm1pbmUgaG93IHRoZSBzZXR0aW5nIGlzIHJlbmRlcmVkIGFuZCB1cGRhdGVcblx0XHQvLyB0aGUgc2VsZWN0ZWQgdmFsdWUuXG5cblx0XHQvLyBIYW5kbGUgZHJvcGRvd25zLlxuXHRcdGlmICggJHNldHRpbmcuaXMoJ3NlbGVjdCcpICkge1xuXHRcdFx0JHZhbHVlID0gJHNldHRpbmcuZmluZCgnW3ZhbHVlPVwiJyArIHZhbHVlICsgJ1wiXScpO1xuXG5cdFx0XHRpZiAoICR2YWx1ZS5sZW5ndGggKSB7XG5cdFx0XHRcdCRzZXR0aW5nLmZpbmQoJ29wdGlvbicpLnByb3AoICdzZWxlY3RlZCcsIGZhbHNlICk7XG5cdFx0XHRcdCR2YWx1ZS5wcm9wKCAnc2VsZWN0ZWQnLCB0cnVlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBkZXNpcmVkIHZhbHVlLCByZWNvcmQgd2hhdCAqaXMqIHNlbGVjdGVkLlxuXHRcdFx0XHR0aGlzLm1vZGVsLnNldCgga2V5LCAkc2V0dGluZy5maW5kKCc6c2VsZWN0ZWQnKS52YWwoKSApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIGJ1dHRvbiBncm91cHMuXG5cdFx0fSBlbHNlIGlmICggJHNldHRpbmcuaGFzQ2xhc3MoJ2J1dHRvbi1ncm91cCcpICkge1xuXHRcdFx0JGJ1dHRvbnMgPSAkc2V0dGluZy5maW5kKCdidXR0b24nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cdFx0XHQkYnV0dG9ucy5maWx0ZXIoICdbdmFsdWU9XCInICsgdmFsdWUgKyAnXCJdJyApLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuXHRcdC8vIEhhbmRsZSB0ZXh0IGlucHV0cyBhbmQgdGV4dGFyZWFzLlxuXHRcdH0gZWxzZSBpZiAoICRzZXR0aW5nLmlzKCdpbnB1dFt0eXBlPVwidGV4dFwiXSwgdGV4dGFyZWEnKSApIHtcblx0XHRcdGlmICggISAkc2V0dGluZy5pcygnOmZvY3VzJykgKSB7XG5cdFx0XHRcdCRzZXR0aW5nLnZhbCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHQvLyBIYW5kbGUgY2hlY2tib3hlcy5cblx0XHR9IGVsc2UgaWYgKCAkc2V0dGluZy5pcygnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykgKSB7XG5cdFx0XHQkc2V0dGluZy5wcm9wKCAnY2hlY2tlZCcsICEhIHZhbHVlICYmICdmYWxzZScgIT09IHZhbHVlICk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG5cdCAqL1xuXHR1cGRhdGVIYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyICRzZXR0aW5nID0gJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCgnW2RhdGEtc2V0dGluZ10nKSxcblx0XHRcdHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLFxuXHRcdFx0dXNlclNldHRpbmc7XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCAhICRzZXR0aW5nLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGNoZWNrYm94ZXMuXG5cdFx0aWYgKCAkc2V0dGluZy5pcygnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykgKSB7XG5cdFx0XHR2YWx1ZSA9ICRzZXR0aW5nWzBdLmNoZWNrZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHNldHRpbmcuXG5cdFx0dGhpcy5tb2RlbC5zZXQoICRzZXR0aW5nLmRhdGEoJ3NldHRpbmcnKSwgdmFsdWUgKTtcblxuXHRcdC8vIElmIHRoZSBzZXR0aW5nIGhhcyBhIGNvcnJlc3BvbmRpbmcgdXNlciBzZXR0aW5nLFxuXHRcdC8vIHVwZGF0ZSB0aGF0IGFzIHdlbGwuXG5cdFx0aWYgKCB1c2VyU2V0dGluZyA9ICRzZXR0aW5nLmRhdGEoJ3VzZXJTZXR0aW5nJykgKSB7XG5cdFx0XHR3aW5kb3cuc2V0VXNlclNldHRpbmcoIHVzZXJTZXR0aW5nLCB2YWx1ZSApO1xuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVDaGFuZ2VzOiBmdW5jdGlvbiggbW9kZWwgKSB7XG5cdFx0aWYgKCBtb2RlbC5oYXNDaGFuZ2VkKCkgKSB7XG5cdFx0XHRfKCBtb2RlbC5jaGFuZ2VkICkuY2hhaW4oKS5rZXlzKCkuZWFjaCggdGhpcy51cGRhdGUsIHRoaXMgKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldHRpbmdzO1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNldHRpbmdzLkF0dGFjaG1lbnREaXNwbGF5XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgU2V0dGluZ3MgPSB3cC5tZWRpYS52aWV3LlNldHRpbmdzLFxuXHRBdHRhY2htZW50RGlzcGxheTtcblxuQXR0YWNobWVudERpc3BsYXkgPSBTZXR0aW5ncy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdhdHRhY2htZW50LWRpc3BsYXktc2V0dGluZ3MnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdhdHRhY2htZW50LWRpc3BsYXktc2V0dGluZ3MnKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYXR0YWNobWVudCA9IHRoaXMub3B0aW9ucy5hdHRhY2htZW50O1xuXG5cdFx0Xy5kZWZhdWx0cyggdGhpcy5vcHRpb25zLCB7XG5cdFx0XHR1c2VyU2V0dGluZ3M6IGZhbHNlXG5cdFx0fSk7XG5cdFx0Ly8gQ2FsbCAnaW5pdGlhbGl6ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzcy5cblx0XHRTZXR0aW5ncy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0dGhpcy5saXN0ZW5UbyggdGhpcy5tb2RlbCwgJ2NoYW5nZTpsaW5rJywgdGhpcy51cGRhdGVMaW5rVG8gKTtcblxuXHRcdGlmICggYXR0YWNobWVudCApIHtcblx0XHRcdGF0dGFjaG1lbnQub24oICdjaGFuZ2U6dXBsb2FkaW5nJywgdGhpcy5yZW5kZXIsIHRoaXMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGF0dGFjaG1lbnQgPSB0aGlzLm9wdGlvbnMuYXR0YWNobWVudDtcblx0XHRpZiAoIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHRhdHRhY2htZW50Lm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdkaXNwb3NlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0U2V0dGluZ3MucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuQXR0YWNobWVudERpc3BsYXl9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBhdHRhY2htZW50ID0gdGhpcy5vcHRpb25zLmF0dGFjaG1lbnQ7XG5cdFx0aWYgKCBhdHRhY2htZW50ICkge1xuXHRcdFx0Xy5leHRlbmQoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0XHRzaXplczogYXR0YWNobWVudC5nZXQoJ3NpemVzJyksXG5cdFx0XHRcdHR5cGU6ICBhdHRhY2htZW50LmdldCgndHlwZScpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAncmVuZGVyJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0U2V0dGluZ3MucHJvdG90eXBlLnJlbmRlci5jYWxsKCB0aGlzICk7XG5cdFx0dGhpcy51cGRhdGVMaW5rVG8oKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR1cGRhdGVMaW5rVG86IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBsaW5rVG8gPSB0aGlzLm1vZGVsLmdldCgnbGluaycpLFxuXHRcdFx0JGlucHV0ID0gdGhpcy4kKCcubGluay10by1jdXN0b20nKSxcblx0XHRcdGF0dGFjaG1lbnQgPSB0aGlzLm9wdGlvbnMuYXR0YWNobWVudDtcblxuXHRcdGlmICggJ25vbmUnID09PSBsaW5rVG8gfHwgJ2VtYmVkJyA9PT0gbGlua1RvIHx8ICggISBhdHRhY2htZW50ICYmICdjdXN0b20nICE9PSBsaW5rVG8gKSApIHtcblx0XHRcdCRpbnB1dC5hZGRDbGFzcyggJ2hpZGRlbicgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGF0dGFjaG1lbnQgKSB7XG5cdFx0XHRpZiAoICdwb3N0JyA9PT0gbGlua1RvICkge1xuXHRcdFx0XHQkaW5wdXQudmFsKCBhdHRhY2htZW50LmdldCgnbGluaycpICk7XG5cdFx0XHR9IGVsc2UgaWYgKCAnZmlsZScgPT09IGxpbmtUbyApIHtcblx0XHRcdFx0JGlucHV0LnZhbCggYXR0YWNobWVudC5nZXQoJ3VybCcpICk7XG5cdFx0XHR9IGVsc2UgaWYgKCAhIHRoaXMubW9kZWwuZ2V0KCdsaW5rVXJsJykgKSB7XG5cdFx0XHRcdCRpbnB1dC52YWwoJ2h0dHA6Ly8nKTtcblx0XHRcdH1cblxuXHRcdFx0JGlucHV0LnByb3AoICdyZWFkb25seScsICdjdXN0b20nICE9PSBsaW5rVG8gKTtcblx0XHR9XG5cblx0XHQkaW5wdXQucmVtb3ZlQ2xhc3MoICdoaWRkZW4nICk7XG5cblx0XHQvLyBJZiB0aGUgaW5wdXQgaXMgdmlzaWJsZSwgZm9jdXMgYW5kIHNlbGVjdCBpdHMgY29udGVudHMuXG5cdFx0aWYgKCAhIHdwLm1lZGlhLmlzVG91Y2hEZXZpY2UgJiYgJGlucHV0LmlzKCc6dmlzaWJsZScpICkge1xuXHRcdFx0JGlucHV0LmZvY3VzKClbMF0uc2VsZWN0KCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBdHRhY2htZW50RGlzcGxheTtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TZXR0aW5ncy5HYWxsZXJ5XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgR2FsbGVyeSA9IHdwLm1lZGlhLnZpZXcuU2V0dGluZ3MuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnY29sbGVjdGlvbi1zZXR0aW5ncyBnYWxsZXJ5LXNldHRpbmdzJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgnZ2FsbGVyeS1zZXR0aW5ncycpXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBHYWxsZXJ5O1xuIiwiLyoqXG4gKiB3cC5tZWRpYS52aWV3LlNldHRpbmdzLlBsYXlsaXN0XG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5TZXR0aW5nc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgUGxheWxpc3QgPSB3cC5tZWRpYS52aWV3LlNldHRpbmdzLmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogJ2NvbGxlY3Rpb24tc2V0dGluZ3MgcGxheWxpc3Qtc2V0dGluZ3MnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCdwbGF5bGlzdC1zZXR0aW5ncycpXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBQbGF5bGlzdDtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TaWRlYmFyXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5Qcmlvcml0eUxpc3RcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFNpZGViYXIgPSB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdC5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS1zaWRlYmFyJ1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2lkZWJhcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TaXRlSWNvbkNyb3BwZXJcbiAqXG4gKiBVc2VzIHRoZSBpbWdBcmVhU2VsZWN0IHBsdWdpbiB0byBhbGxvdyBhIHVzZXIgdG8gY3JvcCBhIFNpdGUgSWNvbi5cbiAqXG4gKiBUYWtlcyBpbWdBcmVhU2VsZWN0IG9wdGlvbnMgZnJvbVxuICogd3AuY3VzdG9taXplLlNpdGVJY29uQ29udHJvbC5jYWxjdWxhdGVJbWFnZVNlbGVjdE9wdGlvbnMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEudmlldy5Dcm9wcGVyXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEudmlldyxcblx0U2l0ZUljb25Dcm9wcGVyO1xuXG5TaXRlSWNvbkNyb3BwZXIgPSBWaWV3LkNyb3BwZXIuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAnY3JvcC1jb250ZW50IHNpdGUtaWNvbicsXG5cblx0cmVhZHk6IGZ1bmN0aW9uICgpIHtcblx0XHRWaWV3LkNyb3BwZXIucHJvdG90eXBlLnJlYWR5LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdHRoaXMuJCggJy5jcm9wLWltYWdlJyApLm9uKCAnbG9hZCcsIF8uYmluZCggdGhpcy5hZGRTaWRlYmFyLCB0aGlzICkgKTtcblx0fSxcblxuXHRhZGRTaWRlYmFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNpZGViYXIgPSBuZXcgd3AubWVkaWEudmlldy5TaWRlYmFyKHtcblx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zaWRlYmFyLnNldCggJ3ByZXZpZXcnLCBuZXcgd3AubWVkaWEudmlldy5TaXRlSWNvblByZXZpZXcoe1xuXHRcdFx0Y29udHJvbGxlcjogdGhpcy5jb250cm9sbGVyLFxuXHRcdFx0YXR0YWNobWVudDogdGhpcy5vcHRpb25zLmF0dGFjaG1lbnRcblx0XHR9KSApO1xuXG5cdFx0dGhpcy5jb250cm9sbGVyLmNyb3BwZXJWaWV3LnZpZXdzLmFkZCggdGhpcy5zaWRlYmFyICk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpdGVJY29uQ3JvcHBlcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TaXRlSWNvblByZXZpZXdcbiAqXG4gKiBTaG93cyBhIHByZXZpZXcgb2YgdGhlIFNpdGUgSWNvbiBhcyBhIGZhdmljb24gYW5kIGFwcCBpY29uIHdoaWxlIGNyb3BwaW5nLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdCQgPSBqUXVlcnksXG5cdFNpdGVJY29uUHJldmlldztcblxuU2l0ZUljb25QcmV2aWV3ID0gVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdzaXRlLWljb24tcHJldmlldycsXG5cdHRlbXBsYXRlOiB3cC50ZW1wbGF0ZSggJ3NpdGUtaWNvbi1wcmV2aWV3JyApLFxuXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbnRyb2xsZXIuaW1nU2VsZWN0LnNldE9wdGlvbnMoe1xuXHRcdFx0b25Jbml0OiB0aGlzLnVwZGF0ZVByZXZpZXcsXG5cdFx0XHRvblNlbGVjdENoYW5nZTogdGhpcy51cGRhdGVQcmV2aWV3XG5cdFx0fSk7XG5cdH0sXG5cblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHVybDogdGhpcy5vcHRpb25zLmF0dGFjaG1lbnQuZ2V0KCAndXJsJyApXG5cdFx0fTtcblx0fSxcblxuXHR1cGRhdGVQcmV2aWV3OiBmdW5jdGlvbiggaW1nLCBjb29yZHMgKSB7XG5cdFx0dmFyIHJ4ID0gNjQgLyBjb29yZHMud2lkdGgsXG5cdFx0XHRyeSA9IDY0IC8gY29vcmRzLmhlaWdodCxcblx0XHRcdHByZXZpZXdfcnggPSAxNiAvIGNvb3Jkcy53aWR0aCxcblx0XHRcdHByZXZpZXdfcnkgPSAxNiAvIGNvb3Jkcy5oZWlnaHQ7XG5cblx0XHQkKCAnI3ByZXZpZXctYXBwLWljb24nICkuY3NzKHtcblx0XHRcdHdpZHRoOiBNYXRoLnJvdW5kKHJ4ICogdGhpcy5pbWFnZVdpZHRoICkgKyAncHgnLFxuXHRcdFx0aGVpZ2h0OiBNYXRoLnJvdW5kKHJ5ICogdGhpcy5pbWFnZUhlaWdodCApICsgJ3B4Jyxcblx0XHRcdG1hcmdpbkxlZnQ6ICctJyArIE1hdGgucm91bmQocnggKiBjb29yZHMueDEpICsgJ3B4Jyxcblx0XHRcdG1hcmdpblRvcDogJy0nICsgTWF0aC5yb3VuZChyeSAqIGNvb3Jkcy55MSkgKyAncHgnXG5cdFx0fSk7XG5cblx0XHQkKCAnI3ByZXZpZXctZmF2aWNvbicgKS5jc3Moe1xuXHRcdFx0d2lkdGg6IE1hdGgucm91bmQoIHByZXZpZXdfcnggKiB0aGlzLmltYWdlV2lkdGggKSArICdweCcsXG5cdFx0XHRoZWlnaHQ6IE1hdGgucm91bmQoIHByZXZpZXdfcnkgKiB0aGlzLmltYWdlSGVpZ2h0ICkgKyAncHgnLFxuXHRcdFx0bWFyZ2luTGVmdDogJy0nICsgTWF0aC5yb3VuZCggcHJldmlld19yeCAqIGNvb3Jkcy54MSApICsgJ3B4Jyxcblx0XHRcdG1hcmdpblRvcDogJy0nICsgTWF0aC5mbG9vciggcHJldmlld19yeSogY29vcmRzLnkxICkgKyAncHgnXG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpdGVJY29uUHJldmlldztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5TcGlubmVyXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBTcGlubmVyID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdzcGFuJyxcblx0Y2xhc3NOYW1lOiAnc3Bpbm5lcicsXG5cdHNwaW5uZXJUaW1lb3V0OiBmYWxzZSxcblx0ZGVsYXk6IDQwMCxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICEgdGhpcy5zcGlubmVyVGltZW91dCApIHtcblx0XHRcdHRoaXMuc3Bpbm5lclRpbWVvdXQgPSBfLmRlbGF5KGZ1bmN0aW9uKCAkZWwgKSB7XG5cdFx0XHRcdCRlbC5hZGRDbGFzcyggJ2lzLWFjdGl2ZScgKTtcblx0XHRcdH0sIHRoaXMuZGVsYXksIHRoaXMuJGVsICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoICdpcy1hY3RpdmUnICk7XG5cdFx0dGhpcy5zcGlubmVyVGltZW91dCA9IGNsZWFyVGltZW91dCggdGhpcy5zcGlubmVyVGltZW91dCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNwaW5uZXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVG9vbGJhclxuICpcbiAqIEEgdG9vbGJhciB3aGljaCBjb25zaXN0cyBvZiBhIHByaW1hcnkgYW5kIGEgc2Vjb25kYXJ5IHNlY3Rpb24uIEVhY2ggc2VjdGlvbnNcbiAqIGNhbiBiZSBmaWxsZWQgd2l0aCB2aWV3cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFZpZXcgPSB3cC5tZWRpYS5WaWV3LFxuXHRUb29sYmFyO1xuXG5Ub29sYmFyID0gVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICdtZWRpYS10b29sYmFyJyxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uID0gc3RhdGUuZ2V0KCdzZWxlY3Rpb24nKSxcblx0XHRcdGxpYnJhcnkgPSB0aGlzLmxpYnJhcnkgPSBzdGF0ZS5nZXQoJ2xpYnJhcnknKTtcblxuXHRcdHRoaXMuX3ZpZXdzID0ge307XG5cblx0XHQvLyBUaGUgdG9vbGJhciBpcyBjb21wb3NlZCBvZiB0d28gYFByaW9yaXR5TGlzdGAgdmlld3MuXG5cdFx0dGhpcy5wcmltYXJ5ICAgPSBuZXcgd3AubWVkaWEudmlldy5Qcmlvcml0eUxpc3QoKTtcblx0XHR0aGlzLnNlY29uZGFyeSA9IG5ldyB3cC5tZWRpYS52aWV3LlByaW9yaXR5TGlzdCgpO1xuXHRcdHRoaXMucHJpbWFyeS4kZWwuYWRkQ2xhc3MoJ21lZGlhLXRvb2xiYXItcHJpbWFyeSBzZWFyY2gtZm9ybScpO1xuXHRcdHRoaXMuc2Vjb25kYXJ5LiRlbC5hZGRDbGFzcygnbWVkaWEtdG9vbGJhci1zZWNvbmRhcnknKTtcblxuXHRcdHRoaXMudmlld3Muc2V0KFsgdGhpcy5zZWNvbmRhcnksIHRoaXMucHJpbWFyeSBdKTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLml0ZW1zICkge1xuXHRcdFx0dGhpcy5zZXQoIHRoaXMub3B0aW9ucy5pdGVtcywgeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMub3B0aW9ucy5zaWxlbnQgKSB7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0aW9uICkge1xuXHRcdFx0c2VsZWN0aW9uLm9uKCAnYWRkIHJlbW92ZSByZXNldCcsIHRoaXMucmVmcmVzaCwgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggbGlicmFyeSApIHtcblx0XHRcdGxpYnJhcnkub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy5yZWZyZXNoLCB0aGlzICk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuVG9vbGJhcn0gUmV0dXJucyBpdHNlZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLnNlbGVjdGlvbiApIHtcblx0XHRcdHRoaXMuc2VsZWN0aW9uLm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5saWJyYXJ5ICkge1xuXHRcdFx0dGhpcy5saWJyYXJ5Lm9mZiggbnVsbCwgbnVsbCwgdGhpcyApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBjYWxsICdkaXNwb3NlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0cmV0dXJuIFZpZXcucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fSxcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuVmlld3xPYmplY3R9IHZpZXdcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Ub29sYmFyfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0c2V0OiBmdW5jdGlvbiggaWQsIHZpZXcsIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGxpc3Q7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvLyBBY2NlcHQgYW4gb2JqZWN0IHdpdGggYW4gYGlkYCA6IGB2aWV3YCBtYXBwaW5nLlxuXHRcdGlmICggXy5pc09iamVjdCggaWQgKSApIHtcblx0XHRcdF8uZWFjaCggaWQsIGZ1bmN0aW9uKCB2aWV3LCBpZCApIHtcblx0XHRcdFx0dGhpcy5zZXQoIGlkLCB2aWV3LCB7IHNpbGVudDogdHJ1ZSB9KTtcblx0XHRcdH0sIHRoaXMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoICEgKCB2aWV3IGluc3RhbmNlb2YgQmFja2JvbmUuVmlldyApICkge1xuXHRcdFx0XHR2aWV3LmNsYXNzZXMgPSBbICdtZWRpYS1idXR0b24tJyArIGlkIF0uY29uY2F0KCB2aWV3LmNsYXNzZXMgfHwgW10gKTtcblx0XHRcdFx0dmlldyA9IG5ldyB3cC5tZWRpYS52aWV3LkJ1dHRvbiggdmlldyApLnJlbmRlcigpO1xuXHRcdFx0fVxuXG5cdFx0XHR2aWV3LmNvbnRyb2xsZXIgPSB2aWV3LmNvbnRyb2xsZXIgfHwgdGhpcy5jb250cm9sbGVyO1xuXG5cdFx0XHR0aGlzLl92aWV3c1sgaWQgXSA9IHZpZXc7XG5cblx0XHRcdGxpc3QgPSB2aWV3Lm9wdGlvbnMucHJpb3JpdHkgPCAwID8gJ3NlY29uZGFyeScgOiAncHJpbWFyeSc7XG5cdFx0XHR0aGlzWyBsaXN0IF0uc2V0KCBpZCwgdmlldywgb3B0aW9ucyApO1xuXHRcdH1cblxuXHRcdGlmICggISBvcHRpb25zLnNpbGVudCApIHtcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LkJ1dHRvbn1cblx0ICovXG5cdGdldDogZnVuY3Rpb24oIGlkICkge1xuXHRcdHJldHVybiB0aGlzLl92aWV3c1sgaWQgXTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5Ub29sYmFyfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0dW5zZXQ6IGZ1bmN0aW9uKCBpZCwgb3B0aW9ucyApIHtcblx0XHRkZWxldGUgdGhpcy5fdmlld3NbIGlkIF07XG5cdFx0dGhpcy5wcmltYXJ5LnVuc2V0KCBpZCwgb3B0aW9ucyApO1xuXHRcdHRoaXMuc2Vjb25kYXJ5LnVuc2V0KCBpZCwgb3B0aW9ucyApO1xuXG5cdFx0aWYgKCAhIG9wdGlvbnMgfHwgISBvcHRpb25zLnNpbGVudCApIHtcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuc3RhdGUoKSxcblx0XHRcdGxpYnJhcnkgPSBzdGF0ZS5nZXQoJ2xpYnJhcnknKSxcblx0XHRcdHNlbGVjdGlvbiA9IHN0YXRlLmdldCgnc2VsZWN0aW9uJyk7XG5cblx0XHRfLmVhY2goIHRoaXMuX3ZpZXdzLCBmdW5jdGlvbiggYnV0dG9uICkge1xuXHRcdFx0aWYgKCAhIGJ1dHRvbi5tb2RlbCB8fCAhIGJ1dHRvbi5vcHRpb25zIHx8ICEgYnV0dG9uLm9wdGlvbnMucmVxdWlyZXMgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHJlcXVpcmVzID0gYnV0dG9uLm9wdGlvbnMucmVxdWlyZXMsXG5cdFx0XHRcdGRpc2FibGVkID0gZmFsc2U7XG5cblx0XHRcdC8vIFByZXZlbnQgaW5zZXJ0aW9uIG9mIGF0dGFjaG1lbnRzIGlmIGFueSBvZiB0aGVtIGFyZSBzdGlsbCB1cGxvYWRpbmdcblx0XHRcdGlmICggc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlbHMgKSB7XG5cdFx0XHRcdGRpc2FibGVkID0gXy5zb21lKCBzZWxlY3Rpb24ubW9kZWxzLCBmdW5jdGlvbiggYXR0YWNobWVudCApIHtcblx0XHRcdFx0XHRyZXR1cm4gYXR0YWNobWVudC5nZXQoJ3VwbG9hZGluZycpID09PSB0cnVlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCByZXF1aXJlcy5zZWxlY3Rpb24gJiYgc2VsZWN0aW9uICYmICEgc2VsZWN0aW9uLmxlbmd0aCApIHtcblx0XHRcdFx0ZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmICggcmVxdWlyZXMubGlicmFyeSAmJiBsaWJyYXJ5ICYmICEgbGlicmFyeS5sZW5ndGggKSB7XG5cdFx0XHRcdGRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGJ1dHRvbi5tb2RlbC5zZXQoICdkaXNhYmxlZCcsIGRpc2FibGVkICk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2xiYXI7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVG9vbGJhci5FbWJlZFxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLnZpZXcuVG9vbGJhci5TZWxlY3RcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlRvb2xiYXJcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFNlbGVjdCA9IHdwLm1lZGlhLnZpZXcuVG9vbGJhci5TZWxlY3QsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdEVtYmVkO1xuXG5FbWJlZCA9IFNlbGVjdC5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmRlZmF1bHRzKCB0aGlzLm9wdGlvbnMsIHtcblx0XHRcdHRleHQ6IGwxMG4uaW5zZXJ0SW50b1Bvc3QsXG5cdFx0XHRyZXF1aXJlczogZmFsc2Vcblx0XHR9KTtcblx0XHQvLyBDYWxsICdpbml0aWFsaXplJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzLlxuXHRcdFNlbGVjdC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHVybCA9IHRoaXMuY29udHJvbGxlci5zdGF0ZSgpLnByb3BzLmdldCgndXJsJyk7XG5cdFx0dGhpcy5nZXQoJ3NlbGVjdCcpLm1vZGVsLnNldCggJ2Rpc2FibGVkJywgISB1cmwgfHwgdXJsID09PSAnaHR0cDovLycgKTtcblx0XHQvKipcblx0XHQgKiBjYWxsICdyZWZyZXNoJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0ICovXG5cdFx0U2VsZWN0LnByb3RvdHlwZS5yZWZyZXNoLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1iZWQ7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVG9vbGJhci5TZWxlY3RcbiAqXG4gKiBAY2xhc3NcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS52aWV3LlRvb2xiYXJcbiAqIEBhdWdtZW50cyB3cC5tZWRpYS5WaWV3XG4gKiBAYXVnbWVudHMgd3AuQmFja2JvbmUuVmlld1xuICogQGF1Z21lbnRzIEJhY2tib25lLlZpZXdcbiAqL1xudmFyIFRvb2xiYXIgPSB3cC5tZWRpYS52aWV3LlRvb2xiYXIsXG5cdGwxMG4gPSB3cC5tZWRpYS52aWV3LmwxMG4sXG5cdFNlbGVjdDtcblxuU2VsZWN0ID0gVG9vbGJhci5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdF8uYmluZEFsbCggdGhpcywgJ2NsaWNrU2VsZWN0JyApO1xuXG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZXZlbnQ6ICdzZWxlY3QnLFxuXHRcdFx0c3RhdGU6IGZhbHNlLFxuXHRcdFx0cmVzZXQ6IHRydWUsXG5cdFx0XHRjbG9zZTogdHJ1ZSxcblx0XHRcdHRleHQ6ICBsMTBuLnNlbGVjdCxcblxuXHRcdFx0Ly8gRG9lcyB0aGUgYnV0dG9uIHJlbHkgb24gdGhlIHNlbGVjdGlvbj9cblx0XHRcdHJlcXVpcmVzOiB7XG5cdFx0XHRcdHNlbGVjdGlvbjogdHJ1ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0b3B0aW9ucy5pdGVtcyA9IF8uZGVmYXVsdHMoIG9wdGlvbnMuaXRlbXMgfHwge30sIHtcblx0XHRcdHNlbGVjdDoge1xuXHRcdFx0XHRzdHlsZTogICAgJ3ByaW1hcnknLFxuXHRcdFx0XHR0ZXh0OiAgICAgb3B0aW9ucy50ZXh0LFxuXHRcdFx0XHRwcmlvcml0eTogODAsXG5cdFx0XHRcdGNsaWNrOiAgICB0aGlzLmNsaWNrU2VsZWN0LFxuXHRcdFx0XHRyZXF1aXJlczogb3B0aW9ucy5yZXF1aXJlc1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIENhbGwgJ2luaXRpYWxpemUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3MuXG5cdFx0VG9vbGJhci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cblx0Y2xpY2tTZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuXHRcdFx0Y29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcjtcblxuXHRcdGlmICggb3B0aW9ucy5jbG9zZSApIHtcblx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMuZXZlbnQgKSB7XG5cdFx0XHRjb250cm9sbGVyLnN0YXRlKCkudHJpZ2dlciggb3B0aW9ucy5ldmVudCApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy5zdGF0ZSApIHtcblx0XHRcdGNvbnRyb2xsZXIuc2V0U3RhdGUoIG9wdGlvbnMuc3RhdGUgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMucmVzZXQgKSB7XG5cdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Q7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBkcm9wem9uZSBvbiBXUCBlZGl0b3IgaW5zdGFuY2VzIChlbGVtZW50cyB3aXRoIC53cC1lZGl0b3Itd3JhcClcbiAqIGFuZCByZWxheXMgZHJhZyduJ2Ryb3BwZWQgZmlsZXMgdG8gYSBtZWRpYSB3b3JrZmxvdy5cbiAqXG4gKiB3cC5tZWRpYS52aWV3LkVkaXRvclVwbG9hZGVyXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0bDEwbiA9IHdwLm1lZGlhLnZpZXcubDEwbixcblx0JCA9IGpRdWVyeSxcblx0RWRpdG9yVXBsb2FkZXI7XG5cbkVkaXRvclVwbG9hZGVyID0gVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICd1cGxvYWRlci1lZGl0b3InLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCAndXBsb2FkZXItZWRpdG9yJyApLFxuXG5cdGxvY2FsRHJhZzogZmFsc2UsXG5cdG92ZXJDb250YWluZXI6IGZhbHNlLFxuXHRvdmVyRHJvcHpvbmU6IGZhbHNlLFxuXHRkcmFnZ2luZ0ZpbGU6IG51bGwsXG5cblx0LyoqXG5cdCAqIEJpbmQgZHJhZyduJ2Ryb3AgZXZlbnRzIHRvIGNhbGxiYWNrcy5cblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuXHRcdC8vIEJhaWwgaWYgbm90IGVuYWJsZWQgb3IgVUEgZG9lcyBub3Qgc3VwcG9ydCBkcmFnJ24nZHJvcCBvciBGaWxlIEFQSS5cblx0XHRpZiAoICEgd2luZG93LnRpbnlNQ0VQcmVJbml0IHx8ICEgd2luZG93LnRpbnlNQ0VQcmVJbml0LmRyYWdEcm9wVXBsb2FkIHx8ICEgdGhpcy5icm93c2VyU3VwcG9ydCgpICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0dGhpcy4kZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblx0XHR0aGlzLmRyb3B6b25lcyA9IFtdO1xuXHRcdHRoaXMuZmlsZXMgPSBbXTtcblxuXHRcdHRoaXMuJGRvY3VtZW50Lm9uKCAnZHJvcCcsICcudXBsb2FkZXItZWRpdG9yJywgXy5iaW5kKCB0aGlzLmRyb3AsIHRoaXMgKSApO1xuXHRcdHRoaXMuJGRvY3VtZW50Lm9uKCAnZHJhZ292ZXInLCAnLnVwbG9hZGVyLWVkaXRvcicsIF8uYmluZCggdGhpcy5kcm9wem9uZURyYWdvdmVyLCB0aGlzICkgKTtcblx0XHR0aGlzLiRkb2N1bWVudC5vbiggJ2RyYWdsZWF2ZScsICcudXBsb2FkZXItZWRpdG9yJywgXy5iaW5kKCB0aGlzLmRyb3B6b25lRHJhZ2xlYXZlLCB0aGlzICkgKTtcblx0XHR0aGlzLiRkb2N1bWVudC5vbiggJ2NsaWNrJywgJy51cGxvYWRlci1lZGl0b3InLCBfLmJpbmQoIHRoaXMuY2xpY2ssIHRoaXMgKSApO1xuXG5cdFx0dGhpcy4kZG9jdW1lbnQub24oICdkcmFnb3ZlcicsIF8uYmluZCggdGhpcy5jb250YWluZXJEcmFnb3ZlciwgdGhpcyApICk7XG5cdFx0dGhpcy4kZG9jdW1lbnQub24oICdkcmFnbGVhdmUnLCBfLmJpbmQoIHRoaXMuY29udGFpbmVyRHJhZ2xlYXZlLCB0aGlzICkgKTtcblxuXHRcdHRoaXMuJGRvY3VtZW50Lm9uKCAnZHJhZ3N0YXJ0IGRyYWdlbmQgZHJvcCcsIF8uYmluZCggZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dGhpcy5sb2NhbERyYWcgPSBldmVudC50eXBlID09PSAnZHJhZ3N0YXJ0JztcblxuXHRcdFx0aWYgKCBldmVudC50eXBlID09PSAnZHJvcCcgKSB7XG5cdFx0XHRcdHRoaXMuY29udGFpbmVyRHJhZ2xlYXZlKCk7XG5cdFx0XHR9XG5cdFx0fSwgdGhpcyApICk7XG5cblx0XHR0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2sgYnJvd3NlciBzdXBwb3J0IGZvciBkcmFnJ24nZHJvcC5cblx0ICpcblx0ICogQHJldHVybiBCb29sZWFuXG5cdCAqL1xuXHRicm93c2VyU3VwcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHN1cHBvcnRzID0gZmFsc2UsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG5cdFx0c3VwcG9ydHMgPSAoICdkcmFnZ2FibGUnIGluIGRpdiApIHx8ICggJ29uZHJhZ3N0YXJ0JyBpbiBkaXYgJiYgJ29uZHJvcCcgaW4gZGl2ICk7XG5cdFx0c3VwcG9ydHMgPSBzdXBwb3J0cyAmJiAhISAoIHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuRmlsZVJlYWRlciApO1xuXHRcdHJldHVybiBzdXBwb3J0cztcblx0fSxcblxuXHRpc0RyYWdnaW5nRmlsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggdGhpcy5kcmFnZ2luZ0ZpbGUgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5kcmFnZ2luZ0ZpbGU7XG5cdFx0fVxuXG5cdFx0aWYgKCBfLmlzVW5kZWZpbmVkKCBldmVudC5vcmlnaW5hbEV2ZW50ICkgfHwgXy5pc1VuZGVmaW5lZCggZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIgKSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmRyYWdnaW5nRmlsZSA9IF8uaW5kZXhPZiggZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIudHlwZXMsICdGaWxlcycgKSA+IC0xICYmXG5cdFx0XHRfLmluZGV4T2YoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLCAndGV4dC9wbGFpbicgKSA9PT0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5kcmFnZ2luZ0ZpbGU7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oIGUgKSB7XG5cdFx0dmFyIGRyb3B6b25lX2lkO1xuXHRcdGZvciAoIGRyb3B6b25lX2lkIGluIHRoaXMuZHJvcHpvbmVzICkge1xuXHRcdFx0Ly8gSGlkZSB0aGUgZHJvcHpvbmVzIG9ubHkgaWYgZHJhZ2dpbmcgaGFzIGxlZnQgdGhlIHNjcmVlbi5cblx0XHRcdHRoaXMuZHJvcHpvbmVzWyBkcm9wem9uZV9pZCBdLnRvZ2dsZSggdGhpcy5vdmVyQ29udGFpbmVyIHx8IHRoaXMub3ZlckRyb3B6b25lICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIF8uaXNVbmRlZmluZWQoIGUgKSApIHtcblx0XHRcdCQoIGUudGFyZ2V0ICkuY2xvc2VzdCggJy51cGxvYWRlci1lZGl0b3InICkudG9nZ2xlQ2xhc3MoICdkcm9wcGFibGUnLCB0aGlzLm92ZXJEcm9wem9uZSApO1xuXHRcdH1cblxuXHRcdGlmICggISB0aGlzLm92ZXJDb250YWluZXIgJiYgISB0aGlzLm92ZXJEcm9wem9uZSApIHtcblx0XHRcdHRoaXMuZHJhZ2dpbmdGaWxlID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggISB0aGlzLmluaXRpYWxpemVkICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Vmlldy5wcm90b3R5cGUucmVuZGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHQkKCAnLndwLWVkaXRvci13cmFwJyApLmVhY2goIF8uYmluZCggdGhpcy5hdHRhY2gsIHRoaXMgKSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGF0dGFjaDogZnVuY3Rpb24oIGluZGV4LCBlZGl0b3IgKSB7XG5cdFx0Ly8gQXR0YWNoIGEgZHJvcHpvbmUgdG8gYW4gZWRpdG9yLlxuXHRcdHZhciBkcm9wem9uZSA9IHRoaXMuJGVsLmNsb25lKCk7XG5cdFx0dGhpcy5kcm9wem9uZXMucHVzaCggZHJvcHpvbmUgKTtcblx0XHQkKCBlZGl0b3IgKS5hcHBlbmQoIGRyb3B6b25lICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFdoZW4gYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIGVkaXRvciB1cGxvYWRlciwgb3BlbiB1cCBhbiBlZGl0b3IgbWVkaWEgd29ya2Zsb3dcblx0ICogYW5kIHVwbG9hZCB0aGUgZmlsZSBpbW1lZGlhdGVseS5cblx0ICpcblx0ICogQHBhcmFtICB7alF1ZXJ5LkV2ZW50fSBldmVudCBUaGUgJ2Ryb3AnIGV2ZW50LlxuXHQgKi9cblx0ZHJvcDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciAkd3JhcCwgdXBsb2FkVmlldztcblxuXHRcdHRoaXMuY29udGFpbmVyRHJhZ2xlYXZlKCBldmVudCApO1xuXHRcdHRoaXMuZHJvcHpvbmVEcmFnbGVhdmUoIGV2ZW50ICk7XG5cblx0XHR0aGlzLmZpbGVzID0gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG5cdFx0aWYgKCB0aGlzLmZpbGVzLmxlbmd0aCA8IDEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBhY3RpdmUgZWRpdG9yIHRvIHRoZSBkcm9wIHRhcmdldC5cblx0XHQkd3JhcCA9ICQoIGV2ZW50LnRhcmdldCApLnBhcmVudHMoICcud3AtZWRpdG9yLXdyYXAnICk7XG5cdFx0aWYgKCAkd3JhcC5sZW5ndGggPiAwICYmICR3cmFwWzBdLmlkICkge1xuXHRcdFx0d2luZG93LndwQWN0aXZlRWRpdG9yID0gJHdyYXBbMF0uaWQuc2xpY2UoIDMsIC01ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIHRoaXMud29ya2Zsb3cgKSB7XG5cdFx0XHR0aGlzLndvcmtmbG93ID0gd3AubWVkaWEuZWRpdG9yLm9wZW4oIHdpbmRvdy53cEFjdGl2ZUVkaXRvciwge1xuXHRcdFx0XHRmcmFtZTogICAgJ3Bvc3QnLFxuXHRcdFx0XHRzdGF0ZTogICAgJ2luc2VydCcsXG5cdFx0XHRcdHRpdGxlOiAgICBsMTBuLmFkZE1lZGlhLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHVwbG9hZFZpZXcgPSB0aGlzLndvcmtmbG93LnVwbG9hZGVyO1xuXG5cdFx0XHRpZiAoIHVwbG9hZFZpZXcudXBsb2FkZXIgJiYgdXBsb2FkVmlldy51cGxvYWRlci5yZWFkeSApIHtcblx0XHRcdFx0dGhpcy5hZGRGaWxlcy5hcHBseSggdGhpcyApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy53b3JrZmxvdy5vbiggJ3VwbG9hZGVyOnJlYWR5JywgdGhpcy5hZGRGaWxlcywgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLndvcmtmbG93LnN0YXRlKCkucmVzZXQoKTtcblx0XHRcdHRoaXMuYWRkRmlsZXMuYXBwbHkoIHRoaXMgKTtcblx0XHRcdHRoaXMud29ya2Zsb3cub3BlbigpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogQWRkIHRoZSBmaWxlcyB0byB0aGUgdXBsb2FkZXIuXG5cdCAqL1xuXHRhZGRGaWxlczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLmZpbGVzLmxlbmd0aCApIHtcblx0XHRcdHRoaXMud29ya2Zsb3cudXBsb2FkZXIudXBsb2FkZXIudXBsb2FkZXIuYWRkRmlsZSggXy50b0FycmF5KCB0aGlzLmZpbGVzICkgKTtcblx0XHRcdHRoaXMuZmlsZXMgPSBbXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y29udGFpbmVyRHJhZ292ZXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRpZiAoIHRoaXMubG9jYWxEcmFnIHx8ICEgdGhpcy5pc0RyYWdnaW5nRmlsZSggZXZlbnQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLm92ZXJDb250YWluZXIgPSB0cnVlO1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9LFxuXG5cdGNvbnRhaW5lckRyYWdsZWF2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vdmVyQ29udGFpbmVyID0gZmFsc2U7XG5cblx0XHQvLyBUaHJvdHRsZSBkcmFnbGVhdmUgYmVjYXVzZSBpdCdzIGNhbGxlZCB3aGVuIGJvdW5jaW5nIGZyb20gc29tZSBlbGVtZW50cyB0byBvdGhlcnMuXG5cdFx0Xy5kZWxheSggXy5iaW5kKCB0aGlzLnJlZnJlc2gsIHRoaXMgKSwgNTAgKTtcblx0fSxcblxuXHRkcm9wem9uZURyYWdvdmVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCB0aGlzLmxvY2FsRHJhZyB8fCAhIHRoaXMuaXNEcmFnZ2luZ0ZpbGUoIGV2ZW50ICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5vdmVyRHJvcHpvbmUgPSB0cnVlO1xuXHRcdHRoaXMucmVmcmVzaCggZXZlbnQgKTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0ZHJvcHpvbmVEcmFnbGVhdmU6IGZ1bmN0aW9uKCBlICkge1xuXHRcdHRoaXMub3ZlckRyb3B6b25lID0gZmFsc2U7XG5cdFx0Xy5kZWxheSggXy5iaW5kKCB0aGlzLnJlZnJlc2gsIHRoaXMsIGUgKSwgNTAgKTtcblx0fSxcblxuXHRjbGljazogZnVuY3Rpb24oIGUgKSB7XG5cdFx0Ly8gSW4gdGhlIHJhcmUgY2FzZSB3aGVyZSB0aGUgZHJvcHpvbmUgZ2V0cyBzdHVjaywgaGlkZSBpdCBvbiBjbGljay5cblx0XHR0aGlzLmNvbnRhaW5lckRyYWdsZWF2ZSggZSApO1xuXHRcdHRoaXMuZHJvcHpvbmVEcmFnbGVhdmUoIGUgKTtcblx0XHR0aGlzLmxvY2FsRHJhZyA9IGZhbHNlO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFZGl0b3JVcGxvYWRlcjtcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5VcGxvYWRlcklubGluZVxuICpcbiAqIFRoZSBpbmxpbmUgdXBsb2FkZXIgdGhhdCBzaG93cyB1cCBpbiB0aGUgJ1VwbG9hZCBGaWxlcycgdGFiLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVmlldyA9IHdwLm1lZGlhLlZpZXcsXG5cdFVwbG9hZGVySW5saW5lO1xuXG5VcGxvYWRlcklubGluZSA9IFZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogICAnZGl2Jyxcblx0Y2xhc3NOYW1lOiAndXBsb2FkZXItaW5saW5lJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgndXBsb2FkZXItaW5saW5lJyksXG5cblx0ZXZlbnRzOiB7XG5cdFx0J2NsaWNrIC5jbG9zZSc6ICdoaWRlJ1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucywge1xuXHRcdFx0bWVzc2FnZTogJycsXG5cdFx0XHRzdGF0dXM6ICB0cnVlLFxuXHRcdFx0Y2FuQ2xvc2U6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHRpZiAoICEgdGhpcy5vcHRpb25zLiRicm93c2VyICYmIHRoaXMuY29udHJvbGxlci51cGxvYWRlciApIHtcblx0XHRcdHRoaXMub3B0aW9ucy4kYnJvd3NlciA9IHRoaXMuY29udHJvbGxlci51cGxvYWRlci4kYnJvd3Nlcjtcblx0XHR9XG5cblx0XHRpZiAoIF8uaXNVbmRlZmluZWQoIHRoaXMub3B0aW9ucy5wb3N0SWQgKSApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5wb3N0SWQgPSB3cC5tZWRpYS52aWV3LnNldHRpbmdzLnBvc3QuaWQ7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RhdHVzICkge1xuXHRcdFx0dGhpcy52aWV3cy5zZXQoICcudXBsb2FkLWlubGluZS1zdGF0dXMnLCBuZXcgd3AubWVkaWEudmlldy5VcGxvYWRlclN0YXR1cyh7XG5cdFx0XHRcdGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlclxuXHRcdFx0fSkgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlcGFyZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHN1Z2dlc3RlZFdpZHRoID0gdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdzdWdnZXN0ZWRXaWR0aCcpLFxuXHRcdFx0c3VnZ2VzdGVkSGVpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnN0YXRlKCkuZ2V0KCdzdWdnZXN0ZWRIZWlnaHQnKSxcblx0XHRcdGRhdGEgPSB7fTtcblxuXHRcdGRhdGEubWVzc2FnZSA9IHRoaXMub3B0aW9ucy5tZXNzYWdlO1xuXHRcdGRhdGEuY2FuQ2xvc2UgPSB0aGlzLm9wdGlvbnMuY2FuQ2xvc2U7XG5cblx0XHRpZiAoIHN1Z2dlc3RlZFdpZHRoICYmIHN1Z2dlc3RlZEhlaWdodCApIHtcblx0XHRcdGRhdGEuc3VnZ2VzdGVkV2lkdGggPSBzdWdnZXN0ZWRXaWR0aDtcblx0XHRcdGRhdGEuc3VnZ2VzdGVkSGVpZ2h0ID0gc3VnZ2VzdGVkSGVpZ2h0O1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuVXBsb2FkZXJJbmxpbmV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIHRoaXMuZGlzcG9zaW5nICkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBjYWxsICdkaXNwb3NlJyBkaXJlY3RseSBvbiB0aGUgcGFyZW50IGNsYXNzXG5cdFx0XHQgKi9cblx0XHRcdHJldHVybiBWaWV3LnByb3RvdHlwZS5kaXNwb3NlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cblx0XHQvLyBSdW4gcmVtb3ZlIG9uIGBkaXNwb3NlYCwgc28gd2UgY2FuIGJlIHN1cmUgdG8gcmVmcmVzaCB0aGVcblx0XHQvLyB1cGxvYWRlciB3aXRoIGEgdmlldy1sZXNzIERPTS4gVHJhY2sgd2hldGhlciB3ZSdyZSBkaXNwb3Npbmdcblx0XHQvLyBzbyB3ZSBkb24ndCB0cmlnZ2VyIGFuIGluZmluaXRlIGxvb3AuXG5cdFx0dGhpcy5kaXNwb3NpbmcgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzLnJlbW92ZSgpO1xuXHR9LFxuXHQvKipcblx0ICogQHJldHVybnMge3dwLm1lZGlhLnZpZXcuVXBsb2FkZXJJbmxpbmV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdC8qKlxuXHRcdCAqIGNhbGwgJ3JlbW92ZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdHZhciByZXN1bHQgPSBWaWV3LnByb3RvdHlwZS5yZW1vdmUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdFx0Xy5kZWZlciggXy5iaW5kKCB0aGlzLnJlZnJlc2gsIHRoaXMgKSApO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHVwbG9hZGVyID0gdGhpcy5jb250cm9sbGVyLnVwbG9hZGVyO1xuXG5cdFx0aWYgKCB1cGxvYWRlciApIHtcblx0XHRcdHVwbG9hZGVyLnJlZnJlc2goKTtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBAcmV0dXJucyB7d3AubWVkaWEudmlldy5VcGxvYWRlcklubGluZX1cblx0ICovXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGJyb3dzZXIgPSB0aGlzLm9wdGlvbnMuJGJyb3dzZXIsXG5cdFx0XHQkcGxhY2Vob2xkZXI7XG5cblx0XHRpZiAoIHRoaXMuY29udHJvbGxlci51cGxvYWRlciApIHtcblx0XHRcdCRwbGFjZWhvbGRlciA9IHRoaXMuJCgnLmJyb3dzZXInKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSByZXBsYWNlZCB0aGUgcGxhY2Vob2xkZXIuXG5cdFx0XHRpZiAoICRwbGFjZWhvbGRlclswXSA9PT0gJGJyb3dzZXJbMF0gKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0JGJyb3dzZXIuZGV0YWNoKCkudGV4dCggJHBsYWNlaG9sZGVyLnRleHQoKSApO1xuXHRcdFx0JGJyb3dzZXJbMF0uY2xhc3NOYW1lID0gJHBsYWNlaG9sZGVyWzBdLmNsYXNzTmFtZTtcblx0XHRcdCRwbGFjZWhvbGRlci5yZXBsYWNlV2l0aCggJGJyb3dzZXIuc2hvdygpICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKCAnaGlkZGVuJyApO1xuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLiR1cGxvYWRlclRvZ2dsZXIubGVuZ3RoICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLiR1cGxvYWRlclRvZ2dsZXIuYXR0ciggJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScgKTtcblx0XHR9XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKCAnaGlkZGVuJyApO1xuXHRcdGlmICggdGhpcy5jb250cm9sbGVyLiR1cGxvYWRlclRvZ2dsZXIubGVuZ3RoICkge1xuXHRcdFx0dGhpcy5jb250cm9sbGVyLiR1cGxvYWRlclRvZ2dsZXJcblx0XHRcdFx0LmF0dHIoICdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyApXG5cdFx0XHRcdC8vIE1vdmUgZm9jdXMgYmFjayB0byB0aGUgdG9nZ2xlIGJ1dHRvbiB3aGVuIGNsb3NpbmcgdGhlIHVwbG9hZGVyLlxuXHRcdFx0XHQuZm9jdXMoKTtcblx0XHR9XG5cdH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBsb2FkZXJJbmxpbmU7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNFcnJvclxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICovXG52YXIgVXBsb2FkZXJTdGF0dXNFcnJvciA9IHdwLm1lZGlhLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiAndXBsb2FkLWVycm9yJyxcblx0dGVtcGxhdGU6ICB3cC50ZW1wbGF0ZSgndXBsb2FkZXItc3RhdHVzLWVycm9yJylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVwbG9hZGVyU3RhdHVzRXJyb3I7XG4iLCIvKipcbiAqIHdwLm1lZGlhLnZpZXcuVXBsb2FkZXJTdGF0dXNcbiAqXG4gKiBBbiB1cGxvYWRlciBzdGF0dXMgZm9yIG9uLWdvaW5nIHVwbG9hZHMuXG4gKlxuICogQGNsYXNzXG4gKiBAYXVnbWVudHMgd3AubWVkaWEuVmlld1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AubWVkaWEuVmlldyxcblx0VXBsb2FkZXJTdGF0dXM7XG5cblVwbG9hZGVyU3RhdHVzID0gVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6ICdtZWRpYS11cGxvYWRlci1zdGF0dXMnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCd1cGxvYWRlci1zdGF0dXMnKSxcblxuXHRldmVudHM6IHtcblx0XHQnY2xpY2sgLnVwbG9hZC1kaXNtaXNzLWVycm9ycyc6ICdkaXNtaXNzJ1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucXVldWUgPSB3cC5VcGxvYWRlci5xdWV1ZTtcblx0XHR0aGlzLnF1ZXVlLm9uKCAnYWRkIHJlbW92ZSByZXNldCcsIHRoaXMudmlzaWJpbGl0eSwgdGhpcyApO1xuXHRcdHRoaXMucXVldWUub24oICdhZGQgcmVtb3ZlIHJlc2V0IGNoYW5nZTpwZXJjZW50JywgdGhpcy5wcm9ncmVzcywgdGhpcyApO1xuXHRcdHRoaXMucXVldWUub24oICdhZGQgcmVtb3ZlIHJlc2V0IGNoYW5nZTp1cGxvYWRpbmcnLCB0aGlzLmluZm8sIHRoaXMgKTtcblxuXHRcdHRoaXMuZXJyb3JzID0gd3AuVXBsb2FkZXIuZXJyb3JzO1xuXHRcdHRoaXMuZXJyb3JzLnJlc2V0KCk7XG5cdFx0dGhpcy5lcnJvcnMub24oICdhZGQgcmVtb3ZlIHJlc2V0JywgdGhpcy52aXNpYmlsaXR5LCB0aGlzICk7XG5cdFx0dGhpcy5lcnJvcnMub24oICdhZGQnLCB0aGlzLmVycm9yLCB0aGlzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzfVxuXHQgKi9cblx0ZGlzcG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0d3AuVXBsb2FkZXIucXVldWUub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0LyoqXG5cdFx0ICogY2FsbCAnZGlzcG9zZScgZGlyZWN0bHkgb24gdGhlIHBhcmVudCBjbGFzc1xuXHRcdCAqL1xuXHRcdFZpZXcucHJvdG90eXBlLmRpc3Bvc2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHZpc2liaWxpdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCAndXBsb2FkaW5nJywgISEgdGhpcy5xdWV1ZS5sZW5ndGggKTtcblx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyggJ2Vycm9ycycsICEhIHRoaXMuZXJyb3JzLmxlbmd0aCApO1xuXHRcdHRoaXMuJGVsLnRvZ2dsZSggISEgdGhpcy5xdWV1ZS5sZW5ndGggfHwgISEgdGhpcy5lcnJvcnMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh7XG5cdFx0XHQnJGJhcic6ICAgICAgJy5tZWRpYS1wcm9ncmVzcy1iYXIgZGl2Jyxcblx0XHRcdCckaW5kZXgnOiAgICAnLnVwbG9hZC1pbmRleCcsXG5cdFx0XHQnJHRvdGFsJzogICAgJy51cGxvYWQtdG90YWwnLFxuXHRcdFx0JyRmaWxlbmFtZSc6ICcudXBsb2FkLWZpbGVuYW1lJ1xuXHRcdH0sIGZ1bmN0aW9uKCBzZWxlY3Rvciwga2V5ICkge1xuXHRcdFx0dGhpc1sga2V5IF0gPSB0aGlzLiQoIHNlbGVjdG9yICk7XG5cdFx0fSwgdGhpcyApO1xuXG5cdFx0dGhpcy52aXNpYmlsaXR5KCk7XG5cdFx0dGhpcy5wcm9ncmVzcygpO1xuXHRcdHRoaXMuaW5mbygpO1xuXHR9LFxuXG5cdHByb2dyZXNzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcXVldWUgPSB0aGlzLnF1ZXVlLFxuXHRcdFx0JGJhciA9IHRoaXMuJGJhcjtcblxuXHRcdGlmICggISAkYmFyIHx8ICEgcXVldWUubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRiYXIud2lkdGgoICggcXVldWUucmVkdWNlKCBmdW5jdGlvbiggbWVtbywgYXR0YWNobWVudCApIHtcblx0XHRcdGlmICggISBhdHRhY2htZW50LmdldCgndXBsb2FkaW5nJykgKSB7XG5cdFx0XHRcdHJldHVybiBtZW1vICsgMTAwO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcGVyY2VudCA9IGF0dGFjaG1lbnQuZ2V0KCdwZXJjZW50Jyk7XG5cdFx0XHRyZXR1cm4gbWVtbyArICggXy5pc051bWJlciggcGVyY2VudCApID8gcGVyY2VudCA6IDEwMCApO1xuXHRcdH0sIDAgKSAvIHF1ZXVlLmxlbmd0aCApICsgJyUnICk7XG5cdH0sXG5cblx0aW5mbzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHF1ZXVlID0gdGhpcy5xdWV1ZSxcblx0XHRcdGluZGV4ID0gMCwgYWN0aXZlO1xuXG5cdFx0aWYgKCAhIHF1ZXVlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRhY3RpdmUgPSB0aGlzLnF1ZXVlLmZpbmQoIGZ1bmN0aW9uKCBhdHRhY2htZW50LCBpICkge1xuXHRcdFx0aW5kZXggPSBpO1xuXHRcdFx0cmV0dXJuIGF0dGFjaG1lbnQuZ2V0KCd1cGxvYWRpbmcnKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuJGluZGV4LnRleHQoIGluZGV4ICsgMSApO1xuXHRcdHRoaXMuJHRvdGFsLnRleHQoIHF1ZXVlLmxlbmd0aCApO1xuXHRcdHRoaXMuJGZpbGVuYW1lLmh0bWwoIGFjdGl2ZSA/IHRoaXMuZmlsZW5hbWUoIGFjdGl2ZS5nZXQoJ2ZpbGVuYW1lJykgKSA6ICcnICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZpbGVuYW1lOiBmdW5jdGlvbiggZmlsZW5hbWUgKSB7XG5cdFx0cmV0dXJuIF8uZXNjYXBlKCBmaWxlbmFtZSApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gZXJyb3Jcblx0ICovXG5cdGVycm9yOiBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0dGhpcy52aWV3cy5hZGQoICcudXBsb2FkLWVycm9ycycsIG5ldyB3cC5tZWRpYS52aWV3LlVwbG9hZGVyU3RhdHVzRXJyb3Ioe1xuXHRcdFx0ZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUoIGVycm9yLmdldCgnZmlsZScpLm5hbWUgKSxcblx0XHRcdG1lc3NhZ2U6ICBlcnJvci5nZXQoJ21lc3NhZ2UnKVxuXHRcdH0pLCB7IGF0OiAwIH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAZ2xvYmFsIHdwLlVwbG9hZGVyXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuXHQgKi9cblx0ZGlzbWlzczogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBlcnJvcnMgPSB0aGlzLnZpZXdzLmdldCgnLnVwbG9hZC1lcnJvcnMnKTtcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIGVycm9ycyApIHtcblx0XHRcdF8uaW52b2tlKCBlcnJvcnMsICdyZW1vdmUnICk7XG5cdFx0fVxuXHRcdHdwLlVwbG9hZGVyLmVycm9ycy5yZXNldCgpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBVcGxvYWRlclN0YXR1cztcbiIsIi8qKlxuICogd3AubWVkaWEudmlldy5VcGxvYWRlcldpbmRvd1xuICpcbiAqIEFuIHVwbG9hZGVyIHdpbmRvdyB0aGF0IGFsbG93cyBmb3IgZHJhZ2dpbmcgYW5kIGRyb3BwaW5nIG1lZGlhLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLm1lZGlhLlZpZXdcbiAqIEBhdWdtZW50cyB3cC5CYWNrYm9uZS5WaWV3XG4gKiBAYXVnbWVudHMgQmFja2JvbmUuVmlld1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgT3B0aW9ucyBoYXNoIHBhc3NlZCB0byB0aGUgdmlldy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy51cGxvYWRlcl0gICAgICAgICAgVXBsb2FkZXIgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7alF1ZXJ5fSBbb3B0aW9ucy51cGxvYWRlci5icm93c2VyXVxuICogQHBhcmFtIHtqUXVlcnl9IFtvcHRpb25zLnVwbG9hZGVyLmRyb3B6b25lXSBqUXVlcnkgY29sbGVjdGlvbiBvZiB0aGUgZHJvcHpvbmUuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMudXBsb2FkZXIucGFyYW1zXVxuICovXG52YXIgJCA9IGpRdWVyeSxcblx0VXBsb2FkZXJXaW5kb3c7XG5cblVwbG9hZGVyV2luZG93ID0gd3AubWVkaWEuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiAgICdkaXYnLFxuXHRjbGFzc05hbWU6ICd1cGxvYWRlci13aW5kb3cnLFxuXHR0ZW1wbGF0ZTogIHdwLnRlbXBsYXRlKCd1cGxvYWRlci13aW5kb3cnKSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdXBsb2FkZXI7XG5cblx0XHR0aGlzLiRicm93c2VyID0gJCggJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnJvd3NlclwiIC8+JyApLmhpZGUoKS5hcHBlbmRUbyggJ2JvZHknICk7XG5cblx0XHR1cGxvYWRlciA9IHRoaXMub3B0aW9ucy51cGxvYWRlciA9IF8uZGVmYXVsdHMoIHRoaXMub3B0aW9ucy51cGxvYWRlciB8fCB7fSwge1xuXHRcdFx0ZHJvcHpvbmU6ICB0aGlzLiRlbCxcblx0XHRcdGJyb3dzZXI6ICAgdGhpcy4kYnJvd3Nlcixcblx0XHRcdHBhcmFtczogICAge31cblx0XHR9KTtcblxuXHRcdC8vIEVuc3VyZSB0aGUgZHJvcHpvbmUgaXMgYSBqUXVlcnkgY29sbGVjdGlvbi5cblx0XHRpZiAoIHVwbG9hZGVyLmRyb3B6b25lICYmICEgKHVwbG9hZGVyLmRyb3B6b25lIGluc3RhbmNlb2YgJCkgKSB7XG5cdFx0XHR1cGxvYWRlci5kcm9wem9uZSA9ICQoIHVwbG9hZGVyLmRyb3B6b25lICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb250cm9sbGVyLm9uKCAnYWN0aXZhdGUnLCB0aGlzLnJlZnJlc2gsIHRoaXMgKTtcblxuXHRcdHRoaXMuY29udHJvbGxlci5vbiggJ2RldGFjaCcsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy4kYnJvd3Nlci5yZW1vdmUoKTtcblx0XHR9LCB0aGlzICk7XG5cdH0sXG5cblx0cmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCB0aGlzLnVwbG9hZGVyICkge1xuXHRcdFx0dGhpcy51cGxvYWRlci5yZWZyZXNoKCk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcG9zdElkID0gd3AubWVkaWEudmlldy5zZXR0aW5ncy5wb3N0LmlkLFxuXHRcdFx0ZHJvcHpvbmU7XG5cblx0XHQvLyBJZiB0aGUgdXBsb2FkZXIgYWxyZWFkeSBleGlzdHMsIGJhaWwuXG5cdFx0aWYgKCB0aGlzLnVwbG9hZGVyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggcG9zdElkICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnVwbG9hZGVyLnBhcmFtcy5wb3N0X2lkID0gcG9zdElkO1xuXHRcdH1cblx0XHR0aGlzLnVwbG9hZGVyID0gbmV3IHdwLlVwbG9hZGVyKCB0aGlzLm9wdGlvbnMudXBsb2FkZXIgKTtcblxuXHRcdGRyb3B6b25lID0gdGhpcy51cGxvYWRlci5kcm9wem9uZTtcblx0XHRkcm9wem9uZS5vbiggJ2Ryb3B6b25lOmVudGVyJywgXy5iaW5kKCB0aGlzLnNob3csIHRoaXMgKSApO1xuXHRcdGRyb3B6b25lLm9uKCAnZHJvcHpvbmU6bGVhdmUnLCBfLmJpbmQoIHRoaXMuaGlkZSwgdGhpcyApICk7XG5cblx0XHQkKCB0aGlzLnVwbG9hZGVyICkub24oICd1cGxvYWRlcjpyZWFkeScsIF8uYmluZCggdGhpcy5fcmVhZHksIHRoaXMgKSApO1xuXHR9LFxuXG5cdF9yZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb250cm9sbGVyLnRyaWdnZXIoICd1cGxvYWRlcjpyZWFkeScgKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgJGVsID0gdGhpcy4kZWwuc2hvdygpO1xuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgdGhlIGFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgYnkgd2FpdGluZyB1bnRpbFxuXHRcdC8vIHRoZSB0cmFuc3BhcmVudCBlbGVtZW50IGlzIHBhaW50ZWQgaW50byB0aGUgRE9NLlxuXHRcdF8uZGVmZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0JGVsLmNzcyh7IG9wYWNpdHk6IDEgfSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyICRlbCA9IHRoaXMuJGVsLmNzcyh7IG9wYWNpdHk6IDAgfSk7XG5cblx0XHR3cC5tZWRpYS50cmFuc2l0aW9uKCAkZWwgKS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIFRyYW5zaXRpb24gZW5kIGV2ZW50cyBhcmUgc3ViamVjdCB0byByYWNlIGNvbmRpdGlvbnMuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgaXMgc2V0IGFzIGludGVuZGVkLlxuXHRcdFx0aWYgKCAnMCcgPT09ICRlbC5jc3MoJ29wYWNpdHknKSApIHtcblx0XHRcdFx0JGVsLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIGh0dHBzOi8vY29yZS50cmFjLndvcmRwcmVzcy5vcmcvdGlja2V0LzI3MzQxXG5cdFx0Xy5kZWxheSggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICcwJyA9PT0gJGVsLmNzcygnb3BhY2l0eScpICYmICRlbC5pcygnOnZpc2libGUnKSApIHtcblx0XHRcdFx0JGVsLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9LCA1MDAgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBsb2FkZXJXaW5kb3c7XG4iLCIvKipcbiAqIHdwLm1lZGlhLlZpZXdcbiAqXG4gKiBUaGUgYmFzZSB2aWV3IGNsYXNzIGZvciBtZWRpYS5cbiAqXG4gKiBVbmRlbGVnYXRpbmcgZXZlbnRzLCByZW1vdmluZyBldmVudHMgZnJvbSB0aGUgbW9kZWwsIGFuZFxuICogcmVtb3ZpbmcgZXZlbnRzIGZyb20gdGhlIGNvbnRyb2xsZXIgbWlycm9yIHRoZSBjb2RlIGZvclxuICogYEJhY2tib25lLlZpZXcuZGlzcG9zZWAgaW4gQmFja2JvbmUgMC45LjggZGV2ZWxvcG1lbnQuXG4gKlxuICogVGhpcyBiZWhhdmlvciBoYXMgc2luY2UgYmVlbiByZW1vdmVkLCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBvdXRzaWRlIG9mIHRoZSBtZWRpYSBtYW5hZ2VyLlxuICpcbiAqIEBjbGFzc1xuICogQGF1Z21lbnRzIHdwLkJhY2tib25lLlZpZXdcbiAqIEBhdWdtZW50cyBCYWNrYm9uZS5WaWV3XG4gKi9cbnZhciBWaWV3ID0gd3AuQmFja2JvbmUuVmlldy5leHRlbmQoe1xuXHRjb25zdHJ1Y3RvcjogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0aWYgKCBvcHRpb25zICYmIG9wdGlvbnMuY29udHJvbGxlciApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlcjtcblx0XHR9XG5cdFx0d3AuQmFja2JvbmUuVmlldy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdH0sXG5cdC8qKlxuXHQgKiBAdG9kbyBUaGUgaW50ZXJuYWwgY29tbWVudCBtZW50aW9ucyB0aGlzIG1pZ2h0IGhhdmUgYmVlbiBhIHN0b3AtZ2FwXG5cdCAqICAgICAgIGJlZm9yZSBCYWNrYm9uZSAwLjkuOCBjYW1lIG91dC4gRmlndXJlIG91dCBpZiBCYWNrYm9uZSBjb3JlIHRha2VzXG5cdCAqICAgICAgIGNhcmUgb2YgdGhpcyBpbiBCYWNrYm9uZS5WaWV3IG5vdy5cblx0ICpcblx0ICogQHJldHVybnMge3dwLm1lZGlhLlZpZXd9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGNoYWluaW5nXG5cdCAqL1xuXHRkaXNwb3NlOiBmdW5jdGlvbigpIHtcblx0XHQvLyBVbmRlbGVnYXRpbmcgZXZlbnRzLCByZW1vdmluZyBldmVudHMgZnJvbSB0aGUgbW9kZWwsIGFuZFxuXHRcdC8vIHJlbW92aW5nIGV2ZW50cyBmcm9tIHRoZSBjb250cm9sbGVyIG1pcnJvciB0aGUgY29kZSBmb3Jcblx0XHQvLyBgQmFja2JvbmUuVmlldy5kaXNwb3NlYCBpbiBCYWNrYm9uZSAwLjkuOCBkZXZlbG9wbWVudC5cblx0XHR0aGlzLnVuZGVsZWdhdGVFdmVudHMoKTtcblxuXHRcdGlmICggdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLm9mZiApIHtcblx0XHRcdHRoaXMubW9kZWwub2ZmKCBudWxsLCBudWxsLCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLm9mZiApIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5vZmYoIG51bGwsIG51bGwsIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBVbmJpbmQgY29udHJvbGxlciBldmVudHMuXG5cdFx0aWYgKCB0aGlzLmNvbnRyb2xsZXIgJiYgdGhpcy5jb250cm9sbGVyLm9mZiApIHtcblx0XHRcdHRoaXMuY29udHJvbGxlci5vZmYoIG51bGwsIG51bGwsIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0LyoqXG5cdCAqIEByZXR1cm5zIHt3cC5tZWRpYS5WaWV3fSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBjaGFpbmluZ1xuXHQgKi9cblx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0XHQvKipcblx0XHQgKiBjYWxsICdyZW1vdmUnIGRpcmVjdGx5IG9uIHRoZSBwYXJlbnQgY2xhc3Ncblx0XHQgKi9cblx0XHRyZXR1cm4gd3AuQmFja2JvbmUuVmlldy5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiJdfQ==