Rafał Pitoń 9 лет назад
Родитель
Сommit
0632e24ccb

+ 141 - 0
frontend/src/components/categories/category.js

@@ -0,0 +1,141 @@
+import React from 'react';
+import LastActivity from 'misago/components/categories/last-activity'; // jshint ignore:line
+import ReadIcon from 'misago/components/categories/read-icon'; // jshint ignore:line
+import Stats from 'misago/components/categories/stats'; // jshint ignore:line
+
+export default class extends React.Component {
+  getClassName() {
+    if (this.props.category.css_class) {
+      return 'panel panel-default panel-category panel-category-' + this.props.category.css_class;
+    } else {
+      return 'panel panel-default panel-category';
+    }
+  }
+
+  getHeadingClassName() {
+    if (this.props.category.subcategories.length) {
+      return 'panel-heading';
+    } else {
+      return 'panel-heading heading-alone';
+    }
+  }
+
+  getCategoryDescription() {
+    if (this.props.category.description) {
+      /* jshint ignore:start */
+      return <div className="panel-body category-description"
+                  dangerouslySetInnerHTML={{
+                    __html: this.props.category.description.html
+                  }} />;
+      /* jshint ignore:end */
+    } else {
+      return null;
+    }
+  }
+
+  getSubcategoryClass(category) {
+    if (category.css_class) {
+      return 'list-group-item category-subcategory subcategory-' + category.css_class;
+    } else {
+      return 'list-group-item category-subcategory';
+    }
+  }
+
+  getSubcategoryDescription(category) {
+    if (category.description) {
+      /* jshint ignore:start */
+      return <div className="subcategory-description"
+                  dangerouslySetInnerHTML={{
+                    __html: category.description.html
+                  }} />;
+      /* jshint ignore:end */
+    } else {
+      return null;
+    }
+  }
+
+  getSubcategorySubcategoryClass(category) {
+    if (category.css_class) {
+      return 'subcategory subcategory-' + category.css_class;
+    } else {
+      return 'subcategory';
+    }
+  }
+
+  getSubcategorySubcategories(category) {
+    if (category.subcategories) {
+      /* jshint ignore:start */
+      return <ul className="list-inline subcategory-subcategories">
+        {category.subcategories.map((category) => {
+          return <li key={category.id}>
+            <a href={category.absolute_url}
+               className={this.getSubcategorySubcategoryClass(category)}>
+              {category.name}
+            </a>
+          </li>;
+        })}
+      </ul>;
+      /* jshint ignore:end */
+    } else {
+      return null;
+    }
+  }
+
+  getSubcategories() {
+    if (this.props.category.subcategories) {
+      /* jshint ignore:start */
+      return <ul className="list-group category-subcategories">
+        {this.props.category.subcategories.map((category) => {
+          return <li className="list-group-item category-subcategory"
+                     key={category.id}>
+            <div className="title-row">
+              <h4>
+                <ReadIcon category={category} />
+                <a href={category.absolute_url} className="item-title">
+                  {category.name}
+                </a>
+              </h4>
+              <Stats category={category} />
+            </div>
+
+            <LastActivity category={category} />
+
+            {this.getSubcategoryDescription(category)}
+            {this.getSubcategorySubcategories(category)}
+
+          </li>;
+        })}
+      </ul>;
+      /* jshint ignore:end */
+    } else {
+      return null;
+    }
+  }
+
+  render() {
+    /* jshint ignore:start */
+    return <div id={'panel-category-' + this.props.category.id}
+                className={this.getClassName()}>
+      <div className={this.getHeadingClassName()}>
+        <div className="panel-heading-inblock">
+          <div className="panel-heading-top-row">
+            <h3 className="panel-title">
+              <ReadIcon category={this.props.category} />
+              <a href={this.props.category.absolute_url} className="item-title">
+                {this.props.category.name}
+              </a>
+            </h3>
+            <Stats category={this.props.category} />
+          </div>
+          <LastActivity category={this.props.category} />
+        </div>
+      </div>
+
+      {this.getCategoryDescription()}
+
+      {this.getSubcategories()}
+
+    </div>;
+    /* jshint ignore:end */
+  }
+}

+ 20 - 0
frontend/src/components/categories/empty-message.js

@@ -0,0 +1,20 @@
+import React from 'react';
+
+export default class extends React.Component {
+  render() {
+    /* jshint ignore:start */
+    return <div className="message-panel">
+
+      <div className="message-icon">
+        <span className="material-icon">info_outline</span>
+      </div>
+
+      <div className="message-body">
+        <p className="lead">{gettext("No categories are available.")}</p>
+        <p>{gettext("No categories are currently defined or you don't have permission to see them.")}</p>
+      </div>
+
+    </div>;
+    /* jshint ignore:end */
+  }
+}

+ 83 - 0
frontend/src/components/categories/last-activity.js

@@ -0,0 +1,83 @@
+import React from 'react';
+
+export default class extends React.Component {
+  getLastPoster() {
+    if (this.props.category.last_poster_url) {
+      /* jshint ignore:start */
+      return <a href={this.props.category.last_poster_url}
+                className="item-title">
+        {this.props.category.last_poster_name}
+      </a>;
+      /* jshint ignore:end */
+    } else {
+      /* jshint ignore:start */
+      return <span className="item-title">
+        {this.props.category.last_poster_name}
+      </span>;
+      /* jshint ignore:end */
+    }
+  }
+
+  getThreadDetails() {
+    /* jshint ignore:start */
+    return [
+      <li className="thread-title" key="title">
+        <a href={this.props.category.last_thread_url} className="item-title">
+          {this.props.category.last_thread_title}
+        </a>
+      </li>,
+      <li className="poster-name" key="poster">
+        {this.getLastPoster()}
+      </li>,
+      <li className="thread-date" key="date">
+        <abbr title={this.props.category.last_post_on.format('LL, LT')}>
+          {this.props.category.last_post_on.fromNow()}
+        </abbr>
+      </li>
+    ];
+    /* jshint ignore:end */
+  }
+
+  getLastActivity() {
+    if (this.props.category.acl.can_browse) {
+      if (!this.props.category.acl.can_see_all_threads) {
+        /* jshint ignore:start */
+        return <li className="thread-message">
+          <span className="material-icon">
+            info_outline
+          </span>
+          {gettext("This category is private. You can see only your own threads within it.")}
+        </li>;
+        /* jshint ignore:end */
+      } else if (this.props.category.last_thread_title) {
+        return this.getThreadDetails();
+      } else {
+        /* jshint ignore:start */
+        return <li className="thread-message">
+          <span className="material-icon">
+            error_outline
+          </span>
+          {gettext("This category is empty.")}
+        </li>;
+        /* jshint ignore:end */
+      }
+    } else {
+      /* jshint ignore:start */
+      return <li className="thread-message">
+        <span className="material-icon">
+          highlight_off
+        </span>
+        {gettext("This category is protected. You can't browse it's contents.")}
+      </li>;
+      /* jshint ignore:end */
+    }
+  }
+
+  render() {
+    /* jshint ignore:start */
+    return <ul className="list-inline category-last-activity">
+      {this.getLastActivity()}
+    </ul>;
+    /* jshint ignore:end */
+  }
+}

+ 51 - 0
frontend/src/components/categories/read-icon.js

@@ -0,0 +1,51 @@
+import React from 'react';
+
+export default class extends React.Component {
+  getClassName() {
+    if (this.props.category.is_read) {
+      return 'material-icon read-status item-read';
+    } else {
+      return 'material-icon read-status item-new';
+    }
+  }
+
+  getTitle() {
+    if (this.props.category.is_closed) {
+      if (this.props.category.is_read) {
+        return gettext("This category has no new posts. (closed)");
+      } else {
+        return gettext("This category has new posts. (closed)");
+      }
+    } else {
+      if (this.props.category.is_read) {
+        return gettext("This category has no new posts.");
+      } else {
+        return gettext("This category has new posts.");
+      }
+    }
+  }
+
+  getIcon() {
+    if (this.props.category.is_closed) {
+      if (this.props.category.is_read) {
+        return 'lock_outline';
+      } else {
+        return 'lock';
+      }
+    } else {
+      if (this.props.category.is_read) {
+        return 'chat_bubble_outline';
+      } else {
+        return 'chat_bubble';
+      }
+    }
+  }
+
+  render() {
+    /* jshint ignore:start */
+    return <span className={this.getClassName()} title={this.getTitle()}>
+      {this.getIcon()}
+    </span>;
+    /* jshint ignore:end */
+  }
+}

+ 98 - 0
frontend/src/components/categories/root.js

@@ -0,0 +1,98 @@
+import moment from 'moment';
+import React from 'react';
+import Category from 'misago/components/categories/category'; // jshint ignore:line
+import EmptyMessage from 'misago/components/categories/empty-message'; // jshint ignore:line
+import misago from 'misago/index';
+import polls from 'misago/services/polls';
+
+let dehydrate = function(category) {
+  return Object.assign({}, category, {
+    last_post_on: category.last_post_on ? moment(category.last_post_on) : null,
+    subcategories: category.subcategories.map(dehydrate)
+  });
+};
+
+export default class extends React.Component {
+  constructor(props) {
+    super(props);
+
+    this.state = {
+      categories: misago.get('CATEGORIES').map(dehydrate)
+    };
+
+    this.startPolling(misago.get('CATEGORIES_API'));
+  }
+
+  startPolling(api) {
+    polls.start({
+      poll: 'categories',
+      url: api,
+      frequency: 180 * 1000,
+      update: this.update
+    });
+  }
+
+  /* jshint ignore:start */
+  update = (data) => {
+    this.setState({
+      categories: data.map(dehydrate)
+    });
+  };
+  /* jshint ignore:end */
+
+  getClassName() {
+    if (this.state.categories.length) {
+      return 'page page-categories';
+    } else {
+      return 'page page-categories page-message';
+    }
+  }
+
+  getHeading() {
+    if (misago.get('CATEGORIES_ON_INDEX')) {
+      return misago.get('SETTINGS').forum_name;
+    } else {
+      return gettext("Categories");
+    }
+  }
+
+  getCategoriesList() {
+    if (this.state.categories.length) {
+      /* jshint ignore:start */
+      return <div className="categories-list">
+        {this.state.categories.map(function(category) {
+          return <Category category={category} key={category.id} />;
+        })}
+      </div>;
+      /* jshint ignore:end */
+    } else {
+      /* jshint ignore:start */
+      return <EmptyMessage />;
+    /* jshint ignore:end */
+    }
+  }
+
+  render() {
+    /* jshint ignore:start */
+    return <div className={this.getClassName()}>
+
+      <div className="page-header">
+        <div className="container">
+          <h1>{this.getHeading()}</h1>
+        </div>
+      </div>
+
+      <div className="container">
+        {this.getCategoriesList()}
+      </div>
+
+    </div>;
+    /* jshint ignore:end */
+  }
+}
+
+export function select(store) {
+  return {
+    'tick': store.tick.tick,
+  };
+}

+ 38 - 0
frontend/src/components/categories/stats.js

@@ -0,0 +1,38 @@
+import React from 'react';
+
+export default class extends React.Component {
+  getThreadsCount() {
+    let string = ngettext(
+      "%(threads)s thread",
+      "%(threads)s threads",
+      this.props.category.threads);
+
+    return interpolate(string, {
+      'threads': this.props.category.threads
+    }, true);
+  }
+
+  getPostsCount() {
+    let string = ngettext(
+      "%(posts)s post",
+      "%(posts)s posts",
+      this.props.category.posts);
+
+    return interpolate(string, {
+      'posts': this.props.category.posts
+    }, true);
+  }
+
+  render() {
+    /* jshint ignore:start */
+    return <ul className="list-inline category-stats">
+      <li className="category-threads">
+        {this.getThreadsCount()}
+      </li>
+      <li className="category-posts">
+        {this.getPostsCount()}
+      </li>
+    </ul>;
+    /* jshint ignore:end */
+  }
+}

+ 16 - 0
frontend/src/initializers/components/categories.js

@@ -0,0 +1,16 @@
+import { connect } from 'react-redux';
+import Categories, { select } from 'misago/components/categories/root';
+import misago from 'misago/index';
+import mount from 'misago/utils/mount-component';
+
+export default function initializer(context) {
+  if (context.has('CATEGORIES')) {
+    mount(connect(select)(Categories), 'page-mount');
+  }
+}
+
+misago.addInitializer({
+  name: 'component:reset-password-form',
+  initializer: initializer,
+  after: 'store'
+});

+ 12 - 7
frontend/src/services/polls.js

@@ -11,15 +11,19 @@ export class Polls {
       this._polls[kwargs.poll] = kwargs;
 
       this._ajax.get(kwargs.url, kwargs.data || null).then((data) => {
-        kwargs.update(data);
+        if (!this._polls[kwargs.poll]._stopped) {
+          kwargs.update(data);
 
-        this._polls[kwargs.poll].timeout = window.setTimeout(
-          poolServer, kwargs.frequency);
+          this._polls[kwargs.poll].timeout = window.setTimeout(
+            poolServer, kwargs.frequency);
+        }
       }, (rejection) => {
-        if (kwargs.error) {
-          kwargs.error(rejection);
-        } else {
-          this._snackbar.apiError(rejection);
+        if (!this._polls[kwargs.poll]._stopped) {
+          if (kwargs.error) {
+            kwargs.error(rejection);
+          } else {
+            this._snackbar.apiError(rejection);
+          }
         }
       });
     };
@@ -30,6 +34,7 @@ export class Polls {
   stop(pollId) {
     if (this._polls[pollId]) {
       window.clearTimeout(this._polls[pollId].timeout);
+      this._polls[pollId]._stopped = true;
     }
   }
 }

+ 1 - 1
frontend/style/misago/category.less

@@ -26,7 +26,7 @@
       width: 26px;
 
       position: relative;
-      bottom: 2px;
+      bottom: 1px;
 
       color: @read-status-old;
       font-size: 24px;

+ 307 - 0
frontend/tests/components/categories/root.js

@@ -0,0 +1,307 @@
+import assert from 'assert';
+import React from 'react'; // jshint ignore:line
+import CategoriesList from 'misago/components/categories/root'; // jshint ignore:line
+import misago from 'misago/index';
+import ajax from 'misago/services/ajax';
+import polls from 'misago/services/polls';
+import snackbar from 'misago/services/snackbar';
+import * as testUtils from 'misago/utils/test-utils';
+
+let snackbarStore = null;
+let categories = [
+  {
+    "id": 3,
+    "name": "Games",
+    "description": null,
+    "is_closed": false,
+    "threads": 82,
+    "posts": 1944,
+    "last_post_on": "2016-02-25T21:15:53.231778Z",
+    "last_thread_title": "Nemo quibusdam sunt ab odit omnis totam.",
+    "last_poster_name": "Raelyn",
+    "css_class": "accent",
+    "is_read": false,
+    "subcategories": [],
+    "absolute_url": "/categories/#games-3",
+    "last_thread_url": "/not-yet-implemented/",
+    "last_poster_url": "/user/raelyn-74/",
+    "acl": {
+      "can_browse": true,
+      "can_see_all_threads": 1
+    }
+  },
+  {
+    "id": 4,
+    "name": "Second category",
+    "description": {
+      "plain": "Lorem ipsum dolor met sit amet elit.",
+      "html": "<p>Lorem ipsum dolor met sit amet elit.</p>"
+    },
+    "is_closed": false,
+    "threads": 418,
+    "posts": 7741,
+    "last_post_on": "2016-02-25T21:15:54.483911Z",
+    "last_thread_title": "Iste officiis debitis velit non magnam aut a.",
+    "last_poster_name": "Myrna",
+    "css_class": "",
+    "is_read": false,
+    "subcategories": [
+      {
+        "id": 5,
+        "name": "Action",
+        "description": {
+          "plain": "Lorem ipsum dolor met sit amet elit pacem bellum sequor.",
+          "html": "<p>Lorem ipsum dolor met sit amet elit pacem bellum sequor.</p>"
+        },
+        "is_closed": true,
+        "threads": 263,
+        "posts": 5386,
+        "last_post_on": "2016-02-25T21:15:54.483911Z",
+        "last_thread_title": "Iste officiis debitis velit non magnam aut a.",
+        "last_poster_name": "Myrna",
+        "css_class": "",
+        "is_read": false,
+        "subcategories": [
+          {
+            "id": 7,
+            "name": "Multiplayer",
+            "description": null,
+            "is_closed": false,
+            "threads": 95,
+            "posts": 1567,
+            "last_post_on": "2016-02-25T21:15:53.697017Z",
+            "last_thread_title": "Et debitis unde in eius.",
+            "last_poster_name": "Morton",
+            "css_class": "",
+            "is_read": false,
+            "subcategories": [],
+            "absolute_url": "/category/multiplayer-7/",
+            "last_thread_url": "/not-yet-implemented/",
+            "last_poster_url": "/user/morton-30/",
+            "acl": {
+              "can_browse": true,
+              "can_see_all_threads": 1
+            }
+          },
+          {
+            "id": 8,
+            "name": "Single player",
+            "description": null,
+            "is_closed": false,
+            "threads": 93,
+            "posts": 2422,
+            "last_post_on": "2016-02-25T21:15:54.483911Z",
+            "last_thread_title": "Iste officiis debitis velit non magnam aut a.",
+            "last_poster_name": "Myrna",
+            "css_class": "",
+            "is_read": false,
+            "subcategories": [],
+            "absolute_url": "/category/single-player-8/",
+            "last_thread_url": "/not-yet-implemented/",
+            "last_poster_url": "/user/myrna-18/",
+            "acl": {
+              "can_browse": true,
+              "can_see_all_threads": 1
+            }
+          }
+        ],
+        "absolute_url": "/category/action-5/",
+        "last_thread_url": "/not-yet-implemented/",
+        "last_poster_url": "/user/myrna-52/",
+        "acl": {
+          "can_browse": true,
+          "can_see_all_threads": 1
+        }
+      },
+      {
+        "id": 6,
+        "name": "Sandbox",
+        "description": null,
+        "is_closed": false,
+        "threads": 73,
+        "posts": 979,
+        "last_post_on": "2016-02-25T21:15:54.240616Z",
+        "last_thread_title": "Totam hic excepturi nulla asperiores illum.",
+        "last_poster_name": "Camille",
+        "css_class": "",
+        "is_read": false,
+        "subcategories": [],
+        "absolute_url": "/category/sandbox-6/",
+        "last_thread_url": "/not-yet-implemented/",
+        "last_poster_url": "/user/camille-29/",
+        "acl": {
+          "can_browse": true,
+          "can_see_all_threads": 1
+        }
+      }
+    ],
+    "absolute_url": "/categories/#second-category-4",
+    "last_thread_url": "/not-yet-implemented/",
+    "last_poster_url": "/user/myrna-88/",
+    "acl": {
+      "can_browse": true,
+      "can_see_all_threads": 1
+    }
+  }
+];
+
+describe("Categories List", function() {
+  beforeEach(function() {
+    misago._context = {
+      CATEGORIES: categories,
+      CATEGORIES_API: '/test-api/categories/',
+      CATEGORIES_ON_INDEX: false
+    };
+
+    snackbarStore = testUtils.snackbarStoreMock();
+    snackbar.init(snackbarStore);
+
+    polls.init(ajax, snackbar);
+  });
+
+  afterEach(function() {
+    polls.stop('categories');
+    testUtils.unmountComponents();
+    $.mockjax.clear();
+  });
+
+  it('renders and loads', function(done) {
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: categories
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount .panel-category').length, 2,
+      "two categories rendered initially");
+
+    window.setTimeout(function() {
+      let element = $('#test-mount .page-categories');
+      assert.ok(element.length, "component renders");
+
+      assert.equal(element.find('.panel-category').length, 2,
+        "two categories rendered");
+
+      done();
+    }, 200);
+  });
+
+  it('renders and loads empty list', function(done) {
+    misago._context.CATEGORIES = [];
+
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: []
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount .panel-category').length, 0,
+      "no categories rendered initially");
+
+    window.setTimeout(function() {
+      let element = $('#test-mount .page-message .message-body');
+      assert.ok(element.length, "component renders message about no data");
+
+      assert.equal(element.find('.panel-category').length, 0,
+        "no categories rendered");
+
+      done();
+    }, 200);
+  });
+
+  it('renders and empties list', function(done) {
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: []
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount .panel-category').length, 2,
+      "two categories rendered initially");
+
+    testUtils.onElement('#test-mount .page-message .message-body', function() {
+      let element = $('#test-mount .page-message .message-body');
+      assert.ok(element.length, "component renders message about no data");
+
+      assert.equal(element.find('.panel-category').length, 0,
+        "no categories rendered");
+
+      done();
+    });
+  });
+
+  it('renders empty and populates list', function(done) {
+    misago._context.CATEGORIES = [];
+
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: categories
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount .panel-category').length, 0,
+      "no categories rendered initially");
+
+    testUtils.onElement('#test-mount .categories-list', function(element) {
+      assert.equal(element.find('.panel-category').length, 2,
+        "two categories rendered");
+
+      done();
+    });
+  });
+
+  it('has valid header if not forum index', function() {
+    misago._context.CATEGORIES = [];
+    misago._context.CATEGORIES_ON_INDEX = false;
+
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: []
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount h1').text(), "Categories",
+      "renders with non-home header");
+  });
+
+  it('has valid header if forum index', function() {
+    misago._context.CATEGORIES = [];
+    misago._context.CATEGORIES_ON_INDEX = true;
+    misago._context.SETTINGS = {
+      forum_name: "Test Misago Forum"
+    };
+
+    $.mockjax({
+      url: '/test-api/categories/',
+      status: 200,
+      responseText: []
+    });
+
+    /* jshint ignore:start */
+    testUtils.render(<CategoriesList />);
+    /* jshint ignore:end */
+
+    assert.equal($('#test-mount h1').text(), "Test Misago Forum",
+      "renders with forum name in header");
+  });
+});

+ 9 - 1
misago/categories/serializers.py

@@ -16,6 +16,7 @@ class CategorySerializer(serializers.ModelSerializer):
     absolute_url = serializers.SerializerMethodField()
     last_poster_url = serializers.SerializerMethodField()
     last_thread_url = serializers.SerializerMethodField()
+    acl = serializers.SerializerMethodField()
 
     class Meta:
         model = Category
@@ -35,6 +36,7 @@ class CategorySerializer(serializers.ModelSerializer):
             'absolute_url',
             'last_thread_url',
             'last_poster_url',
+            'acl',
         )
 
     def get_description(self, obj):
@@ -71,4 +73,10 @@ class CategorySerializer(serializers.ModelSerializer):
                 'user_id': obj.last_poster_id,
             })
         else:
-            return None
+            return None
+
+    def get_acl(self, obj):
+        try:
+            return obj.acl
+        except AttributeError:
+            return []

+ 2 - 0
misago/conf/context_processors.py

@@ -36,6 +36,8 @@ def preload_settings_json(request):
         'MEDIA_URL': dj_settings.MEDIA_URL,
 
         'CSRF_COOKIE_NAME': dj_settings.CSRF_COOKIE_NAME,
+
+        'CATEGORIES_ON_INDEX': dj_settings.MISAGO_CATEGORIES_ON_INDEX,
     })
 
     return {}

+ 1 - 1
misago/static/misago/css/misago.css

@@ -6096,7 +6096,7 @@ a.item-title:hover {
   margin-right: 2px;
   width: 26px;
   position: relative;
-  bottom: 2px;
+  bottom: 1px;
   color: #777777;
   font-size: 24px;
   line-height: 24px;

+ 1075 - 266
misago/static/misago/js/misago.js

@@ -187,7 +187,7 @@ exports.default = misago;
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{"../../../misago/frontend/src/utils/ordered-list":144}],3:[function(require,module,exports){
+},{"../../../misago/frontend/src/utils/ordered-list":151}],3:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -214,7 +214,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128}],4:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/ajax":135}],4:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -254,7 +254,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/auth":129,"../../../../misago/frontend/src/services/local-storage":132,"../../../../misago/frontend/src/services/modal":134,"../../../../misago/frontend/src/services/store":138}],5:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/auth":136,"../../../../misago/frontend/src/services/local-storage":139,"../../../../misago/frontend/src/services/modal":141,"../../../../misago/frontend/src/services/store":145}],5:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -293,7 +293,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/captcha":130,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/snackbar":137}],6:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/ajax":135,"../../../../misago/frontend/src/services/captcha":137,"../../../../misago/frontend/src/services/include":138,"../../../../misago/frontend/src/services/snackbar":144}],6:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -327,7 +327,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/auth-message":52,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],7:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/auth-message":53,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150,"react-redux":"react-redux"}],7:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -357,7 +357,43 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/banned-page":140}],8:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/banned-page":147}],8:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = initializer;
+
+var _reactRedux = require('react-redux');
+
+var _root = require('../../../../../misago/frontend/src/components/categories/root');
+
+var _root2 = _interopRequireDefault(_root);
+
+var _index = require('../../../../../misago/frontend/src/index');
+
+var _index2 = _interopRequireDefault(_index);
+
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
+
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function initializer(context) {
+  if (context.has('CATEGORIES')) {
+    (0, _mountComponent2.default)((0, _reactRedux.connect)(_root.select)(_root2.default), 'page-mount');
+  }
+}
+
+_index2.default.addInitializer({
+  name: 'component:reset-password-form',
+  initializer: initializer,
+  after: 'store'
+});
+
+},{"../../../../../misago/frontend/src/components/categories/root":61,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150,"react-redux":"react-redux"}],9:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -395,7 +431,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/options/root":73,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],9:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/options/root":80,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/routed-component":154}],10:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -435,7 +471,7 @@ _index2.default.addInitializer({
   after: 'reducer:profile-dehydrate'
 });
 
-},{"../../../../../misago/frontend/src/components/profile/root":90,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147,"react-redux":"react-redux"}],10:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/profile/root":97,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/routed-component":154,"react-redux":"react-redux"}],11:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -469,7 +505,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/request-activation-link":94,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],11:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/request-activation-link":101,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150}],12:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -503,7 +539,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/request-password-reset":95,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],12:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/request-password-reset":102,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150}],13:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -537,7 +573,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/reset-password-form":96,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],13:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/reset-password-form":103,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150}],14:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -569,7 +605,7 @@ _index2.default.addInitializer({
   after: 'snackbar'
 });
 
-},{"../../../../../misago/frontend/src/components/snackbar":100,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],14:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/snackbar":107,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150,"react-redux":"react-redux"}],15:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -602,7 +638,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/user-menu/root":102,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],15:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/user-menu/root":109,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/mount-component":150,"react-redux":"react-redux"}],16:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -640,7 +676,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/components/users/root":119,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],16:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/components/users/root":126,"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/utils/routed-component":154}],17:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -667,7 +703,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131}],17:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/include":138}],18:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -694,7 +730,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/local-storage":132}],18:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/local-storage":139}],19:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -725,7 +761,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/mobile-navbar-dropdown":133}],19:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/mobile-navbar-dropdown":140}],20:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -756,7 +792,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/modal":134}],20:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/modal":141}],21:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -783,7 +819,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"moment":"moment"}],21:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"moment":"moment"}],22:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -810,7 +846,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/page-title":135}],22:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/page-title":142}],23:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -845,7 +881,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/polls":136,"../../../../misago/frontend/src/services/snackbar":137}],23:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/ajax":135,"../../../../misago/frontend/src/services/polls":143,"../../../../misago/frontend/src/services/snackbar":144}],24:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -882,7 +918,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/auth":122,"../../../../../misago/frontend/src/services/store":138}],24:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/auth":129,"../../../../../misago/frontend/src/services/store":145}],25:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -914,7 +950,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],25:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/profile":130,"../../../../../misago/frontend/src/services/store":145}],26:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -946,7 +982,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],26:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/profile":130,"../../../../../misago/frontend/src/services/store":145}],27:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -978,7 +1014,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/snackbar":124,"../../../../../misago/frontend/src/services/store":138}],27:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/snackbar":131,"../../../../../misago/frontend/src/services/store":145}],28:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1010,7 +1046,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/tick":125,"../../../../../misago/frontend/src/services/store":138}],28:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/tick":132,"../../../../../misago/frontend/src/services/store":145}],29:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1042,7 +1078,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/username-history":126,"../../../../../misago/frontend/src/services/store":138}],29:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/username-history":133,"../../../../../misago/frontend/src/services/store":145}],30:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1074,7 +1110,7 @@ _index2.default.addInitializer({
   before: 'store'
 });
 
-},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/users":127,"../../../../../misago/frontend/src/services/store":138}],30:[function(require,module,exports){
+},{"../../../../../misago/frontend/src/index":128,"../../../../../misago/frontend/src/reducers/users":134,"../../../../../misago/frontend/src/services/store":145}],31:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1106,7 +1142,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/snackbar":137,"../../../../misago/frontend/src/services/store":138}],31:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/snackbar":144,"../../../../misago/frontend/src/services/store":145}],32:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1134,7 +1170,7 @@ _index2.default.addInitializer({
   before: '_end'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/store":138}],32:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/store":145}],33:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1168,7 +1204,7 @@ _index2.default.addInitializer({
   after: 'store'
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/reducers/tick":125,"../../../../misago/frontend/src/services/store":138}],33:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/reducers/tick":132,"../../../../misago/frontend/src/services/store":145}],34:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -1199,7 +1235,7 @@ _index2.default.addInitializer({
   initializer: initializer
 });
 
-},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/zxcvbn":139}],34:[function(require,module,exports){
+},{"../../../../misago/frontend/src/index":128,"../../../../misago/frontend/src/services/include":138,"../../../../misago/frontend/src/services/zxcvbn":146}],35:[function(require,module,exports){
 var pSlice = Array.prototype.slice;
 var objectKeys = require('./lib/keys.js');
 var isArguments = require('./lib/is_arguments.js');
@@ -1295,7 +1331,7 @@ function objEquiv(a, b, opts) {
   return typeof a === typeof b;
 }
 
-},{"./lib/is_arguments.js":35,"./lib/keys.js":36}],35:[function(require,module,exports){
+},{"./lib/is_arguments.js":36,"./lib/keys.js":37}],36:[function(require,module,exports){
 var supportsArgumentsClass = (function(){
   return Object.prototype.toString.call(arguments)
 })() == '[object Arguments]';
@@ -1317,7 +1353,7 @@ function unsupported(object){
     false;
 };
 
-},{}],36:[function(require,module,exports){
+},{}],37:[function(require,module,exports){
 exports = module.exports = typeof Object.keys === 'function'
   ? Object.keys : shim;
 
@@ -1328,7 +1364,7 @@ function shim (obj) {
   return keys;
 }
 
-},{}],37:[function(require,module,exports){
+},{}],38:[function(require,module,exports){
 /**
  * Indicates that navigation was caused by a call to history.push.
  */
@@ -1360,7 +1396,7 @@ exports['default'] = {
   REPLACE: REPLACE,
   POP: POP
 };
-},{}],38:[function(require,module,exports){
+},{}],39:[function(require,module,exports){
 "use strict";
 
 exports.__esModule = true;
@@ -1387,7 +1423,7 @@ function loopAsync(turns, work, callback) {
 
   next();
 }
-},{}],39:[function(require,module,exports){
+},{}],40:[function(require,module,exports){
 (function (process){
 /*eslint-disable no-empty */
 'use strict';
@@ -1459,7 +1495,7 @@ function readState(key) {
 }
 }).call(this,require('_process'))
 
-},{"_process":1,"warning":51}],40:[function(require,module,exports){
+},{"_process":1,"warning":52}],41:[function(require,module,exports){
 'use strict';
 
 exports.__esModule = true;
@@ -1540,13 +1576,13 @@ function supportsGoWithoutReloadUsingHash() {
   var ua = navigator.userAgent;
   return ua.indexOf('Firefox') === -1;
 }
-},{}],41:[function(require,module,exports){
+},{}],42:[function(require,module,exports){
 'use strict';
 
 exports.__esModule = true;
 var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
 exports.canUseDOM = canUseDOM;
-},{}],42:[function(require,module,exports){
+},{}],43:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -1728,7 +1764,7 @@ exports['default'] = createBrowserHistory;
 module.exports = exports['default'];
 }).call(this,require('_process'))
 
-},{"./Actions":37,"./DOMStateStorage":39,"./DOMUtils":40,"./ExecutionEnvironment":41,"./createDOMHistory":43,"./parsePath":48,"_process":1,"invariant":50}],43:[function(require,module,exports){
+},{"./Actions":38,"./DOMStateStorage":40,"./DOMUtils":41,"./ExecutionEnvironment":42,"./createDOMHistory":44,"./parsePath":49,"_process":1,"invariant":51}],44:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -1772,7 +1808,7 @@ exports['default'] = createDOMHistory;
 module.exports = exports['default'];
 }).call(this,require('_process'))
 
-},{"./DOMUtils":40,"./ExecutionEnvironment":41,"./createHistory":44,"_process":1,"invariant":50}],44:[function(require,module,exports){
+},{"./DOMUtils":41,"./ExecutionEnvironment":42,"./createHistory":45,"_process":1,"invariant":51}],45:[function(require,module,exports){
 //import warning from 'warning'
 'use strict';
 
@@ -2064,7 +2100,7 @@ function createHistory() {
 
 exports['default'] = createHistory;
 module.exports = exports['default'];
-},{"./Actions":37,"./AsyncUtils":38,"./createLocation":45,"./deprecate":46,"./parsePath":48,"./runTransitionHook":49,"deep-equal":34}],45:[function(require,module,exports){
+},{"./Actions":38,"./AsyncUtils":39,"./createLocation":46,"./deprecate":47,"./parsePath":49,"./runTransitionHook":50,"deep-equal":35}],46:[function(require,module,exports){
 //import warning from 'warning'
 'use strict';
 
@@ -2119,7 +2155,7 @@ function createLocation() {
 
 exports['default'] = createLocation;
 module.exports = exports['default'];
-},{"./Actions":37,"./parsePath":48}],46:[function(require,module,exports){
+},{"./Actions":38,"./parsePath":49}],47:[function(require,module,exports){
 //import warning from 'warning'
 
 "use strict";
@@ -2135,7 +2171,7 @@ function deprecate(fn) {
 
 exports["default"] = deprecate;
 module.exports = exports["default"];
-},{}],47:[function(require,module,exports){
+},{}],48:[function(require,module,exports){
 "use strict";
 
 exports.__esModule = true;
@@ -2149,7 +2185,7 @@ function extractPath(string) {
 
 exports["default"] = extractPath;
 module.exports = exports["default"];
-},{}],48:[function(require,module,exports){
+},{}],49:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -2197,7 +2233,7 @@ exports['default'] = parsePath;
 module.exports = exports['default'];
 }).call(this,require('_process'))
 
-},{"./extractPath":47,"_process":1,"warning":51}],49:[function(require,module,exports){
+},{"./extractPath":48,"_process":1,"warning":52}],50:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -2225,7 +2261,7 @@ exports['default'] = runTransitionHook;
 module.exports = exports['default'];
 }).call(this,require('_process'))
 
-},{"_process":1,"warning":51}],50:[function(require,module,exports){
+},{"_process":1,"warning":52}],51:[function(require,module,exports){
 (function (process){
 /**
  * Copyright 2013-2015, Facebook, Inc.
@@ -2281,7 +2317,7 @@ module.exports = invariant;
 
 }).call(this,require('_process'))
 
-},{"_process":1}],51:[function(require,module,exports){
+},{"_process":1}],52:[function(require,module,exports){
 (function (process){
 /**
  * Copyright 2014-2015, Facebook, Inc.
@@ -2346,7 +2382,7 @@ module.exports = warning;
 
 }).call(this,require('_process'))
 
-},{"_process":1}],52:[function(require,module,exports){
+},{"_process":1}],53:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -2449,7 +2485,707 @@ function select(state) {
   };
 }
 
-},{"react":"react"}],53:[function(require,module,exports){
+},{"react":"react"}],54:[function(require,module,exports){
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = require('react');
+
+var _react2 = _interopRequireDefault(_react);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var BASE_URL = $('base').attr('href') + 'user-avatar/';
+
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
+
+  function _class() {
+    _classCallCheck(this, _class);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+  }
+
+  _createClass(_class, [{
+    key: 'getSrc',
+    value: function getSrc() {
+      var size = this.props.size || 100; // jshint ignore:line
+      var url = BASE_URL;
+
+      if (this.props.user && this.props.user.id) {
+        // just avatar hash, size and user id
+        url += this.props.user.avatar_hash + '/' + size + '/' + this.props.user.id + '.png';
+      } else {
+        // just append avatar size to file to produce no-avatar placeholder
+        url += size + '.png';
+      }
+
+      return url;
+    }
+  }, {
+    key: 'render',
+    value: function render() {
+      /* jshint ignore:start */
+      return _react2.default.createElement('img', { src: this.getSrc(),
+        className: this.props.className || 'user-avatar',
+        title: gettext("User avatar") });
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return _class;
+}(_react2.default.Component);
+
+exports.default = _class;
+
+},{"react":"react"}],55:[function(require,module,exports){
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _moment = require('moment');
+
+var _moment2 = _interopRequireDefault(_moment);
+
+var _react = require('react');
+
+var _react2 = _interopRequireDefault(_react);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
+
+  function _class() {
+    _classCallCheck(this, _class);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+  }
+
+  _createClass(_class, [{
+    key: 'getReasonMessage',
+    value: function getReasonMessage() {
+      /* jshint ignore:start */
+      if (this.props.message.html) {
+        return _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
+            __html: this.props.message.html
+          } });
+      } else {
+        return _react2.default.createElement(
+          'p',
+          { className: 'lead' },
+          this.props.message.plain
+        );
+      }
+      /* jshint ignore:end */
+    }
+  }, {
+    key: 'getExpirationMessage',
+    value: function getExpirationMessage() {
+      if (this.props.expires) {
+        if (this.props.expires.isAfter((0, _moment2.default)())) {
+          /* jshint ignore:start */
+          var title = interpolate(gettext("This ban expires on %(expires_on)s."), {
+            'expires_on': this.props.expires.format('LL, LT')
+          }, true);
+
+          var message = interpolate(gettext("This ban expires %(expires_on)s."), {
+            'expires_on': this.props.expires.fromNow()
+          }, true);
+
+          return _react2.default.createElement(
+            'abbr',
+            { title: title },
+            message
+          );
+          /* jshint ignore:end */
+        } else {
+            return gettext("This ban has expired.");
+          }
+      } else {
+        return gettext("This ban is permanent.");
+      }
+    }
+  }, {
+    key: 'render',
+    value: function render() {
+      /* jshint ignore:start */
+      return _react2.default.createElement(
+        'div',
+        { className: 'page page-error page-error-banned' },
+        _react2.default.createElement(
+          'div',
+          { className: 'container' },
+          _react2.default.createElement(
+            'div',
+            { className: 'message-panel' },
+            _react2.default.createElement(
+              'div',
+              { className: 'message-icon' },
+              _react2.default.createElement(
+                'span',
+                { className: 'material-icon' },
+                'highlight_off'
+              )
+            ),
+            _react2.default.createElement(
+              'div',
+              { className: 'message-body' },
+              this.getReasonMessage(),
+              _react2.default.createElement(
+                'p',
+                { className: 'message-footnote' },
+                this.getExpirationMessage()
+              )
+            )
+          )
+        )
+      );
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return _class;
+}(_react2.default.Component);
+
+exports.default = _class;
+
+},{"moment":"moment","react":"react"}],56:[function(require,module,exports){
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = require('react');
+
+var _react2 = _interopRequireDefault(_react);
+
+var _loader = require('./loader');
+
+var _loader2 = _interopRequireDefault(_loader);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+// jshint ignore:line
+
+var Button = function (_React$Component) {
+  _inherits(Button, _React$Component);
+
+  function Button() {
+    _classCallCheck(this, Button);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(Button).apply(this, arguments));
+  }
+
+  _createClass(Button, [{
+    key: 'render',
+    value: function render() {
+      var className = 'btn ' + this.props.className;
+      var disabled = this.props.disabled;
+
+      if (this.props.loading) {
+        className += ' btn-loading';
+        disabled = true;
+      }
+
+      /* jshint ignore:start */
+      return _react2.default.createElement(
+        'button',
+        { type: this.props.onClick ? 'button' : 'submit',
+          className: className,
+          disabled: disabled,
+          onClick: this.props.onClick },
+        this.props.children,
+        this.props.loading ? _react2.default.createElement(_loader2.default, null) : null
+      );
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return Button;
+}(_react2.default.Component);
+
+exports.default = Button;
+
+Button.defaultProps = {
+  className: "btn-default",
+
+  type: "submit",
+
+  loading: false,
+  disabled: false,
+
+  onClick: null
+};
+
+},{"./loader":71,"react":"react"}],57:[function(require,module,exports){
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = require('react');
+
+var _react2 = _interopRequireDefault(_react);
+
+var _lastActivity = require('./last-activity');
+
+var _lastActivity2 = _interopRequireDefault(_lastActivity);
+
+var _readIcon = require('./read-icon');
+
+var _readIcon2 = _interopRequireDefault(_readIcon);
+
+var _stats = require('./stats');
+
+var _stats2 = _interopRequireDefault(_stats);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
+// jshint ignore:line
+
+// jshint ignore:line
+
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
+
+  function _class() {
+    _classCallCheck(this, _class);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+  }
+
+  _createClass(_class, [{
+    key: 'getClassName',
+    value: function getClassName() {
+      if (this.props.category.css_class) {
+        return 'panel panel-default panel-category panel-category-' + this.props.category.css_class;
+      } else {
+        return 'panel panel-default panel-category';
+      }
+    }
+  }, {
+    key: 'getHeadingClassName',
+    value: function getHeadingClassName() {
+      if (this.props.category.subcategories.length) {
+        return 'panel-heading';
+      } else {
+        return 'panel-heading heading-alone';
+      }
+    }
+  }, {
+    key: 'getCategoryDescription',
+    value: function getCategoryDescription() {
+      if (this.props.category.description) {
+        /* jshint ignore:start */
+        return _react2.default.createElement('div', { className: 'panel-body category-description',
+          dangerouslySetInnerHTML: {
+            __html: this.props.category.description.html
+          } });
+        /* jshint ignore:end */
+      } else {
+          return null;
+        }
+    }
+  }, {
+    key: 'getSubcategoryClass',
+    value: function getSubcategoryClass(category) {
+      if (category.css_class) {
+        return 'list-group-item category-subcategory subcategory-' + category.css_class;
+      } else {
+        return 'list-group-item category-subcategory';
+      }
+    }
+  }, {
+    key: 'getSubcategoryDescription',
+    value: function getSubcategoryDescription(category) {
+      if (category.description) {
+        /* jshint ignore:start */
+        return _react2.default.createElement('div', { className: 'subcategory-description',
+          dangerouslySetInnerHTML: {
+            __html: category.description.html
+          } });
+        /* jshint ignore:end */
+      } else {
+          return null;
+        }
+    }
+  }, {
+    key: 'getSubcategorySubcategoryClass',
+    value: function getSubcategorySubcategoryClass(category) {
+      if (category.css_class) {
+        return 'subcategory subcategory-' + category.css_class;
+      } else {
+        return 'subcategory';
+      }
+    }
+  }, {
+    key: 'getSubcategorySubcategories',
+    value: function getSubcategorySubcategories(category) {
+      var _this2 = this;
+
+      if (category.subcategories) {
+        /* jshint ignore:start */
+        return _react2.default.createElement(
+          'ul',
+          { className: 'list-inline subcategory-subcategories' },
+          category.subcategories.map(function (category) {
+            return _react2.default.createElement(
+              'li',
+              { key: category.id },
+              _react2.default.createElement(
+                'a',
+                { href: category.absolute_url,
+                  className: _this2.getSubcategorySubcategoryClass(category) },
+                category.name
+              )
+            );
+          })
+        );
+        /* jshint ignore:end */
+      } else {
+          return null;
+        }
+    }
+  }, {
+    key: 'getSubcategories',
+    value: function getSubcategories() {
+      var _this3 = this;
+
+      if (this.props.category.subcategories) {
+        /* jshint ignore:start */
+        return _react2.default.createElement(
+          'ul',
+          { className: 'list-group category-subcategories' },
+          this.props.category.subcategories.map(function (category) {
+            return _react2.default.createElement(
+              'li',
+              { className: 'list-group-item category-subcategory',
+                key: category.id },
+              _react2.default.createElement(
+                'div',
+                { className: 'title-row' },
+                _react2.default.createElement(
+                  'h4',
+                  null,
+                  _react2.default.createElement(_readIcon2.default, { category: category }),
+                  _react2.default.createElement(
+                    'a',
+                    { href: category.absolute_url, className: 'item-title' },
+                    category.name
+                  )
+                ),
+                _react2.default.createElement(_stats2.default, { category: category })
+              ),
+              _react2.default.createElement(_lastActivity2.default, { category: category }),
+              _this3.getSubcategoryDescription(category),
+              _this3.getSubcategorySubcategories(category)
+            );
+          })
+        );
+        /* jshint ignore:end */
+      } else {
+          return null;
+        }
+    }
+  }, {
+    key: 'render',
+    value: function render() {
+      /* jshint ignore:start */
+      return _react2.default.createElement(
+        'div',
+        { id: 'panel-category-' + this.props.category.id,
+          className: this.getClassName() },
+        _react2.default.createElement(
+          'div',
+          { className: this.getHeadingClassName() },
+          _react2.default.createElement(
+            'div',
+            { className: 'panel-heading-inblock' },
+            _react2.default.createElement(
+              'div',
+              { className: 'panel-heading-top-row' },
+              _react2.default.createElement(
+                'h3',
+                { className: 'panel-title' },
+                _react2.default.createElement(_readIcon2.default, { category: this.props.category }),
+                _react2.default.createElement(
+                  'a',
+                  { href: this.props.category.absolute_url, className: 'item-title' },
+                  this.props.category.name
+                )
+              ),
+              _react2.default.createElement(_stats2.default, { category: this.props.category })
+            ),
+            _react2.default.createElement(_lastActivity2.default, { category: this.props.category })
+          )
+        ),
+        this.getCategoryDescription(),
+        this.getSubcategories()
+      );
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return _class;
+}(_react2.default.Component);
+
+exports.default = _class;
+
+},{"./last-activity":59,"./read-icon":60,"./stats":62,"react":"react"}],58:[function(require,module,exports){
+"use strict";
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = require("react");
+
+var _react2 = _interopRequireDefault(_react);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
+
+  function _class() {
+    _classCallCheck(this, _class);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+  }
+
+  _createClass(_class, [{
+    key: "render",
+    value: function render() {
+      /* jshint ignore:start */
+      return _react2.default.createElement(
+        "div",
+        { className: "message-panel" },
+        _react2.default.createElement(
+          "div",
+          { className: "message-icon" },
+          _react2.default.createElement(
+            "span",
+            { className: "material-icon" },
+            "info_outline"
+          )
+        ),
+        _react2.default.createElement(
+          "div",
+          { className: "message-body" },
+          _react2.default.createElement(
+            "p",
+            { className: "lead" },
+            gettext("No categories are available.")
+          ),
+          _react2.default.createElement(
+            "p",
+            null,
+            gettext("No categories are currently defined or you don't have permission to see them.")
+          )
+        )
+      );
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return _class;
+}(_react2.default.Component);
+
+exports.default = _class;
+
+},{"react":"react"}],59:[function(require,module,exports){
+"use strict";
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _react = require("react");
+
+var _react2 = _interopRequireDefault(_react);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
+
+  function _class() {
+    _classCallCheck(this, _class);
+
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+  }
+
+  _createClass(_class, [{
+    key: "getLastPoster",
+    value: function getLastPoster() {
+      if (this.props.category.last_poster_url) {
+        /* jshint ignore:start */
+        return _react2.default.createElement(
+          "a",
+          { href: this.props.category.last_poster_url,
+            className: "item-title" },
+          this.props.category.last_poster_name
+        );
+        /* jshint ignore:end */
+      } else {
+          /* jshint ignore:start */
+          return _react2.default.createElement(
+            "span",
+            { className: "item-title" },
+            this.props.category.last_poster_name
+          );
+          /* jshint ignore:end */
+        }
+    }
+  }, {
+    key: "getThreadDetails",
+    value: function getThreadDetails() {
+      /* jshint ignore:start */
+      return [_react2.default.createElement(
+        "li",
+        { className: "thread-title", key: "title" },
+        _react2.default.createElement(
+          "a",
+          { href: this.props.category.last_thread_url, className: "item-title" },
+          this.props.category.last_thread_title
+        )
+      ), _react2.default.createElement(
+        "li",
+        { className: "poster-name", key: "poster" },
+        this.getLastPoster()
+      ), _react2.default.createElement(
+        "li",
+        { className: "thread-date", key: "date" },
+        _react2.default.createElement(
+          "abbr",
+          { title: this.props.category.last_post_on.format('LL, LT') },
+          this.props.category.last_post_on.fromNow()
+        )
+      )];
+      /* jshint ignore:end */
+    }
+  }, {
+    key: "getLastActivity",
+    value: function getLastActivity() {
+      if (this.props.category.acl.can_browse) {
+        if (!this.props.category.acl.can_see_all_threads) {
+          /* jshint ignore:start */
+          return _react2.default.createElement(
+            "li",
+            { className: "thread-message" },
+            _react2.default.createElement(
+              "span",
+              { className: "material-icon" },
+              "info_outline"
+            ),
+            gettext("This category is private. You can see only your own threads within it.")
+          );
+          /* jshint ignore:end */
+        } else if (this.props.category.last_thread_title) {
+            return this.getThreadDetails();
+          } else {
+            /* jshint ignore:start */
+            return _react2.default.createElement(
+              "li",
+              { className: "thread-message" },
+              _react2.default.createElement(
+                "span",
+                { className: "material-icon" },
+                "error_outline"
+              ),
+              gettext("This category is empty.")
+            );
+            /* jshint ignore:end */
+          }
+      } else {
+          /* jshint ignore:start */
+          return _react2.default.createElement(
+            "li",
+            { className: "thread-message" },
+            _react2.default.createElement(
+              "span",
+              { className: "material-icon" },
+              "highlight_off"
+            ),
+            gettext("This category is protected. You can't browse it's contents.")
+          );
+          /* jshint ignore:end */
+        }
+    }
+  }, {
+    key: "render",
+    value: function render() {
+      /* jshint ignore:start */
+      return _react2.default.createElement(
+        "ul",
+        { className: "list-inline category-last-activity" },
+        this.getLastActivity()
+      );
+      /* jshint ignore:end */
+    }
+  }]);
+
+  return _class;
+}(_react2.default.Component);
+
+exports.default = _class;
+
+},{"react":"react"}],60:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -2470,8 +3206,6 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
 
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 
-var BASE_URL = $('base').attr('href') + 'user-avatar/';
-
 var _class = function (_React$Component) {
   _inherits(_class, _React$Component);
 
@@ -2482,28 +3216,57 @@ var _class = function (_React$Component) {
   }
 
   _createClass(_class, [{
-    key: 'getSrc',
-    value: function getSrc() {
-      var size = this.props.size || 100; // jshint ignore:line
-      var url = BASE_URL;
-
-      if (this.props.user && this.props.user.id) {
-        // just avatar hash, size and user id
-        url += this.props.user.avatar_hash + '/' + size + '/' + this.props.user.id + '.png';
+    key: 'getClassName',
+    value: function getClassName() {
+      if (this.props.category.is_read) {
+        return 'material-icon read-status item-read';
       } else {
-        // just append avatar size to file to produce no-avatar placeholder
-        url += size + '.png';
+        return 'material-icon read-status item-new';
+      }
+    }
+  }, {
+    key: 'getTitle',
+    value: function getTitle() {
+      if (this.props.category.is_closed) {
+        if (this.props.category.is_read) {
+          return gettext("This category has no new posts. (closed)");
+        } else {
+          return gettext("This category has new posts. (closed)");
+        }
+      } else {
+        if (this.props.category.is_read) {
+          return gettext("This category has no new posts.");
+        } else {
+          return gettext("This category has new posts.");
+        }
+      }
+    }
+  }, {
+    key: 'getIcon',
+    value: function getIcon() {
+      if (this.props.category.is_closed) {
+        if (this.props.category.is_read) {
+          return 'lock_outline';
+        } else {
+          return 'lock';
+        }
+      } else {
+        if (this.props.category.is_read) {
+          return 'chat_bubble_outline';
+        } else {
+          return 'chat_bubble';
+        }
       }
-
-      return url;
     }
   }, {
     key: 'render',
     value: function render() {
       /* jshint ignore:start */
-      return _react2.default.createElement('img', { src: this.getSrc(),
-        className: this.props.className || 'user-avatar',
-        title: gettext("User avatar") });
+      return _react2.default.createElement(
+        'span',
+        { className: this.getClassName(), title: this.getTitle() },
+        this.getIcon()
+      );
       /* jshint ignore:end */
     }
   }]);
@@ -2513,7 +3276,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],54:[function(require,module,exports){
+},{"react":"react"}],61:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -2521,6 +3284,7 @@ var _createClass = function () { function defineProperties(target, props) { for
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.select = select;
 
 var _moment = require('moment');
 
@@ -2530,100 +3294,142 @@ var _react = require('react');
 
 var _react2 = _interopRequireDefault(_react);
 
+var _category = require('./category');
+
+var _category2 = _interopRequireDefault(_category);
+
+var _emptyMessage = require('./empty-message');
+
+var _emptyMessage2 = _interopRequireDefault(_emptyMessage);
+
+var _index = require('../../index');
+
+var _index2 = _interopRequireDefault(_index);
+
+var _polls = require('../../services/polls');
+
+var _polls2 = _interopRequireDefault(_polls);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
 
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
+// jshint ignore:line
+
+var dehydrate = function dehydrate(category) {
+  category.subcategories = category.subcategories.map(dehydrate);
+
+  if (category.last_post_on) {
+    return Object.assign(category, {
+      last_post_on: (0, _moment2.default)(category.last_post_on)
+    });
+  } else {
+    return category;
+  }
+};
 
 var _class = function (_React$Component) {
   _inherits(_class, _React$Component);
 
-  function _class() {
+  function _class(props) {
     _classCallCheck(this, _class);
 
-    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
+    var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
+
+    _this.update = function (data) {
+      _this.setState({
+        categories: data.map(dehydrate)
+      });
+    };
+
+    _this.state = {
+      categories: _index2.default.get('CATEGORIES').map(dehydrate)
+    };
+
+    _this.startPolling(_index2.default.get('CATEGORIES_API'));
+    return _this;
   }
 
   _createClass(_class, [{
-    key: 'getReasonMessage',
-    value: function getReasonMessage() {
-      /* jshint ignore:start */
-      if (this.props.message.html) {
-        return _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
-            __html: this.props.message.html
-          } });
-      } else {
-        return _react2.default.createElement(
-          'p',
-          { className: 'lead' },
-          this.props.message.plain
-        );
-      }
-      /* jshint ignore:end */
+    key: 'startPolling',
+    value: function startPolling(api) {
+      _polls2.default.start({
+        poll: 'categories',
+        url: api,
+        frequency: 180 * 1000,
+        update: this.update
+      });
     }
+
+    /* jshint ignore:start */
+
   }, {
-    key: 'getExpirationMessage',
-    value: function getExpirationMessage() {
-      if (this.props.expires) {
-        if (this.props.expires.isAfter((0, _moment2.default)())) {
-          /* jshint ignore:start */
-          var title = interpolate(gettext("This ban expires on %(expires_on)s."), {
-            'expires_on': this.props.expires.format('LL, LT')
-          }, true);
+    key: 'getClassName',
 
-          var message = interpolate(gettext("This ban expires %(expires_on)s."), {
-            'expires_on': this.props.expires.fromNow()
-          }, true);
+    /* jshint ignore:end */
 
-          return _react2.default.createElement(
-            'abbr',
-            { title: title },
-            message
-          );
-          /* jshint ignore:end */
-        } else {
-            return gettext("This ban has expired.");
-          }
+    value: function getClassName() {
+      if (this.state.categories.length) {
+        return 'page page-categories';
       } else {
-        return gettext("This ban is permanent.");
+        return 'page page-categories page-message';
+      }
+    }
+  }, {
+    key: 'getHeading',
+    value: function getHeading() {
+      if (_index2.default.get('CATEGORIES_ON_INDEX')) {
+        return _index2.default.get('SETTINGS').forum_name;
+      } else {
+        return gettext("Categories");
       }
     }
   }, {
+    key: 'getCategoriesList',
+    value: function getCategoriesList() {
+      if (this.state.categories.length) {
+        /* jshint ignore:start */
+        return _react2.default.createElement(
+          'div',
+          { className: 'categories-list' },
+          this.state.categories.map(function (category) {
+            return _react2.default.createElement(_category2.default, { category: category, key: category.id });
+          })
+        );
+        /* jshint ignore:end */
+      } else {
+          /* jshint ignore:start */
+          return _react2.default.createElement(_emptyMessage2.default, null);
+          /* jshint ignore:end */
+        }
+    }
+  }, {
     key: 'render',
     value: function render() {
       /* jshint ignore:start */
       return _react2.default.createElement(
         'div',
-        { className: 'page page-error page-error-banned' },
+        { className: this.getClassName() },
         _react2.default.createElement(
           'div',
-          { className: 'container' },
+          { className: 'page-header' },
           _react2.default.createElement(
             'div',
-            { className: 'message-panel' },
-            _react2.default.createElement(
-              'div',
-              { className: 'message-icon' },
-              _react2.default.createElement(
-                'span',
-                { className: 'material-icon' },
-                'highlight_off'
-              )
-            ),
+            { className: 'container' },
             _react2.default.createElement(
-              'div',
-              { className: 'message-body' },
-              this.getReasonMessage(),
-              _react2.default.createElement(
-                'p',
-                { className: 'message-footnote' },
-                this.getExpirationMessage()
-              )
+              'h1',
+              null,
+              this.getHeading()
             )
           )
+        ),
+        _react2.default.createElement(
+          'div',
+          { className: 'container' },
+          this.getCategoriesList()
         )
       );
       /* jshint ignore:end */
@@ -2634,9 +3440,14 @@ var _class = function (_React$Component) {
 }(_react2.default.Component);
 
 exports.default = _class;
+function select(store) {
+  return {
+    'tick': store.tick.tick
+  };
+}
 
-},{"moment":"moment","react":"react"}],55:[function(require,module,exports){
-'use strict';
+},{"../../index":128,"../../services/polls":143,"./category":57,"./empty-message":58,"moment":"moment","react":"react"}],62:[function(require,module,exports){
+"use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
@@ -2644,14 +3455,10 @@ Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _react = require('react');
+var _react = require("react");
 
 var _react2 = _interopRequireDefault(_react);
 
-var _loader = require('./loader');
-
-var _loader2 = _interopRequireDefault(_loader);
-
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -2660,59 +3467,61 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
 
 function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
 
-// jshint ignore:line
-
-var Button = function (_React$Component) {
-  _inherits(Button, _React$Component);
+var _class = function (_React$Component) {
+  _inherits(_class, _React$Component);
 
-  function Button() {
-    _classCallCheck(this, Button);
+  function _class() {
+    _classCallCheck(this, _class);
 
-    return _possibleConstructorReturn(this, Object.getPrototypeOf(Button).apply(this, arguments));
+    return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
   }
 
-  _createClass(Button, [{
-    key: 'render',
-    value: function render() {
-      var className = 'btn ' + this.props.className;
-      var disabled = this.props.disabled;
+  _createClass(_class, [{
+    key: "getThreadsCount",
+    value: function getThreadsCount() {
+      var string = ngettext("%(threads)s thread", "%(threads)s threads", this.props.category.threads);
 
-      if (this.props.loading) {
-        className += ' btn-loading';
-        disabled = true;
-      }
+      return interpolate(string, {
+        'threads': this.props.category.threads
+      }, true);
+    }
+  }, {
+    key: "getPostsCount",
+    value: function getPostsCount() {
+      var string = ngettext("%(posts)s post", "%(posts)s posts", this.props.category.posts);
 
+      return interpolate(string, {
+        'posts': this.props.category.posts
+      }, true);
+    }
+  }, {
+    key: "render",
+    value: function render() {
       /* jshint ignore:start */
       return _react2.default.createElement(
-        'button',
-        { type: this.props.onClick ? 'button' : 'submit',
-          className: className,
-          disabled: disabled,
-          onClick: this.props.onClick },
-        this.props.children,
-        this.props.loading ? _react2.default.createElement(_loader2.default, null) : null
+        "ul",
+        { className: "list-inline category-stats" },
+        _react2.default.createElement(
+          "li",
+          { className: "category-threads" },
+          this.getThreadsCount()
+        ),
+        _react2.default.createElement(
+          "li",
+          { className: "category-posts" },
+          this.getPostsCount()
+        )
       );
       /* jshint ignore:end */
     }
   }]);
 
-  return Button;
+  return _class;
 }(_react2.default.Component);
 
-exports.default = Button;
-
-Button.defaultProps = {
-  className: "btn-default",
-
-  type: "submit",
-
-  loading: false,
-  disabled: false,
-
-  onClick: null
-};
+exports.default = _class;
 
-},{"./loader":64,"react":"react"}],56:[function(require,module,exports){
+},{"react":"react"}],63:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -2942,7 +3751,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,"react":"react"}],57:[function(require,module,exports){
+},{"../../services/ajax":135,"../../services/snackbar":144,"../avatar":54,"../button":56,"react":"react"}],64:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -3212,7 +4021,7 @@ var _class = function (_React$Component3) {
 
 exports.default = _class;
 
-},{"../../index":121,"../../services/ajax":128,"../../services/snackbar":137,"../../utils/batch":141,"../button":55,"react":"react"}],58:[function(require,module,exports){
+},{"../../index":128,"../../services/ajax":135,"../../services/snackbar":144,"../../utils/batch":148,"../button":56,"react":"react"}],65:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -3454,7 +4263,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,"../loader":64,"react":"react"}],59:[function(require,module,exports){
+},{"../../services/ajax":135,"../../services/snackbar":144,"../avatar":54,"../button":56,"../loader":71,"react":"react"}],66:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -3716,7 +4525,7 @@ function select(state) {
   };
 }
 
-},{"../../reducers/users":127,"../../services/ajax":128,"../../services/store":138,"../modal-loader":65,"./crop":56,"./gallery":57,"./index":58,"./upload":60,"react":"react"}],60:[function(require,module,exports){
+},{"../../reducers/users":134,"../../services/ajax":135,"../../services/store":145,"../modal-loader":72,"./crop":63,"./gallery":64,"./index":65,"./upload":67,"react":"react"}],67:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -3990,7 +4799,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../services/ajax":128,"../../services/snackbar":137,"../../utils/file-size":142,"../button":55,"./crop":56,"react":"react"}],61:[function(require,module,exports){
+},{"../../services/ajax":135,"../../services/snackbar":144,"../../utils/file-size":149,"../button":56,"./crop":63,"react":"react"}],68:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4141,7 +4950,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],62:[function(require,module,exports){
+},{"react":"react"}],69:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4354,7 +5163,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../services/snackbar":137,"../utils/validators":148,"react":"react"}],63:[function(require,module,exports){
+},{"../services/snackbar":144,"../utils/validators":155,"react":"react"}],70:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4420,7 +5229,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],64:[function(require,module,exports){
+},{"react":"react"}],71:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4468,7 +5277,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],65:[function(require,module,exports){
+},{"react":"react"}],72:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4522,7 +5331,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"./loader":64,"react":"react"}],66:[function(require,module,exports){
+},{"./loader":71,"react":"react"}],73:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4607,7 +5416,7 @@ var _class = function (_PanelMessage) {
 
 exports.default = _class;
 
-},{"./panel-message":78,"react":"react"}],67:[function(require,module,exports){
+},{"./panel-message":85,"react":"react"}],74:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4670,7 +5479,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../panel-loader":77,"react":"react"}],68:[function(require,module,exports){
+},{"../../panel-loader":84,"react":"react"}],75:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4743,7 +5552,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../panel-message":78,"react":"react"}],69:[function(require,module,exports){
+},{"../../panel-message":85,"react":"react"}],76:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -4935,7 +5744,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],70:[function(require,module,exports){
+},{"../../../services/ajax":135,"../../../services/snackbar":144,"../../../utils/validators":155,"../../button":56,"../../form":69,"../../form-group":68,"react":"react"}],77:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -5103,7 +5912,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/page-title":135,"../../../services/snackbar":137,"../../../services/store":138,"../../username-history":105,"./form":69,"./form-loading":67,"./form-locked":68,"moment":"moment","react":"react"}],71:[function(require,module,exports){
+},{"../../../index":128,"../../../reducers/username-history":133,"../../../reducers/users":134,"../../../services/ajax":135,"../../../services/page-title":142,"../../../services/snackbar":144,"../../../services/store":145,"../../username-history":112,"./form":76,"./form-loading":74,"./form-locked":75,"moment":"moment","react":"react"}],78:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -5370,7 +6179,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../reducers/auth":122,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../form":62,"../form-group":61,"../select":98,"../yes-no-switch":120,"react":"react"}],72:[function(require,module,exports){
+},{"../../reducers/auth":129,"../../services/ajax":135,"../../services/page-title":142,"../../services/snackbar":144,"../../services/store":145,"../button":56,"../form":69,"../form-group":68,"../select":105,"../yes-no-switch":127,"react":"react"}],79:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -5490,7 +6299,7 @@ var CompactNav = exports.CompactNav = function (_React$Component2) {
   return CompactNav;
 }(_react2.default.Component);
 
-},{"../../index":121,"../li":63,"react":"react","react-router":"react-router"}],73:[function(require,module,exports){
+},{"../../index":128,"../li":70,"react":"react","react-router":"react-router"}],80:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -5677,7 +6486,7 @@ function paths() {
   }];
 }
 
-},{"../../index":121,"./change-username/root":70,"./forum-options":71,"./navs":72,"./sign-in-credentials/root":76,"react":"react","react-redux":"react-redux"}],74:[function(require,module,exports){
+},{"../../index":128,"./change-username/root":77,"./forum-options":78,"./navs":79,"./sign-in-credentials/root":83,"react":"react","react-redux":"react-redux"}],81:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -5869,7 +6678,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],75:[function(require,module,exports){
+},{"../../../services/ajax":135,"../../../services/snackbar":144,"../../../utils/validators":155,"../../button":56,"../../form":69,"../../form-group":68,"react":"react"}],82:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6082,7 +6891,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],76:[function(require,module,exports){
+},{"../../../index":128,"../../../services/ajax":135,"../../../services/snackbar":144,"../../../utils/validators":155,"../../button":56,"../../form":69,"../../form-group":68,"react":"react"}],83:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6171,7 +6980,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../services/page-title":135,"./change-email":74,"./change-password":75,"react":"react"}],77:[function(require,module,exports){
+},{"../../../index":128,"../../../services/page-title":142,"./change-email":81,"./change-password":82,"react":"react"}],84:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6225,7 +7034,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"./loader":64,"react":"react"}],78:[function(require,module,exports){
+},{"./loader":71,"react":"react"}],85:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6306,7 +7115,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],79:[function(require,module,exports){
+},{"react":"react"}],86:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6423,7 +7232,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../services/zxcvbn":139,"react":"react"}],80:[function(require,module,exports){
+},{"../services/zxcvbn":146,"react":"react"}],87:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6706,7 +7515,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../avatar":53,"../user-status":104,"./follow-button":82,"./moderation/nav":88,"react":"react"}],81:[function(require,module,exports){
+},{"../avatar":54,"../user-status":111,"./follow-button":89,"./moderation/nav":95,"react":"react"}],88:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -6999,7 +7808,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../index":121,"../../services/page-title":135,"../../services/polls":136,"../panel-loader":77,"../panel-message":78,"moment":"moment","react":"react"}],82:[function(require,module,exports){
+},{"../../index":128,"../../services/page-title":142,"../../services/polls":143,"../panel-loader":84,"../panel-message":85,"moment":"moment","react":"react"}],89:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -7146,7 +7955,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../reducers/profile":123,"../../services/ajax":128,"../../services/snackbar":137,"../../services/store":138,"../button":55,"react":"react"}],83:[function(require,module,exports){
+},{"../../reducers/profile":130,"../../services/ajax":135,"../../services/snackbar":144,"../../services/store":145,"../button":56,"react":"react"}],90:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -7458,7 +8267,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../index":121,"../../reducers/users":127,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../users-list/root":106,"react":"react"}],84:[function(require,module,exports){
+},{"../../index":128,"../../reducers/users":134,"../../services/ajax":135,"../../services/page-title":142,"../../services/snackbar":144,"../../services/store":145,"../button":56,"../search":104,"../users-list/root":113,"react":"react"}],91:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -7545,7 +8354,7 @@ var _class = function (_Followers) {
 
 exports.default = _class;
 
-},{"./followers":83,"react":"react"}],85:[function(require,module,exports){
+},{"./followers":90,"react":"react"}],92:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -7808,7 +8617,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,"react":"react"}],86:[function(require,module,exports){
+},{"../../../reducers/users":134,"../../../services/ajax":135,"../../../services/snackbar":144,"../../../services/store":145,"../../button":56,"../../form":69,"../../form-group":68,"../../modal-loader":72,"../../modal-message":73,"../../yes-no-switch":127,"react":"react"}],93:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -8050,7 +8859,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"react":"react"}],87:[function(require,module,exports){
+},{"../../../index":128,"../../../reducers/username-history":133,"../../../reducers/users":134,"../../../services/ajax":135,"../../../services/snackbar":144,"../../../services/store":145,"../../../utils/validators":155,"../../button":56,"../../form":69,"../../form-group":68,"../../modal-loader":72,"../../modal-message":73,"react":"react"}],94:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -8365,7 +9174,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../services/ajax":128,"../../../services/polls":136,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,"react":"react"}],88:[function(require,module,exports){
+},{"../../../index":128,"../../../services/ajax":135,"../../../services/polls":143,"../../button":56,"../../form":69,"../../form-group":68,"../../modal-loader":72,"../../modal-message":73,"../../yes-no-switch":127,"react":"react"}],95:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -8569,7 +9378,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../services/modal":134,"./avatar-controls":85,"./change-username":86,"./delete-account":87,"react":"react","react-redux":"react-redux"}],89:[function(require,module,exports){
+},{"../../../services/modal":141,"./avatar-controls":92,"./change-username":93,"./delete-account":94,"react":"react","react-redux":"react-redux"}],96:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -8767,7 +9576,7 @@ var CompactNav = exports.CompactNav = function (_SideNav) {
   return CompactNav;
 }(SideNav);
 
-},{"../../index":121,"../li":63,"./follow-button":82,"react":"react","react-router":"react-router"}],90:[function(require,module,exports){
+},{"../../index":128,"../li":70,"./follow-button":89,"react":"react","react-router":"react-router"}],97:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -9076,7 +9885,7 @@ function paths() {
   return paths;
 }
 
-},{"../../index":121,"../../reducers/profile":123,"../../services/polls":136,"../../services/store":138,"../avatar":53,"./Header":80,"./ban-details":81,"./followers":83,"./follows":84,"./moderation/nav":88,"./navs":89,"./username-history":91,"react":"react","react-redux":"react-redux"}],91:[function(require,module,exports){
+},{"../../index":128,"../../reducers/profile":130,"../../services/polls":143,"../../services/store":145,"../avatar":54,"./Header":87,"./ban-details":88,"./followers":90,"./follows":91,"./moderation/nav":95,"./navs":96,"./username-history":98,"react":"react","react-redux":"react-redux"}],98:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -9353,7 +10162,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../index":121,"../../reducers/username-history":126,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../username-history":105,"react":"react"}],92:[function(require,module,exports){
+},{"../../index":128,"../../reducers/username-history":133,"../../services/ajax":135,"../../services/page-title":142,"../../services/snackbar":144,"../../services/store":145,"../button":56,"../search":104,"../username-history":112,"react":"react"}],99:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -9473,7 +10282,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../services/zxcvbn":139,"./loader":64,"./register.js":93,"react":"react"}],93:[function(require,module,exports){
+},{"../services/captcha":137,"../services/modal":141,"../services/snackbar":144,"../services/zxcvbn":146,"./loader":71,"./register.js":100,"react":"react"}],100:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -9876,7 +10685,7 @@ var _class = function (_React$Component2) {
 
 exports.default = _class;
 
-},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./form-group":61,"./password-strength":79,"react":"react"}],94:[function(require,module,exports){
+},{"../index":128,"../services/ajax":135,"../services/auth":136,"../services/captcha":137,"../services/modal":141,"../services/snackbar":144,"../utils/banned-page":147,"../utils/validators":155,"./button":56,"./form":69,"./form-group":68,"./password-strength":86,"react":"react"}],101:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -10128,7 +10937,7 @@ var _class = function (_React$Component2) {
 
 exports.default = _class;
 
-},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"react":"react"}],95:[function(require,module,exports){
+},{"../index":128,"../services/ajax":135,"../services/snackbar":144,"../utils/banned-page":147,"../utils/validators":155,"./button":56,"./form":69,"react":"react"}],102:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -10466,7 +11275,7 @@ var _class = function (_React$Component3) {
 
 exports.default = _class;
 
-},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"react":"react","react-dom":"react-dom"}],96:[function(require,module,exports){
+},{"../index":128,"../services/ajax":135,"../services/snackbar":144,"../utils/banned-page":147,"../utils/validators":155,"./button":56,"./form":69,"react":"react","react-dom":"react-dom"}],103:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -10749,7 +11558,7 @@ var _class = function (_React$Component2) {
 
 exports.default = _class;
 
-},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./sign-in.js":99,"react":"react","react-dom":"react-dom"}],97:[function(require,module,exports){
+},{"../index":128,"../services/ajax":135,"../services/auth":136,"../services/modal":141,"../services/snackbar":144,"../utils/banned-page":147,"../utils/validators":155,"./button":56,"./form":69,"./sign-in.js":106,"react":"react","react-dom":"react-dom"}],104:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -10815,7 +11624,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],98:[function(require,module,exports){
+},{"react":"react"}],105:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -10947,7 +11756,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],99:[function(require,module,exports){
+},{"react":"react"}],106:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11192,7 +12001,7 @@ var _class = function (_Form) {
 
 exports.default = _class;
 
-},{"../index":121,"../services/ajax":128,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"./button":55,"./form":62,"react":"react"}],100:[function(require,module,exports){
+},{"../index":128,"../services/ajax":135,"../services/modal":141,"../services/snackbar":144,"../utils/banned-page":147,"./button":56,"./form":69,"react":"react"}],107:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11268,7 +12077,7 @@ function select(state) {
   return state.snackbar;
 }
 
-},{"react":"react"}],101:[function(require,module,exports){
+},{"react":"react"}],108:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11443,7 +12252,7 @@ var CompactGuestNav = exports.CompactGuestNav = function (_React$Component2) {
   return CompactGuestNav;
 }(_react2.default.Component);
 
-},{"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../register-button":92,"../sign-in.js":99,"react":"react"}],102:[function(require,module,exports){
+},{"../../services/mobile-navbar-dropdown":140,"../../services/modal":141,"../avatar":54,"../register-button":99,"../sign-in.js":106,"react":"react"}],109:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11526,7 +12335,7 @@ function select(state) {
   return state.auth;
 }
 
-},{"./guest-nav":101,"./user-nav":103,"react":"react"}],103:[function(require,module,exports){
+},{"./guest-nav":108,"./user-nav":110,"react":"react"}],110:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11744,7 +12553,7 @@ var CompactUserNav = exports.CompactUserNav = function (_React$Component3) {
   return CompactUserNav;
 }(_react2.default.Component);
 
-},{"../../index":121,"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../change-avatar/root":59,"react":"react","react-redux":"react-redux"}],104:[function(require,module,exports){
+},{"../../index":128,"../../services/mobile-navbar-dropdown":140,"../../services/modal":141,"../avatar":54,"../change-avatar/root":66,"react":"react","react-redux":"react-redux"}],111:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -11936,7 +12745,7 @@ var StatusLabel = exports.StatusLabel = function (_React$Component3) {
   return StatusLabel;
 }(_react2.default.Component);
 
-},{"react":"react"}],105:[function(require,module,exports){
+},{"react":"react"}],112:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -12186,7 +12995,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../utils/random":145,"./avatar":53,"react":"react"}],106:[function(require,module,exports){
+},{"../utils/random":152,"./avatar":54,"react":"react"}],113:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -12318,7 +13127,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../utils/batch":141,"./user-card":107,"./user-preview":108,"react":"react"}],107:[function(require,module,exports){
+},{"../../utils/batch":148,"./user-card":114,"./user-preview":115,"react":"react"}],114:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -12571,7 +13380,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../avatar":53,"../user-status":104,"react":"react"}],108:[function(require,module,exports){
+},{"../avatar":54,"../user-status":111,"react":"react"}],115:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -12761,7 +13570,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../utils/random":145,"../avatar":53,"react":"react"}],109:[function(require,module,exports){
+},{"../../utils/random":152,"../avatar":54,"react":"react"}],116:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -12822,7 +13631,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],110:[function(require,module,exports){
+},{"react":"react"}],117:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13035,7 +13844,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../avatar":53,"../../user-status":104,"react":"react","react-router":"react-router"}],111:[function(require,module,exports){
+},{"../../../index":128,"../../avatar":54,"../../user-status":111,"react":"react","react-router":"react-router"}],118:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13235,7 +14044,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../utils/random":145,"../../avatar":53,"react":"react"}],112:[function(require,module,exports){
+},{"../../../utils/random":152,"../../avatar":54,"react":"react"}],119:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13321,7 +14130,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"./list-item":110,"react":"react"}],113:[function(require,module,exports){
+},{"./list-item":117,"react":"react"}],120:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13482,7 +14291,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":112,"./list-empty":109,"./list-loading":111,"react":"react"}],114:[function(require,module,exports){
+},{"../../../index":128,"../../../reducers/users":134,"../../../services/page-title":142,"../../../services/polls":143,"../../../services/store":145,"./list":119,"./list-empty":116,"./list-loading":118,"react":"react"}],121:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13595,7 +14404,7 @@ var CompactNav = exports.CompactNav = function (_React$Component2) {
   return CompactNav;
 }(_react2.default.Component);
 
-},{"../../index":121,"../li":63,"react":"react","react-router":"react-router"}],115:[function(require,module,exports){
+},{"../../index":128,"../li":70,"react":"react","react-router":"react-router"}],122:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13649,7 +14458,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../users-list/root":106,"react":"react"}],116:[function(require,module,exports){
+},{"../../users-list/root":113,"react":"react"}],123:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13722,7 +14531,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../users-list/root":106,"./pager":117,"react":"react"}],117:[function(require,module,exports){
+},{"../../users-list/root":113,"./pager":124,"react":"react"}],124:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -13870,7 +14679,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../utils/reset-scroll":146,"react":"react","react-router":"react-router"}],118:[function(require,module,exports){
+},{"../../../utils/reset-scroll":153,"react":"react","react-router":"react-router"}],125:[function(require,module,exports){
 'use strict';
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
@@ -14087,7 +14896,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":116,"./list-loading":115,"react":"react"}],119:[function(require,module,exports){
+},{"../../../index":128,"../../../reducers/users":134,"../../../services/page-title":142,"../../../services/polls":143,"../../../services/store":145,"./list":123,"./list-loading":122,"react":"react"}],126:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -14279,7 +15088,7 @@ function paths() {
   return paths;
 }
 
-},{"../../index":121,"./active-posters/root":113,"./navs":114,"./rank/root":118,"react":"react","react-redux":"react-redux"}],120:[function(require,module,exports){
+},{"../../index":128,"./active-posters/root":120,"./navs":121,"./rank/root":125,"react":"react","react-redux":"react-redux"}],127:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -14384,7 +15193,7 @@ var _class = function (_React$Component) {
 
 exports.default = _class;
 
-},{"react":"react"}],121:[function(require,module,exports){
+},{"react":"react"}],128:[function(require,module,exports){
 (function (global){
 'use strict';
 
@@ -14480,7 +15289,7 @@ exports.default = misago;
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{"./utils/ordered-list":144}],122:[function(require,module,exports){
+},{"./utils/ordered-list":151}],129:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14574,7 +15383,7 @@ function auth() {
   }
 }
 
-},{"./users":127}],123:[function(require,module,exports){
+},{"./users":134}],130:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14646,7 +15455,7 @@ function auth() {
   }
 }
 
-},{"./users":127,"moment":"moment"}],124:[function(require,module,exports){
+},{"./users":134,"moment":"moment"}],131:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14697,7 +15506,7 @@ function snackbar() {
   }
 }
 
-},{}],125:[function(require,module,exports){
+},{}],132:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14730,7 +15539,7 @@ function tick() {
   }
 }
 
-},{}],126:[function(require,module,exports){
+},{}],133:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14838,7 +15647,7 @@ function username() {
   }
 }
 
-},{"./users":127,"moment":"moment"}],127:[function(require,module,exports){
+},{"./users":134,"moment":"moment"}],134:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -14941,7 +15750,7 @@ function user() {
   }
 }
 
-},{"moment":"moment"}],128:[function(require,module,exports){
+},{"moment":"moment"}],135:[function(require,module,exports){
 'use strict';
 
 var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
@@ -15217,7 +16026,7 @@ var Ajax = exports.Ajax = function () {
 
 exports.default = new Ajax();
 
-},{}],129:[function(require,module,exports){
+},{}],136:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15317,7 +16126,7 @@ var Auth = exports.Auth = function () {
 
 exports.default = new Auth();
 
-},{"../reducers/auth":122}],130:[function(require,module,exports){
+},{"../reducers/auth":129}],137:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* global grecaptcha */
@@ -15595,7 +16404,7 @@ var Captcha = exports.Captcha = function () {
 
 exports.default = new Captcha();
 
-},{"../components/form-group":61,"react":"react"}],131:[function(require,module,exports){
+},{"../components/form-group":68,"react":"react"}],138:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15643,7 +16452,7 @@ var Include = exports.Include = function () {
 
 exports.default = new Include();
 
-},{}],132:[function(require,module,exports){
+},{}],139:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15708,7 +16517,7 @@ var LocalStorage = exports.LocalStorage = function () {
 
 exports.default = new LocalStorage();
 
-},{}],133:[function(require,module,exports){
+},{}],140:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15772,7 +16581,7 @@ var MobileNavbarDropdown = exports.MobileNavbarDropdown = function () {
 
 exports.default = new MobileNavbarDropdown();
 
-},{"../utils/mount-component":143}],134:[function(require,module,exports){
+},{"../utils/mount-component":150}],141:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15830,7 +16639,7 @@ var Modal = exports.Modal = function () {
 
 exports.default = new Modal();
 
-},{"../utils/mount-component":143,"react-dom":"react-dom"}],135:[function(require,module,exports){
+},{"../utils/mount-component":150,"react-dom":"react-dom"}],142:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15881,7 +16690,7 @@ var PageTitle = exports.PageTitle = function () {
 
 exports.default = new PageTitle();
 
-},{}],136:[function(require,module,exports){
+},{}],143:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -15942,7 +16751,7 @@ var Polls = exports.Polls = function () {
 
 exports.default = new Polls();
 
-},{}],137:[function(require,module,exports){
+},{}],144:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -16043,7 +16852,7 @@ var Snackbar = exports.Snackbar = function () {
 
 exports.default = new Snackbar();
 
-},{"../reducers/snackbar":124}],138:[function(require,module,exports){
+},{"../reducers/snackbar":131}],145:[function(require,module,exports){
 'use strict';
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -16102,7 +16911,7 @@ var StoreWrapper = exports.StoreWrapper = function () {
 
 exports.default = new StoreWrapper();
 
-},{"redux":"redux"}],139:[function(require,module,exports){
+},{"redux":"redux"}],146:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -16172,7 +16981,7 @@ var Zxcvbn = exports.Zxcvbn = function () {
 
 exports.default = new Zxcvbn();
 
-},{}],140:[function(require,module,exports){
+},{}],147:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -16239,7 +17048,7 @@ var select = function select(state) {
 var RedrawedBannedPage = (0, _reactRedux.connect)(select)(_bannedPage2.default);
 /* jshint ignore:end */
 
-},{"../components/banned-page":54,"../index":121,"../services/store":138,"moment":"moment","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],141:[function(require,module,exports){
+},{"../components/banned-page":55,"../index":128,"../services/store":145,"moment":"moment","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],148:[function(require,module,exports){
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
@@ -16274,7 +17083,7 @@ exports.default = function (list, rowWidth) {
   return rows;
 };
 
-},{}],142:[function(require,module,exports){
+},{}],149:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -16293,7 +17102,7 @@ exports.default = function (bytes) {
   }
 };
 
-},{}],143:[function(require,module,exports){
+},{}],150:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -16344,7 +17153,7 @@ var _store2 = _interopRequireDefault(_store);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-},{"../services/store":138,"react":"react","react-dom":"react-dom","react-redux":"react-redux"}],144:[function(require,module,exports){
+},{"../services/store":145,"react":"react","react-dom":"react-dom","react-redux":"react-redux"}],151:[function(require,module,exports){
 "use strict";
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@@ -16486,7 +17295,7 @@ var OrderedList = function () {
 
 exports.default = OrderedList;
 
-},{}],145:[function(require,module,exports){
+},{}],152:[function(require,module,exports){
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
@@ -16507,7 +17316,7 @@ function range(min, max) {
   return array;
 }
 
-},{}],146:[function(require,module,exports){
+},{}],153:[function(require,module,exports){
 "use strict";
 
 Object.defineProperty(exports, "__esModule", {
@@ -16518,7 +17327,7 @@ exports.default = function () {
   window.scrollTo(0, 0);
 };
 
-},{}],147:[function(require,module,exports){
+},{}],154:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -16572,7 +17381,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
 var rootElement = document.getElementById('page-mount');
 var history = new _createBrowserHistory2.default();
 
-},{"../services/store":138,"history/lib/createBrowserHistory":42,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],148:[function(require,module,exports){
+},{"../services/store":145,"history/lib/createBrowserHistory":43,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],155:[function(require,module,exports){
 'use strict';
 
 Object.defineProperty(exports, "__esModule", {
@@ -16672,5 +17481,5 @@ function passwordMinLength(settings) {
   return this.minLength(settings.password_length_min, message);
 }
 
-},{}]},{},[2,3,4,5,16,17,18,19,20,21,22,30,31,32,33,6,7,8,9,10,11,12,13,14,15,23,24,25,26,27,28,29])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2luaXRpYWxpemVycy9hamF4LmpzIiwic3JjL2luaXRpYWxpemVycy9hdXRoLmpzIiwic3JjL2luaXRpYWxpemVycy9jYXRjaGEuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL2Jhbm5lZC1wYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL29wdGlvbnMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvcHJvZmlsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9yZXF1ZXN0LWFjdGl2YXRpb24tbGluay5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3Jlc2V0LXBhc3N3b3JkLWZvcm0uanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvc25hY2tiYXIuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvdXNlci1tZW51LmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3VzZXJzLmpzIiwic3JjL2luaXRpYWxpemVycy9pbmNsdWRlLmpzIiwic3JjL2luaXRpYWxpemVycy9sb2NhbC1zdG9yYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9tb2JpbGUtbmF2YmFyLWRyb3Bkb3duLmpzIiwic3JjL2luaXRpYWxpemVycy9tb2RhbC5qcyIsInNyYy9pbml0aWFsaXplcnMvbW9tZW50LWxvY2FsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvcGFnZS10aXRsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvcG9sbHMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL2F1dGguanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL3Byb2ZpbGUtZGVoeWRyYXRlLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy9zbmFja2Jhci5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdGljay5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdXNlcnMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3NuYWNrYmFyLmpzIiwic3JjL2luaXRpYWxpemVycy9zdG9yZS5qcyIsInNyYy9pbml0aWFsaXplcnMvdGljay1zdGFydC5qcyIsInNyYy9pbml0aWFsaXplcnMvenhjdmJuLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9kZWVwLWVxdWFsL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9kZWVwLWVxdWFsL2xpYi9pc19hcmd1bWVudHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvbGliL2tleXMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0FjdGlvbnMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0FzeW5jVXRpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0RPTVN0YXRlU3RvcmFnZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvRE9NVXRpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9jcmVhdGVCcm93c2VySGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlRE9NSGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlSGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlTG9jYXRpb24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL2RlcHJlY2F0ZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvZXh0cmFjdFBhdGguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL3BhcnNlUGF0aC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvcnVuVHJhbnNpdGlvbkhvb2suanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy93YXJuaW5nL2Jyb3dzZXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2F2YXRhci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9iYW5uZWQtcGFnZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9idXR0b24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9jcm9wLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvZ2FsbGVyeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL3VwbG9hZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9mb3JtLWdyb3VwLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2Zvcm0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbGkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbG9hZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL21vZGFsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9tb2RhbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9hZGluZy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLWxvY2tlZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9mb3J1bS1vcHRpb25zLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvbmF2cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1lbWFpbC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvY2hhbmdlLXBhc3N3b3JkLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3BhbmVsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wYW5lbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLXN0cmVuZ3RoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvSGVhZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvYmFuLWRldGFpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93ZXJzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vYXZhdGFyLWNvbnRyb2xzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9jaGFuZ2UtdXNlcm5hbWUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL2RlbGV0ZS1hY2NvdW50LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL3VzZXJuYW1lLWhpc3RvcnkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVnaXN0ZXItYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlZ2lzdGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9zZWFyY2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc2VsZWN0LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3NpZ24taW4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1tZW51L2d1ZXN0LW5hdi5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvdXNlci1uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1zdGF0dXMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy1saXN0L3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLWNhcmQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLXByZXZpZXcuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1lbXB0eS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0LWl0ZW0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL2xpc3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yYW5rL3BhZ2VyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3Jhbmsvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3llcy1uby1zd2l0Y2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9hdXRoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9zbmFja2Jhci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdGljay5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcnMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2FqYXguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2F1dGguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2NhcHRjaGEuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2luY2x1ZGUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vZGFsLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wYWdlLXRpdGxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wb2xscy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL3N0b3JlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy96eGN2Ym4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL2Jhbm5lZC1wYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9iYXRjaC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvZmlsZS1zaXplLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9tb3VudC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL29yZGVyZWQtbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvcmFuZG9tLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9yZXNldC1zY3JvbGwuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3JvdXRlZC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3ZhbGlkYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QztDQUNIOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO0FBQzFDLE1BQUksT0FBTyxHQUFHLFNBQVYsT0FBTyxDQUFZLFVBQVUsRUFBRTtBQUNqQyxXQUFPLFFBQVEsQ0FDYixpRUFBaUUsRUFDakUsa0VBQWtFLEVBQ2xFLFVBQVUsQ0FBQyxDQUFDO0dBQ2YsQ0FBQztBQUNGLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDOUQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJpbXBvcnQgT3JkZXJlZExpc3QgZnJvbSAnbWlzYWdvL3V0aWxzL29yZGVyZWQtbGlzdCc7XG5cbmV4cG9ydCBjbGFzcyBNaXNhZ28ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplcnMgPSBbXTtcbiAgICB0aGlzLl9jb250ZXh0ID0ge307XG4gIH1cblxuICBhZGRJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgIHRoaXMuX2luaXRpYWxpemVycy5wdXNoKHtcbiAgICAgIGtleTogaW5pdGlhbGl6ZXIubmFtZSxcblxuICAgICAgaXRlbTogaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZXIsXG5cbiAgICAgIGFmdGVyOiBpbml0aWFsaXplci5hZnRlcixcbiAgICAgIGJlZm9yZTogaW5pdGlhbGl6ZXIuYmVmb3JlXG4gICAgfSk7XG4gIH1cblxuICBpbml0KGNvbnRleHQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcblxuICAgIHZhciBpbml0T3JkZXIgPSBuZXcgT3JkZXJlZExpc3QodGhpcy5faW5pdGlhbGl6ZXJzKS5vcmRlcmVkVmFsdWVzKCk7XG4gICAgaW5pdE9yZGVyLmZvckVhY2goaW5pdGlhbGl6ZXIgPT4ge1xuICAgICAgaW5pdGlhbGl6ZXIodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb250ZXh0IGFjY2Vzc29yc1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuICEhdGhpcy5fY29udGV4dFtrZXldO1xuICB9XG5cbiAgZ2V0KGtleSwgZmFsbGJhY2spIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwb3Aoa2V5KSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICAgIHRoaXMuX2NvbnRleHRba2V5XSA9IG51bGw7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbi8vIGNyZWF0ZSAgc2luZ2xldG9uXG52YXIgbWlzYWdvID0gbmV3IE1pc2FnbygpO1xuXG4vLyBleHBvc2UgaXQgZ2xvYmFsbHlcbmdsb2JhbC5taXNhZ28gPSBtaXNhZ287XG5cbi8vIGFuZCBleHBvcnQgaXQgZm9yIHRlc3RzIGFuZCBzdHVmZlxuZXhwb3J0IGRlZmF1bHQgbWlzYWdvO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgYWpheC5pbml0KG1pc2Fnby5nZXQoJ0NTUkZfQ09PS0lFX05BTUUnKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdhamF4JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgc3RvcmFnZSBmcm9tICdtaXNhZ28vc2VydmljZXMvbG9jYWwtc3RvcmFnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBhdXRoLmluaXQoc3RvcmUsIHN0b3JhZ2UsIG1vZGFsKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2F1dGgnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTsiLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgY2FwdGNoYSBmcm9tICdtaXNhZ28vc2VydmljZXMvY2FwdGNoYSc7XG5pbXBvcnQgaW5jbHVkZSBmcm9tICdtaXNhZ28vc2VydmljZXMvaW5jbHVkZSc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBjYXB0Y2hhLmluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY2FwdGNoYScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEF1dGhNZXNzYWdlLCB7IHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F1dGgtbWVzc2FnZSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoQXV0aE1lc3NhZ2UpLCAnYXV0aC1tZXNzYWdlLW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6YXV0aC1tZXNzYWdlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ0JBTl9NRVNTQUdFJykpIHtcbiAgICBzaG93QmFubmVkUGFnZShjb250ZXh0LmdldCgnQkFOX01FU1NBR0UnKSwgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6YmFuZWQtcGFnZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IE9wdGlvbnMsIHsgcGF0aHMgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL3Jvb3QnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9yb3V0ZWQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ1VTRVJfT1BUSU9OUycpKSB7XG4gICAgbW91bnQoe1xuICAgICAgcm9vdDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpLFxuICAgICAgY29tcG9uZW50OiBPcHRpb25zLFxuICAgICAgcGF0aHM6IHBhdGhzKClcbiAgICB9KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50Om9wdGlvbnMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUHJvZmlsZSwgeyBwYXRocywgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvcm91dGVkLWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaGFzKCdQUk9GSUxFJykgJiYgY29udGV4dC5oYXMoJ1BST0ZJTEVfUEFHRVMnKSkge1xuICAgIG1vdW50KHtcbiAgICAgIHJvb3Q6IG1pc2Fnby5nZXQoJ1BST0ZJTEUnKS5hYnNvbHV0ZV91cmwsXG4gICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShQcm9maWxlKSxcbiAgICAgIHBhdGhzOiBwYXRocygpXG4gICAgfSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpwcm9maWxlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3JlZHVjZXI6cHJvZmlsZS1kZWh5ZHJhdGUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBSZXF1ZXN0QWN0aXZhdGlvbkxpbmsgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXF1ZXN0LWFjdGl2YXRpb24tbGluay1tb3VudCcpKSB7XG4gICAgbW91bnQoUmVxdWVzdEFjdGl2YXRpb25MaW5rLCAncmVxdWVzdC1hY3RpdmF0aW9uLWxpbmstbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXF1ZXN0LWFjdGl2YXRpb24tbGluaycsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IFJlcXVlc3RQYXNzd29yZFJlc2V0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LW1vdW50JykpIHtcbiAgICBtb3VudChSZXF1ZXN0UGFzc3dvcmRSZXNldCwgJ3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQtbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgUmVzZXRQYXNzd29yZEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXBhc3N3b3JkLWZvcm0tbW91bnQnKSkge1xuICAgIG1vdW50KFJlc2V0UGFzc3dvcmRGb3JtLCAncmVzZXQtcGFzc3dvcmQtZm9ybS1tb3VudCcsIGZhbHNlKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OnJlc2V0LXBhc3N3b3JkLWZvcm0nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBTbmFja2Jhciwgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc25hY2tiYXInO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW91bnQoY29ubmVjdChzZWxlY3QpKFNuYWNrYmFyKSwgJ3NuYWNrYmFyLW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6c25hY2tiYXInLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc25hY2tiYXInXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBVc2VyTWVudSwgQ29tcGFjdFVzZXJNZW51LCBzZWxlY3QgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLW1lbnUvcm9vdCc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoVXNlck1lbnUpLCAndXNlci1tZW51LW1vdW50Jyk7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShDb21wYWN0VXNlck1lbnUpLCAndXNlci1tZW51LWNvbXBhY3QtbW91bnQnKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDp1c2VyLW1lbnUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBVc2VycywgeyBwYXRocyB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3Jvb3QnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9yb3V0ZWQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ1VTRVJTX0xJU1RTJykpIHtcbiAgICBtb3VudCh7XG4gICAgICByb290OiBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpLFxuICAgICAgY29tcG9uZW50OiBVc2VycyxcbiAgICAgIHBhdGhzOiBwYXRocygpXG4gICAgfSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDp1c2VycycsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGluY2x1ZGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2luY2x1ZGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGluY2x1ZGUuaW5pdChjb250ZXh0LmdldCgnU1RBVElDX1VSTCcpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2luY2x1ZGUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHN0b3JhZ2UgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmFnZS5pbml0KCdtaXNhZ29fJyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdsb2NhbC1zdG9yYWdlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBkcm9wZG93biBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9iaWxlLW5hdmJhci1kcm9wZG93bic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2JpbGUtbmF2YmFyLWRyb3Bkb3duLW1vdW50Jyk7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgZHJvcGRvd24uaW5pdChlbGVtZW50KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnZHJvcGRvd24nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLW1vdW50Jyk7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgbW9kYWwuaW5pdChlbGVtZW50KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbW9kYWwnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb21lbnQubG9jYWxlKCQoJ2h0bWwnKS5hdHRyKCdsYW5nJykpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbW9tZW50JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgdGl0bGUuaW5pdChjb250ZXh0LmdldCgnU0VUVElOR1MnKS5mb3J1bV9uYW1lKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3BhZ2UtdGl0bGUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHBvbGxzLmluaXQoYWpheCwgc25hY2tiYXIpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncG9sbHMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIsIHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL2F1dGgnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcignYXV0aCcsIHJlZHVjZXIsIE9iamVjdC5hc3NpZ24oe1xuICAgICdpc0F1dGhlbnRpY2F0ZWQnOiBjb250ZXh0LmdldCgnaXNBdXRoZW50aWNhdGVkJyksXG4gICAgJ2lzQW5vbnltb3VzJzogIWNvbnRleHQuZ2V0KCdpc0F1dGhlbnRpY2F0ZWQnKSxcblxuICAgICd1c2VyJzogY29udGV4dC5nZXQoJ3VzZXInKVxuICB9LCBpbml0aWFsU3RhdGUpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6YXV0aCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKG1pc2Fnby5oYXMoJ1BST0ZJTEUnKSkge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShtaXNhZ28uZ2V0KCdQUk9GSUxFJykpKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpwcm9maWxlLWRlaHlkcmF0ZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3Byb2ZpbGUnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCdwcm9maWxlJywgcmVkdWNlciwge30pO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpwcm9maWxlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIsIHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcignc25hY2tiYXInLCByZWR1Y2VyLCBpbml0aWFsU3RhdGUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpzbmFja2JhcicsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy90aWNrJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcigndGljaycsIHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnRpY2snLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeSc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ3VzZXJuYW1lLWhpc3RvcnknLCByZWR1Y2VyLCBbXSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnVzZXJuYW1lLWhpc3RvcnknLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCd1c2VycycsIHJlZHVjZXIsIFtdKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6dXNlcnMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc25hY2tiYXIuaW5pdChzdG9yZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdzbmFja2JhcicsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5pbml0KCk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdzdG9yZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnX2VuZCdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZG9UaWNrIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3RpY2snO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmNvbnN0IFRJQ0tfUEVSSU9EID0gNTAgKiAxMDAwOyAvL2RvIHRoZSB0aWNrIGV2ZXJ5IDUwc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRvVGljaygpKTtcbiAgfSwgVElDS19QRVJJT0QpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAndGljay1zdGFydCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGluY2x1ZGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2luY2x1ZGUnO1xuaW1wb3J0IHp4Y3ZibiBmcm9tICdtaXNhZ28vc2VydmljZXMvenhjdmJuJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHp4Y3Zibi5pbml0KGluY2x1ZGUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnenhjdmJuJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsInZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vbGliL2tleXMuanMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vbGliL2lzX2FyZ3VtZW50cy5qcycpO1xuXG52YXIgZGVlcEVxdWFsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkIHx8IHR5cGVvZiBhY3R1YWwgIT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyICh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICB2YXIgaSwga2V5O1xuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy9+fn5JJ3ZlIG1hbmFnZWQgdG8gYnJlYWsgT2JqZWN0LmtleXMgdGhyb3VnaCBzY3Jld3kgYXJndW1lbnRzIHBhc3NpbmcuXG4gIC8vICAgQ29udmVydGluZyB0byBhcnJheSBzb2x2ZXMgdGhlIHByb2JsZW0uXG4gIGlmIChpc0FyZ3VtZW50cyhhKSkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIG9wdHMpO1xuICB9XG4gIGlmIChpc0J1ZmZlcihhKSkge1xuICAgIGlmICghaXNCdWZmZXIoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICAgIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgey8vaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XG59XG4iLCJ2YXIgc3VwcG9ydHNBcmd1bWVudHNDbGFzcyA9IChmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50cylcbn0pKCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPyBzdXBwb3J0ZWQgOiB1bnN1cHBvcnRlZDtcblxuZXhwb3J0cy5zdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7XG5mdW5jdGlvbiBzdXBwb3J0ZWQob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbmV4cG9ydHMudW5zdXBwb3J0ZWQgPSB1bnN1cHBvcnRlZDtcbmZ1bmN0aW9uIHVuc3VwcG9ydGVkKG9iamVjdCl7XG4gIHJldHVybiBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIG9iamVjdC5sZW5ndGggPT0gJ251bWJlcicgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnY2FsbGVlJykgJiZcbiAgICAhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpIHx8XG4gICAgZmFsc2U7XG59O1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgY2FsbCB0byBoaXN0b3J5LnB1c2guXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBQVVNIID0gJ1BVU0gnO1xuXG5leHBvcnRzLlBVU0ggPSBQVVNIO1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHdhcyBjYXVzZWQgYnkgYSBjYWxsIHRvIGhpc3RvcnkucmVwbGFjZS5cbiAqL1xudmFyIFJFUExBQ0UgPSAnUkVQTEFDRSc7XG5cbmV4cG9ydHMuUkVQTEFDRSA9IFJFUExBQ0U7XG4vKipcbiAqIEluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gd2FzIGNhdXNlZCBieSBzb21lIG90aGVyIGFjdGlvbiBzdWNoXG4gKiBhcyB1c2luZyBhIGJyb3dzZXIncyBiYWNrL2ZvcndhcmQgYnV0dG9ucyBhbmQvb3IgbWFudWFsbHkgbWFuaXB1bGF0aW5nXG4gKiB0aGUgVVJMIGluIGEgYnJvd3NlcidzIGxvY2F0aW9uIGJhci4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0V2ZW50SGFuZGxlcnMvb25wb3BzdGF0ZVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBQT1AgPSAnUE9QJztcblxuZXhwb3J0cy5QT1AgPSBQT1A7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIFBVU0g6IFBVU0gsXG4gIFJFUExBQ0U6IFJFUExBQ0UsXG4gIFBPUDogUE9QXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5sb29wQXN5bmMgPSBsb29wQXN5bmM7XG5cbmZ1bmN0aW9uIGxvb3BBc3luYyh0dXJucywgd29yaywgY2FsbGJhY2spIHtcbiAgdmFyIGN1cnJlbnRUdXJuID0gMDtcbiAgdmFyIGlzRG9uZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaXNEb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaXNEb25lKSByZXR1cm47XG5cbiAgICBpZiAoY3VycmVudFR1cm4gPCB0dXJucykge1xuICAgICAgd29yay5jYWxsKHRoaXMsIGN1cnJlbnRUdXJuKyssIG5leHQsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpO1xufSIsIi8qZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuc2F2ZVN0YXRlID0gc2F2ZVN0YXRlO1xuZXhwb3J0cy5yZWFkU3RhdGUgPSByZWFkU3RhdGU7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBLZXlQcmVmaXggPSAnQEBIaXN0b3J5Lyc7XG52YXIgUXVvdGFFeGNlZWRlZEVycm9yID0gJ1F1b3RhRXhjZWVkZWRFcnJvcic7XG52YXIgU2VjdXJpdHlFcnJvciA9ICdTZWN1cml0eUVycm9yJztcblxuZnVuY3Rpb24gY3JlYXRlS2V5KGtleSkge1xuICByZXR1cm4gS2V5UHJlZml4ICsga2V5O1xufVxuXG5mdW5jdGlvbiBzYXZlU3RhdGUoa2V5LCBzdGF0ZSkge1xuICB0cnkge1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNyZWF0ZUtleShrZXkpLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvci5uYW1lID09PSBTZWN1cml0eUVycm9yKSB7XG4gICAgICAvLyBCbG9ja2luZyBjb29raWVzIGluIENocm9tZS9GaXJlZm94L1NhZmFyaSB0aHJvd3MgU2VjdXJpdHlFcnJvciBvbiBhbnlcbiAgICAgIC8vIGF0dGVtcHQgdG8gYWNjZXNzIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShmYWxzZSwgJ1toaXN0b3J5XSBVbmFibGUgdG8gc2F2ZSBzdGF0ZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBkdWUgdG8gc2VjdXJpdHkgc2V0dGluZ3MnKSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlcnJvci5uYW1lID09PSBRdW90YUV4Y2VlZGVkRXJyb3IgJiYgd2luZG93LnNlc3Npb25TdG9yYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gU2FmYXJpIFwicHJpdmF0ZSBtb2RlXCIgdGhyb3dzIFF1b3RhRXhjZWVkZWRFcnJvci5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShmYWxzZSwgJ1toaXN0b3J5XSBVbmFibGUgdG8gc2F2ZSBzdGF0ZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBTYWZhcmkgcHJpdmF0ZSBtb2RlJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhdGUoa2V5KSB7XG4gIHZhciBqc29uID0gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGpzb24gPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShjcmVhdGVLZXkoa2V5KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgIC8vIEJsb2NraW5nIGNvb2tpZXMgaW4gQ2hyb21lL0ZpcmVmb3gvU2FmYXJpIHRocm93cyBTZWN1cml0eUVycm9yIG9uIGFueVxuICAgICAgLy8gYXR0ZW1wdCB0byBhY2Nlc3Mgd2luZG93LnNlc3Npb25TdG9yYWdlLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF93YXJuaW5nMlsnZGVmYXVsdCddKGZhbHNlLCAnW2hpc3RvcnldIFVuYWJsZSB0byByZWFkIHN0YXRlOyBzZXNzaW9uU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBzZWN1cml0eSBzZXR0aW5ncycpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpZiAoanNvbikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIGludmFsaWQgSlNPTi5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmFkZEV2ZW50TGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyO1xuZXhwb3J0cy5yZW1vdmVFdmVudExpc3RlbmVyID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbmV4cG9ydHMuZ2V0SGFzaFBhdGggPSBnZXRIYXNoUGF0aDtcbmV4cG9ydHMucmVwbGFjZUhhc2hQYXRoID0gcmVwbGFjZUhhc2hQYXRoO1xuZXhwb3J0cy5nZXRXaW5kb3dQYXRoID0gZ2V0V2luZG93UGF0aDtcbmV4cG9ydHMuZ28gPSBnbztcbmV4cG9ydHMuZ2V0VXNlckNvbmZpcm1hdGlvbiA9IGdldFVzZXJDb25maXJtYXRpb247XG5leHBvcnRzLnN1cHBvcnRzSGlzdG9yeSA9IHN1cHBvcnRzSGlzdG9yeTtcbmV4cG9ydHMuc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2ggPSBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaDtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgaWYgKG5vZGUuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gIGlmIChub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIYXNoUGF0aCgpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGhlcmUgYmVjYXVzZSBpdCdzIG5vdFxuICAvLyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyAtIEZpcmVmb3ggd2lsbCBwcmUtZGVjb2RlIGl0IVxuICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJyMnKVsxXSB8fCAnJztcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUhhc2hQYXRoKHBhdGgpIHtcbiAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArICcjJyArIHBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dQYXRoKCkge1xuICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xufVxuXG5mdW5jdGlvbiBnbyhuKSB7XG4gIGlmIChuKSB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlckNvbmZpcm1hdGlvbihtZXNzYWdlLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayh3aW5kb3cuY29uZmlybShtZXNzYWdlKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBIVE1MNSBoaXN0b3J5IEFQSSBpcyBzdXBwb3J0ZWQuIFRha2VuIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9oaXN0b3J5LmpzXG4gKiBjaGFuZ2VkIHRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcyBmb3IgV2luZG93cyBQaG9uZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWNrdC9yZWFjdC1yb3V0ZXIvaXNzdWVzLzU4NlxuICovXG5cbmZ1bmN0aW9uIHN1cHBvcnRzSGlzdG9yeSgpIHtcbiAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgaWYgKCh1YS5pbmRleE9mKCdBbmRyb2lkIDIuJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0FuZHJvaWQgNC4wJykgIT09IC0xKSAmJiB1YS5pbmRleE9mKCdNb2JpbGUgU2FmYXJpJykgIT09IC0xICYmIHVhLmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSAmJiB1YS5pbmRleE9mKCdXaW5kb3dzIFBob25lJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEZJWE1FOiBXb3JrIGFyb3VuZCBvdXIgYnJvd3NlciBoaXN0b3J5IG5vdCB3b3JraW5nIGNvcnJlY3RseSBvbiBDaHJvbWVcbiAgLy8gaU9TOiBodHRwczovL2dpdGh1Yi5jb20vcmFja3QvcmVhY3Qtcm91dGVyL2lzc3Vlcy8yNTY1XG4gIGlmICh1YS5pbmRleE9mKCdDcmlPUycpICE9PSAtMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gd2luZG93Lmhpc3RvcnkgJiYgJ3B1c2hTdGF0ZScgaW4gd2luZG93Lmhpc3Rvcnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmYWxzZSBpZiB1c2luZyBnbyhuKSB3aXRoIGhhc2ggaGlzdG9yeSBjYXVzZXMgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICovXG5cbmZ1bmN0aW9uIHN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoKCkge1xuICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICByZXR1cm4gdWEuaW5kZXhPZignRmlyZWZveCcpID09PSAtMTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbmV4cG9ydHMuY2FuVXNlRE9NID0gY2FuVXNlRE9NOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX0FjdGlvbnMgPSByZXF1aXJlKCcuL0FjdGlvbnMnKTtcblxudmFyIF9FeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIF9ET01VdGlscyA9IHJlcXVpcmUoJy4vRE9NVXRpbHMnKTtcblxudmFyIF9ET01TdGF0ZVN0b3JhZ2UgPSByZXF1aXJlKCcuL0RPTVN0YXRlU3RvcmFnZScpO1xuXG52YXIgX2NyZWF0ZURPTUhpc3RvcnkgPSByZXF1aXJlKCcuL2NyZWF0ZURPTUhpc3RvcnknKTtcblxudmFyIF9jcmVhdGVET01IaXN0b3J5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZURPTUhpc3RvcnkpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoJy4vcGFyc2VQYXRoJyk7XG5cbnZhciBfcGFyc2VQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhcnNlUGF0aCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGhpc3Rvcnkgb2JqZWN0IHRoYXQgdXNlcyBIVE1MNSdzIGhpc3RvcnkgQVBJXG4gKiAocHVzaFN0YXRlLCByZXBsYWNlU3RhdGUsIGFuZCB0aGUgcG9wc3RhdGUgZXZlbnQpIHRvIG1hbmFnZSBoaXN0b3J5LlxuICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kIG9mIG1hbmFnaW5nIGhpc3RvcnkgaW4gYnJvd3NlcnMgYmVjYXVzZVxuICogaXQgcHJvdmlkZXMgdGhlIGNsZWFuZXN0IFVSTHMuXG4gKlxuICogTm90ZTogSW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgZnVsbFxuICogcGFnZSByZWxvYWRzIHdpbGwgYmUgdXNlZCB0byBwcmVzZXJ2ZSBVUkxzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeSgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAhX0V4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlLCAnQnJvd3NlciBoaXN0b3J5IG5lZWRzIGEgRE9NJykgOiBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICB2YXIgZm9yY2VSZWZyZXNoID0gb3B0aW9ucy5mb3JjZVJlZnJlc2g7XG5cbiAgdmFyIGlzU3VwcG9ydGVkID0gX0RPTVV0aWxzLnN1cHBvcnRzSGlzdG9yeSgpO1xuICB2YXIgdXNlUmVmcmVzaCA9ICFpc1N1cHBvcnRlZCB8fCBmb3JjZVJlZnJlc2g7XG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2F0aW9uKGhpc3RvcnlTdGF0ZSkge1xuICAgIGhpc3RvcnlTdGF0ZSA9IGhpc3RvcnlTdGF0ZSB8fCB3aW5kb3cuaGlzdG9yeS5zdGF0ZSB8fCB7fTtcblxuICAgIHZhciBwYXRoID0gX0RPTVV0aWxzLmdldFdpbmRvd1BhdGgoKTtcbiAgICB2YXIgX2hpc3RvcnlTdGF0ZSA9IGhpc3RvcnlTdGF0ZTtcbiAgICB2YXIga2V5ID0gX2hpc3RvcnlTdGF0ZS5rZXk7XG5cbiAgICB2YXIgc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGtleSkge1xuICAgICAgc3RhdGUgPSBfRE9NU3RhdGVTdG9yYWdlLnJlYWRTdGF0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZSA9IG51bGw7XG4gICAgICBrZXkgPSBoaXN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgICBpZiAoaXNTdXBwb3J0ZWQpIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShfZXh0ZW5kcyh7fSwgaGlzdG9yeVN0YXRlLCB7IGtleToga2V5IH0pLCBudWxsLCBwYXRoKTtcbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb24gPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuXG4gICAgcmV0dXJuIGhpc3RvcnkuY3JlYXRlTG9jYXRpb24oX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7IHN0YXRlOiBzdGF0ZSB9KSwgdW5kZWZpbmVkLCBrZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRQb3BTdGF0ZUxpc3RlbmVyKF9yZWYpIHtcbiAgICB2YXIgdHJhbnNpdGlvblRvID0gX3JlZi50cmFuc2l0aW9uVG87XG5cbiAgICBmdW5jdGlvbiBwb3BTdGF0ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBJZ25vcmUgZXh0cmFuZW91cyBwb3BzdGF0ZSBldmVudHMgaW4gV2ViS2l0LlxuXG4gICAgICB0cmFuc2l0aW9uVG8oZ2V0Q3VycmVudExvY2F0aW9uKGV2ZW50LnN0YXRlKSk7XG4gICAgfVxuXG4gICAgX0RPTVV0aWxzLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LCAncG9wc3RhdGUnLCBwb3BTdGF0ZUxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBfRE9NVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csICdwb3BzdGF0ZScsIHBvcFN0YXRlTGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2hUcmFuc2l0aW9uKGxvY2F0aW9uKSB7XG4gICAgdmFyIGJhc2VuYW1lID0gbG9jYXRpb24uYmFzZW5hbWU7XG4gICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB2YXIgaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gICAgdmFyIHN0YXRlID0gbG9jYXRpb24uc3RhdGU7XG4gICAgdmFyIGFjdGlvbiA9IGxvY2F0aW9uLmFjdGlvbjtcbiAgICB2YXIga2V5ID0gbG9jYXRpb24ua2V5O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gX0FjdGlvbnMuUE9QKSByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uXG5cbiAgICBfRE9NU3RhdGVTdG9yYWdlLnNhdmVTdGF0ZShrZXksIHN0YXRlKTtcblxuICAgIHZhciBwYXRoID0gKGJhc2VuYW1lIHx8ICcnKSArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbiAgICB2YXIgaGlzdG9yeVN0YXRlID0ge1xuICAgICAga2V5OiBrZXlcbiAgICB9O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gX0FjdGlvbnMuUFVTSCkge1xuICAgICAgaWYgKHVzZVJlZnJlc2gpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwYXRoO1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFByZXZlbnQgbG9jYXRpb24gdXBkYXRlLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoaGlzdG9yeVN0YXRlLCBudWxsLCBwYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSRVBMQUNFXG4gICAgICBpZiAodXNlUmVmcmVzaCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShwYXRoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQcmV2ZW50IGxvY2F0aW9uIHVwZGF0ZS5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3RvcnlTdGF0ZSwgbnVsbCwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaGlzdG9yeSA9IF9jcmVhdGVET01IaXN0b3J5MlsnZGVmYXVsdCddKF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgZ2V0Q3VycmVudExvY2F0aW9uOiBnZXRDdXJyZW50TG9jYXRpb24sXG4gICAgZmluaXNoVHJhbnNpdGlvbjogZmluaXNoVHJhbnNpdGlvbixcbiAgICBzYXZlU3RhdGU6IF9ET01TdGF0ZVN0b3JhZ2Uuc2F2ZVN0YXRlXG4gIH0pKTtcblxuICB2YXIgbGlzdGVuZXJDb3VudCA9IDAsXG4gICAgICBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBsaXN0ZW5CZWZvcmUobGlzdGVuZXIpIHtcbiAgICBpZiAoKytsaXN0ZW5lckNvdW50ID09PSAxKSBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihoaXN0b3J5KTtcblxuICAgIHZhciB1bmxpc3RlbiA9IGhpc3RvcnkubGlzdGVuQmVmb3JlKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB1bmxpc3RlbigpO1xuXG4gICAgICBpZiAoLS1saXN0ZW5lckNvdW50ID09PSAwKSBzdG9wUG9wU3RhdGVMaXN0ZW5lcigpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICBpZiAoKytsaXN0ZW5lckNvdW50ID09PSAxKSBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihoaXN0b3J5KTtcblxuICAgIHZhciB1bmxpc3RlbiA9IGhpc3RvcnkubGlzdGVuKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB1bmxpc3RlbigpO1xuXG4gICAgICBpZiAoLS1saXN0ZW5lckNvdW50ID09PSAwKSBzdG9wUG9wU3RhdGVMaXN0ZW5lcigpO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2soaG9vaykge1xuICAgIGlmICgrK2xpc3RlbmVyQ291bnQgPT09IDEpIHN0b3BQb3BTdGF0ZUxpc3RlbmVyID0gc3RhcnRQb3BTdGF0ZUxpc3RlbmVyKGhpc3RvcnkpO1xuXG4gICAgaGlzdG9yeS5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spO1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiB1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2soaG9vaykge1xuICAgIGhpc3RvcnkudW5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spO1xuXG4gICAgaWYgKC0tbGlzdGVuZXJDb3VudCA9PT0gMCkgc3RvcFBvcFN0YXRlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgaGlzdG9yeSwge1xuICAgIGxpc3RlbkJlZm9yZTogbGlzdGVuQmVmb3JlLFxuICAgIGxpc3RlbjogbGlzdGVuLFxuICAgIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2s6IHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2ssXG4gICAgdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rOiB1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2tcbiAgfSk7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnaW52YXJpYW50Jyk7XG5cbnZhciBfaW52YXJpYW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ludmFyaWFudCk7XG5cbnZhciBfRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBfRE9NVXRpbHMgPSByZXF1aXJlKCcuL0RPTVV0aWxzJyk7XG5cbnZhciBfY3JlYXRlSGlzdG9yeSA9IHJlcXVpcmUoJy4vY3JlYXRlSGlzdG9yeScpO1xuXG52YXIgX2NyZWF0ZUhpc3RvcnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlSGlzdG9yeSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTUhpc3Rvcnkob3B0aW9ucykge1xuICB2YXIgaGlzdG9yeSA9IF9jcmVhdGVIaXN0b3J5MlsnZGVmYXVsdCddKF9leHRlbmRzKHtcbiAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBfRE9NVXRpbHMuZ2V0VXNlckNvbmZpcm1hdGlvblxuICB9LCBvcHRpb25zLCB7XG4gICAgZ286IF9ET01VdGlscy5nb1xuICB9KSk7XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgIV9FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX2ludmFyaWFudDJbJ2RlZmF1bHQnXShmYWxzZSwgJ0RPTSBoaXN0b3J5IG5lZWRzIGEgRE9NJykgOiBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBoaXN0b3J5Lmxpc3RlbihsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIGhpc3RvcnksIHtcbiAgICBsaXN0ZW46IGxpc3RlblxuICB9KTtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gY3JlYXRlRE9NSGlzdG9yeTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8vaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZydcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2RlZXBFcXVhbCA9IHJlcXVpcmUoJ2RlZXAtZXF1YWwnKTtcblxudmFyIF9kZWVwRXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVlcEVxdWFsKTtcblxudmFyIF9Bc3luY1V0aWxzID0gcmVxdWlyZSgnLi9Bc3luY1V0aWxzJyk7XG5cbnZhciBfQWN0aW9ucyA9IHJlcXVpcmUoJy4vQWN0aW9ucycpO1xuXG52YXIgX2NyZWF0ZUxvY2F0aW9uMiA9IHJlcXVpcmUoJy4vY3JlYXRlTG9jYXRpb24nKTtcblxudmFyIF9jcmVhdGVMb2NhdGlvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVMb2NhdGlvbjIpO1xuXG52YXIgX3J1blRyYW5zaXRpb25Ib29rID0gcmVxdWlyZSgnLi9ydW5UcmFuc2l0aW9uSG9vaycpO1xuXG52YXIgX3J1blRyYW5zaXRpb25Ib29rMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3J1blRyYW5zaXRpb25Ib29rKTtcblxudmFyIF9wYXJzZVBhdGggPSByZXF1aXJlKCcuL3BhcnNlUGF0aCcpO1xuXG52YXIgX3BhcnNlUGF0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYXJzZVBhdGgpO1xuXG52YXIgX2RlcHJlY2F0ZSA9IHJlcXVpcmUoJy4vZGVwcmVjYXRlJyk7XG5cbnZhciBfZGVwcmVjYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlcHJlY2F0ZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmRvbUtleShsZW5ndGgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCBsZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBsb2NhdGlvbnNBcmVFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhLnBhdGhuYW1lID09PSBiLnBhdGhuYW1lICYmIGEuc2VhcmNoID09PSBiLnNlYXJjaCAmJlxuICAvL2EuYWN0aW9uID09PSBiLmFjdGlvbiAmJiAvLyBEaWZmZXJlbnQgYWN0aW9uICE9PSBsb2NhdGlvbiBjaGFuZ2UuXG4gIGEua2V5ID09PSBiLmtleSAmJiBfZGVlcEVxdWFsMlsnZGVmYXVsdCddKGEuc3RhdGUsIGIuc3RhdGUpO1xufVxuXG52YXIgRGVmYXVsdEtleUxlbmd0aCA9IDY7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhpc3RvcnkoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG4gIHZhciBnZXRDdXJyZW50TG9jYXRpb24gPSBvcHRpb25zLmdldEN1cnJlbnRMb2NhdGlvbjtcbiAgdmFyIGZpbmlzaFRyYW5zaXRpb24gPSBvcHRpb25zLmZpbmlzaFRyYW5zaXRpb247XG4gIHZhciBzYXZlU3RhdGUgPSBvcHRpb25zLnNhdmVTdGF0ZTtcbiAgdmFyIGdvID0gb3B0aW9ucy5nbztcbiAgdmFyIGtleUxlbmd0aCA9IG9wdGlvbnMua2V5TGVuZ3RoO1xuICB2YXIgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IG9wdGlvbnMuZ2V0VXNlckNvbmZpcm1hdGlvbjtcblxuICBpZiAodHlwZW9mIGtleUxlbmd0aCAhPT0gJ251bWJlcicpIGtleUxlbmd0aCA9IERlZmF1bHRLZXlMZW5ndGg7XG5cbiAgdmFyIHRyYW5zaXRpb25Ib29rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGxpc3RlbkJlZm9yZShob29rKSB7XG4gICAgdHJhbnNpdGlvbkhvb2tzLnB1c2goaG9vayk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNpdGlvbkhvb2tzID0gdHJhbnNpdGlvbkhvb2tzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gaG9vaztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICB2YXIgYWxsS2V5cyA9IFtdO1xuICB2YXIgY2hhbmdlTGlzdGVuZXJzID0gW107XG4gIHZhciBsb2NhdGlvbiA9IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBnZXRDdXJyZW50KCkge1xuICAgIGlmIChwZW5kaW5nTG9jYXRpb24gJiYgcGVuZGluZ0xvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUE9QKSB7XG4gICAgICByZXR1cm4gYWxsS2V5cy5pbmRleE9mKHBlbmRpbmdMb2NhdGlvbi5rZXkpO1xuICAgIH0gZWxzZSBpZiAobG9jYXRpb24pIHtcbiAgICAgIHJldHVybiBhbGxLZXlzLmluZGV4T2YobG9jYXRpb24ua2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBnZXRDdXJyZW50KCk7XG5cbiAgICBsb2NhdGlvbiA9IG5ld0xvY2F0aW9uO1xuXG4gICAgaWYgKGxvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUFVTSCkge1xuICAgICAgYWxsS2V5cyA9IFtdLmNvbmNhdChhbGxLZXlzLnNsaWNlKDAsIGN1cnJlbnQgKyAxKSwgW2xvY2F0aW9uLmtleV0pO1xuICAgIH0gZWxzZSBpZiAobG9jYXRpb24uYWN0aW9uID09PSBfQWN0aW9ucy5SRVBMQUNFKSB7XG4gICAgICBhbGxLZXlzW2N1cnJlbnRdID0gbG9jYXRpb24ua2V5O1xuICAgIH1cblxuICAgIGNoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIobG9jYXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgY2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICBsaXN0ZW5lcihsb2NhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfbG9jYXRpb24gPSBnZXRDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgIGFsbEtleXMgPSBbX2xvY2F0aW9uLmtleV07XG4gICAgICB1cGRhdGVMb2NhdGlvbihfbG9jYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGFuZ2VMaXN0ZW5lcnMgPSBjaGFuZ2VMaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtICE9PSBsaXN0ZW5lcjtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBjYWxsYmFjaykge1xuICAgIF9Bc3luY1V0aWxzLmxvb3BBc3luYyh0cmFuc2l0aW9uSG9va3MubGVuZ3RoLCBmdW5jdGlvbiAoaW5kZXgsIG5leHQsIGRvbmUpIHtcbiAgICAgIF9ydW5UcmFuc2l0aW9uSG9vazJbJ2RlZmF1bHQnXSh0cmFuc2l0aW9uSG9va3NbaW5kZXhdLCBsb2NhdGlvbiwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBkb25lKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgaWYgKGdldFVzZXJDb25maXJtYXRpb24gJiYgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGdldFVzZXJDb25maXJtYXRpb24obWVzc2FnZSwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICAgICAgY2FsbGJhY2sob2sgIT09IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhtZXNzYWdlICE9PSBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgcGVuZGluZ0xvY2F0aW9uID0gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25UbyhuZXh0TG9jYXRpb24pIHtcbiAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb25zQXJlRXF1YWwobG9jYXRpb24sIG5leHRMb2NhdGlvbikpIHJldHVybjsgLy8gTm90aGluZyB0byBkby5cblxuICAgIHBlbmRpbmdMb2NhdGlvbiA9IG5leHRMb2NhdGlvbjtcblxuICAgIGNvbmZpcm1UcmFuc2l0aW9uVG8obmV4dExvY2F0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmIChwZW5kaW5nTG9jYXRpb24gIT09IG5leHRMb2NhdGlvbikgcmV0dXJuOyAvLyBUcmFuc2l0aW9uIHdhcyBpbnRlcnJ1cHRlZC5cblxuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIC8vIHRyZWF0IFBVU0ggdG8gY3VycmVudCBwYXRoIGxpa2UgUkVQTEFDRSB0byBiZSBjb25zaXN0ZW50IHdpdGggYnJvd3NlcnNcbiAgICAgICAgaWYgKG5leHRMb2NhdGlvbi5hY3Rpb24gPT09IF9BY3Rpb25zLlBVU0gpIHtcbiAgICAgICAgICB2YXIgcHJldlBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcbiAgICAgICAgICB2YXIgbmV4dFBhdGggPSBjcmVhdGVQYXRoKG5leHRMb2NhdGlvbik7XG5cbiAgICAgICAgICBpZiAobmV4dFBhdGggPT09IHByZXZQYXRoKSBuZXh0TG9jYXRpb24uYWN0aW9uID0gX0FjdGlvbnMuUkVQTEFDRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5pc2hUcmFuc2l0aW9uKG5leHRMb2NhdGlvbikgIT09IGZhbHNlKSB1cGRhdGVMb2NhdGlvbihuZXh0TG9jYXRpb24pO1xuICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiAmJiBuZXh0TG9jYXRpb24uYWN0aW9uID09PSBfQWN0aW9ucy5QT1ApIHtcbiAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbEtleXMuaW5kZXhPZihsb2NhdGlvbi5rZXkpO1xuICAgICAgICB2YXIgbmV4dEluZGV4ID0gYWxsS2V5cy5pbmRleE9mKG5leHRMb2NhdGlvbi5rZXkpO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xICYmIG5leHRJbmRleCAhPT0gLTEpIGdvKHByZXZJbmRleCAtIG5leHRJbmRleCk7IC8vIFJlc3RvcmUgdGhlIFVSTC5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2gobG9jYXRpb24pIHtcbiAgICB0cmFuc2l0aW9uVG8oY3JlYXRlTG9jYXRpb24obG9jYXRpb24sIF9BY3Rpb25zLlBVU0gsIGNyZWF0ZUtleSgpKSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXBsYWNlKGxvY2F0aW9uKSB7XG4gICAgdHJhbnNpdGlvblRvKGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBfQWN0aW9ucy5SRVBMQUNFLCBjcmVhdGVLZXkoKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xuICAgIGdvKC0xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvRm9yd2FyZCgpIHtcbiAgICBnbygxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUtleSgpIHtcbiAgICByZXR1cm4gY3JlYXRlUmFuZG9tS2V5KGtleUxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQYXRoKGxvY2F0aW9uKSB7XG4gICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgdHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIGxvY2F0aW9uO1xuXG4gICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB2YXIgaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG5cbiAgICB2YXIgcmVzdWx0ID0gcGF0aG5hbWU7XG5cbiAgICBpZiAoc2VhcmNoKSByZXN1bHQgKz0gc2VhcmNoO1xuXG4gICAgaWYgKGhhc2gpIHJlc3VsdCArPSBoYXNoO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlUGF0aChsb2NhdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVMb2NhdGlvbihsb2NhdGlvbiwgYWN0aW9uKSB7XG4gICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IGNyZWF0ZUtleSgpIDogYXJndW1lbnRzWzJdO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAvL3dhcm5pbmcoXG4gICAgICAvLyAgZmFsc2UsXG4gICAgICAvLyAgJ1RoZSBzdGF0ZSAoMm5kKSBhcmd1bWVudCB0byBoaXN0b3J5LmNyZWF0ZUxvY2F0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBhICcgK1xuICAgICAgLy8gICdsb2NhdGlvbiBkZXNjcmlwdG9yIGluc3RlYWQnXG4gICAgICAvLylcblxuICAgICAgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3N0cmluZycpIGxvY2F0aW9uID0gX3BhcnNlUGF0aDJbJ2RlZmF1bHQnXShsb2NhdGlvbik7XG5cbiAgICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7IHN0YXRlOiBhY3Rpb24gfSk7XG5cbiAgICAgIGFjdGlvbiA9IGtleTtcbiAgICAgIGtleSA9IGFyZ3VtZW50c1szXSB8fCBjcmVhdGVLZXkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2NyZWF0ZUxvY2F0aW9uM1snZGVmYXVsdCddKGxvY2F0aW9uLCBhY3Rpb24sIGtleSk7XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHNldFN0YXRlKHN0YXRlKSB7XG4gICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICB1cGRhdGVMb2NhdGlvblN0YXRlKGxvY2F0aW9uLCBzdGF0ZSk7XG4gICAgICB1cGRhdGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUxvY2F0aW9uU3RhdGUoZ2V0Q3VycmVudExvY2F0aW9uKCksIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblN0YXRlKGxvY2F0aW9uLCBzdGF0ZSkge1xuICAgIGxvY2F0aW9uLnN0YXRlID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLnN0YXRlLCBzdGF0ZSk7XG4gICAgc2F2ZVN0YXRlKGxvY2F0aW9uLmtleSwgbG9jYXRpb24uc3RhdGUpO1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiByZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICBpZiAodHJhbnNpdGlvbkhvb2tzLmluZGV4T2YoaG9vaykgPT09IC0xKSB0cmFuc2l0aW9uSG9va3MucHVzaChob29rKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICB0cmFuc2l0aW9uSG9va3MgPSB0cmFuc2l0aW9uSG9va3MuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbSAhPT0gaG9vaztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gcHVzaFN0YXRlKHN0YXRlLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgcGF0aCA9IF9wYXJzZVBhdGgyWydkZWZhdWx0J10ocGF0aCk7XG5cbiAgICBwdXNoKF9leHRlbmRzKHsgc3RhdGU6IHN0YXRlIH0sIHBhdGgpKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gcmVwbGFjZVN0YXRlKHN0YXRlLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgcGF0aCA9IF9wYXJzZVBhdGgyWydkZWZhdWx0J10ocGF0aCk7XG5cbiAgICByZXBsYWNlKF9leHRlbmRzKHsgc3RhdGU6IHN0YXRlIH0sIHBhdGgpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGlzdGVuQmVmb3JlOiBsaXN0ZW5CZWZvcmUsXG4gICAgbGlzdGVuOiBsaXN0ZW4sXG4gICAgdHJhbnNpdGlvblRvOiB0cmFuc2l0aW9uVG8sXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBjcmVhdGVLZXk6IGNyZWF0ZUtleSxcbiAgICBjcmVhdGVQYXRoOiBjcmVhdGVQYXRoLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgY3JlYXRlTG9jYXRpb246IGNyZWF0ZUxvY2F0aW9uLFxuXG4gICAgc2V0U3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10oc2V0U3RhdGUsICdzZXRTdGF0ZSBpcyBkZXByZWNhdGVkOyB1c2UgbG9jYXRpb24ua2V5IHRvIHNhdmUgc3RhdGUgaW5zdGVhZCcpLFxuICAgIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2s6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocmVnaXN0ZXJUcmFuc2l0aW9uSG9vaywgJ3JlZ2lzdGVyVHJhbnNpdGlvbkhvb2sgaXMgZGVwcmVjYXRlZDsgdXNlIGxpc3RlbkJlZm9yZSBpbnN0ZWFkJyksXG4gICAgdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vaywgJ3VucmVnaXN0ZXJUcmFuc2l0aW9uSG9vayBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gbGlzdGVuQmVmb3JlIGluc3RlYWQnKSxcbiAgICBwdXNoU3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocHVzaFN0YXRlLCAncHVzaFN0YXRlIGlzIGRlcHJlY2F0ZWQ7IHVzZSBwdXNoIGluc3RlYWQnKSxcbiAgICByZXBsYWNlU3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocmVwbGFjZVN0YXRlLCAncmVwbGFjZVN0YXRlIGlzIGRlcHJlY2F0ZWQ7IHVzZSByZXBsYWNlIGluc3RlYWQnKVxuICB9O1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBjcmVhdGVIaXN0b3J5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLy9pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJ1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfQWN0aW9ucyA9IHJlcXVpcmUoJy4vQWN0aW9ucycpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoJy4vcGFyc2VQYXRoJyk7XG5cbnZhciBfcGFyc2VQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhcnNlUGF0aCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKCkge1xuICB2YXIgbG9jYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAnLycgOiBhcmd1bWVudHNbMF07XG4gIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBfQWN0aW9ucy5QT1AgOiBhcmd1bWVudHNbMV07XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBfZm91cnRoQXJnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1szXTtcblxuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykgbG9jYXRpb24gPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKGxvY2F0aW9uKTtcblxuICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAvL3dhcm5pbmcoXG4gICAgLy8gIGZhbHNlLFxuICAgIC8vICAnVGhlIHN0YXRlICgybmQpIGFyZ3VtZW50IHRvIGNyZWF0ZUxvY2F0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBhICcgK1xuICAgIC8vICAnbG9jYXRpb24gZGVzY3JpcHRvciBpbnN0ZWFkJ1xuICAgIC8vKVxuXG4gICAgbG9jYXRpb24gPSBfZXh0ZW5kcyh7fSwgbG9jYXRpb24sIHsgc3RhdGU6IGFjdGlvbiB9KTtcblxuICAgIGFjdGlvbiA9IGtleSB8fCBfQWN0aW9ucy5QT1A7XG4gICAga2V5ID0gX2ZvdXJ0aEFyZztcbiAgfVxuXG4gIHZhciBwYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lIHx8ICcvJztcbiAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCB8fCAnJztcbiAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoIHx8ICcnO1xuICB2YXIgc3RhdGUgPSBsb2NhdGlvbi5zdGF0ZSB8fCBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgIHNlYXJjaDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2gsXG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGtleToga2V5XG4gIH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZUxvY2F0aW9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLy9pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJ1xuXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmZ1bmN0aW9uIGRlcHJlY2F0ZShmbikge1xuICByZXR1cm4gZm47XG4gIC8vcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgLy8gIHdhcm5pbmcoZmFsc2UsICdbaGlzdG9yeV0gJyArIG1lc3NhZ2UpXG4gIC8vICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAvL31cbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBkZXByZWNhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZnVuY3Rpb24gZXh0cmFjdFBhdGgoc3RyaW5nKSB7XG4gIHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaCgvXmh0dHBzPzpcXC9cXC9bXlxcL10qLyk7XG5cbiAgaWYgKG1hdGNoID09IG51bGwpIHJldHVybiBzdHJpbmc7XG5cbiAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHRyYWN0UGF0aDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2V4dHJhY3RQYXRoID0gcmVxdWlyZSgnLi9leHRyYWN0UGF0aCcpO1xuXG52YXIgX2V4dHJhY3RQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dHJhY3RQYXRoKTtcblxuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgdmFyIHBhdGhuYW1lID0gX2V4dHJhY3RQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuICB2YXIgc2VhcmNoID0gJyc7XG4gIHZhciBoYXNoID0gJyc7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF93YXJuaW5nMlsnZGVmYXVsdCddKHBhdGggPT09IHBhdGhuYW1lLCAnQSBwYXRoIG11c3QgYmUgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoIG9ubHksIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBVUkwgbGlrZSBcIiVzXCInLCBwYXRoKSA6IHVuZGVmaW5lZDtcblxuICB2YXIgaGFzaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGhhc2ggPSBwYXRobmFtZS5zdWJzdHJpbmcoaGFzaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBoYXNoSW5kZXgpO1xuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZignPycpO1xuICBpZiAoc2VhcmNoSW5kZXggIT09IC0xKSB7XG4gICAgc2VhcmNoID0gcGF0aG5hbWUuc3Vic3RyaW5nKHNlYXJjaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gIH1cblxuICBpZiAocGF0aG5hbWUgPT09ICcnKSBwYXRobmFtZSA9ICcvJztcblxuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoXG4gIH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHBhcnNlUGF0aDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxuZnVuY3Rpb24gcnVuVHJhbnNpdGlvbkhvb2soaG9vaywgbG9jYXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHQgPSBob29rKGxvY2F0aW9uLCBjYWxsYmFjayk7XG5cbiAgaWYgKGhvb2subGVuZ3RoIDwgMikge1xuICAgIC8vIEFzc3VtZSB0aGUgaG9vayBydW5zIHN5bmNocm9ub3VzbHkgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAvLyBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX3dhcm5pbmcyWydkZWZhdWx0J10ocmVzdWx0ID09PSB1bmRlZmluZWQsICdZb3Ugc2hvdWxkIG5vdCBcInJldHVyblwiIGluIGEgdHJhbnNpdGlvbiBob29rIHdpdGggYSBjYWxsYmFjayBhcmd1bWVudDsgY2FsbCB0aGUgY2FsbGJhY2sgaW5zdGVhZCcpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHJ1blRyYW5zaXRpb25Ib29rO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgaW52YXJpYW50ID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAnTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArXG4gICAgICAgICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7IHJldHVybiBhcmdzW2FyZ0luZGV4KytdOyB9KVxuICAgICAgKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZWZyZXNoKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgZ2V0dGV4dChcIllvdSBoYXZlIHNpZ25lZCBpbiBhcyAlKHVzZXJuYW1lKXMuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnNpZ25lZEluLnVzZXJuYW1lfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnNpZ25lZE91dCkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICBnZXR0ZXh0KFwiJSh1c2VybmFtZSlzLCB5b3UgaGF2ZSBiZWVuIHNpZ25lZCBvdXQuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWV9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4gfHwgdGhpcy5wcm9wcy5zaWduZWRPdXQpIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZSBzaG93XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZVwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj57dGhpcy5nZXRNZXNzYWdlKCl9PC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5yZWZyZXNofT5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVsb2FkIHBhZ2VcIil9XG4gICAgICAgICAgPC9idXR0b24+IDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbi14cyBoaWRkZW4tc20gdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAge2dldHRleHQoXCJvciBwcmVzcyBGNSBrZXkuXCIpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHVzZXI6IHN0YXRlLmF1dGgudXNlcixcbiAgICBzaWduZWRJbjogc3RhdGUuYXV0aC5zaWduZWRJbixcbiAgICBzaWduZWRPdXQ6IHN0YXRlLmF1dGguc2lnbmVkT3V0XG4gIH07XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQkFTRV9VUkwgPSAkKCdiYXNlJykuYXR0cignaHJlZicpICsgJ3VzZXItYXZhdGFyLyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0U3JjKCkge1xuICAgIGxldCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IDEwMDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgbGV0IHVybCA9IEJBU0VfVVJMO1xuXG4gICAgaWYgKHRoaXMucHJvcHMudXNlciAmJiB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIC8vIGp1c3QgYXZhdGFyIGhhc2gsIHNpemUgYW5kIHVzZXIgaWRcbiAgICAgIHVybCArPSB0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2hhc2ggKyAnLycgKyBzaXplICsgJy8nICsgdGhpcy5wcm9wcy51c2VyLmlkICsgJy5wbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IGFwcGVuZCBhdmF0YXIgc2l6ZSB0byBmaWxlIHRvIHByb2R1Y2Ugbm8tYXZhdGFyIHBsYWNlaG9sZGVyXG4gICAgICB1cmwgKz0gc2l6ZSArICcucG5nJztcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGltZyBzcmM9e3RoaXMuZ2V0U3JjKCl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAndXNlci1hdmF0YXInfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtnZXR0ZXh0KFwiVXNlciBhdmF0YXJcIil9Lz47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRSZWFzb25NZXNzYWdlKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5tZXNzYWdlLmh0bWwpIHtcbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxlYWRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDogdGhpcy5wcm9wcy5tZXNzYWdlLmh0bWxcbiAgICAgICAgfX0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+e3RoaXMucHJvcHMubWVzc2FnZS5wbGFpbn08L3A+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcykge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcy5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgIGdldHRleHQoXCJUaGlzIGJhbiBleHBpcmVzIG9uICUoZXhwaXJlc19vbilzLlwiKSwge1xuICAgICAgICAgICAgJ2V4cGlyZXNfb24nOiB0aGlzLnByb3BzLmV4cGlyZXMuZm9ybWF0KCdMTCwgTFQnKVxuICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMucHJvcHMuZXhwaXJlcy5mcm9tTm93KClcbiAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gPGFiYnIgdGl0bGU9e3RpdGxlfT5cbiAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgPC9hYmJyPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBiYW4gaGFzIGV4cGlyZWQuXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlRoaXMgYmFuIGlzIHBlcm1hbmVudC5cIik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlIHBhZ2UtZXJyb3IgcGFnZS1lcnJvci1iYW5uZWRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1wYW5lbFwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5oaWdobGlnaHRfb2ZmPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICB7dGhpcy5nZXRSZWFzb25NZXNzYWdlKCl9XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtZXNzYWdlLWZvb3Rub3RlXCI+XG4gICAgICAgICAgICAgIHt0aGlzLmdldEV4cGlyYXRpb25NZXNzYWdlKCl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IGNsYXNzTmFtZSA9ICdidG4gJyArIHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgIGxldCBkaXNhYmxlZCA9IHRoaXMucHJvcHMuZGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5sb2FkaW5nKSB7XG4gICAgICBjbGFzc05hbWUgKz0gJyBidG4tbG9hZGluZyc7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9e3RoaXMucHJvcHMub25DbGljayA/ICdidXR0b24nIDogJ3N1Ym1pdCd9XG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XG4gICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgIHt0aGlzLnByb3BzLmxvYWRpbmcgPyA8TG9hZGVyIC8+IDogbnVsbH1cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5cbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogXCJidG4tZGVmYXVsdFwiLFxuXG4gIHR5cGU6IFwic3VibWl0XCIsXG5cbiAgbG9hZGluZzogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcblxuICBvbkNsaWNrOiBudWxsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuY29uc3QgQkFTRV9VUkwgPSAkKCdiYXNlJykuYXR0cignaHJlZicpICsgJ3VzZXItYXZhdGFyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0QXZhdGFyU2l6ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF90bXAuc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5jcm9wX29yZy5zaXplO1xuICAgIH1cbiAgfVxuXG4gIGdldEF2YXRhclNlY3JldCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF90bXAuc2VjcmV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmNyb3Bfb3JnLnNlY3JldDtcbiAgICB9XG4gIH1cblxuICBnZXRBdmF0YXJIYXNoKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnVwbG9hZCB8fCB0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2hhc2g7XG4gIH1cblxuICBnZXRJbWFnZVBhdGgoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEJBU0VfVVJMLFxuICAgICAgdGhpcy5nZXRBdmF0YXJTZWNyZXQoKSArICc6JyArIHRoaXMuZ2V0QXZhdGFySGFzaCgpLFxuICAgICAgdGhpcy5wcm9wcy51c2VyLmlkICsgJy5wbmcnXG4gICAgXS5qb2luKCcvJyk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBsZXQgY3JvcGl0ID0gJCgnLmNyb3AtZm9ybScpO1xuICAgIGNyb3BpdC53aWR0aCh0aGlzLmdldEF2YXRhclNpemUoKSk7XG5cbiAgICBjcm9waXQuY3JvcGl0KHtcbiAgICAgICd3aWR0aCc6IHRoaXMuZ2V0QXZhdGFyU2l6ZSgpLFxuICAgICAgJ2hlaWdodCc6IHRoaXMuZ2V0QXZhdGFyU2l6ZSgpLFxuICAgICAgJ2ltYWdlU3RhdGUnOiB7XG4gICAgICAgICdzcmMnOiB0aGlzLmdldEltYWdlUGF0aCgpXG4gICAgICB9LFxuICAgICAgb25JbWFnZUxvYWRlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgICAgICAvLyBjZW50ZXIgdXBsb2FkZWQgaW1hZ2VcbiAgICAgICAgICBsZXQgem9vbUxldmVsID0gY3JvcGl0LmNyb3BpdCgnem9vbScpO1xuICAgICAgICAgIGxldCBpbWFnZVNpemUgPSBjcm9waXQuY3JvcGl0KCdpbWFnZVNpemUnKTtcblxuICAgICAgICAgIC8vIGlzIGl0IHdpZGVyIHRoYW4gdGFsbGVyP1xuICAgICAgICAgIGlmIChpbWFnZVNpemUud2lkdGggPiBpbWFnZVNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgZGlzcGxheWVkV2lkdGggPSAoaW1hZ2VTaXplLndpZHRoICogem9vbUxldmVsKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRYID0gKGRpc3BsYXllZFdpZHRoIC0gdGhpcy5nZXRBdmF0YXJTaXplKCkpIC8gLTI7XG5cbiAgICAgICAgICAgIGNyb3BpdC5jcm9waXQoJ29mZnNldCcsIHtcbiAgICAgICAgICAgICAgJ3gnOiBvZmZzZXRYLFxuICAgICAgICAgICAgICAneSc6IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VTaXplLndpZHRoIDwgaW1hZ2VTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IGRpc3BsYXllZEhlaWdodCA9IChpbWFnZVNpemUuaGVpZ2h0ICogem9vbUxldmVsKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRZID0gKGRpc3BsYXllZEhlaWdodCAtIHRoaXMuZ2V0QXZhdGFyU2l6ZSgpKSAvIC0yO1xuXG4gICAgICAgICAgICBjcm9waXQuY3JvcGl0KCdvZmZzZXQnLCB7XG4gICAgICAgICAgICAgICd4JzogMCxcbiAgICAgICAgICAgICAgJ3knOiBvZmZzZXRZXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIHByZXNlcnZlZCBjcm9wXG4gICAgICAgICAgbGV0IGNyb3AgPSB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF9vcmcuY3JvcDtcbiAgICAgICAgICBpZiAoY3JvcCkge1xuICAgICAgICAgICAgY3JvcGl0LmNyb3BpdCgnem9vbScsIGNyb3Auem9vbSk7XG4gICAgICAgICAgICBjcm9waXQuY3JvcGl0KCdvZmZzZXQnLCB7XG4gICAgICAgICAgICAgICd4JzogY3JvcC54LFxuICAgICAgICAgICAgICAneSc6IGNyb3AueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAkKCcuY3JvcC1mb3JtJykuY3JvcGl0KCdkaXNhYmxlJyk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNyb3BBdmF0YXIgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnaXNMb2FkaW5nJzogdHJ1ZVxuICAgIH0pO1xuXG4gICAgbGV0IGF2YXRhclR5cGUgPSB0aGlzLnByb3BzLnVwbG9hZCA/ICdjcm9wX3RtcCcgOiAnY3JvcF9vcmcnO1xuICAgIGxldCBjcm9waXQgPSAkKCcuY3JvcC1mb3JtJyk7XG5cbiAgICBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCB7XG4gICAgICAnYXZhdGFyJzogYXZhdGFyVHlwZSxcbiAgICAgICdjcm9wJzoge1xuICAgICAgICAnb2Zmc2V0JzogY3JvcGl0LmNyb3BpdCgnb2Zmc2V0JyksXG4gICAgICAgICd6b29tJzogY3JvcGl0LmNyb3BpdCgnem9vbScpXG4gICAgICB9XG4gICAgfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKGRhdGEuYXZhdGFyX2hhc2gsIGRhdGEub3B0aW9ucyk7XG4gICAgICBzbmFja2Jhci5zdWNjZXNzKGRhdGEuZGV0YWlsKTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLnNob3dFcnJvcihyZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHkgbW9kYWwtYXZhdGFyLWNyb3BcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjcm9wLWZvcm1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyb3BpdC1pbWFnZS1wcmV2aWV3XCI+PC9kaXY+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzTmFtZT1cImNyb3BpdC1pbWFnZS16b29tLWlucHV0XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTYgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuY3JvcEF2YXRhcn1cbiAgICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy51cGxvYWQgPyBnZXR0ZXh0KFwiU2V0IGF2YXRhclwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0dGV4dChcIkNyb3AgaW1hZ2VcIil9XG4gICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0luZGV4fVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBiYXRjaCBmcm9tICdtaXNhZ28vdXRpbHMvYmF0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEdhbGxlcnlJdGVtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZWxlY3QgPSAoKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZWxlY3QodGhpcy5wcm9wcy5pbWFnZSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdGlvbiA9PT0gdGhpcy5wcm9wcy5pbWFnZSkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuICdidG4gYnRuLWF2YXRhciBidG4tZGlzYWJsZWQgYXZhdGFyLXNlbGVjdGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXIgYXZhdGFyLXNlbGVjdGVkJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXIgYnRuLWRpc2FibGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWF2YXRhcic7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zZWxlY3R9PlxuICAgICAgPGltZyBzcmM9e21pc2Fnby5nZXQoJ01FRElBX1VSTCcpICsgdGhpcy5wcm9wcy5pbWFnZX0gLz5cbiAgICA8L2J1dHRvbj5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHYWxsZXJ5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhdmF0YXJzLWdhbGxlcnlcIj5cbiAgICAgIDxoMz57dGhpcy5wcm9wcy5uYW1lfTwvaDM+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXZhdGFycy1nYWxsZXJ5LWltYWdlc1wiPlxuICAgICAgICB7YmF0Y2godGhpcy5wcm9wcy5pbWFnZXMsIDQsIG51bGwpLm1hcCgocm93LCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicm93XCIga2V5PXtpfT5cbiAgICAgICAgICAgIHtyb3cubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImNvbC14cy0zXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICB7aXRlbSA/IDxHYWxsZXJ5SXRlbSBpbWFnZT17aXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9e3RoaXMucHJvcHMuc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbj17dGhpcy5wcm9wcy5zZWxlY3Rpb259IC8+XG4gICAgICAgICAgICAgICAgICAgICAgOiA8ZGl2IGNsYXNzTmFtZT1cImJsYW5rLWF2YXRhclwiIC8+fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9KX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ3NlbGVjdGlvbic6IG51bGwsXG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZWxlY3QgPSAoaW1hZ2UpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGlvbjogaW1hZ2VcbiAgICB9KTtcbiAgfTtcblxuICBzYXZlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIsIHtcbiAgICAgIGF2YXRhcjogJ2dhbGxlcmllcycsXG4gICAgICBpbWFnZTogdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHNuYWNrYmFyLnN1Y2Nlc3MocmVzcG9uc2UuZGV0YWlsKTtcbiAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZShyZXNwb25zZS5hdmF0YXJfaGFzaCwgcmVzcG9uc2Uub3B0aW9ucyk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci1nYWxsZXJ5XCI+XG5cbiAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5nYWxsZXJpZXMubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxHYWxsZXJ5IG5hbWU9e2l0ZW0ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzPXtpdGVtLmltYWdlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uPXt0aGlzLnN0YXRlLnNlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9e3RoaXMuc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l9IC8+O1xuICAgICAgICB9KX1cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTYgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5zYXZlfVxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyF0aGlzLnN0YXRlLnNlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt0aGlzLnN0YXRlLnNlbGVjdGlvbiA/IGdldHRleHQoXCJTYXZlIGNob2ljZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXR0ZXh0KFwiU2VsZWN0IGF2YXRhclwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0luZGV4fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGNhbGxBcGkoYXZhdGFyVHlwZSkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIsIHtcbiAgICAgIGF2YXRhcjogYXZhdGFyVHlwZVxuICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgc25hY2tiYXIuc3VjY2VzcyhyZXNwb25zZS5kZXRhaWwpO1xuICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKHJlc3BvbnNlLmF2YXRhcl9oYXNoLCByZXNwb25zZS5vcHRpb25zKTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLnNob3dFcnJvcihyZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZXRHcmF2YXRhciA9ICgpID0+IHtcbiAgICB0aGlzLmNhbGxBcGkoJ2dyYXZhdGFyJyk7XG4gIH07XG5cbiAgc2V0R2VuZXJhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuY2FsbEFwaSgnZ2VuZXJhdGVkJyk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0R3JhdmF0YXJCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5ncmF2YXRhcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxCdXR0b24gb25DbGljaz17dGhpcy5zZXRHcmF2YXRhcn1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2sgYnRuLWF2YXRhci1ncmF2YXRhclwiPlxuICAgICAgICB7Z2V0dGV4dChcIkRvd25sb2FkIG15IEdyYXZhdGFyXCIpfVxuICAgICAgPC9CdXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3JvcEJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLmNyb3Bfb3JnKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dDcm9wfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9jayBidG4tYXZhdGFyLWNyb3BcIj5cbiAgICAgICAge2dldHRleHQoXCJSZS1jcm9wIHVwbG9hZGVkIGltYWdlXCIpfVxuICAgICAgPC9CdXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXBsb2FkQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMudXBsb2FkKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dVcGxvYWR9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItdXBsb2FkXCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiVXBsb2FkIG5ldyBpbWFnZVwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEdhbGxlcnlCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5nYWxsZXJpZXMpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0dhbGxlcnl9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItZ2FsbGVyeVwiPlxuICAgICAgICB7Z2V0dGV4dChcIlBpY2sgYXZhdGFyIGZyb20gZ2FsbGVyeVwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEF2YXRhclByZXZpZXcoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB1c2VyUGV2aWV3ID0ge1xuICAgICAgaWQ6IHRoaXMucHJvcHMudXNlci5pZCxcbiAgICAgIGF2YXRhcl9oYXNoOiB0aGlzLnByb3BzLm9wdGlvbnMuYXZhdGFyX2hhc2hcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYXZhdGFyLXByZXZpZXcgcHJldmlldy1sb2FkaW5nXCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17dXNlclBldmlld30gc2l6ZT1cIjIwMFwiIC8+XG4gICAgICAgIDxMb2FkZXIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhci1wcmV2aWV3XCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17dXNlclBldmlld30gc2l6ZT1cIjIwMFwiIC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1hdmF0YXItaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTVcIj5cblxuICAgICAgICAgIHt0aGlzLmdldEF2YXRhclByZXZpZXcoKX1cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtN1wiPlxuXG4gICAgICAgICAge3RoaXMuZ2V0R3JhdmF0YXJCdXR0b24oKX1cblxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5zZXRHZW5lcmF0ZWR9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2sgYnRuLWF2YXRhci1nZW5lcmF0ZVwiPlxuICAgICAgICAgICAge2dldHRleHQoXCJHZW5lcmF0ZSBteSBpbmRpdmlkdWFsIGF2YXRhclwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgIHt0aGlzLmdldENyb3BCdXR0b24oKX1cbiAgICAgICAgICB7dGhpcy5nZXRVcGxvYWRCdXR0b24oKX1cbiAgICAgICAgICB7dGhpcy5nZXRHYWxsZXJ5QnV0dG9uKCl9XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFySW5kZXggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhckNyb3AgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9jcm9wJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQXZhdGFyVXBsb2FkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvdXBsb2FkJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQXZhdGFyR2FsbGVyeSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2dhbGxlcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVBdmF0YXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIENoYW5nZUF2YXRhckVycm9yIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0RXJyb3JSZWFzb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucmVhc29uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHRoaXMucHJvcHMucmVhc29ufX0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICByZW1vdmVfY2lyY2xlX291dGxpbmVcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgICAgPC9wPlxuICAgICAgICB7dGhpcy5nZXRFcnJvclJlYXNvbigpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBhamF4LmdldCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIpLnRoZW4oKG9wdGlvbnMpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnY29tcG9uZW50JzogQXZhdGFySW5kZXgsXG4gICAgICAgICdvcHRpb25zJzogb3B0aW9ucyxcbiAgICAgICAgJ2Vycm9yJzogbnVsbFxuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBlcnJvclxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dJbmRleCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdjb21wb25lbnQnOiBBdmF0YXJJbmRleFxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dVcGxvYWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFyVXBsb2FkXG4gICAgfSk7XG4gIH07XG5cbiAgc2hvd0Nyb3AgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFyQ3JvcFxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dHYWxsZXJ5ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckdhbGxlcnlcbiAgICB9KTtcbiAgfTtcblxuICBjb21wbGV0ZUZsb3cgPSAoYXZhdGFySGFzaCwgb3B0aW9ucykgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZUF2YXRhcih0aGlzLnByb3BzLnVzZXIsIGF2YXRhckhhc2gpKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckluZGV4LFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxDaGFuZ2VBdmF0YXJFcnJvciBtZXNzYWdlPXt0aGlzLnN0YXRlLmVycm9yLmRldGFpbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb249e3RoaXMuc3RhdGUuZXJyb3IucmVhc29ufSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDx0aGlzLnN0YXRlLmNvbXBvbmVudCBvcHRpb25zPXt0aGlzLnN0YXRlLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU9e3RoaXMuY29tcGxldGVGbG93fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcj17dGhpcy5zaG93RXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0luZGV4PXt0aGlzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3JvcD17dGhpcy5zaG93Q3JvcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VXBsb2FkPXt0aGlzLnNob3dVcGxvYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0dhbGxlcnk9e3RoaXMuc2hvd0dhbGxlcnl9IC8+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgaWYgKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSB5b3VyIGF2YXRhclwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7dGhpcy5nZXRCb2R5KCl9XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICAndXNlcic6IHN0YXRlLmF1dGgudXNlclxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXJDcm9wIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvY3JvcCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgZmlsZVNpemUgZnJvbSAnbWlzYWdvL3V0aWxzL2ZpbGUtc2l6ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2ltYWdlJzogbnVsbCxcbiAgICAgICdwcmV2aWV3JzogbnVsbCxcbiAgICAgICdwcm9ncmVzcyc6IDAsXG4gICAgICAndXBsb2FkZWQnOiBudWxsLFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZUZpbGUoaW1hZ2UpIHtcbiAgICBpZiAoaW1hZ2Uuc2l6ZSA+IHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQubGltaXQpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiU2VsZWN0ZWQgZmlsZSBpcyB0b28gYmlnLiAoJShmaWxlc2l6ZSlzKVwiKSwge1xuICAgICAgICAnZmlsZXNpemUnOiBmaWxlU2l6ZShpbWFnZS5zaXplKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgbGV0IGludmFsaWRUeXBlTXNnID0gZ2V0dGV4dChcIlNlbGVjdGVkIGZpbGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLnVwbG9hZC5hbGxvd2VkX21pbWVfdHlwZXMuaW5kZXhPZihpbWFnZS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkVHlwZU1zZztcbiAgICB9XG5cbiAgICBsZXQgZXh0ZW5zaW9uRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgbG93ZXJlZEZpbGVuYW1lID0gaW1hZ2UubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQuYWxsb3dlZF9leHRlbnNpb25zLm1hcChmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChsb3dlcmVkRmlsZW5hbWUuc3Vic3RyKGV4dGVuc2lvbi5sZW5ndGggKiAtMSkgPT09IGV4dGVuc2lvbikge1xuICAgICAgICBleHRlbnNpb25Gb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWV4dGVuc2lvbkZvdW5kKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFR5cGVNc2c7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBwaWNrRmlsZSA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhdGFyLWhpZGRlbi11cGxvYWQnKS5jbGljaygpO1xuICB9O1xuXG4gIHVwbG9hZEZpbGUgPSAoKSA9PiB7XG4gICAgbGV0IGltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YXRhci1oaWRkZW4tdXBsb2FkJykuZmlsZXNbMF07XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdGhpcy52YWxpZGF0ZUZpbGUoaW1hZ2UpO1xuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpbWFnZSxcbiAgICAgICdwcmV2aWV3JzogVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZSksXG4gICAgICAncHJvZ3Jlc3MnOiAwXG4gICAgfSk7XG5cbiAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGRhdGEuYXBwZW5kKCdhdmF0YXInLCAndXBsb2FkJyk7XG4gICAgZGF0YS5hcHBlbmQoJ2ltYWdlJywgaW1hZ2UpO1xuXG4gICAgYWpheC51cGxvYWQodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCBkYXRhLCAocHJvZ3Jlc3MpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwcm9ncmVzc1xuICAgICAgfSk7XG4gICAgfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdvcHRpb25zJzogZGF0YS5vcHRpb25zLFxuICAgICAgICAndXBsb2FkZWQnOiBkYXRhLmRldGFpbFxuICAgICAgfSk7XG4gICAgICBzbmFja2Jhci5pbmZvKGdldHRleHQoXCJZb3VyIGltYWdlIGhhcyBiZWVuIHVwbG9hZGVkIGFuZCB5b3UgbWF5IG5vdyBjcm9wIGl0LlwiKSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgICAgICdpbWFnZSc6IG51bGwsXG4gICAgICAgICAgJ3Byb2dyZXNzJzogMFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRVcGxvYWRSZXF1aXJlbWVudHMob3B0aW9ucykge1xuICAgIGxldCBleHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkX2V4dGVuc2lvbnMubWFwKGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbi5zdWJzdHIoMSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUoZmlsZXMpcyBmaWxlcyBzbWFsbGVyIHRoYW4gJShsaW1pdClzXCIpLCB7XG4gICAgICAgICdmaWxlcyc6IGV4dGVuc2lvbnMuam9pbignLCAnKSxcbiAgICAgICAgJ2xpbWl0JzogZmlsZVNpemUob3B0aW9ucy5saW1pdClcbiAgICAgIH0sIHRydWUpO1xuICB9XG5cbiAgZ2V0VXBsb2FkQnV0dG9uKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci11cGxvYWRcIj5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcGljay1maWxlXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnBpY2tGaWxlfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge2dldHRleHQoXCJTZWxlY3QgZmlsZVwiKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRVcGxvYWRSZXF1aXJlbWVudHModGhpcy5wcm9wcy5vcHRpb25zLnVwbG9hZCl9XG4gICAgICAgIDwvcD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldFVwbG9hZFByb2dyZXNzTGFiZWwoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHByb2dyZXNzKXMgJSBjb21wbGV0ZVwiKSwge1xuICAgICAgICAncHJvZ3Jlc3MnOiB0aGlzLnN0YXRlLnByb2dyZXNzXG4gICAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIGdldFVwbG9hZFByb2dyZXNzKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci11cGxvYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1cGxvYWQtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICA8aW1nIHNyYz17dGhpcy5zdGF0ZS5wcmV2aWV3fSAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzcy1iYXJcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICAgICAgICAgICBhcmlhLXZhbHVlbm93PVwie3RoaXMuc3RhdGUucHJvZ3Jlc3N9XCJcbiAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9e3t3aWR0aDogdGhpcy5zdGF0ZS5wcm9ncmVzcyArICclJ319PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+e3RoaXMuZ2V0VXBsb2FkUHJvZ3Jlc3NMYWJlbCgpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlclVwbG9hZCgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgIGlkPVwiYXZhdGFyLWhpZGRlbi11cGxvYWRcIlxuICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhpZGRlbi1maWxlLXVwbG9hZFwiXG4gICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMudXBsb2FkRmlsZX0gLz5cbiAgICAgIHt0aGlzLnN0YXRlLmltYWdlID8gdGhpcy5nZXRVcGxvYWRQcm9ncmVzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0VXBsb2FkQnV0dG9uKCl9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC02IGNvbC1tZC1vZmZzZXQtM1wiPlxuXG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshIXRoaXMuc3RhdGUuaW1hZ2V9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiQ2FuY2VsXCIpfVxuICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICByZW5kZXJDcm9wKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPEF2YXRhckNyb3Agb3B0aW9ucz17dGhpcy5zdGF0ZS5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZD17dGhpcy5zdGF0ZS51cGxvYWRlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZT17dGhpcy5wcm9wcy5vbkNvbXBsZXRlfVxuICAgICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3I9e3RoaXMucHJvcHMuc2hvd0Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICBzaG93SW5kZXg9e3RoaXMucHJvcHMuc2hvd0luZGV4fSAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gKHRoaXMuc3RhdGUudXBsb2FkZWQgPyB0aGlzLnJlbmRlckNyb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyVXBsb2FkKCkpO1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGlzVmFsaWRhdGVkKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5wcm9wcy52YWxpZGF0aW9uICE9PSBcInVuZGVmaW5lZFwiO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSAnZm9ybS1ncm91cCc7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLWZlZWRiYWNrJztcbiAgICAgIGlmICh0aGlzLnByb3BzLnZhbGlkYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLXN1Y2Nlc3MnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLWVycm9yJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGdldEZlZWRiYWNrKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnZhbGlkYXRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImhlbHAtYmxvY2sgZXJyb3JzXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnZhbGlkYXRpb24ubWFwKChlcnJvciwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8cCBrZXk9e3RoaXMucHJvcHMuZm9yICsgJ0ZlZWRiYWNrSXRlbScgKyBpfT57ZXJyb3J9PC9wPjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRGZWVkYmFja0ljb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb24gZm9ybS1jb250cm9sLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIiBrZXk9e3RoaXMucHJvcHMuZm9yICsgJ0ZlZWRiYWNrSWNvbid9PlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uID8gJ2NsZWFyJyA6ICdjaGVjayd9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmVlZGJhY2tEZXNjcmlwdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRlZCgpKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gaWQ9e3RoaXMucHJvcHMuZm9yICsgJ19zdGF0dXMnfSBjbGFzc05hbWU9XCJzci1vbmx5XCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnZhbGlkYXRpb24gPyBnZXR0ZXh0KCcoZXJyb3IpJykgOiBnZXR0ZXh0KCcoc3VjY2VzcyknKX1cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRIZWxwVGV4dCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5oZWxwVGV4dCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGNsYXNzTmFtZT1cImhlbHAtYmxvY2tcIj57dGhpcy5wcm9wcy5oZWxwVGV4dH08L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuICAgICAgPGxhYmVsIGNsYXNzTmFtZT17J2NvbnRyb2wtbGFiZWwgJyArICh0aGlzLnByb3BzLmxhYmVsQ2xhc3MgfHwgJycpfVxuICAgICAgICAgICAgIGh0bWxGb3I9e3RoaXMucHJvcHMuZm9yIHx8ICcnfT5cbiAgICAgICAge3RoaXMucHJvcHMubGFiZWwgKyAnOid9XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY29udHJvbENsYXNzIHx8ICcnfT5cbiAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgIHt0aGlzLmdldEZlZWRiYWNrSWNvbigpfVxuICAgICAgICB7dGhpcy5nZXRGZWVkYmFja0Rlc2NyaXB0aW9uKCl9XG4gICAgICAgIHt0aGlzLmdldEZlZWRiYWNrKCl9XG4gICAgICAgIHt0aGlzLmdldEhlbHBUZXh0KCl9XG4gICAgICAgIHt0aGlzLnByb3BzLmV4dHJhIHx8IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVxdWlyZWQgfSBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmxldCB2YWxpZGF0ZVJlcXVpcmVkID0gcmVxdWlyZWQoKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgZXJyb3JzID0ge307XG4gICAgaWYgKCF0aGlzLnN0YXRlLnZhbGlkYXRvcnMpIHtcbiAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRvcnMgPSB7XG4gICAgICByZXF1aXJlZDogdGhpcy5zdGF0ZS52YWxpZGF0b3JzLnJlcXVpcmVkIHx8IHRoaXMuc3RhdGUudmFsaWRhdG9ycyxcbiAgICAgIG9wdGlvbmFsOiB0aGlzLnN0YXRlLnZhbGlkYXRvcnMub3B0aW9uYWwgfHwge31cbiAgICB9O1xuXG4gICAgbGV0IHZhbGlkYXRlZEZpZWxkcyA9IFtdO1xuXG4gICAgLy8gYWRkIHJlcXVpcmVkIGZpZWxkcyB0byB2YWxpZGF0aW9uXG4gICAgZm9yIChsZXQgbmFtZSBpbiB2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICBpZiAodmFsaWRhdG9ycy5yZXF1aXJlZC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgIHZhbGlkYXRvcnMucmVxdWlyZWRbbmFtZV0pIHtcbiAgICAgICAgdmFsaWRhdGVkRmllbGRzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIG9wdGlvbmFsIGZpZWxkcyB0byB2YWxpZGF0aW9uXG4gICAgZm9yIChsZXQgbmFtZSBpbiB2YWxpZGF0b3JzLm9wdGlvbmFsKSB7XG4gICAgICBpZiAodmFsaWRhdG9ycy5vcHRpb25hbC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgIHZhbGlkYXRvcnMub3B0aW9uYWxbbmFtZV0pIHtcbiAgICAgICAgdmFsaWRhdGVkRmllbGRzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgZmllbGRzIHZhbHVlc1xuICAgIGZvciAobGV0IGkgaW4gdmFsaWRhdGVkRmllbGRzKSB7XG4gICAgICBsZXQgbmFtZSA9IHZhbGlkYXRlZEZpZWxkc1tpXTtcbiAgICAgIGxldCBmaWVsZEVycm9ycyA9IHRoaXMudmFsaWRhdGVGaWVsZChuYW1lLCB0aGlzLnN0YXRlW25hbWVdKTtcblxuICAgICAgaWYgKGZpZWxkRXJyb3JzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9yc1tuYW1lXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRXJyb3JzKSB7XG4gICAgICAgIGVycm9yc1tuYW1lXSA9IGZpZWxkRXJyb3JzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIGxldCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgZm9yIChsZXQgZmllbGQgaW4gZXJyb3JzKSB7XG4gICAgICBpZiAoZXJyb3JzLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICBpZiAoZXJyb3JzW2ZpZWxkXSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFsaWRhdGVGaWVsZChuYW1lLCB2YWx1ZSkge1xuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuc3RhdGUudmFsaWRhdG9ycykge1xuICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdG9ycyA9IHtcbiAgICAgIHJlcXVpcmVkOiAodGhpcy5zdGF0ZS52YWxpZGF0b3JzLnJlcXVpcmVkIHx8IHRoaXMuc3RhdGUudmFsaWRhdG9ycylbbmFtZV0sXG4gICAgICBvcHRpb25hbDogKHRoaXMuc3RhdGUudmFsaWRhdG9ycy5vcHRpb25hbCB8fCB7fSlbbmFtZV1cbiAgICB9O1xuXG4gICAgbGV0IHJlcXVpcmVkRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkKHZhbHVlKSB8fCBmYWxzZTtcblxuICAgIGlmICh2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICBpZiAocmVxdWlyZWRFcnJvcikge1xuICAgICAgICBlcnJvcnMgPSBbcmVxdWlyZWRFcnJvcl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpIGluIHZhbGlkYXRvcnMucmVxdWlyZWQpIHtcbiAgICAgICAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9ycy5yZXF1aXJlZFtpXSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2godmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH0gZWxzZSBpZiAocmVxdWlyZWRFcnJvciA9PT0gZmFsc2UgJiYgdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgZm9yIChsZXQgaSBpbiB2YWxpZGF0b3JzLm9wdGlvbmFsKSB7XG4gICAgICAgIGxldCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0b3JzLm9wdGlvbmFsW2ldKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTsgLy8gZmFsc2UgPT09IGZpZWxkIHdhc24ndCB2YWxpZGF0ZWRcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgYmluZElucHV0ID0gKG5hbWUpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgICAgIFtuYW1lXTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICB9O1xuXG4gICAgICBsZXQgZm9ybUVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzIHx8IHt9O1xuICAgICAgZm9ybUVycm9yc1tuYW1lXSA9IHRoaXMudmFsaWRhdGVGaWVsZChuYW1lLCBuZXdTdGF0ZVtuYW1lXSk7XG4gICAgICBuZXdTdGF0ZS5lcnJvcnMgPSBmb3JtRXJyb3JzO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY2xlYW4oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhzdWNjZXNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgfVxuXG4gIGhhbmRsZVN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgIC8vIHdlIGRvbid0IHJlbG9hZCBwYWdlIG9uIHN1Ym1pc3Npb25zXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsZWFuKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogdHJ1ZX0pO1xuICAgICAgbGV0IHByb21pc2UgPSB0aGlzLnNlbmQoKTtcblxuICAgICAgaWYgKHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogZmFsc2V9KTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKHJlamVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnBhdGgpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKHRoaXMucHJvcHMucGF0aCkgPT09IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgcmV0dXJuICh0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAnJykgKyAnICcrICh0aGlzLnByb3BzLmFjdGl2ZUNsYXNzTmFtZSB8fCAnYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAnJztcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgIDwvbGk+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcImxvYWRlclwifT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGVyLXNwaW5uaW5nLXdoZWVsXCI+PC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1sb2FkZXJcIj5cbiAgICAgIDxMb2FkZXIgLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBQYW5lbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFuZWwtbWVzc2FnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUGFuZWxNZXNzYWdlIHtcbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaGVscFRleHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJoZWxwLWJsb2NrXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLmhlbHBUZXh0fVxuICAgICAgPC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmljb24gfHwgJ2luZm9fb3V0bGluZSd9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgIDwvcD5cbiAgICAgICAge3RoaXMuZ2V0SGVscFRleHQoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYW5lbExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wYW5lbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfTwvaDM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPFBhbmVsTG9hZGVyIC8+XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRIZWxwVGV4dCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLm5leHRfb24pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgICBnZXR0ZXh0KFwiWW91IHdpbGwgYmUgYWJsZSB0byBjaGFuZ2UgeW91ciB1c2VybmFtZSAlKG5leHRfY2hhbmdlKXMuXCIpLFxuICAgICAgICAgIHsnbmV4dF9jaGFuZ2UnOiB0aGlzLnByb3BzLm9wdGlvbnMubmV4dF9vbi5mcm9tTm93KCl9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgaGF2ZSB1c2VkIHVwIGF2YWlsYWJsZSBuYW1lIGNoYW5nZXMuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1mb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oMz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8UGFuZWxNZXNzYWdlIG1lc3NhZ2U9e2dldHRleHQoXCJZb3UgY2FuJ3QgY2hhbmdlIHlvdXIgdXNlcm5hbWUgYXQgdGhlIG1vbWVudC5cIil9XG4gICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXt0aGlzLmdldEhlbHBUZXh0KCl9IC8+XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHVzZXJuYW1lOiAnJyxcblxuICAgICAgdmFsaWRhdG9yczoge1xuICAgICAgICB1c2VybmFtZTogW1xuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVDb250ZW50KCksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1pbkxlbmd0aCh7XG4gICAgICAgICAgICB1c2VybmFtZV9sZW5ndGhfbWluOiBwcm9wcy5vcHRpb25zLmxlbmd0aF9taW5cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lTWF4TGVuZ3RoKHtcbiAgICAgICAgICAgIHVzZXJuYW1lX2xlbmd0aF9tYXg6IHByb3BzLm9wdGlvbnMubGVuZ3RoX21heFxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgbGV0IHBocmFzZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMuY2hhbmdlc19sZWZ0ID4gMCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJZb3UgY2FuIGNoYW5nZSB5b3VyIHVzZXJuYW1lICUoY2hhbmdlc19sZWZ0KXMgbW9yZSB0aW1lLlwiLFxuICAgICAgICBcIllvdSBjYW4gY2hhbmdlIHlvdXIgdXNlcm5hbWUgJShjaGFuZ2VzX2xlZnQpcyBtb3JlIHRpbWVzLlwiLFxuICAgICAgICB0aGlzLnByb3BzLm9wdGlvbnMuY2hhbmdlc19sZWZ0KTtcblxuICAgICAgcGhyYXNlcy5wdXNoKGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ2NoYW5nZXNfbGVmdCc6IHRoaXMucHJvcHMub3B0aW9ucy5jaGFuZ2VzX2xlZnRcbiAgICAgIH0sIHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy51c2VyLmFjbC5uYW1lX2NoYW5nZXNfZXhwaXJlID4gMCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJVc2VkIGNoYW5nZXMgcmVkZWVtIGFmdGVyICUobmFtZV9jaGFuZ2VzX2V4cGlyZSlzIGRheS5cIixcbiAgICAgICAgXCJVc2VkIGNoYW5nZXMgcmVkZWVtIGFmdGVyICUobmFtZV9jaGFuZ2VzX2V4cGlyZSlzIGRheXMuXCIsXG4gICAgICAgIHRoaXMucHJvcHMudXNlci5hY2wubmFtZV9jaGFuZ2VzX2V4cGlyZSk7XG5cbiAgICAgIHBocmFzZXMucHVzaChpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICduYW1lX2NoYW5nZXNfZXhwaXJlJzogdGhpcy5wcm9wcy51c2VyLmFjbC5uYW1lX2NoYW5nZXNfZXhwaXJlXG4gICAgICB9LCB0cnVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBocmFzZXMubGVuZ3RoID8gcGhyYXNlcy5qb2luKCcgJykgOiBudWxsO1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgbGV0IGVycm9ycyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoZXJyb3JzLnVzZXJuYW1lKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihlcnJvcnMudXNlcm5hbWVbMF0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gaWYgKHRoaXMuc3RhdGUudXNlcm5hbWUudHJpbSgpID09PSB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIHNuYWNrYmFyLmluZm8oZ2V0dGV4dChcIllvdXIgbmV3IHVzZXJuYW1lIGlzIHNhbWUgYXMgY3VycmVudCBvbmUuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLnVzZXJuYW1lLCB7XG4gICAgICAndXNlcm5hbWUnOiB0aGlzLnN0YXRlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKHN1Y2Nlc3MpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICd1c2VybmFtZSc6ICcnXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3BzLmNvbXBsZXRlKHN1Y2Nlc3MudXNlcm5hbWUsIHN1Y2Nlc3Muc2x1Zywgc3VjY2Vzcy5vcHRpb25zKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHBhbmVsLWZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keVwiPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIk5ldyB1c2VybmFtZVwiKX0gZm9yPVwiaWRfdXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIlxuICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e3RoaXMuZ2V0SGVscFRleHQoKX0+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnVzZXJuYW1lfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWZvb3RlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS04IGNvbC1zbS1vZmZzZXQtNFwiPlxuXG4gICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Mb2FkaW5nIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9hZGluZyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm1Mb2NrZWQgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9jaGFuZ2UtdXNlcm5hbWUvZm9ybS1sb2NrZWQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2VybmFtZUhpc3RvcnkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcm5hbWUtaGlzdG9yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlLCBhZGROYW1lQ2hhbmdlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHVwZGF0ZVVzZXJuYW1lIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgb3B0aW9uczogbnVsbFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IGdldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIiksXG4gICAgICBwYXJlbnQ6IGdldHRleHQoXCJDaGFuZ2UgeW91ciBvcHRpb25zXCIpXG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChbXG4gICAgICBhamF4LmdldCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC51c2VybmFtZSksXG4gICAgICBhamF4LmdldChtaXNhZ28uZ2V0KCdVU0VSTkFNRV9DSEFOR0VTX0FQSScpLCB7dXNlcjogdGhpcy5wcm9wcy51c2VyLmlkfSlcbiAgICBdKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YVsxXS5yZXN1bHRzKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNoYW5nZXNfbGVmdDogZGF0YVswXS5jaGFuZ2VzX2xlZnQsXG4gICAgICAgICAgbGVuZ3RoX21pbjogZGF0YVswXS5sZW5ndGhfbWluLFxuICAgICAgICAgIGxlbmd0aF9tYXg6IGRhdGFbMF0ubGVuZ3RoX21heCxcbiAgICAgICAgICBuZXh0X29uOiBkYXRhWzBdLm5leHRfb24gPyBtb21lbnQoZGF0YVswXS5uZXh0X29uKSA6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBvbkNvbXBsZXRlID0gKHVzZXJuYW1lLCBzbHVnLCBvcHRpb25zKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBvcHRpb25zXG4gICAgfSk7XG5cbiAgICBzdG9yZS5kaXNwYXRjaChcbiAgICAgIGFkZE5hbWVDaGFuZ2UoeyB1c2VybmFtZSwgc2x1ZyB9LCB0aGlzLnByb3BzLnVzZXIsIHRoaXMucHJvcHMudXNlcikpO1xuICAgIHN0b3JlLmRpc3BhdGNoKFxuICAgICAgdXBkYXRlVXNlcm5hbWUodGhpcy5wcm9wcy51c2VyLCB1c2VybmFtZSwgc2x1ZykpO1xuXG4gICAgc25hY2tiYXIuc3VjY2VzcyhnZXR0ZXh0KFwiWW91ciB1c2VybmFtZSBoYXMgYmVlbiBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS5cIikpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldENoYW5nZUZvcm0oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm9wdGlvbnMuY2hhbmdlc19sZWZ0ID4gMCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8Rm9ybSB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt0aGlzLnN0YXRlLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZT17dGhpcy5vbkNvbXBsZXRlfSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxGb3JtTG9ja2VkIG9wdGlvbnM9e3RoaXMuc3RhdGUub3B0aW9uc30gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Rm9ybUxvYWRpbmcgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICB7dGhpcy5nZXRDaGFuZ2VGb3JtKCl9XG4gICAgICA8VXNlcm5hbWVIaXN0b3J5IGlzTG9hZGVkPXt0aGlzLnN0YXRlLmlzTG9hZGVkfVxuICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzPXt0aGlzLnByb3BzWyd1c2VybmFtZS1oaXN0b3J5J119IC8+XG4gICAgPC9kaXY+XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU2VsZWN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NlbGVjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFllc05vU3dpdGNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3llcy1uby1zd2l0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHBhdGNoVXNlciB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG5cbiAgICAgICdpc19oaWRpbmdfcHJlc2VuY2UnOiBwcm9wcy51c2VyLmlzX2hpZGluZ19wcmVzZW5jZSxcbiAgICAgICdsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190byc6IHByb3BzLnVzZXIubGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG8sXG4gICAgICAnc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyc6IHByb3BzLnVzZXIuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyxcbiAgICAgICdzdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzJzogcHJvcHMudXNlci5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzLFxuXG4gICAgICAnZXJyb3JzJzoge31cbiAgICB9O1xuXG4gICAgdGhpcy5wcml2YXRlVGhyZWFkSW52aXRlc0Nob2ljZXMgPSBbXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAgICdpY29uJzogJ2hlbHBfb3V0bGluZScsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ0V2ZXJ5Ym9keScpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndmFsdWUnOiAxLFxuICAgICAgICAnaWNvbic6ICdkb25lX2FsbCcsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ1VzZXJzIEkgZm9sbG93JylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDIsXG4gICAgICAgICdpY29uJzogJ2hpZ2hsaWdodF9vZmYnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdOb2JvZHknKVxuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLnN1YnNjcmliZVRvQ2hvaWNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMCxcbiAgICAgICAgJ2ljb24nOiAnYm9va21hcmtfYm9yZGVyJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnTm8nKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMSxcbiAgICAgICAgJ2ljb24nOiAnYm9va21hcmsnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdCb29rbWFyaycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndmFsdWUnOiAyLFxuICAgICAgICAnaWNvbic6ICdtYWlsJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnQm9va21hcmsgd2l0aCBlLW1haWwgbm90aWZpY2F0aW9uJylcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLm9wdGlvbnMsIHtcbiAgICAgIGlzX2hpZGluZ19wcmVzZW5jZTogdGhpcy5zdGF0ZS5pc19oaWRpbmdfcHJlc2VuY2UsXG4gICAgICBsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190bzogdGhpcy5zdGF0ZS5saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190byxcbiAgICAgIHN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyxcbiAgICAgIHN1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkc1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcygpIHtcbiAgICBzdG9yZS5kaXNwYXRjaChwYXRjaFVzZXIoe1xuICAgICAgaXNfaGlkaW5nX3ByZXNlbmNlOiB0aGlzLnN0YXRlLmlzX2hpZGluZ19wcmVzZW5jZSxcbiAgICAgIGxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvOiB0aGlzLnN0YXRlLmxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvLFxuICAgICAgc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkczogdGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzLFxuICAgICAgc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkczogdGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzXG4gICAgfSkpO1xuICAgIHNuYWNrYmFyLnN1Y2Nlc3MoZ2V0dGV4dChcIllvdXIgZm9ydW0gb3B0aW9ucyBoYXZlIGJlZW4gY2hhbmdlZC5cIikpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIlBsZWFzZSByZWxvYWQgcGFnZSBhbmQgdHJ5IGFnYWluLlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiRm9ydW0gb3B0aW9uc1wiKSxcbiAgICAgIHBhcmVudDogZ2V0dGV4dChcIkNoYW5nZSB5b3VyIG9wdGlvbnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0gY2xhc3NOYW1lPVwiZm9ybS1ob3Jpem9udGFsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSBmb3J1bSBvcHRpb25zXCIpfTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHlcIj5cblxuICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgIDxsZWdlbmQ+e2dldHRleHQoXCJQcml2YWN5IHNldHRpbmdzXCIpfTwvbGVnZW5kPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiSGlkZSBteSBwcmVzZW5jZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJJZiB5b3UgaGlkZSB5b3VyIHByZXNlbmNlLCBvbmx5IG1lbWJlcnMgd2l0aCBwZXJtaXNzaW9uIHRvIHNlZSBoaWRkZW4gdXNlcnMgd2lsbCBzZWUgd2hlbiB5b3UgYXJlIG9ubGluZS5cIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2lzX2hpZGluZ19wcmVzZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxZZXNOb1N3aXRjaCBpZD1cImlkX2lzX2hpZGluZ19wcmVzZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uT249XCJ2aXNpYmlsaXR5X29mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uT2ZmPVwidmlzaWJpbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiSGlkZSBteSBwcmVzZW5jZSBmcm9tIG90aGVyIHVzZXJzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmY9e2dldHRleHQoXCJTaG93IG15IHByZXNlbmNlIHRvIG90aGVyIHVzZXJzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdpc19oaWRpbmdfcHJlc2VuY2UnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmlzX2hpZGluZ19wcmVzZW5jZX0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiUHJpdmF0ZSB0aHJlYWQgaW52aXRhdGlvbnNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2xpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgPFNlbGVjdCBpZD1cImlkX2xpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190bycpfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvfVxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9e3RoaXMucHJpdmF0ZVRocmVhZEludml0ZXNDaG9pY2VzfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgIDxsZWdlbmQ+e2dldHRleHQoXCJBdXRvbWF0aWMgc3Vic2NyaXB0aW9uc1wiKX08L2xlZ2VuZD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlRocmVhZHMgSSBzdGFydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxTZWxlY3QgaWQ9XCJpZF9zdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdzdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzJyl9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkc31cbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPXt0aGlzLnN1YnNjcmliZVRvQ2hvaWNlc30gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVGhyZWFkcyBJIHJlcGx5IHRvXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgPFNlbGVjdCBpZD1cImlkX3N1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHNcIlxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3N1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHMnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzfVxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9e3RoaXMuc3Vic2NyaWJlVG9DaG9pY2VzfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1mb290ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tOCBjb2wtc20tb2Zmc2V0LTRcIj5cblxuICAgICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiU2F2ZSBjaGFuZ2VzXCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xpJzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFNpZGVOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAgbmF2LXNpZGVcIj5cbiAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBvcHRpb24uY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi5jb21wb25lbnR9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIHtvcHRpb24uaWNvbn1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L0xpbms+O1xuICAgICAgfSl9XG4gICAgPC9kaXY+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3ROYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiA8TGkgcGF0aD17dGhpcy5wcm9wcy5iYXNlVXJsICsgb3B0aW9uLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi5jb21wb25lbnR9PlxuICAgICAgICAgIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBvcHRpb24uY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGlkZU5hdn0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIHtvcHRpb24uaWNvbn1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIHtvcHRpb24ubmFtZX1cbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgIDwvTGk+O1xuICAgICAgfSl9XG4gICAgPC91bD47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgU2lkZU5hdiwgQ29tcGFjdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IENoYW5nZUZvcnVtT3B0aW9ucyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL2ZvcnVtLW9wdGlvbnMnO1xuaW1wb3J0IENoYW5nZVVzZXJuYW1lIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL3Jvb3QnO1xuaW1wb3J0IENoYW5nZVNpZ25JbkNyZWRlbnRpYWxzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBoaWRlTmF2ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VG9nZ2xlTmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24nO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhY3ROYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYgb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYnO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLW9wdGlvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFnZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cblxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJwdWxsLWxlZnRcIj57Z2V0dGV4dChcIkNoYW5nZSB5b3VyIG9wdGlvbnNcIil9PC9oMT5cblxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1hbGlnbmVkIGJ0bi1pY29uIGJ0bi1kcm9wZG93bi10b2dnbGUgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17dGhpcy5zdGF0ZS5kcm9wZG93biA/ICd0cnVlJyA6ICdmYWxzZSd9PlxuICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBtZW51XG4gICAgICAgICAgICA8L2k+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbXBhY3ROYXZDbGFzc05hbWUoKX0+XG5cbiAgICAgICAgPENvbXBhY3ROYXYgb3B0aW9ucz17bWlzYWdvLmdldCgnVVNFUl9PUFRJT05TJyl9XG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZU5hdj17dGhpcy5oaWRlTmF2fSAvPlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC0zIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cblxuICAgICAgICAgICAgPFNpZGVOYXYgb3B0aW9ucz17bWlzYWdvLmdldCgnVVNFUl9PUFRJT05TJyl9XG4gICAgICAgICAgICAgICAgICAgICBiYXNlVXJsPXttaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJyl9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC05XCI+XG5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gICAgJ3VzZXInOiBzdG9yZS5hdXRoLnVzZXIsXG4gICAgJ3VzZXJuYW1lLWhpc3RvcnknOiBzdG9yZVsndXNlcm5hbWUtaGlzdG9yeSddXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocygpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJykgKyAnZm9ydW0tb3B0aW9ucy8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlRm9ydW1PcHRpb25zKVxuICAgIH0sXG4gICAge1xuICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpICsgJ2NoYW5nZS11c2VybmFtZS8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlVXNlcm5hbWUpXG4gICAgfSxcbiAgICB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJykgKyAnc2lnbi1pbi1jcmVkZW50aWFscy8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlU2lnbkluQ3JlZGVudGlhbHMpXG4gICAgfVxuICBdO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG5ld19lbWFpbDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgbmV3X2VtYWlsOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF0sXG4gICAgICAgIHBhc3N3b3JkOiBbXVxuICAgICAgfSxcblxuICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBsZXQgZXJyb3JzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGxldCBsZW5ndGhzID0gW1xuICAgICAgdGhpcy5zdGF0ZS5uZXdfZW1haWwudHJpbSgpLmxlbmd0aCxcbiAgICAgIHRoaXMuc3RhdGUucGFzc3dvcmQudHJpbSgpLmxlbmd0aFxuICAgIF07XG5cbiAgICBpZiAobGVuZ3Rocy5pbmRleE9mKDApICE9PSAtMSkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZpbGwgb3V0IGFsbCBmaWVsZHMuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLm5ld19lbWFpbCkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZXJyb3JzLm5ld19lbWFpbFswXSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuY2hhbmdlX2VtYWlsLCB7XG4gICAgICBuZXdfZW1haWw6IHRoaXMuc3RhdGUubmV3X2VtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuc3RhdGUucGFzc3dvcmQsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBuZXdfZW1haWw6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnXG4gICAgfSk7XG5cbiAgICBzbmFja2Jhci5zdWNjZXNzKHJlc3BvbnNlLmRldGFpbCk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLm5ld19lbWFpbCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24ubmV3X2VtYWlsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5wYXNzd29yZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidHlwZVwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSBlLW1haWwgYWRkcmVzc1wiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiTmV3IGUtbWFpbFwiKX0gZm9yPVwiaWRfbmV3X2VtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX25ld19lbWFpbFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnbmV3X2VtYWlsJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUubmV3X2VtYWlsfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiWW91ciBjdXJyZW50IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTggY29sLXNtLW9mZnNldC00XCI+XG5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBlLW1haWxcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbmV3X3Bhc3N3b3JkOiAnJyxcbiAgICAgIHJlcGVhdF9wYXNzd29yZDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgbmV3X3Bhc3N3b3JkOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICByZXBlYXRfcGFzc3dvcmQ6IFtdLFxuICAgICAgICBwYXNzd29yZDogW11cbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgbGV0IGVycm9ycyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBsZXQgbGVuZ3RocyA9IFtcbiAgICAgIHRoaXMuc3RhdGUubmV3X3Bhc3N3b3JkLnRyaW0oKS5sZW5ndGgsXG4gICAgICB0aGlzLnN0YXRlLnJlcGVhdF9wYXNzd29yZC50cmltKCkubGVuZ3RoLFxuICAgICAgdGhpcy5zdGF0ZS5wYXNzd29yZC50cmltKCkubGVuZ3RoXG4gICAgXTtcblxuICAgIGlmIChsZW5ndGhzLmluZGV4T2YoMCkgIT09IC0xKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRmlsbCBvdXQgYWxsIGZpZWxkcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubmV3X3Bhc3N3b3JkKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihlcnJvcnMubmV3X3Bhc3N3b3JkWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmQudHJpbSgpICE9PSB0aGlzLnN0YXRlLnJlcGVhdF9wYXNzd29yZC50cmltKCkpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJOZXcgcGFzc3dvcmRzIGFyZSBkaWZmZXJlbnQuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5jaGFuZ2VfcGFzc3dvcmQsIHtcbiAgICAgIG5ld19wYXNzd29yZDogdGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmQsXG4gICAgICBwYXNzd29yZDogdGhpcy5zdGF0ZS5wYXNzd29yZFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbmV3X3Bhc3N3b3JkOiAnJyxcbiAgICAgIHJlcGVhdF9wYXNzd29yZDogJycsXG4gICAgICBwYXNzd29yZDogJydcbiAgICB9KTtcblxuICAgIHNuYWNrYmFyLnN1Y2Nlc3MocmVzcG9uc2UuZGV0YWlsKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIGlmIChyZWplY3Rpb24ubmV3X3Bhc3N3b3JkKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5uZXdfcGFzc3dvcmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLnBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0eXBlXCIgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fSAvPlxuICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1mb3JtXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZ1wiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHBhc3N3b3JkXCIpfTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHlcIj5cblxuICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJOZXcgcGFzc3dvcmRcIil9IGZvcj1cImlkX25ld19wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfbmV3X3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCduZXdfcGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiUmVwZWF0IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9yZXBlYXRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImlkX3JlcGVhdF9wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncmVwZWF0X3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucmVwZWF0X3Bhc3N3b3JkfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiWW91ciBjdXJyZW50IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTggY29sLXNtLW9mZnNldC00XCI+XG5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBwYXNzd29yZFwiKX1cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGFuZ2VFbWFpbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvY2hhbmdlLWVtYWlsJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQ2hhbmdlUGFzc3dvcmQgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1wYXNzd29yZCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiQ2hhbmdlIGVtYWlsIG9yIHBhc3N3b3JkXCIpLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiQ2hhbmdlIHlvdXIgb3B0aW9uc1wiKVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdj5cbiAgICAgIDxDaGFuZ2VFbWFpbCB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+XG4gICAgICA8Q2hhbmdlUGFzc3dvcmQgdXNlcj17dGhpcy5wcm9wcy51c2VyfSAvPlxuXG4gICAgICA8cCBjbGFzc05hbWU9XCJtZXNzYWdlLWxpbmVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdGT1JHT1RURU5fUEFTU1dPUkRfVVJMJyl9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIGZvcmdvdHRlbiBwYXNzd29yZFwiKX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgcGFuZWwtYm9keS1sb2FkaW5nXCI+XG4gICAgICA8TG9hZGVyIGNsYXNzTmFtZT1cImxvYWRlciBsb2FkZXItc3BhY2VkXCIgLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEhlbHBUZXh0KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmhlbHBUZXh0KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHAgY2xhc3NOYW1lPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICB7dGhpcy5wcm9wcy5oZWxwVGV4dH1cbiAgICAgIDwvcD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgcGFuZWwtbWVzc2FnZS1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMuaWNvbiB8fCAnaW5mb19vdXRsaW5lJ31cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgICAgPC9wPlxuICAgICAgICB7dGhpcy5nZXRIZWxwVGV4dCgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgenhjdmJuIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy96eGN2Ym4nO1xuXG5leHBvcnQgY29uc3QgU1RZTEVTID0gW1xuICAncHJvZ3Jlc3MtYmFyLWRhbmdlcicsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItcHJpbWFyeScsXG4gICdwcm9ncmVzcy1iYXItc3VjY2Vzcydcbl07XG5cbmV4cG9ydCBjb25zdCBMQUJFTFMgPSBbXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHZlcnkgd2Vhay5cIiksXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHdlYWsuXCIpLFxuICBnZXR0ZXh0KFwiRW50ZXJlZCBwYXNzd29yZCBpcyBhdmVyYWdlLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgc3Ryb25nLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgdmVyeSBzdHJvbmcuXCIpXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5fc2NvcmUgPSAwO1xuICAgIHRoaXMuX3Bhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldFNjb3JlKHBhc3N3b3JkLCBpbnB1dHMpIHtcbiAgICBsZXQgY2FjaGVTdGFsZSA9IGZhbHNlO1xuXG4gICAgaWYgKHBhc3N3b3JkLnRyaW0oKSAhPT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgIGNhY2hlU3RhbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSB0aGlzLl9pbnB1dHMubGVuZ3RoKSB7XG4gICAgICBjYWNoZVN0YWxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRzLm1hcCgodmFsdWUsIGkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSAhPT0gdGhpcy5faW5wdXRzW2ldKSB7XG4gICAgICAgICAgY2FjaGVTdGFsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjYWNoZVN0YWxlKSB7XG4gICAgICB0aGlzLl9zY29yZSA9IHp4Y3Zibi5zY29yZVBhc3N3b3JkKHBhc3N3b3JkLCBpbnB1dHMpO1xuICAgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZC50cmltKCk7XG4gICAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50cmltKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcmU7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCBzY29yZSA9IHRoaXMuZ2V0U2NvcmUodGhpcy5wcm9wcy5wYXNzd29yZCwgdGhpcy5wcm9wcy5pbnB1dHMpO1xuXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiaGVscC1ibG9jayBwYXNzd29yZC1zdHJlbmd0aFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJwcm9ncmVzcy1iYXIgXCIgKyBTVFlMRVNbc2NvcmVdfVxuICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICgyMCArICgyMCAqIHNjb3JlKSkgKyAnJSd9fVxuICAgICAgICAgICAgIHJvbGU9XCJwcm9ncmVzcy1iYXJcIlxuICAgICAgICAgICAgIGFyaWEtdmFsdWVub3c9e3Njb3JlfVxuICAgICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgICAgICAgICBhcmlhLXZhbHVlbWF4PVwiNFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgIHtMQUJFTFNbc2NvcmVdfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc21hbGxcIj5cbiAgICAgICAge0xBQkVMU1tzY29yZV19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTW9kZXJhdGlvbk5hdiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vbmF2JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHVzLCB7IFN0YXR1c0ljb24sIFN0YXR1c0xhYmVsIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1zdGF0dXMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzLWRpc3BsYXlcIj5cbiAgICAgIDxTdGF0dXMgdXNlcj17dGhpcy5wcm9wcy5wcm9maWxlfSBzdGF0dXM9e3RoaXMucHJvcHMucHJvZmlsZS5zdGF0dXN9PlxuICAgICAgICA8U3RhdHVzSWNvbiB1c2VyPXt0aGlzLnByb3BzLnByb2ZpbGV9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy5wcm9maWxlLnN0YXR1c30gLz5cbiAgICAgICAgPFN0YXR1c0xhYmVsIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy5wcm9maWxlLnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbFwiIC8+XG4gICAgICA8L1N0YXR1cz5cbiAgICA8L2xpPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0VXNlclJhbmsoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5yYW5rLmlzX3RhYikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXJhbmtcIj5cbiAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy5wcm9maWxlLnJhbmsuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMucHJvZmlsZS5yYW5rLm5hbWV9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXJhbmtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPnt0aGlzLnByb3BzLnByb2ZpbGUucmFuay5uYW1lfTwvc3Bhbj5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUudGl0bGV9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnByb2ZpbGUucmFuay50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUucmFuay50aXRsZX1cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Sm9pbmVkT24oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgb24gJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMucHJvZmlsZS5qb2luZWRfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgIH0sIHRydWUpO1xuXG4gICAgbGV0IGFnZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMucHJvZmlsZS5qb2luZWRfb24uZnJvbU5vdygpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItam9pbmVkLW9uXCI+XG4gICAgICA8YWJiciB0aXRsZT17dGl0bGV9PlxuICAgICAgICB7YWdlfVxuICAgICAgPC9hYmJyPlxuICAgIDwvbGk+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRFbWFpbCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmVtYWlsKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItZW1haWxcIj5cbiAgICAgICAgPGEgaHJlZj17J21haWx0bzonICsgdGhpcy5wcm9wcy5wcm9maWxlLmVtYWlsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMucHJvZmlsZS5lbWFpbH1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRGb2xsb3dCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX2ZvbGxvdykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxGb2xsb3dCdXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1hbGlnbmVkIGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vZGVyYXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJidG4tZ3JvdXAgYnRuLWFsaWduZWQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tbW9kZXJhdGUgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgdG9uYWxpdHlcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJNb2RlcmF0aW9uXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPE1vZGVyYXRpb25OYXYgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm48ZGl2IGNsYXNzTmFtZT1cInBhZ2UtaGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtOSBjb2wtbWQtb2Zmc2V0LTNcIj5cblxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX0gc2l6ZT1cIjEwMFwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItbmFtZVwiPnt0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgPC9oMT5cblxuICAgICAgICAgICAge3RoaXMuZ2V0Rm9sbG93QnV0dG9uKCl9XG4gICAgICAgICAgICB7dGhpcy5nZXRNb2RlcmF0aW9uQnV0dG9uKCl9XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1hbGlnbmVkIGJ0bi1pY29uIGJ0bi1kcm9wZG93bi10b2dnbGUgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLnRvZ2dsZU5hdn1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXt0aGlzLnByb3BzLmRyb3Bkb3duID8gJ3RydWUnIDogJ2ZhbHNlJ30+XG4gICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICBtZW51XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGVhZGVyLXN0YXRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTkgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtaW5saW5lXCI+XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclN0YXR1cygpfVxuICAgICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJSYW5rKCl9XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclRpdGxlKCl9XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0Sm9pbmVkT24oKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5nZXRFbWFpbCgpfVxuICAgICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFuZWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUGFuZWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHRpdGxlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wYWdlLXRpdGxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGlmIChtaXNhZ28uaGFzKCdQUk9GSUxFX0JBTicpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKCdQUk9GSUxFX0JBTicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0V2l0aG91dFByZWxvYWRlZERhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhwcm9wcy5wcm9maWxlLmFwaV91cmwuYmFuKTtcbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShiYW4pIHtcbiAgICBpZiAoYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGJhbi5leHBpcmVzX29uID0gbW9tZW50KGJhbi5leHBpcmVzX29uKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICBiYW5cbiAgICB9O1xuICB9XG5cbiAgaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgc3RhcnRQb2xsaW5nKGFwaSkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICdiYW4tZGV0YWlscycsXG4gICAgICB1cmw6IGFwaSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZSxcbiAgICAgIGVycm9yOiB0aGlzLmVycm9yXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHVwZGF0ZSA9IChiYW4pID0+IHtcbiAgICBpZiAoYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGJhbi5leHBpcmVzX29uID0gbW9tZW50KGJhbi5leHBpcmVzX29uKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIGJhblxuICAgIH0pO1xuICB9O1xuXG4gIGVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGVycm9yOiBlcnJvci5kZXRhaWwsXG4gICAgICBiYW46IG51bGxcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IGdldHRleHQoXCJCYW4gZGV0YWlsc1wiKSxcbiAgICAgIHBhcmVudDogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBwb2xscy5zdG9wKCdiYW4tZGV0YWlscycpO1xuICB9XG5cbiAgZ2V0VXNlck1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYmFuLnVzZXJfbWVzc2FnZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keSBiYW4tbWVzc2FnZSBiYW4tdXNlci1tZXNzYWdlXCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIlVzZXItc2hvd24gYmFuIG1lc3NhZ2VcIil9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogdGhpcy5zdGF0ZS5iYW4udXNlcl9tZXNzYWdlLmh0bWxcbiAgICAgICAgICB9fSAvPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhZmZNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmJhbi5zdGFmZl9tZXNzYWdlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5IGJhbi1tZXNzYWdlIGJhbi1zdGFmZi1tZXNzYWdlXCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIlRlYW0tc2hvd24gYmFuIG1lc3NhZ2VcIil9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogdGhpcy5zdGF0ZS5iYW4uc3RhZmZfbWVzc2FnZS5odG1sXG4gICAgICAgICAgfX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmJhbi5leHBpcmVzX29uLmlzQWZ0ZXIobW9tZW50KCkpKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgbGV0IHRpdGxlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgb24gJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24uZnJvbU5vdygpXG4gICAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIDxhYmJyIHRpdGxlPXt0aXRsZX0+XG4gICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgIDwvYWJicj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2V0dGV4dChcIlRoaXMgYmFuIGhhcyBleHBpcmVkLlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBiYW4gaXMgcGVybWFuZW50LlwiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFBhbmVsQm9keSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5iYW4pIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlLmJhbikubGVuZ3RoKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgICAge3RoaXMuZ2V0VXNlck1lc3NhZ2UoKX1cbiAgICAgICAgICB7dGhpcy5nZXRTdGFmZk1lc3NhZ2UoKX1cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keSBiYW4tZXhwaXJlc1wiPlxuICAgICAgICAgICAgPGg0PntnZXR0ZXh0KFwiQmFuIGV4cGlyYXRpb25cIil9PC9oND5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPGRpdj5cbiAgICAgICAgICA8UGFuZWxNZXNzYWdlIG1lc3NhZ2U9e2dldHRleHQoXCJObyBiYW4gaXMgYWN0aXZlIGF0IHRoZSBtb21lbnQuXCIpfSAvPlxuICAgICAgICA8L2Rpdj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdj5cbiAgICAgICAgPFBhbmVsTWVzc2FnZSBpY29uPVwiZXJyb3Jfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvcn0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2PlxuICAgICAgICA8UGFuZWxMb2FkZXIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwcm9maWxlLWJhbi1kZXRhaWxzXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJCYW4gZGV0YWlsc1wiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7dGhpcy5nZXRQYW5lbEJvZHkoKX1cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHBhdGNoUHJvZmlsZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaXNfZm9sbG93ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICcgYnRuLWRlZmF1bHQgYnRuLWZvbGxvd2luZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICcgYnRuLWRlZmF1bHQgYnRuLWZvbGxvdyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SWNvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlzX2ZvbGxvd2VkKSB7XG4gICAgICByZXR1cm4gJ2Zhdm9yaXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdmYXZvcml0ZV9ib3JkZXInO1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaXNfZm9sbG93ZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiRm9sbG93aW5nXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkZvbGxvd1wiKTtcbiAgICB9XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGFjdGlvbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pc19mb2xsb3dlZCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2gocGF0Y2hQcm9maWxlKHtcbiAgICAgICAgaXNfZm9sbG93ZWQ6IGZhbHNlLFxuICAgICAgICBmb2xsb3dlcnM6IHRoaXMucHJvcHMucHJvZmlsZS5mb2xsb3dlcnMgLSAxXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKHBhdGNoUHJvZmlsZSh7XG4gICAgICAgIGlzX2ZvbGxvd2VkOiB0cnVlLFxuICAgICAgICBmb2xsb3dlcnM6IHRoaXMucHJvcHMucHJvZmlsZS5mb2xsb3dlcnMgKyAxXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYWpheC5wb3N0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLmZvbGxvdykudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBzdG9yZS5kaXNwYXRjaChwYXRjaFByb2ZpbGUoZGF0YSkpO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPEJ1dHRvbiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuYWN0aW9ufT5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgICAgPC9zcGFuPlxuICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICA8L0J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFNlYXJjaCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zZWFyY2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2Vyc0xpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC9yb290JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUsIGFwcGVuZCB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnNldFNwZWNpYWxQcm9wcygpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXModGhpcy5QUkVMT0FERURfREFUQV9LRVkpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U3BlY2lhbFByb3BzKCkge1xuICAgIHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZID0gJ1BST0ZJTEVfRk9MTE9XRVJTJztcbiAgICB0aGlzLlRJVExFID0gZ2V0dGV4dCgnRm9sbG93ZXJzJyk7XG4gICAgdGhpcy5BUElfRklMVEVSID0gJ2ZvbGxvd2Vycyc7XG4gIH1cblxuICBpbml0V2l0aFByZWxvYWRlZERhdGEoZGF0YSkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgbW9yZTogZGF0YS5tb3JlLFxuXG4gICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICBwYWdlczogZGF0YS5wYWdlc1xuICAgIH07XG5cbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YS5yZXN1bHRzKSk7XG4gIH1cblxuICBpbml0V2l0aG91dFByZWxvYWRlZERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfTtcblxuICAgIHRoaXMubG9hZFVzZXJzKCk7XG4gIH1cblxuICBsb2FkVXNlcnMocGFnZT0xLCBzZWFyY2g9bnVsbCkge1xuICAgIGFqYXguZ2V0KG1pc2Fnby5nZXQoJ1VTRVJTX0FQSScpLCB7XG4gICAgICBbdGhpcy5BUElfRklMVEVSXTogdGhpcy5wcm9wcy5wcm9maWxlLmlkLFxuICAgICAgbmFtZTogc2VhcmNoLFxuICAgICAgcGFnZTogcGFnZSB8fCAxXG4gICAgfSwgJ3VzZXItJyArIHRoaXMuQVBJX0ZJTFRFUikudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goYXBwZW5kKGRhdGEucmVzdWx0cykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICAgIG1vcmU6IGRhdGEubW9yZSxcblxuICAgICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiB0aGlzLlRJVExFLFxuICAgICAgcGFyZW50OiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgbG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0J1c3k6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMubG9hZFVzZXJzKHRoaXMuc3RhdGUucGFnZSArIDEsIHRoaXMuc3RhdGUuc2VhcmNoKTtcbiAgfTtcblxuICBzZWFyY2ggPSAoZXYpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogdHJ1ZSxcblxuICAgICAgc2VhcmNoOiBldi50YXJnZXQudmFsdWUsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRVc2VycygxLCBldi50YXJnZXQudmFsdWUpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoJ0xvYWRpbmcuLi4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuc2VhcmNoKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIkZvdW5kICUodXNlcnMpcyB1c2VyLlwiLFxuICAgICAgICBcIkZvdW5kICUodXNlcnMpcyB1c2Vycy5cIixcbiAgICAgICAgdGhpcy5zdGF0ZS5jb3VudCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlkID09PSB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiWW91IGhhdmUgJSh1c2VycylzIGZvbGxvd2VyLlwiLFxuICAgICAgICBcIllvdSBoYXZlICUodXNlcnMpcyBmb2xsb3dlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMgaGFzICUodXNlcnMpcyBmb2xsb3dlci5cIixcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMgaGFzICUodXNlcnMpcyBmb2xsb3dlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiU2VhcmNoIHJldHVybmVkIG5vIHVzZXJzIG1hdGNoaW5nIHNwZWNpZmllZCBjcml0ZXJpYS5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnVzZXIuaWQgPT09IHRoaXMucHJvcHMucHJvZmlsZS5pZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgaGF2ZSBubyBmb2xsb3dlcnMuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBoYXMgbm8gZm9sbG93ZXJzLlwiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vcmVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUubW9yZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZXItbW9yZVwiPlxuICAgICAgICA8QnV0dG9uIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNCdXN5fVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMubG9hZE1vcmV9PlxuICAgICAgICAgIHtpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiU2hvdyBtb3JlICglKG1vcmUpcylcIiksIHtcbiAgICAgICAgICAgICdtb3JlJzogdGhpcy5zdGF0ZS5tb3JlXG4gICAgICAgICAgfSwgdHJ1ZSl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGlzdEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQgJiYgdGhpcy5zdGF0ZS5jb3VudCA9PT0gMCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAge3RoaXMuZ2V0RW1wdHlNZXNzYWdlKCl9XG4gICAgICA8L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgIDxVc2Vyc0xpc3QgaXNMb2FkZWQ9e3RoaXMuc3RhdGUuaXNMb2FkZWR9XG4gICAgICAgICAgICAgICAgICAgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgICAgc2hvd1Jhbms9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgY29scz17Mn0gLz5cblxuICAgICAgICB7dGhpcy5nZXRNb3JlQnV0dG9uKCl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Byb2ZpbGUtJyArIHRoaXMuQVBJX0ZJTFRFUjtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cblxuICAgICAgPG5hdiBjbGFzc05hbWU9XCJ0b29sYmFyXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0b29sYmFyLWxlZnRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRMYWJlbCgpfVxuICAgICAgICA8L2gzPlxuXG4gICAgICAgIDxTZWFyY2ggY2xhc3NOYW1lPVwidG9vbGJhci1yaWdodFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc2VhcmNofVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlNlYXJjaCBoaXN0b3J5Li4uXCIpfSAvPlxuICAgICAgPC9uYXY+XG5cbiAgICAgIHt0aGlzLmdldExpc3RCb2R5KCl9XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd2VycyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvd2Vycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9sbG93ZXJzIHtcbiAgc2V0U3BlY2lhbFByb3BzKCkge1xuICAgIHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZID0gJ1BST0ZJTEVfRk9MTE9XUyc7XG4gICAgdGhpcy5USVRMRSA9IGdldHRleHQoJ0ZvbGxvd3MnKTtcbiAgICB0aGlzLkFQSV9GSUxURVIgPSAnZm9sbG93cyc7XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KCdMb2FkaW5nLi4uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlci5cIixcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pZCA9PT0gdGhpcy5wcm9wcy51c2VyLmlkKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIllvdSBhcmUgZm9sbG93aW5nICUodXNlcnMpcyB1c2VyLlwiLFxuICAgICAgICBcIllvdSBhcmUgZm9sbG93aW5nICUodXNlcnMpcyB1c2Vycy5cIixcbiAgICAgICAgdGhpcy5zdGF0ZS5jb3VudCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIiUodXNlcm5hbWUpcyBpcyBmb2xsb3dpbmcgJSh1c2VycylzIHVzZXIuXCIsXG4gICAgICAgIFwiJSh1c2VybmFtZSlzIGlzIGZvbGxvd2luZyAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiU2VhcmNoIHJldHVybmVkIG5vIHVzZXJzIG1hdGNoaW5nIHNwZWNpZmllZCBjcml0ZXJpYS5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnVzZXIuaWQgPT09IHRoaXMucHJvcHMucHJvZmlsZS5pZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgYXJlIG5vdCBmb2xsb3dpbmcgYW55IHVzZXJzLlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgbm90IGZvbGxvd2luZyBhbnkgdXNlcnMuXCIpLCB7XG4gICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgWWVzTm9Td2l0Y2ggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMveWVzLW5vLXN3aXRjaCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IE1vZGFsTWVzc2FnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1tZXNzYWdlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVBdmF0YXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcblxuICAgICAgaXNfYXZhdGFyX2xvY2tlZDogJycsXG4gICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6ICcnLFxuICAgICAgYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZTogJydcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgYWpheC5nZXQodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwubW9kZXJhdGVfYXZhdGFyKS50aGVuKChvcHRpb25zKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG5cbiAgICAgICAgaXNfYXZhdGFyX2xvY2tlZDogb3B0aW9ucy5pc19hdmF0YXJfbG9ja2VkLFxuICAgICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6IG9wdGlvbnMuYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlLFxuICAgICAgICBhdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlOiBvcHRpb25zLmF2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgZXJyb3I6IHJlamVjdGlvbi5kZXRhaWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IodGhpcy52YWxpZGF0ZSgpLnVzZXJuYW1lWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwubW9kZXJhdGVfYXZhdGFyLCB7XG4gICAgICBpc19hdmF0YXJfbG9ja2VkOiB0aGlzLnN0YXRlLmlzX2F2YXRhcl9sb2NrZWQsXG4gICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6IHRoaXMuc3RhdGUuYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlLFxuICAgICAgYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZTogdGhpcy5zdGF0ZS5hdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlQXZhdGFyKHRoaXMucHJvcHMucHJvZmlsZSwgYXBpUmVzcG9uc2UuYXZhdGFyX2hhc2gpKTtcbiAgICBzbmFja2Jhci5zdWNjZXNzKGdldHRleHQoXCJBdmF0YXIgY29udHJvbHMgaGF2ZSBiZWVuIGNoYW5nZWQuXCIpKTtcbiAgfVxuXG4gIGdldEZvcm1Cb2R5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJMb2NrIGF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17Z2V0dGV4dChcIkxvY2tpbmcgdXNlciBhdmF0YXIgd2lsbCBwcm9oaWJpdCB1c2VyIGZyb20gY2hhbmdpbmcgaGlzIGF2YXRhciBhbmQgd2lsbCByZXNldCBoaXMvaGVyIGF2YXRhciB0byBkZWZhdWx0IG9uZS5cIil9XG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfaXNfYXZhdGFyX2xvY2tlZFwiPlxuICAgICAgICAgIDxZZXNOb1N3aXRjaCBpZD1cImlkX2lzX2F2YXRhcl9sb2NrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgIGljb25Pbj1cImxvY2tfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGljb25PZmY9XCJsb2NrX29wZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiRGlzYWxsb3cgdXNlciBmcm9tIGNoYW5naW5nIGF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmY9e2dldHRleHQoXCJBbGxvdyB1c2VyIHRvIGNoYW5nZSBhdmF0YXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnaXNfYXZhdGFyX2xvY2tlZCcpfVxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5pc19hdmF0YXJfbG9ja2VkfSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVXNlciBtZXNzYWdlXCIpfVxuICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiT3B0aW9uYWwgbWVzc2FnZSBmb3IgdXNlciBleHBsYWluaW5nIHdoeSBoZS9zaGUgaXMgcHJvaGliaXRlZCBmb3JtIGNoYW5naW5nIGF2YXRhci5cIil9XG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiaWRfYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgcm93cz1cIjRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlJyl9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmF2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZX0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlN0YWZmIG1lc3NhZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJPcHRpb25hbCBtZXNzYWdlIGZvciBmb3J1bSB0ZWFtIG1lbWJlcnMgZXhwbGFpbmluZyB3aHkgdXNlciBpcyBwcm9oaWJpdGVkIGZvcm0gY2hhbmdpbmcgYXZhdGFyLlwiKX1cbiAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9hdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiaWRfYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvd3M9XCI0XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2F2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2UnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZX0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNsb3NlXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNhdmUgY2hhbmdlc1wiKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRNb2RhbEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TW9kYWxNZXNzYWdlIGljb249XCJyZW1vdmVfY2lyY2xlX291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvcn0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUJvZHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMb2FkZXIgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtYXZhdGFyLWNvbnRyb2xzXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm1vZGFsLWRpYWxvZyBtb2RhbC1hdmF0YXItY29udHJvbHNcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJBdmF0YXIgY29udHJvbHNcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldE1vZGFsQm9keSgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RhbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbWVzc2FnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgYWRkTmFtZUNoYW5nZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2VybmFtZS1oaXN0b3J5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVVc2VybmFtZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgdXNlcm5hbWU6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lQ29udGVudCgpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1heExlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGFqYXguZ2V0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLm1vZGVyYXRlX3VzZXJuYW1lKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBlcnJvcjogcmVqZWN0aW9uLmRldGFpbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcih0aGlzLnZhbGlkYXRlKCkudXNlcm5hbWVbMF0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5tb2RlcmF0ZV91c2VybmFtZSwge1xuICAgICAgdXNlcm5hbWU6IHRoaXMuc3RhdGUudXNlcm5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHVzZXJuYW1lOiAnJ1xuICAgIH0pO1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goYWRkTmFtZUNoYW5nZShcbiAgICAgIGFwaVJlc3BvbnNlLCB0aGlzLnByb3BzLnByb2ZpbGUsIHRoaXMucHJvcHMudXNlcikpO1xuICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZVVzZXJuYW1lKFxuICAgICAgdGhpcy5wcm9wcy5wcm9maWxlLCBhcGlSZXNwb25zZS51c2VybmFtZSwgYXBpUmVzcG9uc2Uuc2x1ZykpO1xuXG4gICAgc25hY2tiYXIuc3VjY2VzcyhnZXR0ZXh0KFwiVXNlcm5hbWUgaGFzIGJlZW4gY2hhbmdlZC5cIikpO1xuICB9XG5cbiAgZ2V0Rm9ybUJvZHkoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIk5ldyB1c2VybmFtZVwiKX0gZm9yPVwiaWRfdXNlcm5hbWVcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3VzZXJuYW1lJyl9XG4gICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnVzZXJuYW1lfSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2xvc2VcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfVxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldE1vZGFsQm9keSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxNb2RhbE1lc3NhZ2UgaWNvbj1cInJlbW92ZV9jaXJjbGVfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXt0aGlzLnN0YXRlLmVycm9yfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtQm9keSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtbWVzc2FnZSBtb2RhbC1yZW5hbWUtdXNlclwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtcmVuYW1lLXVzZXJcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldE1vZGFsQm9keSgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RhbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbWVzc2FnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFllc05vU3dpdGNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3llcy1uby1zd2l0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcblxuICAgICAgY291bnRkb3duOiA1LFxuICAgICAgY29uZmlybTogZmFsc2UsXG5cbiAgICAgIHdpdGhfY29udGVudDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgYWpheC5nZXQodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwuZGVsZXRlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY291bnRkb3duKCk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBlcnJvcjogcmVqZWN0aW9uLmRldGFpbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvdW50ZG93biA9ICgpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5jb3VudGRvd24gPiAxKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGNvdW50ZG93bjogdGhpcy5zdGF0ZS5jb3VudGRvd24gLSAxLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb3VudGRvd24oKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc3RhdGUuY29uZmlybSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjb25maXJtOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5kZWxldGUsIHtcbiAgICAgIHdpdGhfY29udGVudDogdGhpcy5zdGF0ZS53aXRoX2NvbnRlbnRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gICAgcG9sbHMuc3RvcCgndXNlci1wcm9maWxlJyk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS53aXRoX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RlbGV0ZWQ6IGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBhY2NvdW50LCB0aHJlYWRzLCBwb3N0cyBhbmQgb3RoZXIgY29udGVudCBoYXMgYmVlbiBkZWxldGVkLlwiKSwge1xuICAgICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgICB9LCB0cnVlKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RlbGV0ZWQ6IGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBhY2NvdW50IGhhcyBiZWVuIGRlbGV0ZWQgYW5kIG90aGVyIGNvbnRlbnQgaGFzIGJlZW4gaGlkZGVuLlwiKSwge1xuICAgICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgICB9LCB0cnVlKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnV0dG9uTGFiZWwoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY29uZmlybSkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCJEZWxldGUgJSh1c2VybmFtZSlzXCIpLCB7XG4gICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiUGxlYXNlIHdhaXQuLi4gKCUoY291bnRkb3duKXNzKVwiKSwge1xuICAgICAgICAnY291bnRkb3duJzogdGhpcy5zdGF0ZS5jb3VudGRvd25cbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZvcm0oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlVzZXIgY29udGVudFwiKX1cbiAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfd2l0aF9jb250ZW50XCI+XG4gICAgICAgICAgPFllc05vU3dpdGNoIGlkPVwiaWRfd2l0aF9jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiRGVsZXRlIHRvZ2V0aGVyIHdpdGggdXNlcidzIGFjY291bnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT2ZmPXtnZXR0ZXh0KFwiSGlkZSBhZnRlciBkZWxldGluZyB1c2VyJ3MgYWNjb3VudFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd3aXRoX2NvbnRlbnQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUud2l0aF9jb250ZW50fSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2FuY2VsXCIpfVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5zdGF0ZS5jb25maXJtfT5cbiAgICAgICAgICB7dGhpcy5nZXRCdXR0b25MYWJlbCgpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RGVsZXRlZEJvZHkoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMuc3RhdGUuaXNEZWxldGVkfVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJyl9PlxuICAgICAgICAgICAge2dldHRleHQoXCJSZXR1cm4gdG8gdXNlcnMgbGlzdFwiKX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0TW9kYWxCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPE1vZGFsTWVzc2FnZSBpY29uPVwicmVtb3ZlX2NpcmNsZV9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUuZXJyb3J9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRGVsZXRlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWxldGVkQm9keSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yIHx8IHRoaXMuc3RhdGUuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtbWVzc2FnZSBtb2RhbC1kZWxldGUtYWNjb3VudFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtZGVsZXRlLWFjY291bnRcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJEZWxldGUgdXNlciBhY2NvdW50XCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5nZXRNb2RhbEJvZHkoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhckNvbnRyb2xzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9hdmF0YXItY29udHJvbHMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBDaGFuZ2VVc2VybmFtZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vY2hhbmdlLXVzZXJuYW1lJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRGVsZXRlQWNjb3VudCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vZGVsZXRlLWFjY291bnQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xubGV0IHNlbGVjdCA9IGZ1bmN0aW9uKHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgdGljazogc3RvcmUudGljayxcbiAgICB1c2VyOiBzdG9yZS5hdXRoLFxuICAgIHByb2ZpbGU6IHN0b3JlLnByb2ZpbGUsXG4gIH07XG59O1xuLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNob3dBdmF0YXJEaWFsb2cgPSAoKSA9PiB7XG4gICAgbW9kYWwuc2hvdyhjb25uZWN0KHNlbGVjdCkoQXZhdGFyQ29udHJvbHMpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRBdmF0YXJCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlX2F2YXRhcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd0F2YXRhckRpYWxvZ30+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgcG9ydHJhaXRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJBdmF0YXIgY29udHJvbHNcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd1JlbmFtZURpYWxvZyA9ICgpID0+IHtcbiAgICBtb2RhbC5zaG93KGNvbm5lY3Qoc2VsZWN0KShDaGFuZ2VVc2VybmFtZSkpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldFJlbmFtZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmFjbC5jYW5fcmVuYW1lKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGxpPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zaG93UmVuYW1lRGlhbG9nfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBjcmVkaXRfY2FyZFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSB1c2VybmFtZVwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzaG93RGVsZXRlRGlhbG9nID0gKCkgPT4ge1xuICAgIG1vZGFsLnNob3coY29ubmVjdChzZWxlY3QpKERlbGV0ZUFjY291bnQpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXREZWxldGVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX2RlbGV0ZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd0RlbGV0ZURpYWxvZ30+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY2xlYXJcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJEZWxldGUgYWNjb3VudFwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7dGhpcy5nZXRBdmF0YXJCdXR0b24oKX1cbiAgICAgIHt0aGlzLmdldFJlbmFtZUJ1dHRvbigpfVxuICAgICAge3RoaXMuZ2V0RGVsZXRlQnV0dG9uKCl9XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlciBoaWRkZW4tbWQgaGlkZGVuLWxnXCIgLz5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zIGhpZGRlbi1tZCBoaWRkZW4tbGdcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy50b2dnbGVOYXZ9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIG1lbnVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJNZW51XCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbGknOyAvL2pzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd0J1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvdy1idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFNpZGVOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXRhKG1ldGEpIHtcbiAgICBpZiAobWV0YSkge1xuICAgICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cImJhZGdlXCI+e3RoaXMucHJvcHMucHJvZmlsZVttZXRhLmF0dHJdfTwvc3Bhbj47XG4gICAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAgbmF2LXNpZGVcIj5cbiAgICAgIHt0aGlzLnByb3BzLnBhZ2VzLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICByZXR1cm4gPExpbmsgdG89e3RoaXMucHJvcHMuYmFzZVVybCArIHBhZ2UuY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICBrZXk9e3BhZ2UuY29tcG9uZW50fT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICB7cGFnZS5pY29ufVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7cGFnZS5uYW1lfVxuICAgICAgICAgIHt0aGlzLmdldE1ldGEocGFnZS5tZXRhKX1cbiAgICAgICAgPC9MaW5rPjtcbiAgICAgIH0pfVxuICAgIDwvZGl2PjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0TmF2IGV4dGVuZHMgU2lkZU5hdiB7XG4gIHNob3dTcGVjaWFsT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wcm9maWxlLmFjbC5jYW5fZm9sbG93IHx8IHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlO1xuICB9XG5cbiAgZ2V0Rm9sbG93QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9mb2xsb3cpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Rm9sbG93QnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vZGVyYXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLnRvZ2dsZU1vZGVyYXRpb259PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgdG9uYWxpdHlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICB7Z2V0dGV4dChcIk1vZGVyYXRpb25cIil9XG4gICAgICA8L2J1dHRvbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGVjaWFsT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5zaG93U3BlY2lhbE9wdGlvbnMoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zXCI+XG4gICAgICAgIHt0aGlzLmdldEZvbGxvd0J1dHRvbigpfVxuICAgICAgICB7dGhpcy5nZXRNb2RlcmF0aW9uQnV0dG9uKCl9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgIHt0aGlzLmdldFNwZWNpYWxPcHRpb25zKCl9XG4gICAgICB7dGhpcy5zaG93U3BlY2lhbE9wdGlvbnMoKSA/IDxsaSBjbGFzc05hbWU9XCJkaXZpZGVyXCIgLz4gOiBudWxsfVxuICAgICAge3RoaXMucHJvcHMucGFnZXMubWFwKChwYWdlKSA9PiB7XG4gICAgICAgIHJldHVybiA8TGkgcGF0aD17dGhpcy5wcm9wcy5iYXNlVXJsICsgcGFnZS5jb21wb25lbnQgKyAnLyd9XG4gICAgICAgICAgICAgICAgICAga2V5PXtwYWdlLmNvbXBvbmVudH0+XG4gICAgICAgICAgPExpbmsgdG89e3RoaXMucHJvcHMuYmFzZVVybCArIHBhZ2UuY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGlkZU5hdn0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIHtwYWdlLmljb259XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB7cGFnZS5uYW1lfVxuICAgICAgICAgICAge3RoaXMuZ2V0TWV0YShwYWdlLm1ldGEpfVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9MaT47XG4gICAgICB9KX1cbiAgICA8L3VsPjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJhbkRldGFpbHMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9iYW4tZGV0YWlscyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd2VycyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvd2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd3MgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3dzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcm5hbWVIaXN0b3J5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvdXNlcm5hbWUtaGlzdG9yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEhlYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL0hlYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IE1vZGVyYXRpb25OYXYgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL25hdic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgU2lkZU5hdiwgQ29tcGFjdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3Byb2ZpbGUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRyb3Bkb3duOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhwcm9wcy5wcm9maWxlLmFwaV91cmwucm9vdCk7XG4gIH1cblxuICBzdGFydFBvbGxpbmcoYXBpKSB7XG4gICAgcG9sbHMuc3RhcnQoe1xuICAgICAgcG9sbDogJ3VzZXItcHJvZmlsZScsXG4gICAgICB1cmw6IGFwaSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhKSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdwYWdlcycpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246ICdwYWdlcydcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0b2dnbGVNb2RlcmF0aW9uID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duID09PSAnbW9kZXJhdGlvbicpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246ICdtb2RlcmF0aW9uJ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGhpZGVOYXYgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRUb2dnbGVOYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1pY29uIG9wZW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbic7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcGFjdE5hdkNsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcm9wZG93bikge1xuICAgICAgcmV0dXJuICdjb21wYWN0LW5hdiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjb21wYWN0LW5hdic7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmF2RHJvcGRvd24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdwYWdlcycpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Q29tcGFjdE5hdiBwYWdlcz17bWlzYWdvLmdldCgnUFJPRklMRV9QQUdFUycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1BST0ZJTEUnKS5hYnNvbHV0ZV91cmx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZU1vZGVyYXRpb249e3RoaXMudG9nZ2xlTW9kZXJhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlTmF2PXt0aGlzLmhpZGVOYXZ9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdtb2RlcmF0aW9uJykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxNb2RlcmF0aW9uTmF2IHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVOYXY9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVOYXY9e3RoaXMuaGlkZU5hdn0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgY29uc3QgYmFzZUNsYXNzID0gJ3BhZ2UgcGFnZS11c2VyLXByb2ZpbGUnO1xuICAgIGlmIChmYWxzZSAmJiB0aGlzLnByb3BzLnByb2ZpbGUucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIHBhZ2UtdXNlci1wcm9maWxlLScgKyB0aGlzLnByb3BzLnByb2ZpbGUucmFuay5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiYXNlQ2xhc3M7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuXG4gICAgICA8SGVhZGVyIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfVxuICAgICAgICAgICAgICB0b2dnbGVOYXY9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICB0b2dnbGVNb2RlcmF0aW9uPXt0aGlzLnRvZ2dsZU1vZGVyYXRpb259IC8+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbXBhY3ROYXZDbGFzc05hbWUoKX0+XG4gICAgICAgIHt0aGlzLmdldE5hdkRyb3Bkb3duKCl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC0zIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9maWxlLXNpZGUtYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy5wcm9maWxlfSBzaXplPVwiNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8U2lkZU5hdiBwYWdlcz17bWlzYWdvLmdldCgnUFJPRklMRV9QQUdFUycpfVxuICAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnUFJPRklMRScpLmFic29sdXRlX3VybH1cbiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTlcIj5cblxuICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RvcmUpIHtcbiAgcmV0dXJuIHtcbiAgICAndGljayc6IHN0b3JlLnRpY2sudGljayxcbiAgICAndXNlcic6IHN0b3JlLmF1dGgudXNlcixcbiAgICAndXNlcnMnOiBzdG9yZS51c2VycyxcbiAgICAncHJvZmlsZSc6IHN0b3JlLnByb2ZpbGUsXG4gICAgJ3VzZXJuYW1lLWhpc3RvcnknOiBzdG9yZVsndXNlcm5hbWUtaGlzdG9yeSddXG4gIH07XG59XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgIDxwPntcIkhlbGxvLCBJJ20gcGxhY2Vob2xkZXIgZm9yIFwiICsgdGhpcy5wcm9wcy5yb3V0ZS5uYW1lfTwvcD5cbiAgICA8L2Rpdj47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0ge1xuICAncG9zdHMnOiBQbGFjZWhvbGRlcixcbiAgJ3RocmVhZHMnOiBQbGFjZWhvbGRlcixcbiAgJ2ZvbGxvd2Vycyc6IEZvbGxvd2VycyxcbiAgJ2ZvbGxvd3MnOiBGb2xsb3dzLFxuICAndXNlcm5hbWUtaGlzdG9yeSc6IFVzZXJuYW1lSGlzdG9yeSxcbiAgJ2Jhbi1kZXRhaWxzJzogQmFuRGV0YWlsc1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzKCkge1xuICBsZXQgcGF0aHMgPSBbXTtcblxuICBtaXNhZ28uZ2V0KCdQUk9GSUxFX1BBR0VTJykuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgcGF0aHMucHVzaChPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdQUk9GSUxFJykuYWJzb2x1dGVfdXJsICsgaXRlbS5jb21wb25lbnQgKyAnLycsXG4gICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShDT01QT05FTlRTW2l0ZW0uY29tcG9uZW50XSksXG4gICAgfSkpO1xuICB9KTtcblxuICByZXR1cm4gcGF0aHM7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTZWFyY2ggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2VhcmNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcm5hbWVIaXN0b3J5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSwgYXBwZW5kIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXMoJ1BST0ZJTEVfTkFNRV9ISVNUT1JZJykpIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhQcmVsb2FkZWREYXRhKG1pc2Fnby5wb3AoJ1BST0ZJTEVfTkFNRV9ISVNUT1JZJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShkYXRhKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgaXNCdXN5OiBmYWxzZSxcblxuICAgICAgc2VhcmNoOiAnJyxcblxuICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICBtb3JlOiBkYXRhLm1vcmUsXG5cbiAgICAgIHBhZ2U6IGRhdGEucGFnZSxcbiAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgfTtcblxuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgaXNCdXN5OiBmYWxzZSxcblxuICAgICAgc2VhcmNoOiAnJyxcblxuICAgICAgY291bnQ6IDAsXG4gICAgICBtb3JlOiAwLFxuXG4gICAgICBwYWdlOiAxLFxuICAgICAgcGFnZXM6IDFcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkQ2hhbmdlcygpO1xuICB9XG5cbiAgbG9hZENoYW5nZXMocGFnZT0xLCBzZWFyY2g9bnVsbCkge1xuICAgIGFqYXguZ2V0KG1pc2Fnby5nZXQoJ1VTRVJOQU1FX0NIQU5HRVNfQVBJJyksIHtcbiAgICAgIHVzZXI6IHRoaXMucHJvcHMucHJvZmlsZS5pZCxcbiAgICAgIHNlYXJjaDogc2VhcmNoLFxuICAgICAgcGFnZTogcGFnZSB8fCAxXG4gICAgfSwgJ3NlYXJjaC11c2VybmFtZS1oaXN0b3J5JykudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goYXBwZW5kKGRhdGEucmVzdWx0cykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICAgIG1vcmU6IGRhdGEubW9yZSxcblxuICAgICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiVXNlcm5hbWUgaGlzdG9yeVwiKSxcbiAgICAgIHBhcmVudDogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGxvYWRNb3JlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNCdXN5OiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRDaGFuZ2VzKHRoaXMuc3RhdGUucGFnZSArIDEsIHRoaXMuc3RhdGUuc2VhcmNoKTtcbiAgfTtcblxuICBzZWFyY2ggPSAoZXYpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogdHJ1ZSxcblxuICAgICAgc2VhcmNoOiBldi50YXJnZXQudmFsdWUsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRDaGFuZ2VzKDEsIGV2LnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dCgnTG9hZGluZy4uLicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiRm91bmQgJShjaGFuZ2VzKXMgdXNlcm5hbWUgY2hhbmdlLlwiLFxuICAgICAgICBcIkZvdW5kICUoY2hhbmdlcylzIHVzZXJuYW1lIGNoYW5nZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAnY2hhbmdlcyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlkID09PSB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiWW91ciB1c2VybmFtZSB3YXMgY2hhbmdlZCAlKGNoYW5nZXMpcyB0aW1lLlwiLFxuICAgICAgICBcIllvdXIgdXNlcm5hbWUgd2FzIGNoYW5nZWQgJShjaGFuZ2VzKXMgdGltZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAnY2hhbmdlcyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIiUodXNlcm5hbWUpcydzIHVzZXJuYW1lIHdhcyBjaGFuZ2VkICUoY2hhbmdlcylzIHRpbWUuXCIsXG4gICAgICAgIFwiJSh1c2VybmFtZSlzJ3MgdXNlcm5hbWUgd2FzIGNoYW5nZWQgJShjaGFuZ2VzKXMgdGltZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICdjaGFuZ2VzJzogdGhpcy5zdGF0ZS5jb3VudFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW1wdHlNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJTZWFyY2ggcmV0dXJuZWQgbm8gdXNlcm5hbWUgY2hhbmdlcyBtYXRjaGluZyBzcGVjaWZpZWQgY3JpdGVyaWEuXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51c2VyLmlkID09PSB0aGlzLnByb3BzLnByb2ZpbGUuaWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiTm8gbmFtZSBjaGFuZ2VzIGhhdmUgYmVlbiByZWNvcmRlZCBmb3IgeW91ciBhY2NvdW50LlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyB1c2VybmFtZSB3YXMgbmV2ZXIgY2hhbmdlZC5cIiksIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRNb3JlQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLm1vcmUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2VyLW1vcmVcIj5cbiAgICAgICAgPEJ1dHRvbiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzQnVzeX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvYWRNb3JlfT5cbiAgICAgICAgICB7aW50ZXJwb2xhdGUoZ2V0dGV4dChcIlNob3cgb2xkZXIgKCUobW9yZSlzKVwiKSwge1xuICAgICAgICAgICAgJ21vcmUnOiB0aGlzLnN0YXRlLm1vcmVcbiAgICAgICAgICB9LCB0cnVlKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInByb2ZpbGUtdXNlcm5hbWUtaGlzdG9yeVwiPlxuXG4gICAgICA8bmF2IGNsYXNzTmFtZT1cInRvb2xiYXJcIj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgIHt0aGlzLmdldExhYmVsKCl9XG4gICAgICAgIDwvaDM+XG5cbiAgICAgICAgPFNlYXJjaCBjbGFzc05hbWU9XCJ0b29sYmFyLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5zZWFyY2h9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuc2VhcmNofVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiU2VhcmNoIGhpc3RvcnkuLi5cIil9IC8+XG4gICAgICA8L25hdj5cblxuICAgICAgPFVzZXJuYW1lSGlzdG9yeSBpc0xvYWRlZD17dGhpcy5zdGF0ZS5pc0xvYWRlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPXt0aGlzLmdldEVtcHR5TWVzc2FnZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzPXt0aGlzLnByb3BzWyd1c2VybmFtZS1oaXN0b3J5J119IC8+XG5cbiAgICAgIHt0aGlzLmdldE1vcmVCdXR0b24oKX1cblxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVnaXN0ZXJNb2RhbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9yZWdpc3Rlci5qcyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGNhcHRjaGEgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2NhcHRjaGEnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB6eGN2Ym4gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3p4Y3Zibic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdpc0xvYWRlZCc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd1JlZ2lzdGVyTW9kYWwgPSAoKSA9PiB7XG4gICAgaWYgKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykuYWNjb3VudF9hY3RpdmF0aW9uID09PSAnY2xvc2VkJykge1xuICAgICAgc25hY2tiYXIuaW5mbyhnZXR0ZXh0KFwiTmV3IHJlZ2lzdHJhdGlvbnMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZC5cIikpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgbW9kYWwuc2hvdyhSZWdpc3Rlck1vZGFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBjYXB0Y2hhLmxvYWQoKSxcbiAgICAgICAgenhjdmJuLmxvYWQoKVxuICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgICAgICAgJ2lzTG9hZGVkJzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGFsLnNob3coUmVnaXN0ZXJNb2RhbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICh0aGlzLnN0YXRlLmlzTG9hZGluZyA/ICcgYnRuLWxvYWRpbmcnIDogJycpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5zaG93UmVnaXN0ZXJNb2RhbH1cbiAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydidG4gJyArIHRoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkZWR9PlxuICAgICAge2dldHRleHQoXCJSZWdpc3RlclwiKX1cbiAgICAgIHt0aGlzLnN0YXRlLmlzTG9hZGluZyA/IDxMb2FkZXIgLz4gOiBudWxsIH1cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFBhc3N3b3JkU3RyZW5ndGggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFzc3dvcmQtc3RyZW5ndGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgY2FwdGNoYSBmcm9tICdtaXNhZ28vc2VydmljZXMvY2FwdGNoYSc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyRm9ybSBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuXG4gICAgICB1c2VybmFtZTogJycsXG4gICAgICBlbWFpbDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG4gICAgICBjYXB0Y2hhOiAnJyxcblxuICAgICAgdmFsaWRhdG9yczoge1xuICAgICAgICB1c2VybmFtZTogW1xuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVDb250ZW50KCksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKSxcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lTWF4TGVuZ3RoKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykpXG4gICAgICAgIF0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF0sXG4gICAgICAgIHBhc3N3b3JkOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICBjYXB0Y2hhOiBjYXB0Y2hhLnZhbGlkYXRvcigpXG4gICAgICB9LFxuXG4gICAgICBlcnJvcnM6IHt9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGb3JtIGNvbnRhaW5zIGVycm9ycy5cIikpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVycm9yczogdGhpcy52YWxpZGF0ZSgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnVVNFUlNfQVBJJyksIHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnN0YXRlLnVzZXJuYW1lLFxuICAgICAgZW1haWw6IHRoaXMuc3RhdGUuZW1haWwsXG4gICAgICBwYXNzd29yZDogdGhpcy5zdGF0ZS5wYXNzd29yZCxcbiAgICAgIGNhcHRjaGE6IHRoaXMuc3RhdGUuY2FwdGNoYVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHRoaXMucHJvcHMuY2FsbGJhY2soYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdlcnJvcnMnOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmVycm9ycywgcmVqZWN0aW9uKVxuICAgICAgfSk7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRm9ybSBjb250YWlucyBlcnJvcnMuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXRMZWdhbEZvb3ROb3RlKCkge1xuICAgIGlmIChtaXNhZ28uZ2V0KCdURVJNU19PRl9TRVJWSUNFX1VSTCcpKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGEgaHJlZj17bWlzYWdvLmdldCgnVEVSTVNfT0ZfU0VSVklDRV9VUkwnKX1cbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAge2dldHRleHQoXCJCeSByZWdpc3RlcmluZyB5b3UgYWdyZWUgdG8gc2l0ZSdzIHRlcm1zIGFuZCBjb25kaXRpb25zLlwiKX1cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWRpYWxvZyBtb2RhbC1yZWdpc3RlclwiIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidHlwZVwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVXNlcm5hbWVcIil9IGZvcj1cImlkX3VzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIlxuICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uPXt0aGlzLnN0YXRlLmVycm9ycy51c2VybmFtZX0+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaWRfdXNlcm5hbWVcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX3VzZXJuYW1lX3N0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3VzZXJuYW1lJyl9XG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiRS1tYWlsXCIpfSBmb3I9XCJpZF9lbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMuZW1haWx9PlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX2VtYWlsXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpZF9lbWFpbF9zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdlbWFpbCcpfVxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuZW1haWx9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMucGFzc3dvcmR9XG4gICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPXs8UGFzc3dvcmRTdHJlbmd0aCBwYXNzd29yZD17dGhpcy5zdGF0ZS5wYXNzd29yZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz17W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdfSAvPn0gPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJpZF9wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfcGFzc3dvcmRfc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICAgIHtjYXB0Y2hhLmNvbXBvbmVudCh7XG4gICAgICAgICAgICAgIGZvcm06IHRoaXMsXG4gICAgICAgICAgICAgIGxhYmVsQ2xhc3M6IFwiY29sLXNtLTRcIixcbiAgICAgICAgICAgICAgY29udHJvbENsYXNzOiBcImNvbC1zbS04XCJcbiAgICAgICAgICAgIH0pfVxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgIHt0aGlzLmdldExlZ2FsRm9vdE5vdGUoKX1cbiAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVnaXN0ZXIgYWNjb3VudFwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJDb21wbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldExlYWQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ3VzZXInKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91ciBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IHlvdSBuZWVkIHRvIGFjdGl2YXRlIGl0IGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNpZ24gaW4uXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAnYWRtaW4nKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91ciBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IGJvYXJkIGFkbWluaXN0cmF0b3Igd2lsbCBoYXZlIHRvIGFjdGl2YXRlIGl0IGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNpZ24gaW4uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN1YnNjcmlwdCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAndXNlcicpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiV2UgaGF2ZSBzZW50IGFuIGUtbWFpbCB0byAlKGVtYWlsKXMgd2l0aCBsaW5rIHRoYXQgeW91IGhhdmUgdG8gY2xpY2sgdG8gYWN0aXZhdGUgeW91ciBhY2NvdW50LlwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ2FkbWluJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJXZSB3aWxsIHNlbmQgYW4gZS1tYWlsIHRvICUoZW1haWwpcyB3aGVuIHRoaXMgdGFrZXMgcGxhY2UuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtcmVnaXN0ZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlJlZ2lzdHJhdGlvbiBjb21wbGV0ZVwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge2ludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGVhZCgpLFxuICAgICAgICAgICAgICAgIHsndXNlcm5hbWUnOiB0aGlzLnByb3BzLnVzZXJuYW1lfSwgdHJ1ZSl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge2ludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3Vic2NyaXB0KCksXG4gICAgICAgICAgICAgICAgeydlbWFpbCc6IHRoaXMucHJvcHMuZW1haWx9LCB0cnVlKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlUmVnaXN0cmF0aW9uID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKGFwaVJlc3BvbnNlLmFjdGl2YXRpb24gPT09ICdhY3RpdmUnKSB7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICBhdXRoLnNpZ25JbihhcGlSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjb21wbGV0ZTogYXBpUmVzcG9uc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gPFJlZ2lzdGVyQ29tcGxldGUgYWN0aXZhdGlvbj17dGhpcy5zdGF0ZS5jb21wbGV0ZS5hY3RpdmF0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXt0aGlzLnN0YXRlLmNvbXBsZXRlLnVzZXJuYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsPXt0aGlzLnN0YXRlLmNvbXBsZXRlLmVtYWlsfSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxSZWdpc3RlckZvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGVSZWdpc3RyYXRpb259Lz47XG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdExpbmtGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ2VtYWlsJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAnZW1haWwnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdTRU5EX0FDVElWQVRJT05fQVBJJyksIHtcbiAgICAgICdlbWFpbCc6IHRoaXMuc3RhdGUuZW1haWxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChbJ2FscmVhZHlfYWN0aXZlJywgJ2luYWN0aXZlX2FkbWluJ10uaW5kZXhPZihyZWplY3Rpb24uY29kZSkgPiAtMSkge1xuICAgICAgc25hY2tiYXIuaW5mbyhyZWplY3Rpb24uZGV0YWlsKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LWFjdGl2YXRpb24tbGlua1wiPlxuICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJZb3VyIGUtbWFpbCBhZGRyZXNzXCIpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2VtYWlsJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuZW1haWx9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNlbmQgbGlua1wiKX1cbiAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua1NlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiQWN0aXZhdGlvbiBsaW5rIHdhcyBzZW50IHRvICUoZW1haWwpc1wiKSwge1xuICAgICAgZW1haWw6IHRoaXMucHJvcHMudXNlci5lbWFpbFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsgd2VsbC1kb25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRvbmUtbWVzc2FnZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGNoZWNrXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIHt0aGlzLmdldE1lc3NhZ2UoKX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNhbGxiYWNrfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlJlcXVlc3QgYW5vdGhlciBsaW5rXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcGxldGUgPSAoYXBpUmVzcG9uc2UpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNvbXBsZXRlOiBhcGlSZXNwb25zZVxuICAgIH0pO1xuICB9O1xuXG4gIHJlc2V0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5zdGF0ZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIDxMaW5rU2VudCB1c2VyPXt0aGlzLnN0YXRlLmNvbXBsZXRlfSBjYWxsYmFjaz17dGhpcy5yZXNldH0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8UmVxdWVzdExpbmtGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlfSAvPjtcbiAgICB9O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RSZXNldEZvcm0gZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuXG4gICAgICAnZW1haWwnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICdlbWFpbCc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsKClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ1NFTkRfUEFTU1dPUkRfUkVTRVRfQVBJJyksIHtcbiAgICAgICdlbWFpbCc6IHRoaXMuc3RhdGUuZW1haWxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChbJ2luYWN0aXZlX3VzZXInLCAnaW5hY3RpdmVfYWRtaW4nXS5pbmRleE9mKHJlamVjdGlvbi5jb2RlKSA+IC0xKSB7XG4gICAgICB0aGlzLnByb3BzLnNob3dJbmFjdGl2ZVBhZ2UocmVqZWN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0XCI+XG4gICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIllvdXIgZS1tYWlsIGFkZHJlc3NcIil9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnZW1haWwnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5lbWFpbH0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiU2VuZCBsaW5rXCIpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5rU2VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCJSZXNldCBwYXNzd29yZCBsaW5rIHdhcyBzZW50IHRvICUoZW1haWwpc1wiKSwge1xuICAgICAgZW1haWw6IHRoaXMucHJvcHMudXNlci5lbWFpbFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1wYXNzd29yZC1yZXNldCB3ZWxsLWRvbmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZG9uZS1tZXNzYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY2hlY2tcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAge3RoaXMuZ2V0TWVzc2FnZSgpfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2FsbGJhY2t9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiUmVxdWVzdCBhbm90aGVyIGxpbmtcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnRJbmFjdGl2ZVBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRBY3RpdmF0ZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAnaW5hY3RpdmVfdXNlcicpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cD5cbiAgICAgICAgPGEgaHJlZj17bWlzYWdvLmdldCgnUkVRVUVTVF9BQ1RJVkFUSU9OX1VSTCcpfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIkFjdGl2YXRlIHlvdXIgYWNjb3VudC5cIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvcD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS1tZXNzYWdlIHBhZ2UtbWVzc2FnZS1pbmZvIHBhZ2UtZm9yZ290dGVuLXBhc3N3b3JkLWluYWN0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtcGFuZWxcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJZb3VyIGFjY291bnQgaXMgaW5hY3RpdmUuXCIpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICB7dGhpcy5nZXRBY3RpdmF0ZUJ1dHRvbigpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wbGV0ZSA9IChhcGlSZXNwb25zZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGFwaVJlc3BvbnNlXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzZXQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9KTtcbiAgfTtcblxuICBzaG93SW5hY3RpdmVQYWdlKGFwaVJlc3BvbnNlKSB7XG4gICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgPEFjY291bnRJbmFjdGl2ZVBhZ2UgYWN0aXZhdGlvbj17YXBpUmVzcG9uc2UuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e2FwaVJlc3BvbnNlLmRldGFpbH0gLz4sXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tb3VudCcpXG4gICAgKTtcbiAgfVxuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMuc3RhdGUuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiA8TGlua1NlbnQgdXNlcj17dGhpcy5zdGF0ZS5jb21wbGV0ZX0gY2FsbGJhY2s9e3RoaXMucmVzZXR9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPFJlcXVlc3RSZXNldEZvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0luYWN0aXZlUGFnZT17dGhpcy5zaG93SW5hY3RpdmVQYWdlfSAvPjtcbiAgICB9O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBTaWduSW5Nb2RhbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zaWduLWluLmpzJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGNsYXNzIFJlc2V0UGFzc3dvcmRGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ3Bhc3N3b3JkJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAncGFzc3dvcmQnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnBhc3N3b3JkLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IodGhpcy5zdGF0ZS5lcnJvcnMucGFzc3dvcmRbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkVudGVyIG5ldyBwYXNzd29yZC5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdDSEFOR0VfUEFTU1dPUkRfQVBJJyksIHtcbiAgICAgICdwYXNzd29yZCc6IHRoaXMuc3RhdGUucGFzc3dvcmRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVzZXQtcGFzc3dvcmRcIj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIkVudGVyIG5ldyBwYXNzd29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdwYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgcGFzc3dvcmRcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkQ2hhbmdlZFBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzLCB5b3VyIHBhc3N3b3JkIGhhcyBiZWVuIGNoYW5nZWQgc3VjY2Vzc2Z1bGx5LlwiKSwge1xuICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgc2hvd1NpZ25JbigpIHtcbiAgICBtb2RhbC5zaG93KFNpZ25Jbk1vZGFsKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLW1lc3NhZ2UgcGFnZS1tZXNzYWdlLXN1Y2Nlc3MgcGFnZS1mb3Jnb3R0ZW4tcGFzc3dvcmQtY2hhbmdlZFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLXBhbmVsXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBjaGVja1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0TWVzc2FnZSgpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiWW91IHdpbGwgaGF2ZSB0byBzaWduIGluIHVzaW5nIG5ldyBwYXNzd29yZCBiZWZvcmUgY29udGludWluZy5cIil9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5XCIgb25DbGljaz17dGhpcy5zaG93U2lnbklufT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgYXV0aC5zb2Z0U2lnbk91dCgpO1xuXG4gICAgLy8gbnVrZSBcInJlZGlyZWN0X3RvXCIgZmllbGQgc28gd2UgZG9uJ3QgZW5kXG4gICAgLy8gY29taW5nIGJhY2sgdG8gZXJyb3IgcGFnZSBhZnRlciBzaWduIGluXG4gICAgJCgnI2hpZGRlbi1sb2dpbi1mb3JtIGlucHV0W25hbWU9XCJyZWRpcmVjdF90b1wiXScpLnJlbW92ZSgpO1xuXG4gICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgPFBhc3N3b3JkQ2hhbmdlZFBhZ2UgdXNlcj17YXBpUmVzcG9uc2V9IC8+LFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbW91bnQnKVxuICAgICk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPFJlc2V0UGFzc3dvcmRGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlfSAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gXCJmb3JtLXNlYXJjaCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJmb3JtLXNlYXJjaFwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy52YWx1ZX1cbiAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX1cbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlciB8fCBnZXR0ZXh0KFwiU2VhcmNoLi4uXCIpfSAvPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICBzZWFyY2hcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2hvaWNlKCkge1xuICAgIGxldCBjaG9pY2UgPSBudWxsO1xuICAgIHRoaXMucHJvcHMuY2hvaWNlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlID09PSB0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICAgIGNob2ljZSA9IGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNob2ljZTtcbiAgfVxuXG4gIGdldEljb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hvaWNlKCkuaWNvbjtcbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZSgpLmxhYmVsO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjaGFuZ2UgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYnRuLWdyb3VwIGJ0bi1zZWxlY3QtZ3JvdXBcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tc2VsZWN0IGRyb3Bkb3duLXRvZ2dsZVwiXG4gICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlkIHx8IG51bGx9XG4gICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RoaXMucHJvcHNbJ2FyaWEtZGVzY3JpYmVkYnknXSB8fCBudWxsfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZX0+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICB7dGhpcy5nZXRJY29uKCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAge3RoaXMucHJvcHMuY2hvaWNlcy5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGtleT17aX0+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuY2hhbmdlKGl0ZW0udmFsdWUpfT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICAgIHtpdGVtLmljb259XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPjtcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdzaG93QWN0aXZhdGlvbic6IGZhbHNlLFxuXG4gICAgICAndXNlcm5hbWUnOiAnJyxcbiAgICAgICdwYXNzd29yZCc6ICcnLFxuXG4gICAgICAndmFsaWRhdG9ycyc6IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogW10sXG4gICAgICAgICdwYXNzd29yZCc6IFtdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGaWxsIG91dCBib3RoIGZpZWxkcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnQVVUSF9BUEknKSwge1xuICAgICAgJ3VzZXJuYW1lJzogdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgICdwYXNzd29yZCc6IHRoaXMuc3RhdGUucGFzc3dvcmRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gICAgbGV0IGZvcm0gPSAkKCcjaGlkZGVuLWxvZ2luLWZvcm0nKTtcblxuICAgIGZvcm0uYXBwZW5kKCc8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiAvPicpO1xuICAgIGZvcm0uYXBwZW5kKCc8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkXCIgLz4nKTtcblxuICAgIC8vIGZpbGwgb3V0IGZvcm0gd2l0aCB1c2VyIGNyZWRlbnRpYWxzIGFuZCBzdWJtaXQgaXQsIHRoaXMgd2lsbCB0ZWxsXG4gICAgLy8gTWlzYWdvIHRvIHJlZGlyZWN0IHVzZXIgYmFjayB0byByaWdodCBwYWdlLCBhbmQgd2lsbCB0cmlnZ2VyIGJyb3dzZXInc1xuICAgIC8vIGtleSByaW5nIGZlYXR1cmVcbiAgICBmb3JtLmZpbmQoJ2lucHV0W3R5cGU9XCJoaWRkZW5cIl0nKS52YWwoYWpheC5nZXRDc3JmVG9rZW4oKSk7XG4gICAgZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwicmVkaXJlY3RfdG9cIl0nKS52YWwod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICBmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJ1c2VybmFtZVwiXScpLnZhbCh0aGlzLnN0YXRlLnVzZXJuYW1lKTtcbiAgICBmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJwYXNzd29yZFwiXScpLnZhbCh0aGlzLnN0YXRlLnBhc3N3b3JkKTtcbiAgICBmb3JtLnN1Ym1pdCgpO1xuXG4gICAgLy8ga2VlcCBmb3JtIGxvYWRpbmdcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLmNvZGUgPT09ICdpbmFjdGl2ZV9hZG1pbicpIHtcbiAgICAgICAgc25hY2tiYXIuaW5mbyhyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLmNvZGUgPT09ICdpbmFjdGl2ZV91c2VyJykge1xuICAgICAgICBzbmFja2Jhci5pbmZvKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnc2hvd0FjdGl2YXRpb24nOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChyZWplY3Rpb24uY29kZSA9PT0gJ2Jhbm5lZCcpIHtcbiAgICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAzICYmIHJlamVjdGlvbi5iYW4pIHtcbiAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5iYW4pO1xuICAgICAgbW9kYWwuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldEFjdGl2YXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0FjdGl2YXRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8YSBocmVmPXttaXNhZ28uZ2V0KCdSRVFVRVNUX0FDVElWQVRJT05fVVJMJyl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1ibG9ja1wiPlxuICAgICAgICAge2dldHRleHQoXCJBY3RpdmF0ZSBhY2NvdW50XCIpfVxuICAgICAgPC9hPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZGlhbG9nIG1vZGFsLXNtIG1vZGFsLXNpZ24taW5cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlNpZ24gaW5cIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZF91c2VybmFtZVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlVzZXJuYW1lIG9yIGUtbWFpbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkX3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlBhc3N3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgIHt0aGlzLmdldEFjdGl2YXRpb25CdXR0b24oKX1cbiAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ0ZPUkdPVFRFTl9QQVNTV09SRF9VUkwnKX1cbiAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiRm9yZ290IHBhc3N3b3JkP1wiKX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbmNvbnN0IFRZUEVTX0NMQVNTRVMgPSB7XG4gICdpbmZvJzogJ2FsZXJ0LWluZm8nLFxuICAnc3VjY2Vzcyc6ICdhbGVydC1zdWNjZXNzJyxcbiAgJ3dhcm5pbmcnOiAnYWxlcnQtd2FybmluZycsXG4gICdlcnJvcic6ICdhbGVydC1kYW5nZXInXG59O1xuLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuZXhwb3J0IGNsYXNzIFNuYWNrYmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0U25hY2tiYXJDbGFzcygpIHtcbiAgICBsZXQgc25hY2tiYXJDbGFzcyA9ICdhbGVydHMtc25hY2tiYXInO1xuICAgIGlmICh0aGlzLnByb3BzLmlzVmlzaWJsZSkge1xuICAgICAgc25hY2tiYXJDbGFzcyArPSAnIGluJztcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXJDbGFzcyArPSAnIG91dCc7XG4gICAgfVxuICAgIHJldHVybiBzbmFja2JhckNsYXNzO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0U25hY2tiYXJDbGFzcygpfT5cbiAgICAgIDxwIGNsYXNzTmFtZT17J2FsZXJ0ICcgKyBUWVBFU19DTEFTU0VTW3RoaXMucHJvcHMudHlwZV19PlxuICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnNuYWNrYmFyO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVnaXN0ZXJCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVnaXN0ZXItYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU2lnbkluTW9kYWwgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2lnbi1pbi5qcyc7XG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24nO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5cbmV4cG9ydCBjbGFzcyBHdWVzdE1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzaG93U2lnbkluTW9kYWwoKSB7XG4gICAgbW9kYWwuc2hvdyhTaWduSW5Nb2RhbCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudSB1c2VyLWRyb3Bkb3duIGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJndWVzdC1wcmV2aWV3XCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIllvdSBhcmUgYnJvd3NpbmcgYXMgZ3Vlc3QuXCIpfTwvaDQ+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHtnZXR0ZXh0KCdTaWduIGluIG9yIHJlZ2lzdGVyIHRvIHN0YXJ0IGFuZCBwYXJ0aWNpcGF0ZSBpbiBkaXNjdXNzaW9ucy4nKX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTZcIj5cblxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd1NpZ25Jbk1vZGFsfT5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC14cy02XCI+XG5cbiAgICAgICAgICAgIDxSZWdpc3RlckJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJSZWdpc3RlclwiKX1cbiAgICAgICAgICAgIDwvUmVnaXN0ZXJCdXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1ZXN0TmF2IGV4dGVuZHMgR3Vlc3RNZW51IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJuYXYgbmF2LWd1ZXN0XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gbmF2YmFyLWJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd1NpZ25Jbk1vZGFsfT5cbiAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8UmVnaXN0ZXJCdXR0b24gY2xhc3NOYW1lPVwibmF2YmFyLWJ0biBidG4tcHJpbWFyeVwiPlxuICAgICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfVxuICAgICAgPC9SZWdpc3RlckJ1dHRvbj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdEd1ZXN0TmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc2hvd0d1ZXN0TWVudSgpIHtcbiAgICBkcm9wZG93bi5zaG93KEd1ZXN0TWVudSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLnNob3dHdWVzdE1lbnV9PlxuICAgICAgPEF2YXRhciBzaXplPVwiNjRcIiAvPlxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgR3Vlc3ROYXYsIENvbXBhY3RHdWVzdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXItbWVudS9ndWVzdC1uYXYnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IFVzZXJOYXYsIENvbXBhY3RVc2VyTmF2fSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLW1lbnUvdXNlci1uYXYnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiA8VXNlck5hdiB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPEd1ZXN0TmF2IC8+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0VXNlck1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnByb3BzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIDxDb21wYWN0VXNlck5hdiB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPENvbXBhY3RHdWVzdE5hdiAvPjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5hdXRoO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IENoYW5nZUF2YXRhck1vZGFsLCB7IHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvcm9vdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBkcm9wZG93biBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9iaWxlLW5hdmJhci1kcm9wZG93bic7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcblxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgbG9nb3V0KCkge1xuICAgIGxldCBkZWNpc2lvbiA9IGNvbmZpcm0oZ2V0dGV4dChcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzaWduIG91dD9cIikpO1xuICAgIGlmIChkZWNpc2lvbikge1xuICAgICAgJCgnI2hpZGRlbi1sb2dvdXQtZm9ybScpLnN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUF2YXRhcigpIHtcbiAgICBtb2RhbC5zaG93KGNvbm5lY3Qoc2VsZWN0KShDaGFuZ2VBdmF0YXJNb2RhbCkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnUgdXNlci1kcm9wZG93biBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgIHJvbGU9XCJtZW51XCI+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24taGVhZGVyXCI+XG4gICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci51c2VybmFtZX08L3N0cm9uZz5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlclwiIC8+XG4gICAgICA8bGk+XG4gICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5hYnNvbHV0ZV91cmx9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5hY2NvdW50X2NpcmNsZTwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNlZSB5b3VyIHByb2ZpbGVcIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKX0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmRvbmVfYWxsPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIG9wdGlvbnNcIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0bi1saW5rXCIgb25DbGljaz17dGhpcy5jaGFuZ2VBdmF0YXJ9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5wb3J0cmFpdDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBhdmF0YXJcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkaXZpZGVyXCIgLz5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvZ291dH0+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkxvZyBvdXRcIil9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwidWwgbmF2IG5hdmJhci1uYXYgbmF2LXVzZXJcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93blwiPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI2NFwiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPFVzZXJNZW51IHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VXNlck1lbnUoc3RhdGUpIHtcbiAgcmV0dXJuIHt1c2VyOiBzdGF0ZS5hdXRoLnVzZXJ9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdFVzZXJOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzaG93VXNlck1lbnUoKSB7XG4gICAgZHJvcGRvd24uc2hvd0Nvbm5lY3RlZCgndXNlci1tZW51JywgY29ubmVjdChzZWxlY3RVc2VyTWVudSkoVXNlck1lbnUpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuc2hvd1VzZXJNZW51fT5cbiAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNjRcIiAvPlxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENsYXNzKCkge1xuICAgIGxldCBzdGF0dXMgPSAnJztcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfYmFubmVkKSB7XG4gICAgICBzdGF0dXMgPSAnYmFubmVkJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29mZmxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29ubGluZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29mZmxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lKSB7XG4gICAgICBzdGF0dXMgPSAnb25saW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmUpIHtcbiAgICAgIHN0YXR1cyA9ICdvZmZsaW5lJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3VzZXItc3RhdHVzIHVzZXItJyArIHN0YXR1cztcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzcygpfT5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgIDwvc3Bhbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdHVzSWNvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEljb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2Jhbm5lZCkge1xuICAgICAgcmV0dXJuICdyZW1vdmVfY2lyY2xlX291dGxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2hlbHBfb3V0bGluZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2xhYmVsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2xhYmVsX291dGxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lKSB7XG4gICAgICByZXR1cm4gJ2xlbnMnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZSkge1xuICAgICAgcmV0dXJuICdwYW5vcmFtYV9maXNoX2V5ZSc7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvbiBzdGF0dXMtaWNvblwiPlxuICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgIDwvc3Bhbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0dXNMYWJlbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEhlbHAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2Jhbm5lZCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmJhbm5lZF91bnRpbCkge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBiYW5uZWQgdW50aWwgJShiYW5fZXhwaXJlcylzXCIpLCB7XG4gICAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZSxcbiAgICAgICAgICBiYW5fZXhwaXJlczogdGhpcy5wcm9wcy5zdGF0dXMuYmFubmVkX3VudGlsLmZvcm1hdCgnTEwsIExUJylcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBiYW5uZWRcIiksIHtcbiAgICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBoaWRpbmcgcHJlc2VuY2VcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBvbmxpbmUgKGhpZGRlbilcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lX2hpZGRlbikge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgd2FzIGxhc3Qgc2VlbiAlKGxhc3RfY2xpY2spcyAoaGlkZGVuKVwiKSwge1xuICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lLFxuICAgICAgICBsYXN0X2NsaWNrOiB0aGlzLnByb3BzLnN0YXR1cy5sYXN0X2NsaWNrLmZyb21Ob3coKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmUpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIGlzIG9ubGluZVwiKSwge1xuICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmUpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIHdhcyBsYXN0IHNlZW4gJShsYXN0X2NsaWNrKXNcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZSxcbiAgICAgICAgbGFzdF9jbGljazogdGhpcy5wcm9wcy5zdGF0dXMubGFzdF9jbGljay5mcm9tTm93KClcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19iYW5uZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiQmFubmVkXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkhpZGRlblwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZV9oaWRkZW4pIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiT25saW5lIChoaWRkZW4pXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZV9oaWRkZW4pIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiT2ZmbGluZSAoaGlkZGVuKVwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZSkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJPbmxpbmVcIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIk9mZmxpbmVcIik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcInN0YXR1cy1sYWJlbFwifVxuICAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy5nZXRIZWxwKCl9PlxuICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCAqIGFzIHJhbmRvbSBmcm9tICdtaXNhZ28vdXRpbHMvcmFuZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyVXNlckF2YXRhcihpdGVtKSB7XG4gICAgaWYgKGl0ZW0uY2hhbmdlZF9ieSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e2l0ZW0uY2hhbmdlZF9ieS5hYnNvbHV0ZV91cmx9IGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17aXRlbS5jaGFuZ2VkX2J5fSBzaXplPVwiMTAwXCIgLz5cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgPEF2YXRhciBzaXplPVwiMTAwXCIgLz5cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlclVzZXJuYW1lKGl0ZW0pIHtcbiAgICBpZiAoaXRlbS5jaGFuZ2VkX2J5KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGEgaHJlZj17aXRlbS5jaGFuZ2VkX2J5LmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICB7aXRlbS5jaGFuZ2VkX2J5LnVzZXJuYW1lfVxuICAgICAgPC9hPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgIHtpdGVtLmNoYW5nZWRfYnlfdXNlcm5hbWV9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXJIaXN0b3J5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1oaXN0b3J5IHVpLXJlYWR5XCI+XG4gICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5jaGFuZ2VzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCIga2V5PXtpdGVtLmlkfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWF2YXRhclwiPlxuICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJVc2VyQXZhdGFyKGl0ZW0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdXRob3JcIj5cbiAgICAgICAgICAgICAge3RoaXMucmVuZGVyVXNlcm5hbWUoaXRlbSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlXCI+XG4gICAgICAgICAgICAgIHtpdGVtLm9sZF91c2VybmFtZX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICAgIGFycm93X2ZvcndhcmRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7aXRlbS5uZXdfdXNlcm5hbWV9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWRhdGVcIj5cbiAgICAgICAgICAgICAgPGFiYnIgdGl0bGU9e2l0ZW0uY2hhbmdlZF9vbi5mb3JtYXQoJ0xMTCcpfT5cbiAgICAgICAgICAgICAgICB7aXRlbS5jaGFuZ2VkX29uLmZyb21Ob3coKX1cbiAgICAgICAgICAgICAgPC9hYmJyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT47XG4gICAgICAgIH0pfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbXB0eU1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmVtcHR5TWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJObyBuYW1lIGNoYW5nZXMgaGF2ZSBiZWVuIHJlY29yZGVkIGZvciB5b3VyIGFjY291bnQuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckVtcHR5SGlzdG9yeSgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtaGlzdG9yeSB1aS1yZWFkeVwiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbSBlbXB0eS1tZXNzYWdlXCI+XG4gICAgICAgICAge3RoaXMuZ2V0RW1wdHlNZXNzYWdlKCl9XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVySGlzdG9yeVByZXZpZXcoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWhpc3RvcnkgdWktcHJldmlld1wiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAge3JhbmRvbS5yYW5nZSgzLCA1KS5tYXAoKGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbVwiIGtleT17aX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICA8QXZhdGFyIHNpemU9XCIxMDBcIiAvPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWF1dGhvclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCAxMDApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICBhcnJvd19mb3J3YXJkXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1kYXRlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoNTAsIDEwMCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPjtcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmlzTG9hZGVkKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIaXN0b3J5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJFbXB0eUhpc3RvcnkoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGlzdG9yeVByZXZpZXcoKTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVzZXJDYXJkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzLWxpc3QvdXNlci1jYXJkJyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2VyUHJldmlldyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy1saXN0L3VzZXItcHJldmlldycgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYmF0Y2ggZnJvbSAnbWlzYWdvL3V0aWxzL2JhdGNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0UGFnZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGFnZXMgPiAxKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPFBhZ2VyIHsuLi50aGlzLnByb3BzfSAvPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIFwidXNlcnMtY2FyZHMtbGlzdCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lICsgXCIgdWktcmVhZHlcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwidXNlcnMtY2FyZHMtbGlzdCB1aS1yZWFkeVwiO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gXCJjb2wtbWQtXCIgKyAoMTIgLyB0aGlzLnByb3BzLmNvbHMpO1xuICB9XG5cbiAgZ2V0Qm9keSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pc0xvYWRlZCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIGJhdGNoKHRoaXMucHJvcHMudXNlcnMsIHRoaXMucHJvcHMuY29scykubWFwKChyb3csIHIpID0+IHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicm93XCIga2V5PXtyfT5cbiAgICAgICAgICB7cm93Lm1hcCgodXNlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbENsYXNzTmFtZSgpfSBrZXk9e3VzZXIuaWR9PlxuICAgICAgICAgICAgICA8VXNlckNhcmQgdXNlcj17dXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTdGF0dXM9e3RoaXMucHJvcHMuc2hvd1N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dSYW5rPXt0aGlzLnByb3BzLnNob3dSYW5rfSAvPlxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L2Rpdj47XG4gICAgICB9KTtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIGxldCByb3cgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9wcy5jb2xzOyBpICsrKSB7XG4gICAgICAgIHJvdy5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAge3Jvdy5tYXAoKGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q29sQ2xhc3NOYW1lKCl9IGtleT17aX0+XG4gICAgICAgICAgICA8VXNlclByZXZpZXcgc2hvd1N0YXR1cz17dGhpcy5wcm9wcy5zaG93U3RhdHVzfSAvPlxuICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwidXNlcnMtY2FyZHMtbGlzdCB1aS1yZWFkeVwiPlxuICAgICAge3RoaXMuZ2V0Qm9keSgpfVxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHVzLCB7IFN0YXR1c0ljb24sIFN0YXR1c0xhYmVsIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1zdGF0dXMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci5yYW5rLmNzc19jbGFzcykge1xuICAgICAgcmV0dXJuICd1c2VyLWNhcmQgdXNlci1jYXJkLScgKyB0aGlzLnByb3BzLnVzZXIucmFuay5jc3NfY2xhc3MgKyAnIHVpLXJlYWR5JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICd1c2VyLWNhcmQgdWktcmVhZHknO1xuICAgIH1cbiAgfVxuXG4gIGdldFVzZXJTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd1N0YXR1cykge1xuICAgICAgaWYgKHRoaXMucHJvcHMudXNlci5zdGF0dXMpIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPFN0YXR1cyB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30+XG4gICAgICAgICAgPFN0YXR1c0ljb24gdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30gLz5cbiAgICAgICAgICA8U3RhdHVzTGFiZWwgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3RoaXMucHJvcHMudXNlci5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbFwiIC8+XG4gICAgICAgIDwvU3RhdHVzPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdHVzLWljb24gdWktcHJldmlld1wiPlxuICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbCB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFJhbmtOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dSYW5rKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy51c2VyLnJhbmsuaXNfdGFiKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5yYW5rLmFic29sdXRlX3VybH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGUgcmFuay1uYW1lXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMudXNlci5yYW5rLm5hbWV9XG4gICAgICAgIDwvYT47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlIHJhbmstbmFtZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLnVzZXIucmFuay5uYW1lfVxuICAgICAgICA8L3NwYW4+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItdGl0bGVcIj57dGhpcy5wcm9wcy51c2VyLnRpdGxlfTwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VySm9pbmVkT24oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgb24gJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMudXNlci5qb2luZWRfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgIH0sIHRydWUpO1xuXG4gICAgbGV0IGFnZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMudXNlci5qb2luZWRfb24uZnJvbU5vdygpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwidXNlci1qb2luZWQtb25cIiB0aXRsZT17dGl0bGV9PlxuICAgICAge2FnZX1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZy1pbWFnZVwiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gc2l6ZT1cIjQwMFwiIGNsYXNzTmFtZT1cImJnLWltYWdlXCIgLz5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1kZXRhaWxzXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0+XG4gICAgICAgICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI0MDBcIiAvPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMudXNlci51c2VybmFtZX1cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidXNlci1zdWJzY3JpcHRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclN0YXR1cygpfVxuICAgICAgICAgICAgICB7dGhpcy5nZXRSYW5rTmFtZSgpfVxuICAgICAgICAgICAgICB7dGhpcy5nZXRVc2VyVGl0bGUoKX1cbiAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlckpvaW5lZE9uKCl9XG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1zdGF0c1wiPlxuXG4gICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC11bnN0eWxlZFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci1wb3N0cy1jb3VudFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci5wb3N0c308L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJwb3N0c1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci10aHJlYWRzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57dGhpcy5wcm9wcy51c2VyLnRocmVhZHN9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwidGhyZWFkc1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci1mb2xsb3dlcnMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIuZm9sbG93ZXJzfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcImZvbGxvd2Vyc1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgKiBhcyByYW5kb20gZnJvbSAnbWlzYWdvL3V0aWxzL3JhbmRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldFVzZXJTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd1N0YXR1cykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlld1wiPlxuICAgICAgICAgICZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J3VzZXItY2FyZCB1aS1wcmV2aWV3Jz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1jYXJkLWJnLWltYWdlXCI+XG4gICAgICAgIDxBdmF0YXIgc2l6ZT1cIjQwMFwiIGNsYXNzTmFtZT1cImJnLWltYWdlXCIgLz5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1kZXRhaWxzXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPEF2YXRhciBzaXplPVwiNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwidXNlci1uYW1lXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDYwLCAxNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2g0PlxuXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ1c2VyLXN1YnNjcmlwdFwiPlxuXG4gICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidXNlci1qb2luZWQtb25cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtc3RhdHNcIj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItcG9zdHMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcInBvc3RzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRocmVhZHMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcInRocmVhZHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItZm9sbG93ZXJzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJmb2xsb3dlcnNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0RW1wdHlNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgIGdldHRleHQoXCJObyB1c2VycyBoYXZlIHBvc3RlZCBhbnkgbmV3IG1lc3NhZ2VzIGR1cmluZyBsYXN0ICUoZGF5cylzIGRheXMuXCIpLFxuICAgICAgeydkYXlzJzogdGhpcy5wcm9wcy50cmFja2VkUGVyaW9kfSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImFjdGl2ZS1wb3N0ZXJzLWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRFbXB0eU1lc3NhZ2UoKX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTdGF0dXMsIHsgU3RhdHVzSWNvbiwgU3RhdHVzTGFiZWwgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLXN0YXR1cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiBcImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLXJhbmstXCIgKyB0aGlzLnByb3BzLnJhbmsuY3NzX2NsYXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJsaXN0LWdyb3VwLWl0ZW1cIjtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVzZXIuc3RhdHVzKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPFN0YXR1cyB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30+XG4gICAgICAgIDxTdGF0dXNJY29uIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXt0aGlzLnByb3BzLnVzZXIuc3RhdHVzfSAvPlxuICAgICAgICA8U3RhdHVzTGFiZWwgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXt0aGlzLnByb3BzLnVzZXIuc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic3RhdHVzLWxhYmVsIGhpZGRlbi14cyBoaWRkZW4tc21cIiAvPlxuICAgICAgPC9TdGF0dXM+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlldyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldFJhbmtOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJhbmsuaXNfdGFiKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBsZXQgcmFua1VybCA9IG1pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJykgKyB0aGlzLnByb3BzLnJhbmsuc2x1ZyArICcvJztcbiAgICAgIHJldHVybiA8TGluayB0bz17cmFua1VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZSByYW5rLW5hbWVcIj5cbiAgICAgICAge3RoaXMucHJvcHMucmFuay5uYW1lfVxuICAgICAgPC9MaW5rPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlIHJhbmstbmFtZVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5yYW5rLm5hbWV9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItdGl0bGUgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy51c2VyLnRpdGxlfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXItYXZhdGFyXCI+XG4gICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5hYnNvbHV0ZV91cmx9PlxuICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNTBcIiAvPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAge3RoaXMuZ2V0UmFua05hbWUoKX1cbiAgICAgICAge3RoaXMuZ2V0VXNlclRpdGxlKCl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc2l0aW9uXCI+XG4gICAgICAgIDxzdHJvbmc+I3t0aGlzLnByb3BzLmNvdW50ZXJ9PC9zdHJvbmc+XG4gICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlJhbmtcIil9PC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstcG9zdHMtY291bnRlZFwiPlxuICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIubWV0YS5zY29yZX08L3N0cm9uZz5cbiAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiUmFua2VkIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc3RzLXRvdGFsXCI+XG4gICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci5wb3N0c308L3N0cm9uZz5cbiAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiVG90YWwgcG9zdHNcIil9PC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbGk+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCAqIGFzIHJhbmRvbSBmcm9tICdtaXNhZ28vdXRpbHMvcmFuZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycy1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkIHVpLXByZXZpZXctcGFyYWdyYXBoXCI+XG4gICAgICAgICAge3JhbmRvbS5yYW5nZSgzLCA0KS5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8c3BhbiBrZXk9e2l9IGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoNTAsIDEyMCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFjdGl2ZS1wb3N0ZXJzIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICAgICAge3JhbmRvbS5yYW5nZSg1LCAxMCkubWFwKChpLCBjb3VudGVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8bGkga2V5PXtpfSBjbGFzc05hbWU9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstdXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8QXZhdGFyIHNpemU9XCI1MFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstdXNlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoMzAsIDgwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlldyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJhbmstbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiBcIjMwcHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiUmFua1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc3RzLWNvdW50ZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IFwiMzBweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJSYW5rZWQgcG9zdHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3N0cy10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogXCIzMHB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlRvdGFsIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbGk+O1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1pdGVtJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TGVhZE1lc3NhZ2UoKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHBvc3RlcnMpcyBtb3N0IGFjdGl2ZSBwb3N0ZXIgZnJvbSBsYXN0ICUoZGF5cylzIGRheXMuXCIsXG4gICAgICAgIFwiJShwb3N0ZXJzKXMgbW9zdCBhY3RpdmUgcG9zdGVycyBmcm9tIGxhc3QgJShkYXlzKXMgZGF5cy5cIixcbiAgICAgICAgdGhpcy5wcm9wcy5jb3VudCk7XG5cbiAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgcG9zdGVyczogdGhpcy5wcm9wcy5jb3VudCxcbiAgICAgIGRheXM6IHRoaXMucHJvcHMudHJhY2tlZFBlcmlvZFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycy1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMuZ2V0TGVhZE1lc3NhZ2UoKX1cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWN0aXZlLXBvc3RlcnMgdWktcmVhZHlcIj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMudXNlcnMubWFwKCh1c2VyLCBpKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8TGlzdEl0ZW0gdXNlcj17dXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rPXt1c2VyLnJhbmt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcj17aSArIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt1c2VyLmlkfSAvPjtcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExpc3RFbXB0eSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0LWVtcHR5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdExvYWRpbmcgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1sb2FkaW5nJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnO1xuaW1wb3J0IHBvbGxzIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wb2xscyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAobWlzYWdvLmhhcygnVVNFUlMnKSkge1xuICAgICAgdGhpcy5pbml0V2l0aFByZWxvYWRlZERhdGEobWlzYWdvLnBvcCgnVVNFUlMnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFBvbGxpbmcoKTtcbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShkYXRhKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuXG4gICAgICB0cmFja2VkUGVyaW9kOiBkYXRhLnRyYWNrZWRfcGVyaW9kLFxuICAgICAgY291bnQ6IGRhdGEuY291bnRcbiAgICB9O1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICB9XG5cbiAgaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgc3RhcnRQb2xsaW5nKCkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICdhY3RpdmUtcG9zdGVycycsXG4gICAgICB1cmw6IG1pc2Fnby5nZXQoJ1VTRVJTX0FQSScpLFxuICAgICAgZGF0YToge1xuICAgICAgICBsaXN0OiAnYWN0aXZlJ1xuICAgICAgfSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG5cbiAgICAgIHRyYWNrZWRQZXJpb2Q6IGRhdGEudHJhY2tlZF9wZXJpb2QsXG4gICAgICBjb3VudDogZGF0YS5jb3VudFxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogdGhpcy5wcm9wcy5yb3V0ZS5leHRyYS5uYW1lLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHBvbGxzLnN0b3AoJ2FjdGl2ZS1wb3N0ZXJzJyk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmNvdW50ID4gMCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8TGlzdCB1c2Vycz17dGhpcy5wcm9wcy51c2Vyc31cbiAgICAgICAgICAgICAgICAgICAgIHRyYWNrZWRQZXJpb2Q9e3RoaXMuc3RhdGUudHJhY2tlZFBlcmlvZH1cbiAgICAgICAgICAgICAgICAgICAgIGNvdW50PXt0aGlzLnN0YXRlLmNvdW50fSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxMaXN0RW1wdHkgdHJhY2tlZFBlcmlvZD17dGhpcy5zdGF0ZS50cmFja2VkUGVyaW9kfSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMaXN0TG9hZGluZyAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMaSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9saSc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5cbi8vIGpzaGludCBpZ25vcmU6c3RhcnRcbmxldCBsaXN0VXJsID0gZnVuY3Rpb24oYmFzZVVybCwgbGlzdCkge1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKGxpc3QuY29tcG9uZW50ID09PSAncmFuaycpIHtcbiAgICB1cmwgKz0gbGlzdC5zbHVnO1xuICB9IGVsc2Uge1xuICAgIHVybCArPSBsaXN0LmNvbXBvbmVudDtcbiAgfVxuICByZXR1cm4gdXJsICsgJy8nO1xufTtcblxubGV0IG5hdkxpbmtzID0gZnVuY3Rpb24oYmFzZVVybCwgbGlzdHMsIGhpZGVOYXYpIHtcbiAgICByZXR1cm4gbGlzdHMubWFwKGZ1bmN0aW9uKGxpc3QpIHtcbiAgICAgIGxldCB1cmwgPSBsaXN0VXJsKGJhc2VVcmwsIGxpc3QpO1xuICAgICAgcmV0dXJuIDxMaSBwYXRoPXt1cmx9XG4gICAgICAgICAgICAgICAgIGtleT17dXJsfT5cbiAgICAgICAgPExpbmsgdG89e3VybH0gb25DbGljaz17aGlkZU5hdn0+XG4gICAgICAgICAge2xpc3QubmFtZX1cbiAgICAgICAgPC9MaW5rPlxuICAgICAgPC9MaT47XG4gIH0pO1xufTtcbi8vIGpzaGludCBpZ25vcmU6ZW5kXG5cbmV4cG9ydCBjbGFzcyBUYWJzTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cIm5hdiBuYXYtcGlsbHNcIj5cbiAgICAgIHtuYXZMaW5rcyh0aGlzLnByb3BzLmJhc2VVcmwsIHRoaXMucHJvcHMubGlzdHMpfVxuICAgIDwvdWw+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3ROYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7bmF2TGlua3ModGhpcy5wcm9wcy5iYXNlVXJsLCB0aGlzLnByb3BzLmxpc3RzLCB0aGlzLnByb3BzLmhpZGVOYXYpfVxuICAgIDwvdWw+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVzZXJzTGlzdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy1saXN0L3Jvb3QnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8VXNlcnNMaXN0IGlzTG9hZGVkPXtmYWxzZX0gY29scz17M30gc2hvd1N0YXR1cz17dHJ1ZX0gLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYWdlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9yYW5rL3BhZ2VyJyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2Vyc0xpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC9yb290JyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRQYWdlcigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wYWdlcyA+IDEpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8UGFnZXIgey4uLnRoaXMucHJvcHN9IC8+XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPFVzZXJzTGlzdCB1c2Vycz17dGhpcy5wcm9wcy51c2Vyc31cbiAgICAgICAgICAgICAgICAgc2hvd1N0YXR1cz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgY29scz17M31cbiAgICAgICAgICAgICAgICAgaXNMb2FkZWQ9e3RydWV9IC8+XG5cbiAgICAgIHt0aGlzLmdldFBhZ2VyKCl9XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHJlc2V0U2Nyb2xsIGZyb20gJ21pc2Fnby91dGlscy9yZXNldC1zY3JvbGwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRQcmV2aW91c1BhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJldmlvdXMgfHwgdGhpcy5wcm9wcy5maXJzdCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgbGV0IHVybCA9IHRoaXMucHJvcHMuYmFzZVVybDtcbiAgICAgIGlmICh0aGlzLnByb3BzLnByZXZpb3VzKSB7XG4gICAgICAgIHVybCArPSB0aGlzLnByb3BzLnByZXZpb3VzICsgJy8nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInByZXZpb3VzXCI+XG4gICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e3Jlc2V0U2Nyb2xsfT5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBhcnJvd19iYWNrXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L0xpbms+XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm5leHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIGxldCB1cmwgPSB0aGlzLnByb3BzLmJhc2VVcmwgKyB0aGlzLnByb3BzLm5leHQgKyAnLyc7XG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cIm5leHRcIj5cbiAgICAgICAgPExpbmsgdG89e3VybH0gb25DbGljaz17cmVzZXRTY3JvbGx9PlxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGFycm93X2ZvcndhcmRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvTGluaz5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvZ2Vzc0JhcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJwYWdlci1wcm9ncmVzcy1iYXJcIj5cbiAgICAgIHt0aGlzLnByb3BzLnBhZ2VfcmFuZ2UubWFwKChwYWdlKSA9PiB7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBwYWdlID09PSB0aGlzLnByb3BzLnBhZ2UgPyAnYWN0aXZlJyA6IG51bGw7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnByb3BzLmJhc2VVcmw7XG5cbiAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgdXJsICs9IHBhZ2UgKyAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGxpIGtleT17cGFnZX0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e3Jlc2V0U2Nyb2xsfT5cbiAgICAgICAgICAgIHtwYWdlfVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9saT47XG4gICAgICB9KX1cbiAgICA8L3VsPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlci11bmRlcmNvbnRlbnRcIj5cbiAgICAgIDxuYXY+XG4gICAgICAgIDx1bCBjbGFzc05hbWU9XCJwYWdlclwiPlxuICAgICAgICAgIHt0aGlzLmdldFByZXZpb3VzUGFnZSgpfVxuICAgICAgICAgIHt0aGlzLmdldE5leHRQYWdlKCl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgIHt0aGlzLmdldFByb2dlc3NCYXIoKX1cbiAgICAgIDwvbmF2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMaXN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdCcgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdExvYWRpbmcgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvcmFuay9saXN0LWxvYWRpbmcnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXMoJ1VTRVJTJykpIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhQcmVsb2FkZWREYXRhKG1pc2Fnby5wb3AoJ1VTRVJTJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRQb2xsaW5nKHByb3BzLnBhcmFtcy5wYWdlIHx8IDEpO1xuICB9XG5cbiAgaW5pdFdpdGhQcmVsb2FkZWREYXRhKGRhdGEpIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgIH0pO1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0UG9sbGluZyhwYWdlKSB7XG4gICAgcG9sbHMuc3RhcnQoe1xuICAgICAgcG9sbDogJ3JhbmstdXNlcnMnLFxuICAgICAgdXJsOiBtaXNhZ28uZ2V0KCdVU0VSU19BUEknKSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmFuazogdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLmlkLFxuICAgICAgICBwYWdlOiBwYWdlXG4gICAgICB9LFxuICAgICAgZnJlcXVlbmN5OiA5MCAqIDEwMDAsXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHVwZGF0ZSA9IChkYXRhKSA9PiB7XG4gICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuXG4gICAgZGF0YS5pc0xvYWRlZCA9IHRydWU7XG4gICAgdGhpcy5zZXRTdGF0ZShkYXRhKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IHRoaXMucHJvcHMucm91dGUucmFuay5uYW1lLFxuICAgICAgcGFnZTogdGhpcy5wcm9wcy5wYXJhbXMucGFnZSB8fCBudWxsLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHBvbGxzLnN0b3AoJ3JhbmstdXNlcnMnKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGFyYW1zLnBhZ2UgIT09IG5leHRQcm9wcy5wYXJhbXMucGFnZSkge1xuICAgICAgdGl0bGUuc2V0KHtcbiAgICAgICAgdGl0bGU6IHRoaXMucHJvcHMucm91dGUucmFuay5uYW1lLFxuICAgICAgICBwYWdlOiBuZXh0UHJvcHMucGFyYW1zLnBhZ2UgfHwgbnVsbCxcbiAgICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgcG9sbHMuc3RvcCgncmFuay11c2VycycpO1xuICAgICAgdGhpcy5zdGFydFBvbGxpbmcobmV4dFByb3BzLnBhcmFtcy5wYWdlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucm91dGUucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiAncmFuay11c2Vycy1saXN0IHJhbmstdXNlcnMtJyArIHRoaXMucHJvcHMucm91dGUucmFuay5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncmFuay11c2Vycy1saXN0JztcbiAgICB9XG4gIH1cblxuICBnZXRSYW5rRGVzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucm91dGUucmFuay5kZXNjcmlwdGlvbikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicmFuay1kZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxlYWRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDogdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLmRlc2NyaXB0aW9uLmh0bWxcbiAgICAgICAgfX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuY291bnQgPiAwKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgbGV0IGJhc2VVcmwgPSBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLnNsdWcgKyAnLyc7XG4gICAgICAgIHJldHVybiA8TGlzdCBiYXNlVXJsPXtiYXNlVXJsfVxuICAgICAgICAgICAgICAgICAgICAgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5zdGF0ZX0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge2dldHRleHQoXCJUaGVyZSBhcmUgbm8gdXNlcnMgd2l0aCB0aGlzIHJhbmsgYXQgdGhlIG1vbWVudC5cIil9XG4gICAgICAgIDwvcD47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TGlzdExvYWRpbmcgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIHt0aGlzLmdldFJhbmtEZXNjcmlwdGlvbigpfVxuICAgICAgICB7dGhpcy5nZXRDb21wb25lbnQoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBUYWJzTmF2LCBDb21wYWN0TmF2IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEFjdGl2ZVBvc3RlcnMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvcm9vdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJhbmsgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvcmFuay9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBoaWRlTmF2ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VG9nZ2xlTmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24nO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhY3ROYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYgb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYnO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLXVzZXJzLWxpc3RzXCI+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFnZS1oZWFkZXIgdGFiYmVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwicHVsbC1sZWZ0XCI+e2dldHRleHQoXCJVc2Vyc1wiKX08L2gxPlxuXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWFsaWduZWQgYnRuLWljb24gYnRuLWRyb3Bkb3duLXRvZ2dsZSBoaWRkZW4tbWQgaGlkZGVuLWxnXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGVOYXZ9XG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXt0aGlzLnN0YXRlLmRyb3Bkb3duID8gJ3RydWUnIDogJ2ZhbHNlJ30+XG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIG1lbnVcbiAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYWdlLXRhYnMgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgIDxUYWJzTmF2IGxpc3RzPXttaXNhZ28uZ2V0KCdVU0VSU19MSVNUUycpfVxuICAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKX0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q29tcGFjdE5hdkNsYXNzTmFtZSgpfT5cblxuICAgICAgICA8Q29tcGFjdE5hdiBsaXN0cz17bWlzYWdvLmdldCgnVVNFUlNfTElTVFMnKX1cbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZU5hdj17dGhpcy5oaWRlTmF2fSAvPlxuXG4gICAgICA8L2Rpdj5cblxuICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gICAgJ3VzZXInOiBzdG9yZS5hdXRoLnVzZXIsXG4gICAgJ3VzZXJzJzogc3RvcmUudXNlcnNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzKCkge1xuICBsZXQgcGF0aHMgPSBbXTtcblxuICBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUUycpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpdGVtLmNvbXBvbmVudCA9PT0gJ3JhbmsnKSB7XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKSArIGl0ZW0uc2x1ZyArICcvOnBhZ2UvJyxcbiAgICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoUmFuayksXG4gICAgICAgIHJhbms6IGl0ZW1cbiAgICAgIH0pO1xuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG1pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJykgKyBpdGVtLnNsdWcgKyAnLycsXG4gICAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKFJhbmspLFxuICAgICAgICByYW5rOiBpdGVtXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcG9uZW50ID09PSAnYWN0aXZlLXBvc3RlcnMnKXtcbiAgICAgIHBhdGhzLnB1c2goe1xuICAgICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgaXRlbS5jb21wb25lbnQgKyAnLycsXG4gICAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKEFjdGl2ZVBvc3RlcnMpLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXRocztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJidG4gYnRuLXllcy1ubyBidG4teWVzLW5vLW9uXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImJ0biBidG4teWVzLW5vIGJ0bi15ZXMtbm8tb2ZmXCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0SWNvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaWNvbk9uIHx8ICdjaGVja19ib3gnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5pY29uT2ZmIHx8ICdjaGVja19ib3hfb3V0bGluZV9ibGFuayc7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmxhYmVsT24gfHwgZ2V0dGV4dChcInllc1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMubGFiZWxPZmYgfHwgZ2V0dGV4dChcIm5vXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdG9nZ2xlID0gKCkgPT4ge1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2Uoe1xuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiAhdGhpcy5wcm9wcy52YWx1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGV9XG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlkIHx8IG51bGx9XG4gICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17dGhpcy5wcm9wc1snYXJpYS1kZXNjcmliZWRieSddIHx8IG51bGx9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWQgfHwgZmFsc2V9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICB7dGhpcy5nZXRJY29uKCl9XG4gICAgICA8L3NwYW4+XG4gICAgICB7dGhpcy5nZXRMYWJlbCgpfVxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IE9yZGVyZWRMaXN0IGZyb20gJ21pc2Fnby91dGlscy9vcmRlcmVkLWxpc3QnO1xuXG5leHBvcnQgY2xhc3MgTWlzYWdvIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IHt9O1xuICB9XG5cbiAgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplcnMucHVzaCh7XG4gICAgICBrZXk6IGluaXRpYWxpemVyLm5hbWUsXG5cbiAgICAgIGl0ZW06IGluaXRpYWxpemVyLmluaXRpYWxpemVyLFxuXG4gICAgICBhZnRlcjogaW5pdGlhbGl6ZXIuYWZ0ZXIsXG4gICAgICBiZWZvcmU6IGluaXRpYWxpemVyLmJlZm9yZVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdChjb250ZXh0KSB7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICB2YXIgaW5pdE9yZGVyID0gbmV3IE9yZGVyZWRMaXN0KHRoaXMuX2luaXRpYWxpemVycykub3JkZXJlZFZhbHVlcygpO1xuICAgIGluaXRPcmRlci5mb3JFYWNoKGluaXRpYWxpemVyID0+IHtcbiAgICAgIGluaXRpYWxpemVyKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY29udGV4dCBhY2Nlc3NvcnNcbiAgaGFzKGtleSkge1xuICAgIHJldHVybiAhIXRoaXMuX2NvbnRleHRba2V5XTtcbiAgfVxuXG4gIGdldChrZXksIGZhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxsYmFjayB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcG9wKGtleSkge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgICB0aGlzLl9jb250ZXh0W2tleV0gPSBudWxsO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vLyBjcmVhdGUgIHNpbmdsZXRvblxudmFyIG1pc2FnbyA9IG5ldyBNaXNhZ28oKTtcblxuLy8gZXhwb3NlIGl0IGdsb2JhbGx5XG5nbG9iYWwubWlzYWdvID0gbWlzYWdvO1xuXG4vLyBhbmQgZXhwb3J0IGl0IGZvciB0ZXN0cyBhbmQgc3R1ZmZcbmV4cG9ydCBkZWZhdWx0IG1pc2FnbztcbiIsImltcG9ydCB7IFVQREFURV9BVkFUQVIsIFVQREFURV9VU0VSTkFNRSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7XG5cbmV4cG9ydCB2YXIgaW5pdGlhbFN0YXRlID0ge1xuICBzaWduZWRJbjogZmFsc2UsXG4gIHNpZ25lZE91dDogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBQQVRDSF9VU0VSID0gJ1BBVENIX1VTRVInO1xuZXhwb3J0IGNvbnN0IFNJR05fSU4gPSAnU0lHTl9JTic7XG5leHBvcnQgY29uc3QgU0lHTl9PVVQgPSAnU0lHTl9PVVQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hVc2VyKHBhdGNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogUEFUQ0hfVVNFUixcbiAgICBwYXRjaFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluKHVzZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBTSUdOX0lOLFxuICAgIHVzZXJcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25PdXQoc29mdD1mYWxzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNJR05fT1VULFxuICAgIHNvZnRcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXV0aChzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFBBVENIX1VTRVI6XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKTtcbiAgICAgICAgbmV3U3RhdGUudXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnVzZXIsIGFjdGlvbi5wYXRjaCk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcblxuICAgIGNhc2UgU0lHTl9JTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzaWduZWRJbjogYWN0aW9uLnVzZXJcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBTSUdOX09VVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBpc0Fub255bW91czogdHJ1ZSxcbiAgICAgICAgc2lnbmVkT3V0OiAhYWN0aW9uLnNvZnRcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgaWYgKHN0YXRlLmlzQXV0aGVudGljYXRlZCAmJiBzdGF0ZS51c2VyLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKTtcbiAgICAgICAgbmV3U3RhdGUudXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnVzZXIsIHtcbiAgICAgICAgICAnYXZhdGFyX2hhc2gnOiBhY3Rpb24uYXZhdGFySGFzaFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuXG4gICAgY2FzZSBVUERBVEVfVVNFUk5BTUU6XG4gICAgICBpZiAoc3RhdGUuaXNBdXRoZW50aWNhdGVkICYmIHN0YXRlLnVzZXIuaWQgPT09IGFjdGlvbi51c2VySWQpIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpO1xuICAgICAgICBuZXdTdGF0ZS51c2VyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUudXNlciwge1xuICAgICAgICAgIHVzZXJuYW1lOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgc2x1ZzogYWN0aW9uLnNsdWdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFVQREFURV9BVkFUQVIsIFVQREFURV9VU0VSTkFNRSwgZGVoeWRyYXRlU3RhdHVzIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcblxuZXhwb3J0IGNvbnN0IERFSFlEUkFURV9QUk9GSUxFID0gJ0RFSFlEUkFURV9QUk9GSUxFJztcbmV4cG9ydCBjb25zdCBQQVRDSF9QUk9GSUxFID0gJ1BBVENIX1BST0ZJTEUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVoeWRyYXRlKHByb2ZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBERUhZRFJBVEVfUFJPRklMRSxcbiAgICBwcm9maWxlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFByb2ZpbGUocGF0Y2gpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBQQVRDSF9QUk9GSUxFLFxuICAgIHBhdGNoXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1dGgoc3RhdGU9e30sIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIERFSFlEUkFURV9QUk9GSUxFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjdGlvbi5wcm9maWxlLCB7XG4gICAgICAgIGpvaW5lZF9vbjogbW9tZW50KGFjdGlvbi5wcm9maWxlLmpvaW5lZF9vbiksXG4gICAgICAgIHN0YXR1czogZGVoeWRyYXRlU3RhdHVzKGFjdGlvbi5wcm9maWxlLnN0YXR1cylcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBQQVRDSF9QUk9GSUxFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBhY3Rpb24ucGF0Y2gpO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGF2YXRhcl9oYXNoOiBhY3Rpb24uYXZhdGFySGFzaFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGNhc2UgVVBEQVRFX1VTRVJOQU1FOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIHVzZXJuYW1lOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgc2x1ZzogYWN0aW9uLnNsdWdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCJleHBvcnQgdmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgdHlwZTogJ2luZm8nLFxuICBtZXNzYWdlOiAnJyxcbiAgaXNWaXNpYmxlOiBmYWxzZVxufTtcblxuZXhwb3J0IGNvbnN0IFNIT1dfU05BQ0tCQVIgPSAnU0hPV19TTkFDS0JBUic7XG5leHBvcnQgY29uc3QgSElERV9TTkFDS0JBUiA9ICdISURFX1NOQUNLQkFSJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dTbmFja2JhcihtZXNzYWdlLCB0eXBlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogU0hPV19TTkFDS0JBUixcbiAgICBtZXNzYWdlLFxuICAgIG1lc3NhZ2VUeXBlOiB0eXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWRlU25hY2tiYXIoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSElERV9TTkFDS0JBUlxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbmFja2JhcihzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gU0hPV19TTkFDS0JBUikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBhY3Rpb24ubWVzc2FnZVR5cGUsXG4gICAgICBtZXNzYWdlOiBhY3Rpb24ubWVzc2FnZSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IEhJREVfU05BQ0tCQVIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBpbml0aWFsU3RhdGUgPSB7XG4gIHRpY2s6IDBcbn07XG5cbmV4cG9ydCBjb25zdCBUSUNLID0gJ1RJQ0snO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9UaWNrKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRJQ0tcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGljayhzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gVElDSykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICB0aWNrOiBzdGF0ZS50aWNrICsgMVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVVBEQVRFX0FWQVRBUiwgVVBEQVRFX1VTRVJOQU1FIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY29uc3QgQUREX05BTUVfQ0hBTkdFID0gJ0FERF9OQU1FX0NIQU5HRSc7XG5leHBvcnQgY29uc3QgQVBQRU5EX0hJU1RPUlkgPSAnQVBQRU5EX0hJU1RPUlknO1xuZXhwb3J0IGNvbnN0IERFSFlEUkFURV9ISVNUT1JZID0gJ0RFSFlEUkFURV9ISVNUT1JZJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5hbWVDaGFuZ2UoY2hhbmdlLCB1c2VyLCBjaGFuZ2VkQnkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBRERfTkFNRV9DSEFOR0UsXG4gICAgY2hhbmdlLFxuICAgIHVzZXIsXG4gICAgY2hhbmdlZEJ5XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQoaXRlbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBUFBFTkRfSElTVE9SWSxcbiAgICBpdGVtczogaXRlbXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlaHlkcmF0ZShpdGVtcykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IERFSFlEUkFURV9ISVNUT1JZLFxuICAgIGl0ZW1zOiBpdGVtc1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VybmFtZShzdGF0ZT1bXSwgYWN0aW9uPW51bGwpIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgQUREX05BTUVfQ0hBTkdFOlxuICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGUuc2xpY2UoKTtcbiAgICAgIG5ld1N0YXRlLnVuc2hpZnQoe1xuICAgICAgICBpZDogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCksIC8vIGp1c3Qgc21hbGwgaGF4IGZvciBnZXR0aW5nIGlkXG4gICAgICAgIGNoYW5nZWRfYnk6IGFjdGlvbi5jaGFuZ2VkQnksXG4gICAgICAgIGNoYW5nZWRfYnlfdXNlcm5hbWU6IGFjdGlvbi5jaGFuZ2VkQnkudXNlcm5hbWUsXG4gICAgICAgIGNoYW5nZWRfb246IG1vbWVudCgpLFxuICAgICAgICBuZXdfdXNlcm5hbWU6IGFjdGlvbi5jaGFuZ2UudXNlcm5hbWUsXG4gICAgICAgIG9sZF91c2VybmFtZTogYWN0aW9uLnVzZXIudXNlcm5hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuXG4gICAgY2FzZSBBUFBFTkRfSElTVE9SWTpcbiAgICAgIHJldHVybiBzdGF0ZS5jb25jYXQoYWN0aW9uLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICAgICAgY2hhbmdlZF9vbjogbW9tZW50KGl0ZW0uY2hhbmdlZF9vbilcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG5cbiAgICBjYXNlIERFSFlEUkFURV9ISVNUT1JZOlxuICAgICAgcmV0dXJuIGFjdGlvbi5pdGVtcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgICAgIGNoYW5nZWRfb246IG1vbWVudChpdGVtLmNoYW5nZWRfb24pXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjYXNlIFVQREFURV9BVkFUQVI6XG4gICAgICByZXR1cm4gc3RhdGUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgICAgICBpZiAoaXRlbS5jaGFuZ2VkX2J5ICYmIGl0ZW0uY2hhbmdlZF9ieS5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICAgIGl0ZW0uY2hhbmdlZF9ieSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uY2hhbmdlZF9ieSwge1xuICAgICAgICAgICAgJ2F2YXRhcl9oYXNoJzogYWN0aW9uLmF2YXRhckhhc2hcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICBjYXNlIFVQREFURV9VU0VSTkFNRTpcbiAgICAgIHJldHVybiBzdGF0ZS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICAgIGlmIChpdGVtLmNoYW5nZWRfYnkgJiYgaXRlbS5jaGFuZ2VkX2J5LmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgICAgaXRlbS5jaGFuZ2VkX2J5ID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbS5jaGFuZ2VkX2J5LCB7XG4gICAgICAgICAgICAndXNlcm5hbWUnOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgICAnc2x1Zyc6IGFjdGlvbi5zbHVnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn0iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjb25zdCBBUFBFTkRfVVNFUlMgPSAnQVBQRU5EX1VTRVJTJztcbmV4cG9ydCBjb25zdCBERUhZRFJBVEVfVVNFUlMgPSAnREVIWURSQVRFX1VTRVJTJztcbmV4cG9ydCBjb25zdCBVUERBVEVfQVZBVEFSID0gJ1VQREFURV9BVkFUQVInO1xuZXhwb3J0IGNvbnN0IFVQREFURV9VU0VSTkFNRSA9ICdVUERBVEVfVVNFUk5BTUUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kKGl0ZW1zKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQVBQRU5EX1VTRVJTLFxuICAgIGl0ZW1zXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWh5ZHJhdGUoaXRlbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBERUhZRFJBVEVfVVNFUlMsXG4gICAgaXRlbXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlaHlkcmF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgaWYgKHN0YXR1cykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0dXMsIHtcbiAgICAgIGxhc3RfY2xpY2s6IHN0YXR1cy5sYXN0X2NsaWNrID8gbW9tZW50KHN0YXR1cy5sYXN0X2NsaWNrKSA6IG51bGwsXG4gICAgICBiYW5uZWRfdW50aWw6IHN0YXR1cy5iYW5uZWRfdW50aWwgPyBtb21lbnQoc3RhdHVzLmJhbm5lZF91bnRpbCkgOiBudWxsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF2YXRhcih1c2VyLCBhdmF0YXJIYXNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0FWQVRBUixcbiAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgYXZhdGFySGFzaFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVXNlcm5hbWUodXNlciwgdXNlcm5hbWUsIHNsdWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfVVNFUk5BTUUsXG4gICAgdXNlcklkOiB1c2VyLmlkLFxuICAgIHVzZXJuYW1lLFxuICAgIHNsdWdcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlcihzdGF0ZT1bXSwgYWN0aW9uPW51bGwpIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgQVBQRU5EX1VTRVJTOlxuICAgICAgcmV0dXJuIHN0YXRlLmNvbmNhdChhY3Rpb24uaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHtcbiAgICAgICAgICBqb2luZWRfb246IG1vbWVudChpdGVtLmpvaW5lZF9vbiksXG4gICAgICAgICAgc3RhdHVzOiBkZWh5ZHJhdGVTdGF0dXMoaXRlbS5zdGF0dXMpXG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuXG4gICAgY2FzZSBERUhZRFJBVEVfVVNFUlM6XG4gICAgICByZXR1cm4gYWN0aW9uLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICAgICAgam9pbmVkX29uOiBtb21lbnQoaXRlbS5qb2luZWRfb24pLFxuICAgICAgICAgIHN0YXR1czogZGVoeWRyYXRlU3RhdHVzKGl0ZW0uc3RhdHVzKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgcmV0dXJuIHN0YXRlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcbiAgICAgICAgaWYgKGl0ZW0uaWQgPT09IGFjdGlvbi51c2VySWQpIHtcbiAgICAgICAgICBpdGVtLmF2YXRhcl9oYXNoID0gYWN0aW9uLmF2YXRhckhhc2g7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufSIsImV4cG9ydCBjbGFzcyBBamF4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fY29va2llTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fY3NyZlRva2VuID0gbnVsbDtcbiAgICB0aGlzLl9sb2NrcyA9IHt9O1xuICB9XG5cbiAgaW5pdChjb29raWVOYW1lKSB7XG4gICAgdGhpcy5fY29va2llTmFtZSA9IGNvb2tpZU5hbWU7XG4gICAgdGhpcy5fY3NyZlRva2VuID0gdGhpcy5nZXRDc3JmVG9rZW4oKTtcbiAgfVxuXG4gIGdldENzcmZUb2tlbigpIHtcbiAgICBpZiAoZG9jdW1lbnQuY29va2llLmluZGV4T2YodGhpcy5fY29va2llTmFtZSkgIT09IC0xKSB7XG4gICAgICBsZXQgY29va2llUmVnZXggPSBuZXcgUmVnRXhwKHRoaXMuX2Nvb2tpZU5hbWUgKyAnXFw9KFteO10qKScpO1xuICAgICAgbGV0IGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChjb29raWVSZWdleClbMF07XG4gICAgICByZXR1cm4gY29va2llID8gY29va2llLnNwbGl0KCc9JylbMV0gOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0KG1ldGhvZCwgdXJsLCBkYXRhKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxldCB4aHIgPSB7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdYLUNTUkZUb2tlbic6IHNlbGYuX2NzcmZUb2tlblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IChkYXRhID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiBudWxsKSxcbiAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUikge1xuICAgICAgICAgIGxldCByZWplY3Rpb24gPSBqcVhIUi5yZXNwb25zZUpTT04gfHwge307XG5cbiAgICAgICAgICByZWplY3Rpb24uc3RhdHVzID0ganFYSFIuc3RhdHVzO1xuXG4gICAgICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdGlvbi5kZXRhaWwgPSBnZXR0ZXh0KFwiTG9zdCBjb25uZWN0aW9uIHdpdGggYXBwbGljYXRpb24uXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGlmICghcmVqZWN0aW9uLmRldGFpbCB8fCByZWplY3Rpb24uZGV0YWlsID09PSAnTk9UIEZPVU5EJykge1xuICAgICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIkFjdGlvbiBsaW5rIGlzIGludmFsaWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA1MDAgJiYgIXJlamVjdGlvbi5kZXRhaWwpIHtcbiAgICAgICAgICAgIHJlamVjdGlvbi5kZXRhaWwgPSBnZXR0ZXh0KFwiVW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC5cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVqZWN0aW9uLnN0YXR1c1RleHQgPSBqcVhIUi5zdGF0dXNUZXh0O1xuXG4gICAgICAgICAgcmVqZWN0KHJlamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICQuYWpheCh4aHIpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KHVybCwgcGFyYW1zLCBsb2NrKSB7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgdXJsICs9ICc/JyArICQucGFyYW0ocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyB1cGRhdGUgdXJsIGluIGV4aXN0aW5nIGxvY2s/XG4gICAgICBpZiAodGhpcy5fbG9ja3NbbG9ja10pIHtcbiAgICAgICAgdGhpcy5fbG9ja3NbbG9ja10udXJsID0gdXJsO1xuICAgICAgfVxuXG4gICAgICAvLyBpbW1lZGlhdGVseSBkZXJlZmVyZW5jZSBwcm9taXNlIGhhbmRsZXJzIHdpdGhvdXQgZG9pbmcgYW55dGhpbmdcbiAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IHdhaXRpbmcgZm9yIGV4aXN0aW5nIHJlc3BvbnNlIHRvIHJlc29sdmVcbiAgICAgIGlmICh0aGlzLl9sb2Nrc1tsb2NrXSAmJiB0aGlzLl9sb2Nrc1tsb2NrXS53YWl0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIC8vIHJldHVybiBwcm9taXNlIHRoYXQgd2lsbCBiZWdpbiB3aGVuIG9yaWdpbmFsIG9uZSByZXNvbHZlc1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9sb2Nrc1tsb2NrXSAmJiB0aGlzLl9sb2Nrc1tsb2NrXS53YWl0KSB7XG4gICAgICAgIHRoaXMuX2xvY2tzW2xvY2tdLndhaXRlciA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGxldCB3YWl0ID0gZnVuY3Rpb24odXJsKSB7XG4gICAgICAgICAgICAvLyBrZWVwIHdhaXRpbmcgb24gcHJvbWlzZVxuICAgICAgICAgICAgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLndhaXQpIHtcbiAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgd2FpdCh1cmwpO1xuICAgICAgICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgICAgICAvLyBwb2xsIGZvciBuZXcgdXJsXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLnVybCAhPT0gdXJsKSB7XG4gICAgICAgICAgICAgIHdhaXQoc2VsZi5fbG9ja3NbbG9ja10udXJsKTtcblxuICAgICAgICAgICAgLy8gYWpheCBiYWNrZW5kIGZvciByZXNwb25zZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5fbG9ja3NbbG9ja10ud2FpdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNlbGYucmVxdWVzdCgnR0VUJywgc2VsZi5fbG9ja3NbbG9ja10udXJsKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX2xvY2tzW2xvY2tdLndhaXRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3YWl0KHNlbGYuX2xvY2tzW2xvY2tdLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZWplY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd2FpdChzZWxmLl9sb2Nrc1tsb2NrXS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2FpdCh1cmwpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBzZXR1cCBuZXcgbG9jayB3aXRob3V0IHdhaXRlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9ja3NbbG9ja10gPSB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHdhaXQ6IHRydWUsXG4gICAgICAgICAgd2FpdGVyOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBzZWxmLnJlcXVlc3QoJ0dFVCcsIHVybCkudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbihyZWplY3Rpb24pIHtcbiAgICAgICAgICAgIHNlbGYuX2xvY2tzW2xvY2tdLndhaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzZWxmLl9sb2Nrc1tsb2NrXS51cmwgPT09IHVybCkge1xuICAgICAgICAgICAgICByZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gICAgfVxuICB9XG5cbiAgcG9zdCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHBhdGNoKHVybCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHB1dCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGEpO1xuICB9XG5cbiAgZGVsZXRlKHVybCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIH1cblxuICB1cGxvYWQodXJsLCBkYXRhLCBwcm9ncmVzcykge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQgeGhyID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnWC1DU1JGVG9rZW4nOiBzZWxmLl9jc3JmVG9rZW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcblxuICAgICAgICB4aHI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCB4aHIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgeGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIiwgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICBpZiAoZXZ0Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MoTWF0aC5yb3VuZChldnQubG9hZGVkIC8gZXZ0LnRvdGFsICogMTAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIHJldHVybiB4aHI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIpIHtcbiAgICAgICAgICBsZXQgcmVqZWN0aW9uID0ganFYSFIucmVzcG9uc2VKU09OIHx8IHt9O1xuXG4gICAgICAgICAgcmVqZWN0aW9uLnN0YXR1cyA9IGpxWEhSLnN0YXR1cztcblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIkxvc3QgY29ubmVjdGlvbiB3aXRoIGFwcGxpY2F0aW9uLlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBpZiAoIXJlamVjdGlvbi5kZXRhaWwgfHwgcmVqZWN0aW9uLmRldGFpbCA9PT0gJ05PVCBGT1VORCcpIHtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uLmRldGFpbCA9IGdldHRleHQoXCJBY3Rpb24gbGluayBpcyBpbnZhbGlkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNTAwICYmICFyZWplY3Rpb24uZGV0YWlsKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlamVjdGlvbi5zdGF0dXNUZXh0ID0ganFYSFIuc3RhdHVzVGV4dDtcblxuICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkLmFqYXgoeGhyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQWpheCgpO1xuIiwiaW1wb3J0IHsgc2lnbkluLCBzaWduT3V0IH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL2F1dGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEF1dGgge1xuICBpbml0KHN0b3JlLCBsb2NhbCwgbW9kYWwpIHtcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuX2xvY2FsID0gbG9jYWw7XG4gICAgdGhpcy5fbW9kYWwgPSBtb2RhbDtcblxuICAgIC8vIHRlbGwgb3RoZXIgdGFicyB3aGF0IGF1dGggc3RhdGUgaXMgYmVjYXVzZSB3ZSBhcmUgbW9zdCBjdXJyZW50IHdpdGggaXRcbiAgICB0aGlzLnN5bmNTZXNzaW9uKCk7XG5cbiAgICAvLyBsaXN0ZW4gZm9yIG90aGVyIHRhYnMgdG8gdGVsbCB1cyB0aGF0IHN0YXRlIGNoYW5nZWRcbiAgICB0aGlzLndhdGNoU3RhdGUoKTtcbiAgfVxuXG4gIHN5bmNTZXNzaW9uKCkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXV0aDtcbiAgICBpZiAoc3RhdGUuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgICAgdXNlcm5hbWU6IHN0YXRlLnVzZXIudXNlcm5hbWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoU3RhdGUoKSB7XG4gICAgdGhpcy5fbG9jYWwud2F0Y2goJ2F1dGgnLCAobmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChuZXdTdGF0ZS5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2lnbkluKHtcbiAgICAgICAgICB1c2VybmFtZTogbmV3U3RhdGUudXNlcm5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2lnbk91dCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzaWduSW4odXNlcikge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25Jbih1c2VyKSk7XG4gICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgaXNBdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWVcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzaWduT3V0KCkge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQoKSk7XG4gICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuX21vZGFsLmhpZGUoKTtcbiAgfVxuXG4gIHNvZnRTaWduT3V0KCkge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQodHJ1ZSkpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEF1dGgoKTsiLCIvKiBnbG9iYWwgZ3JlY2FwdGNoYSAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEJhc2VDYXB0Y2hhIHtcbiAgaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcikge1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX2FqYXggPSBhamF4O1xuICAgIHRoaXMuX2luY2x1ZGUgPSBpbmNsdWRlO1xuICAgIHRoaXMuX3NuYWNrYmFyID0gc25hY2tiYXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZSBhcyB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHZhbGlkYXRlXG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFFBQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlbGYuX2FqYXguZ2V0KHNlbGYuX2NvbnRleHQuZ2V0KCdDQVBUQ0hBX0FQSV9VUkwnKSkudGhlbihcbiAgICAgIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5xdWVzdGlvbiA9IGRhdGEucXVlc3Rpb247XG4gICAgICAgIHNlbGYuaGVscFRleHQgPSBkYXRhLmhlbHBfdGV4dDtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3NuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGYWlsZWQgdG8gbG9hZCBDQVBUQ0hBLlwiKSk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wb25lbnQoa3dhcmdzKSB7XG4gICAgcmV0dXJuIDxGb3JtR3JvdXAgbGFiZWw9e3RoaXMucXVlc3Rpb259IGZvcj1cImlkX2NhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9e2t3YXJncy5sYWJlbENsYXNzIHx8IFwiY29sLXNtLTRcIn1cbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sQ2xhc3M9e2t3YXJncy5jb250cm9sQ2xhc3MgfHwgXCJjb2wtc20tOFwifVxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e2t3YXJncy5mb3JtLnN0YXRlLmVycm9ycy5jYXB0Y2hhfVxuICAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXt0aGlzLmhlbHBUZXh0IHx8IG51bGx9PlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF9jYXB0Y2hhXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfY2FwdGNoYV9zdGF0dXNcIlxuICAgICAgICAgICAgIGRpc2FibGVkPXtrd2FyZ3MuZm9ybS5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgb25DaGFuZ2U9e2t3YXJncy5mb3JtLmJpbmRJbnB1dCgnY2FwdGNoYScpfVxuICAgICAgICAgICAgIHZhbHVlPXtrd2FyZ3MuZm9ybS5zdGF0ZS5jYXB0Y2hhfSAvPlxuICAgIDwvRm9ybUdyb3VwPjtcbiAgfVxuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xufVxuXG5cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGFDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBncmVjYXB0Y2hhLnJlbmRlcigncmVjYXB0Y2hhJywge1xuICAgICAgJ3NpdGVrZXknOiB0aGlzLnByb3BzLnNpdGVLZXksXG4gICAgICAnY2FsbGJhY2snOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gZmlyZSBmYWtleSBldmVudCB0byBiaW5kaW5nXG4gICAgICAgIHRoaXMucHJvcHMuYmluZGluZyh7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBpZD1cInJlY2FwdGNoYVwiIC8+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICB0aGlzLl9pbmNsdWRlLmluY2x1ZGUoJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcycsIHRydWUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHZhciB3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZ3JlY2FwdGNoYSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2FpdCgpO1xuICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgd2FpdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiQ2FwdGNoYVwiKX0gZm9yPVwiaWRfY2FwdGNoYVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz17a3dhcmdzLmxhYmVsQ2xhc3MgfHwgXCJjb2wtc20tNFwifVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xDbGFzcz17a3dhcmdzLmNvbnRyb2xDbGFzcyB8fCBcImNvbC1zbS04XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17a3dhcmdzLmZvcm0uc3RhdGUuZXJyb3JzLmNhcHRjaGF9XG4gICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJQbGVhc2Ugc29sdmUgdGhlIHF1aWNrIHRlc3QuXCIpfT5cbiAgICAgIDxSZUNhcHRjaGFDb21wb25lbnQgc2l0ZUtleT17dGhpcy5fY29udGV4dC5nZXQoJ1NFVFRJTkdTJykucmVjYXB0Y2hhX3NpdGVfa2V5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nPXtrd2FyZ3MuZm9ybS5iaW5kSW5wdXQoJ2NhcHRjaGEnKX0gLz5cbiAgICA8L0Zvcm1Hcm91cD47XG4gIH1cbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn1cblxuZXhwb3J0IGNsYXNzIENhcHRjaGEge1xuICBpbml0KGNvbnRleHQsIGFqYXgsIGluY2x1ZGUsIHNuYWNrYmFyKSB7XG4gICAgc3dpdGNoKGNvbnRleHQuZ2V0KCdTRVRUSU5HUycpLmNhcHRjaGFfdHlwZSkge1xuICAgICAgY2FzZSAnbm8nOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IE5vQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncWEnOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IFFBQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmUnOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IFJlQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLl9jYXB0Y2hhLmluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpO1xuICB9XG5cbiAgLy8gYWNjZXNzb3JzIGZvciB1bmRlcmx5aW5nIHN0cmF0ZWd5XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGNoYS5sb2FkKCk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEudmFsaWRhdG9yKCk7XG4gIH1cblxuICBjb21wb25lbnQoa3dhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEuY29tcG9uZW50KGt3YXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IENhcHRjaGEoKTsiLCJleHBvcnQgY2xhc3MgSW5jbHVkZSB7XG4gIGluaXQoc3RhdGljVXJsKSB7XG4gICAgdGhpcy5fc3RhdGljVXJsID0gc3RhdGljVXJsO1xuICAgIHRoaXMuX2luY2x1ZGVkID0gW107XG4gIH1cblxuICBpbmNsdWRlKHNjcmlwdCwgcmVtb3RlPWZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkLmluZGV4T2Yoc2NyaXB0KSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGVkLnB1c2goc2NyaXB0KTtcbiAgICAgIHRoaXMuX2luY2x1ZGUoc2NyaXB0LCByZW1vdGUpO1xuICAgIH1cbiAgfVxuXG4gIF9pbmNsdWRlKHNjcmlwdCwgcmVtb3RlKSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogKCFyZW1vdGUgPyB0aGlzLl9zdGF0aWNVcmwgOiAnJykgKyBzY3JpcHQsXG4gICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgIGRhdGFUeXBlOiAnc2NyaXB0J1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBJbmNsdWRlKCk7IiwibGV0IHN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlIHtcbiAgaW5pdChwcmVmaXgpIHtcbiAgICB0aGlzLl9wcmVmaXggPSBwcmVmaXg7XG4gICAgdGhpcy5fd2F0Y2hlcnMgPSBbXTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgKGUpID0+IHtcbiAgICAgIGxldCBuZXdWYWx1ZUpzb24gPSBKU09OLnBhcnNlKGUubmV3VmFsdWUpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuZm9yRWFjaChmdW5jdGlvbih3YXRjaGVyKSB7XG4gICAgICAgIGlmICh3YXRjaGVyLmtleSA9PT0gZS5rZXkgJiYgZS5vbGRWYWx1ZSAhPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgIHdhdGNoZXIuY2FsbGJhY2sobmV3VmFsdWVKc29uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9wcmVmaXggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgbGV0IGl0ZW1TdHJpbmcgPSBzdG9yYWdlLmdldEl0ZW0odGhpcy5fcHJlZml4ICsga2V5KTtcbiAgICBpZiAoaXRlbVN0cmluZykge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaXRlbVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoKGtleSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl93YXRjaGVycy5wdXNoKHtcbiAgICAgIGtleTogdGhpcy5fcHJlZml4ICsga2V5LFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IExvY2FsU3RvcmFnZSgpOyIsImltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIE1vYmlsZU5hdmJhckRyb3Bkb3duIHtcbiAgaW5pdChlbGVtZW50KSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fY29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHNob3coY29tcG9uZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudCA9PT0gY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgbW91bnQoY29tcG9uZW50LCB0aGlzLl9lbGVtZW50LmlkKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICB9XG4gIH1cblxuICBzaG93Q29ubmVjdGVkKG5hbWUsIGNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnQgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wb25lbnQgPSBuYW1lO1xuICAgICAgbW91bnQoY29tcG9uZW50LCB0aGlzLl9lbGVtZW50LmlkLCB0cnVlKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICB9XG4gIH1cblxuICBoaWRlKCkge1xuICAgICQodGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcbiAgICB0aGlzLl9jb21wb25lbnQgPSBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBNb2JpbGVOYXZiYXJEcm9wZG93bigpO1xuIiwiaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RhbCB7XG4gIGluaXQoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgdGhpcy5fbW9kYWwgPSAkKGVsZW1lbnQpLm1vZGFsKHtzaG93OiBmYWxzZX0pO1xuXG4gICAgdGhpcy5fbW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICgpID0+IHtcbiAgICAgIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5fZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBzaG93KGNvbXBvbmVudCkge1xuICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCk7XG4gICAgdGhpcy5fbW9kYWwubW9kYWwoJ3Nob3cnKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5fbW9kYWwubW9kYWwoJ2hpZGUnKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTW9kYWwoKTtcbiIsImV4cG9ydCBjbGFzcyBQYWdlVGl0bGUge1xuICBpbml0KGZvcnVtTmFtZSkge1xuICAgIHRoaXMuX2ZvcnVtTmFtZSA9IGZvcnVtTmFtZTtcbiAgfVxuXG4gIHNldCh0aXRsZSkge1xuICAgIGlmICh0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aXRsZSA9IHt0aXRsZTogdGl0bGV9O1xuICAgIH1cblxuICAgIGxldCBmaW5hbFRpdGxlID0gdGl0bGUudGl0bGU7XG5cbiAgICBpZiAodGl0bGUucGFnZSkge1xuICAgICAgbGV0IHBhZ2VMYWJlbCA9IGludGVycG9sYXRlKGdldHRleHQoJ3BhZ2U6ICUocGFnZSlzJyksIHtcbiAgICAgICAgcGFnZTogdGl0bGUucGFnZVxuICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgIGZpbmFsVGl0bGUgKz0gJyAoJyArIHBhZ2VMYWJlbCArICcpJztcbiAgICB9XG5cbiAgICBpZiAodGl0bGUucGFyZW50KSB7XG4gICAgICBmaW5hbFRpdGxlICs9ICcgfCAnICsgdGl0bGUucGFyZW50O1xuICAgIH1cblxuICAgIGRvY3VtZW50LnRpdGxlID0gZmluYWxUaXRsZSArICcgfCAnICsgdGhpcy5fZm9ydW1OYW1lO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQYWdlVGl0bGUoKTtcbiIsImV4cG9ydCBjbGFzcyBQb2xscyB7XG4gIGluaXQoYWpheCwgc25hY2tiYXIpIHtcbiAgICB0aGlzLl9hamF4ID0gYWpheDtcbiAgICB0aGlzLl9zbmFja2JhciA9IHNuYWNrYmFyO1xuXG4gICAgdGhpcy5fcG9sbHMgPSB7fTtcbiAgfVxuXG4gIHN0YXJ0KGt3YXJncykge1xuICAgIGxldCBwb29sU2VydmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcG9sbHNba3dhcmdzLnBvbGxdID0ga3dhcmdzO1xuXG4gICAgICB0aGlzLl9hamF4LmdldChrd2FyZ3MudXJsLCBrd2FyZ3MuZGF0YSB8fCBudWxsKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGt3YXJncy51cGRhdGUoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5fcG9sbHNba3dhcmdzLnBvbGxdLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICBwb29sU2VydmVyLCBrd2FyZ3MuZnJlcXVlbmN5KTtcbiAgICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGt3YXJncy5lcnJvcikge1xuICAgICAgICAgIGt3YXJncy5lcnJvcihyZWplY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwb29sU2VydmVyKCk7XG4gIH1cblxuICBzdG9wKHBvbGxJZCkge1xuICAgIGlmICh0aGlzLl9wb2xsc1twb2xsSWRdKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3BvbGxzW3BvbGxJZF0udGltZW91dCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQb2xscygpO1xuIiwiaW1wb3J0IHsgc2hvd1NuYWNrYmFyLCBoaWRlU25hY2tiYXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvc25hY2tiYXInO1xuXG5jb25zdCBISURFX0FOSU1BVElPTl9MRU5HVEggPSAzMDA7XG5jb25zdCBNRVNTQUdFX1NIT1dfTEVOR1RIID0gNTAwMDtcblxuZXhwb3J0IGNsYXNzIFNuYWNrYmFyIHtcbiAgaW5pdChzdG9yZSkge1xuICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gIH1cblxuICBhbGVydChtZXNzYWdlLCB0eXBlKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChoaWRlU25hY2tiYXIoKSk7XG5cbiAgICAgIHRoaXMuX3RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsIHR5cGUpO1xuICAgICAgfSwgSElERV9BTklNQVRJT05fTEVOR1RIKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2hvd1NuYWNrYmFyKG1lc3NhZ2UsIHR5cGUpKTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKGhpZGVTbmFja2JhcigpKTtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICB9LCBNRVNTQUdFX1NIT1dfTEVOR1RIKTtcbiAgICB9XG4gIH1cblxuICAvLyBzaG9ydGhhbmRzIGZvciBtZXNzYWdlIHR5cGVzXG5cbiAgaW5mbyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnaW5mbycpO1xuICB9XG5cbiAgc3VjY2VzcyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnc3VjY2VzcycpO1xuICB9XG5cbiAgd2FybmluZyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnd2FybmluZycpO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgJ2Vycm9yJyk7XG4gIH1cblxuICAvLyBzaG9ydGhhbmQgZm9yIGFwaSBlcnJvcnNcblxuICBhcGlFcnJvcihyZWplY3Rpb24pIHtcbiAgICBsZXQgbWVzc2FnZSA9IHJlamVjdGlvbi5kZXRhaWw7XG5cbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgbWVzc2FnZSA9IGdldHRleHQoXCJBY3Rpb24gbGluayBpcyBpbnZhbGlkLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiVW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiBtZXNzYWdlID09PSBcIlBlcm1pc3Npb24gZGVuaWVkXCIpIHtcbiAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBTbmFja2JhcigpO1xuIiwiaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzLCBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcblxuZXhwb3J0IGNsYXNzIFN0b3JlV3JhcHBlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3N0b3JlID0gbnVsbDtcbiAgICB0aGlzLl9yZWR1Y2VycyA9IHt9O1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IHt9O1xuICB9XG5cbiAgYWRkUmVkdWNlcihuYW1lLCByZWR1Y2VyLCBpbml0aWFsU3RhdGUpIHtcbiAgICB0aGlzLl9yZWR1Y2Vyc1tuYW1lXSA9IHJlZHVjZXI7XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlW25hbWVdID0gaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLl9zdG9yZSA9IGNyZWF0ZVN0b3JlKFxuICAgICAgY29tYmluZVJlZHVjZXJzKHRoaXMuX3JlZHVjZXJzKSwgdGhpcy5faW5pdGlhbFN0YXRlKTtcbiAgfVxuXG4gIGdldFN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZTtcbiAgfVxuXG4gIC8vIFN0b3JlIEFQSVxuXG4gIGdldFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFN0b3JlV3JhcHBlcigpO1xuIiwiLyogZ2xvYmFsIHp4Y3ZibiAqL1xuZXhwb3J0IGNsYXNzIFp4Y3ZibiB7XG4gIGluaXQoaW5jbHVkZSkge1xuICAgIHRoaXMuX2luY2x1ZGUgPSBpbmNsdWRlO1xuICB9XG5cbiAgc2NvcmVQYXNzd29yZChwYXNzd29yZCwgaW5wdXRzKSB7XG4gICAgLy8gMC00IHNjb3JlLCB0aGUgbW9yZSB0aGUgc3Ryb25nZXIgcGFzc3dvcmRcbiAgICByZXR1cm4genhjdmJuKHBhc3N3b3JkLCBpbnB1dHMpLnNjb3JlO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICBpZiAodHlwZW9mIHp4Y3ZibiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5faW5jbHVkZS5pbmNsdWRlKCdtaXNhZ28vanMvenhjdmJuLmpzJyk7XG4gICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1Byb21pc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFByb21pc2UoKTtcbiAgICB9XG4gIH1cblxuICBfbG9hZGluZ1Byb21pc2UoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHZhciB3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgenhjdmJuID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3YWl0KCk7XG4gICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB3YWl0KCk7XG4gICAgfSk7XG4gIH1cblxuICBfbG9hZGVkUHJvbWlzZSgpIHtcbiAgICAvLyB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHp4Y3Zibi5qcywgcmVzb2x2ZSBhd2F5IVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFp4Y3ZibigpOyIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgUHJvdmlkZXIsIGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYmFubmVkLXBhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xubGV0IHNlbGVjdCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS50aWNrO1xufTtcblxubGV0IFJlZHJhd2VkQmFubmVkUGFnZSA9IGNvbm5lY3Qoc2VsZWN0KShCYW5uZWRQYWdlKTtcbi8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGJhbiwgY2hhbmdlU3RhdGUpIHtcbiAgUmVhY3RET00ucmVuZGVyKFxuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlLmdldFN0b3JlKCl9PlxuICAgICAgPFJlZHJhd2VkQmFubmVkUGFnZSBtZXNzYWdlPXtiYW4ubWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcz17YmFuLmV4cGlyZXNfb24gPyBtb21lbnQoYmFuLmV4cGlyZXNfb24pIDogbnVsbH0gLz5cbiAgICA8L1Byb3ZpZGVyPixcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50JylcbiAgKTtcblxuICBpZiAodHlwZW9mIGNoYW5nZVN0YXRlID09PSAndW5kZWZpbmVkJyB8fCBjaGFuZ2VTdGF0ZSkge1xuICAgIGxldCBmb3J1bU5hbWUgPSBtaXNhZ28uZ2V0KCdTRVRUSU5HUycpLmZvcnVtX25hbWU7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBnZXR0ZXh0KFwiWW91IGFyZSBiYW5uZWRcIikgKyAnIHwgJyArIGZvcnVtTmFtZTtcbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIFwiXCIsIG1pc2Fnby5nZXQoJ0JBTk5FRF9VUkwnKSk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaXN0LCByb3dXaWR0aCwgcGFkZGluZz1mYWxzZSkge1xuICBsZXQgcm93cyA9IFtdO1xuICBsZXQgcm93ID0gW107XG5cbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByb3cucHVzaChlbGVtZW50KTtcbiAgICBpZiAocm93Lmxlbmd0aCA9PT0gcm93V2lkdGgpIHtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgICAgcm93ID0gW107XG4gICAgfVxuICB9KTtcblxuICAvLyBwYWQgcm93IHRvIHJlcXVpcmVkIGxlbmd0aD9cbiAgaWYgKHBhZGRpbmcgIT09IGZhbHNlICYmIHJvdy5sZW5ndGggPiAwICYmIHJvdy5sZW5ndGggPCByb3dXaWR0aCkge1xuICAgIGZvciAobGV0IGkgPSByb3cubGVuZ3RoOyBpIDwgcm93V2lkdGg7IGkgKyspIHtcbiAgICAgIHJvdy5wdXNoKHBhZGRpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb3cubGVuZ3RoKSB7XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gIH1cblxuICByZXR1cm4gcm93cztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihieXRlcykge1xuICBpZiAoYnl0ZXMgPiAxMDAwICogMTAwMCAqIDEwMDApIHtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoYnl0ZXMgKiAxMDAgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSkgLyAxMDApICsgJyBHQic7XG4gIH0gZWxzZSBpZiAoYnl0ZXMgPiAxMDAwICogMTAwMCkge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCAvICgxMDAwICogMTAwMCkpIC8gMTAwKSArICcgTUInO1xuICB9IGVsc2UgaWYgKGJ5dGVzID4gMTAwMCkge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCAvIDEwMDApIC8gMTAwKSArICcgS0InO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCkgLyAxMDApICsgJyBCJztcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKENvbXBvbmVudCwgcm9vdEVsZW1lbnRJZCwgY29ubmVjdGVkPXRydWUpIHtcbiAgbGV0IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocm9vdEVsZW1lbnRJZCk7XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBsZXQgZmluYWxDb21wb25lbnQgPSBDb21wb25lbnQucHJvcHMgPyBDb21wb25lbnQgOiA8Q29tcG9uZW50IC8+O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGlmIChyb290RWxlbWVudCkge1xuICAgIGlmIChjb25uZWN0ZWQpIHtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlLmdldFN0b3JlKCl9PlxuICAgICAgICAgIHtmaW5hbENvbXBvbmVudH1cbiAgICAgICAgPC9Qcm92aWRlcj4sXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICAgIHJvb3RFbGVtZW50XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBSZWFjdERPTS5yZW5kZXIoZmluYWxDb21wb25lbnQsIHJvb3RFbGVtZW50KTtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcmRlcmVkTGlzdCB7XG4gICAgY29uc3RydWN0b3IoaXRlbXMpIHtcbiAgICAgIHRoaXMuaXNPcmRlcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zIHx8IFtdO1xuICAgIH1cblxuICAgIGFkZChrZXksIGl0ZW0sIG9yZGVyKSB7XG4gICAgICB0aGlzLl9pdGVtcy5wdXNoKHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGl0ZW06IGl0ZW0sXG5cbiAgICAgICAgYWZ0ZXI6IG9yZGVyID8gb3JkZXIuYWZ0ZXIgfHwgbnVsbCA6IG51bGwsXG4gICAgICAgIGJlZm9yZTogb3JkZXIgPyBvcmRlci5iZWZvcmUgfHwgbnVsbCA6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldChrZXksIHZhbHVlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1tpXS5pdGVtO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoa2V5KSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhbHVlcygpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzLnB1c2godGhpcy5faXRlbXNbaV0uaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIG9yZGVyKHZhbHVlc19vbmx5KSB7XG4gICAgICBpZiAoIXRoaXMuaXNPcmRlcmVkKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5fb3JkZXIodGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLmlzT3JkZXJlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZXNfb25seSB8fCB0eXBlb2YgdmFsdWVzX29ubHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9yZGVyZWRWYWx1ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmRlcih0cnVlKTtcbiAgICB9XG5cbiAgICBfb3JkZXIodW5vcmRlcmVkKSB7XG4gICAgICAvLyBJbmRleCBvZiB1bm9yZGVyZWQgaXRlbXNcbiAgICAgIHZhciBpbmRleCA9IFtdO1xuICAgICAgdW5vcmRlcmVkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaW5kZXgucHVzaChpdGVtLmtleSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gT3JkZXJlZCBpdGVtc1xuICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcbiAgICAgIHZhciBvcmRlcmluZyA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCBwYXNzOiByZWdpc3RlciBpdGVtcyB0aGF0XG4gICAgICAvLyBkb24ndCBzcGVjaWZ5IHRoZWlyIG9yZGVyXG4gICAgICB1bm9yZGVyZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoIWl0ZW0uYWZ0ZXIgJiYgIWl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgICAgIG9yZGVyaW5nLnB1c2goaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vjb25kIHBhc3M6IHJlZ2lzdGVyIGl0ZW1zIHRoYXRcbiAgICAgIC8vIHNwZWNpZnkgdGhlaXIgYmVmb3JlIHRvIFwiX2VuZFwiXG4gICAgICB1bm9yZGVyZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoaXRlbS5iZWZvcmUgPT09IFwiX2VuZFwiKSB7XG4gICAgICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgICAgIG9yZGVyaW5nLnB1c2goaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcmQgcGFzczoga2VlcCBpdGVyYXRpbmcgaXRlbXNcbiAgICAgIC8vIHVudGlsIHdlIGhpdCBpdGVyYXRpb25zIGxpbWl0IG9yIGZpbmlzaFxuICAgICAgLy8gb3JkZXJpbmcgbGlzdFxuICAgICAgZnVuY3Rpb24gaW5zZXJ0SXRlbShpdGVtKSB7XG4gICAgICAgIHZhciBpbnNlcnRBdCA9IC0xO1xuICAgICAgICBpZiAob3JkZXJpbmcuaW5kZXhPZihpdGVtLmtleSkgPT09IC0xKSB7XG4gICAgICAgICAgaWYgKGl0ZW0uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGluc2VydEF0ID0gb3JkZXJpbmcuaW5kZXhPZihpdGVtLmFmdGVyKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnRBdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgaW5zZXJ0QXQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBpbnNlcnRBdCA9IG9yZGVyaW5nLmluZGV4T2YoaXRlbS5iZWZvcmUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbnNlcnRBdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG9yZGVyZWQuc3BsaWNlKGluc2VydEF0LCAwLCBpdGVtKTtcbiAgICAgICAgICAgIG9yZGVyaW5nLnNwbGljZShpbnNlcnRBdCwgMCwgaXRlbS5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDIwMDtcbiAgICAgIHdoaWxlIChpdGVyYXRpb25zID4gMCAmJiBpbmRleC5sZW5ndGggIT09IG9yZGVyaW5nLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRpb25zIC09IDE7XG4gICAgICAgIHVub3JkZXJlZC5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JkZXJlZDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBPcmRlcmVkTGlzdDtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbnQobWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpKSArIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKG1pbiwgbWF4KSB7XG4gIGxldCBhcnJheSA9IG5ldyBBcnJheShpbnQobWluLCBtYXgpKTtcbiAgZm9yKGxldCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspe1xuICAgIGFycmF5W2ldID0gaTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xufSIsIi8vIGpzaGludCBpZ25vcmU6c3RhcnRcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcbmltcG9ydCBjcmVhdGVIaXN0b3J5IGZyb20gJ2hpc3RvcnkvbGliL2NyZWF0ZUJyb3dzZXJIaXN0b3J5JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5jb25zdCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50Jyk7XG5jb25zdCBoaXN0b3J5ID0gbmV3IGNyZWF0ZUhpc3RvcnkoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICBsZXQgcm91dGVzID0ge1xuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgY2hpbGRSb3V0ZXM6IFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogb3B0aW9ucy5yb290LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbihuZXh0U3RhdGUsIHJlcGxhY2VTdGF0ZSkge1xuICAgICAgICAgIHJlcGxhY2VTdGF0ZShudWxsLCBvcHRpb25zLnBhdGhzWzBdLnBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXS5jb25jYXQob3B0aW9ucy5wYXRocy5tYXAoZnVuY3Rpb24ocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSkpXG4gIH07XG5cbiAgUmVhY3RET00ucmVuZGVyKFxuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmUuZ2V0U3RvcmUoKX0+XG4gICAgICA8Um91dGVyIHJvdXRlcz17cm91dGVzfSBoaXN0b3J5PXtoaXN0b3J5fSAvPlxuICAgIDwvUHJvdmlkZXI+LFxuICAgIHJvb3RFbGVtZW50XG4gICk7XG59XG4iLCJjb25zdCBFTUFJTCA9IC9eKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcbmNvbnN0IFVTRVJOQU1FID0gbmV3IFJlZ0V4cCgnXlswLTlhLXpdKyQnLCAnaScpO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICgkLnRyaW0odmFsdWUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICghRU1BSUwudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlIHx8IGdldHRleHQoXCJFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuXCIpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbkxlbmd0aChsaW1pdFZhbHVlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXR1cm5NZXNzYWdlID0gJyc7XG4gICAgdmFyIGxlbmd0aCA9ICQudHJpbSh2YWx1ZSkubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA8IGxpbWl0VmFsdWUpIHtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybk1lc3NhZ2UgPSBtZXNzYWdlKGxpbWl0VmFsdWUsIGxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBcIkVuc3VyZSB0aGlzIHZhbHVlIGhhcyBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBsaW1pdFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShyZXR1cm5NZXNzYWdlLCB7XG4gICAgICAgIGxpbWl0X3ZhbHVlOiBsaW1pdFZhbHVlLFxuICAgICAgICBzaG93X3ZhbHVlOiBsZW5ndGhcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heExlbmd0aChsaW1pdFZhbHVlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXR1cm5NZXNzYWdlID0gJyc7XG4gICAgdmFyIGxlbmd0aCA9ICQudHJpbSh2YWx1ZSkubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA+IGxpbWl0VmFsdWUpIHtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybk1lc3NhZ2UgPSBtZXNzYWdlKGxpbWl0VmFsdWUsIGxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbW9zdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVyIChpdCBoYXMgJShzaG93X3ZhbHVlKXMpLlwiLFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IG1vc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlcnMgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgbGltaXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUocmV0dXJuTWVzc2FnZSwge1xuICAgICAgICBsaW1pdF92YWx1ZTogbGltaXRWYWx1ZSxcbiAgICAgICAgc2hvd192YWx1ZTogbGVuZ3RoXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VybmFtZU1pbkxlbmd0aChzZXR0aW5ncykge1xuICB2YXIgbWVzc2FnZSA9IGZ1bmN0aW9uKGxpbWl0VmFsdWUpIHtcbiAgICByZXR1cm4gbmdldHRleHQoXG4gICAgICBcIlVzZXJuYW1lIG11c3QgYmUgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciBsb25nLlwiLFxuICAgICAgXCJVc2VybmFtZSBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIGxvbmcuXCIsXG4gICAgICBsaW1pdFZhbHVlKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMubWluTGVuZ3RoKHNldHRpbmdzLnVzZXJuYW1lX2xlbmd0aF9taW4sIG1lc3NhZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlcm5hbWVNYXhMZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJVc2VybmFtZSBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJShsaW1pdF92YWx1ZSlzIGNoYXJhY3Rlci5cIixcbiAgICAgIFwiVXNlcm5hbWUgY2Fubm90IGJlIGxvbmdlciB0aGFuICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1heExlbmd0aChzZXR0aW5ncy51c2VybmFtZV9sZW5ndGhfbWF4LCBtZXNzYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lQ29udGVudCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKCFVU0VSTkFNRS50ZXN0KCQudHJpbSh2YWx1ZSkpKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlVzZXJuYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGF0aW4gYWxwaGFiZXQgbGV0dGVycyBhbmQgZGlnaXRzLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZE1pbkxlbmd0aChzZXR0aW5ncykge1xuICB2YXIgbWVzc2FnZSA9IGZ1bmN0aW9uKGxpbWl0VmFsdWUpIHtcbiAgICByZXR1cm4gbmdldHRleHQoXG4gICAgICBcIlZhbGlkIHBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciBsb25nLlwiLFxuICAgICAgXCJWYWxpZCBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIGxvbmcuXCIsXG4gICAgICBsaW1pdFZhbHVlKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMubWluTGVuZ3RoKHNldHRpbmdzLnBhc3N3b3JkX2xlbmd0aF9taW4sIG1lc3NhZ2UpO1xufSJdfQ==
+},{}]},{},[2,3,4,5,17,18,19,20,21,22,23,31,32,33,34,6,7,8,9,10,11,12,13,14,15,16,24,25,26,27,28,29,30])
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2luaXRpYWxpemVycy9hamF4LmpzIiwic3JjL2luaXRpYWxpemVycy9hdXRoLmpzIiwic3JjL2luaXRpYWxpemVycy9jYXRjaGEuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL2Jhbm5lZC1wYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL2NhdGVnb3JpZXMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvb3B0aW9ucy5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9wcm9maWxlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybS5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9zbmFja2Jhci5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy91c2VyLW1lbnUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvdXNlcnMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2luY2x1ZGUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2xvY2FsLXN0b3JhZ2UuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL21vYmlsZS1uYXZiYXItZHJvcGRvd24uanMiLCJzcmMvaW5pdGlhbGl6ZXJzL21vZGFsLmpzIiwic3JjL2luaXRpYWxpemVycy9tb21lbnQtbG9jYWxlLmpzIiwic3JjL2luaXRpYWxpemVycy9wYWdlLXRpdGxlLmpzIiwic3JjL2luaXRpYWxpemVycy9wb2xscy5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvYXV0aC5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvcHJvZmlsZS1kZWh5ZHJhdGUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL3Byb2ZpbGUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL3NuYWNrYmFyLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy90aWNrLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy91c2VybmFtZS1oaXN0b3J5LmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy91c2Vycy5qcyIsInNyYy9pbml0aWFsaXplcnMvc25hY2tiYXIuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3N0b3JlLmpzIiwic3JjL2luaXRpYWxpemVycy90aWNrLXN0YXJ0LmpzIiwic3JjL2luaXRpYWxpemVycy96eGN2Ym4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvaW5kZXguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvbGliL2lzX2FyZ3VtZW50cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9saWIva2V5cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvQWN0aW9ucy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvQXN5bmNVdGlscy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvRE9NU3RhdGVTdG9yYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9ET01VdGlscy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL2NyZWF0ZUJyb3dzZXJIaXN0b3J5LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9jcmVhdGVET01IaXN0b3J5LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9jcmVhdGVIaXN0b3J5LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9jcmVhdGVMb2NhdGlvbi5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvZGVwcmVjYXRlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9leHRyYWN0UGF0aC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvcGFyc2VQYXRoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9ydW5UcmFuc2l0aW9uSG9vay5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL3dhcm5pbmcvYnJvd3Nlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9hdXRoLW1lc3NhZ2UuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvYXZhdGFyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2Jhbm5lZC1wYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2J1dHRvbi5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jYXRlZ29yaWVzL2NhdGVnb3J5LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NhdGVnb3JpZXMvZW1wdHktbWVzc2FnZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jYXRlZ29yaWVzL2xhc3QtYWN0aXZpdHkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2F0ZWdvcmllcy9yZWFkLWljb24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2F0ZWdvcmllcy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NhdGVnb3JpZXMvc3RhdHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9jcm9wLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvZ2FsbGVyeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL3VwbG9hZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9mb3JtLWdyb3VwLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2Zvcm0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbGkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbG9hZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL21vZGFsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9tb2RhbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9hZGluZy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLWxvY2tlZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9mb3J1bS1vcHRpb25zLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvbmF2cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1lbWFpbC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvY2hhbmdlLXBhc3N3b3JkLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3BhbmVsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wYW5lbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLXN0cmVuZ3RoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvSGVhZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvYmFuLWRldGFpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93ZXJzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vYXZhdGFyLWNvbnRyb2xzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9jaGFuZ2UtdXNlcm5hbWUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL2RlbGV0ZS1hY2NvdW50LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL3VzZXJuYW1lLWhpc3RvcnkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVnaXN0ZXItYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlZ2lzdGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9zZWFyY2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc2VsZWN0LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3NpZ24taW4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1tZW51L2d1ZXN0LW5hdi5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvdXNlci1uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1zdGF0dXMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy1saXN0L3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLWNhcmQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLXByZXZpZXcuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1lbXB0eS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0LWl0ZW0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL2xpc3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yYW5rL3BhZ2VyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3Jhbmsvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3llcy1uby1zd2l0Y2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9hdXRoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9zbmFja2Jhci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdGljay5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcnMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2FqYXguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2F1dGguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2NhcHRjaGEuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2luY2x1ZGUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vZGFsLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wYWdlLXRpdGxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wb2xscy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL3N0b3JlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy96eGN2Ym4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL2Jhbm5lZC1wYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9iYXRjaC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvZmlsZS1zaXplLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9tb3VudC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL29yZGVyZWQtbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvcmFuZG9tLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9yZXNldC1zY3JvbGwuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3JvdXRlZC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3ZhbGlkYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ3pGYSxNQUFNLFdBQU4sTUFBTTtBQUNqQixXQURXLE1B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TyxjQUFjLENBQUM7QUFDcEIsTUFBSSxFQUFFLFFBQVE7QUFDZCxhQUFXLEVBQUUsV0FBVztDQUN6QixDQUFDLENBQUM7OztBQ1hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QVEsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUM5RCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsImltcG9ydCBPcmRlcmVkTGlzdCBmcm9tICdtaXNhZ28vdXRpbHMvb3JkZXJlZC1saXN0JztcblxuZXhwb3J0IGNsYXNzIE1pc2FnbyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVycyA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSB7fTtcbiAgfVxuXG4gIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZXJzLnB1c2goe1xuICAgICAga2V5OiBpbml0aWFsaXplci5uYW1lLFxuXG4gICAgICBpdGVtOiBpbml0aWFsaXplci5pbml0aWFsaXplcixcblxuICAgICAgYWZ0ZXI6IGluaXRpYWxpemVyLmFmdGVyLFxuICAgICAgYmVmb3JlOiBpbml0aWFsaXplci5iZWZvcmVcbiAgICB9KTtcbiAgfVxuXG4gIGluaXQoY29udGV4dCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdmFyIGluaXRPcmRlciA9IG5ldyBPcmRlcmVkTGlzdCh0aGlzLl9pbml0aWFsaXplcnMpLm9yZGVyZWRWYWx1ZXMoKTtcbiAgICBpbml0T3JkZXIuZm9yRWFjaChpbml0aWFsaXplciA9PiB7XG4gICAgICBpbml0aWFsaXplcih0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbnRleHQgYWNjZXNzb3JzXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gISF0aGlzLl9jb250ZXh0W2tleV07XG4gIH1cblxuICBnZXQoa2V5LCBmYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udGV4dFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2sgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHBvcChrZXkpIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5fY29udGV4dFtrZXldO1xuICAgICAgdGhpcy5fY29udGV4dFtrZXldID0gbnVsbDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gY3JlYXRlICBzaW5nbGV0b25cbnZhciBtaXNhZ28gPSBuZXcgTWlzYWdvKCk7XG5cbi8vIGV4cG9zZSBpdCBnbG9iYWxseVxuZ2xvYmFsLm1pc2FnbyA9IG1pc2FnbztcblxuLy8gYW5kIGV4cG9ydCBpdCBmb3IgdGVzdHMgYW5kIHN0dWZmXG5leHBvcnQgZGVmYXVsdCBtaXNhZ287XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBhamF4LmluaXQobWlzYWdvLmdldCgnQ1NSRl9DT09LSUVfTkFNRScpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2FqYXgnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGF1dGggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2F1dGgnO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCBzdG9yYWdlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGF1dGguaW5pdChzdG9yZSwgc3RvcmFnZSwgbW9kYWwpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnYXV0aCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pOyIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBjYXB0Y2hhIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9jYXB0Y2hhJztcbmltcG9ydCBpbmNsdWRlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9pbmNsdWRlJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGNhcHRjaGEuaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcik7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjYXB0Y2hhJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQXV0aE1lc3NhZ2UsIHsgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShBdXRoTWVzc2FnZSksICdhdXRoLW1lc3NhZ2UtbW91bnQnKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDphdXRoLW1lc3NhZ2UnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0LmhhcygnQkFOX01FU1NBR0UnKSkge1xuICAgIHNob3dCYW5uZWRQYWdlKGNvbnRleHQuZ2V0KCdCQU5fTUVTU0FHRScpLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpiYW5lZC1wYWdlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IENhdGVnb3JpZXMsIHsgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2F0ZWdvcmllcy9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ0NBVEVHT1JJRVMnKSkge1xuICAgIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShDYXRlZ29yaWVzKSwgJ3BhZ2UtbW91bnQnKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OnJlc2V0LXBhc3N3b3JkLWZvcm0nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBPcHRpb25zLCB7IHBhdGhzIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvcm91dGVkLWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaGFzKCdVU0VSX09QVElPTlMnKSkge1xuICAgIG1vdW50KHtcbiAgICAgIHJvb3Q6IG1pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKSxcbiAgICAgIGNvbXBvbmVudDogT3B0aW9ucyxcbiAgICAgIHBhdGhzOiBwYXRocygpXG4gICAgfSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpvcHRpb25zJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFByb2ZpbGUsIHsgcGF0aHMsIHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvcm9vdCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL3JvdXRlZC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0LmhhcygnUFJPRklMRScpICYmIGNvbnRleHQuaGFzKCdQUk9GSUxFX1BBR0VTJykpIHtcbiAgICBtb3VudCh7XG4gICAgICByb290OiBtaXNhZ28uZ2V0KCdQUk9GSUxFJykuYWJzb2x1dGVfdXJsLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoUHJvZmlsZSksXG4gICAgICBwYXRoczogcGF0aHMoKVxuICAgIH0pO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6cHJvZmlsZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdyZWR1Y2VyOnByb2ZpbGUtZGVoeWRyYXRlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgUmVxdWVzdEFjdGl2YXRpb25MaW5rIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVxdWVzdC1hY3RpdmF0aW9uLWxpbmstbW91bnQnKSkge1xuICAgIG1vdW50KFJlcXVlc3RBY3RpdmF0aW9uTGluaywgJ3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLW1vdW50JywgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6cmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBSZXF1ZXN0UGFzc3dvcmRSZXNldCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVxdWVzdC1wYXNzd29yZC1yZXNldC1tb3VudCcpKSB7XG4gICAgbW91bnQoUmVxdWVzdFBhc3N3b3JkUmVzZXQsICdyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LW1vdW50JywgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6cmVxdWVzdC1wYXNzd29yZC1yZXNldCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IFJlc2V0UGFzc3dvcmRGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Jlc2V0LXBhc3N3b3JkLWZvcm0nO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1wYXNzd29yZC1mb3JtLW1vdW50JykpIHtcbiAgICBtb3VudChSZXNldFBhc3N3b3JkRm9ybSwgJ3Jlc2V0LXBhc3N3b3JkLWZvcm0tbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXNldC1wYXNzd29yZC1mb3JtJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgU25hY2tiYXIsIHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NuYWNrYmFyJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShTbmFja2JhciksICdzbmFja2Jhci1tb3VudCcpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OnNuYWNrYmFyJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3NuYWNrYmFyJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgVXNlck1lbnUsIENvbXBhY3RVc2VyTWVudSwgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1tZW51L3Jvb3QnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW91bnQoY29ubmVjdChzZWxlY3QpKFVzZXJNZW51KSwgJ3VzZXItbWVudS1tb3VudCcpO1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoQ29tcGFjdFVzZXJNZW51KSwgJ3VzZXItbWVudS1jb21wYWN0LW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6dXNlci1tZW51JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgVXNlcnMsIHsgcGF0aHMgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvcm91dGVkLWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaGFzKCdVU0VSU19MSVNUUycpKSB7XG4gICAgbW91bnQoe1xuICAgICAgcm9vdDogbWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKSxcbiAgICAgIGNvbXBvbmVudDogVXNlcnMsXG4gICAgICBwYXRoczogcGF0aHMoKVxuICAgIH0pO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6dXNlcnMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBpbmNsdWRlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9pbmNsdWRlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpbmNsdWRlLmluaXQoY29udGV4dC5nZXQoJ1NUQVRJQ19VUkwnKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdpbmNsdWRlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yYWdlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JhZ2UuaW5pdCgnbWlzYWdvXycpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbG9jYWwtc3RvcmFnZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9iaWxlLW5hdmJhci1kcm9wZG93bi1tb3VudCcpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIGRyb3Bkb3duLmluaXQoZWxlbWVudCk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2Ryb3Bkb3duJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1tb3VudCcpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIG1vZGFsLmluaXQoZWxlbWVudCk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ21vZGFsJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW9tZW50LmxvY2FsZSgkKCdodG1sJykuYXR0cignbGFuZycpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ21vbWVudCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIHRpdGxlLmluaXQoY29udGV4dC5nZXQoJ1NFVFRJTkdTJykuZm9ydW1fbmFtZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdwYWdlLXRpdGxlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHBvbGxzIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wb2xscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBwb2xscy5pbml0KGFqYXgsIHNuYWNrYmFyKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3BvbGxzJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ2F1dGgnLCByZWR1Y2VyLCBPYmplY3QuYXNzaWduKHtcbiAgICAnaXNBdXRoZW50aWNhdGVkJzogY29udGV4dC5nZXQoJ2lzQXV0aGVudGljYXRlZCcpLFxuICAgICdpc0Fub255bW91cyc6ICFjb250ZXh0LmdldCgnaXNBdXRoZW50aWNhdGVkJyksXG5cbiAgICAndXNlcic6IGNvbnRleHQuZ2V0KCd1c2VyJylcbiAgfSwgaW5pdGlhbFN0YXRlKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOmF1dGgnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvcHJvZmlsZSc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGlmIChtaXNhZ28uaGFzKCdQUk9GSUxFJykpIHtcbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUobWlzYWdvLmdldCgnUFJPRklMRScpKSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6cHJvZmlsZS1kZWh5ZHJhdGUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyIGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcigncHJvZmlsZScsIHJlZHVjZXIsIHt9KTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6cHJvZmlsZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ3NuYWNrYmFyJywgcmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6c25hY2tiYXInLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciwgeyBpbml0aWFsU3RhdGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdGljayc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ3RpY2snLCByZWR1Y2VyLCBpbml0aWFsU3RhdGUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjp0aWNrJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJuYW1lLWhpc3RvcnknO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCd1c2VybmFtZS1oaXN0b3J5JywgcmVkdWNlciwgW10pO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjp1c2VybmFtZS1oaXN0b3J5JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcigndXNlcnMnLCByZWR1Y2VyLCBbXSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnVzZXJzJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHNuYWNrYmFyLmluaXQoc3RvcmUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnc25hY2tiYXInLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuaW5pdCgpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnc3RvcmUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ19lbmQnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRvVGljayB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy90aWNrJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5jb25zdCBUSUNLX1BFUklPRCA9IDUwICogMTAwMDsgLy9kbyB0aGUgdGljayBldmVyeSA1MHNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICBzdG9yZS5kaXNwYXRjaChkb1RpY2soKSk7XG4gIH0sIFRJQ0tfUEVSSU9EKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3RpY2stc3RhcnQnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBpbmNsdWRlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9pbmNsdWRlJztcbmltcG9ydCB6eGN2Ym4gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3p4Y3Zibic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICB6eGN2Ym4uaW5pdChpbmNsdWRlKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3p4Y3ZibicsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJ2YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuL2xpYi9rZXlzLmpzJyk7XG52YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2xpYi9pc19hcmd1bWVudHMuanMnKTtcblxudmFyIGRlZXBFcXVhbCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMpIHtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSAmJiBleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMy4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCB0eXBlb2YgYWN0dWFsICE9ICdvYmplY3QnICYmIHR5cGVvZiBleHBlY3RlZCAhPSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcHRzLnN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gNy40LiBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoeCkge1xuICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnIHx8IHR5cGVvZiB4Lmxlbmd0aCAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB4LmNvcHkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHguc2xpY2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHgubGVuZ3RoID4gMCAmJiB0eXBlb2YgeFswXSAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIG9wdHMpIHtcbiAgdmFyIGksIGtleTtcbiAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGEpIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSByZXR1cm4gZmFsc2U7XG4gIC8vfn5+SSd2ZSBtYW5hZ2VkIHRvIGJyZWFrIE9iamVjdC5rZXlzIHRocm91Z2ggc2NyZXd5IGFyZ3VtZW50cyBwYXNzaW5nLlxuICAvLyAgIENvbnZlcnRpbmcgdG8gYXJyYXkgc29sdmVzIHRoZSBwcm9ibGVtLlxuICBpZiAoaXNBcmd1bWVudHMoYSkpIHtcbiAgICBpZiAoIWlzQXJndW1lbnRzKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIGRlZXBFcXVhbChhLCBiLCBvcHRzKTtcbiAgfVxuICBpZiAoaXNCdWZmZXIoYSkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICB2YXIga2EgPSBvYmplY3RLZXlzKGEpLFxuICAgICAgICBrYiA9IG9iamVjdEtleXMoYik7XG4gIH0gY2F0Y2ggKGUpIHsvL2hhcHBlbnMgd2hlbiBvbmUgaXMgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgdGhlIG90aGVyIGlzbid0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgb3B0cykpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiO1xufVxuIiwidmFyIHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPSAoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpXG59KSgpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0c0FyZ3VtZW50c0NsYXNzID8gc3VwcG9ydGVkIDogdW5zdXBwb3J0ZWQ7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuZnVuY3Rpb24gc3VwcG9ydGVkKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59O1xuXG5leHBvcnRzLnVuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQ7XG5mdW5jdGlvbiB1bnN1cHBvcnRlZChvYmplY3Qpe1xuICByZXR1cm4gb2JqZWN0ICYmXG4gICAgdHlwZW9mIG9iamVjdCA9PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QubGVuZ3RoID09ICdudW1iZXInICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpICYmXG4gICAgIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsICdjYWxsZWUnKSB8fFxuICAgIGZhbHNlO1xufTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJ1xuICA/IE9iamVjdC5rZXlzIDogc2hpbTtcblxuZXhwb3J0cy5zaGltID0gc2hpbTtcbmZ1bmN0aW9uIHNoaW0gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59XG4iLCIvKipcbiAqIEluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gd2FzIGNhdXNlZCBieSBhIGNhbGwgdG8gaGlzdG9yeS5wdXNoLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUFVTSCA9ICdQVVNIJztcblxuZXhwb3J0cy5QVVNIID0gUFVTSDtcbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgY2FsbCB0byBoaXN0b3J5LnJlcGxhY2UuXG4gKi9cbnZhciBSRVBMQUNFID0gJ1JFUExBQ0UnO1xuXG5leHBvcnRzLlJFUExBQ0UgPSBSRVBMQUNFO1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHdhcyBjYXVzZWQgYnkgc29tZSBvdGhlciBhY3Rpb24gc3VjaFxuICogYXMgdXNpbmcgYSBicm93c2VyJ3MgYmFjay9mb3J3YXJkIGJ1dHRvbnMgYW5kL29yIG1hbnVhbGx5IG1hbmlwdWxhdGluZ1xuICogdGhlIFVSTCBpbiBhIGJyb3dzZXIncyBsb2NhdGlvbiBiYXIuIFRoaXMgaXMgdGhlIGRlZmF1bHQuXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dFdmVudEhhbmRsZXJzL29ucG9wc3RhdGVcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG52YXIgUE9QID0gJ1BPUCc7XG5cbmV4cG9ydHMuUE9QID0gUE9QO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBQVVNIOiBQVVNILFxuICBSRVBMQUNFOiBSRVBMQUNFLFxuICBQT1A6IFBPUFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMubG9vcEFzeW5jID0gbG9vcEFzeW5jO1xuXG5mdW5jdGlvbiBsb29wQXN5bmModHVybnMsIHdvcmssIGNhbGxiYWNrKSB7XG4gIHZhciBjdXJyZW50VHVybiA9IDA7XG4gIHZhciBpc0RvbmUgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIGlzRG9uZSA9IHRydWU7XG4gICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgaWYgKGlzRG9uZSkgcmV0dXJuO1xuXG4gICAgaWYgKGN1cnJlbnRUdXJuIDwgdHVybnMpIHtcbiAgICAgIHdvcmsuY2FsbCh0aGlzLCBjdXJyZW50VHVybisrLCBuZXh0LCBkb25lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoKTtcbn0iLCIvKmVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnNhdmVTdGF0ZSA9IHNhdmVTdGF0ZTtcbmV4cG9ydHMucmVhZFN0YXRlID0gcmVhZFN0YXRlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgS2V5UHJlZml4ID0gJ0BASGlzdG9yeS8nO1xudmFyIFF1b3RhRXhjZWVkZWRFcnJvciA9ICdRdW90YUV4Y2VlZGVkRXJyb3InO1xudmFyIFNlY3VyaXR5RXJyb3IgPSAnU2VjdXJpdHlFcnJvcic7XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleShrZXkpIHtcbiAgcmV0dXJuIEtleVByZWZpeCArIGtleTtcbn1cblxuZnVuY3Rpb24gc2F2ZVN0YXRlKGtleSwgc3RhdGUpIHtcbiAgdHJ5IHtcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShjcmVhdGVLZXkoa2V5KSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gU2VjdXJpdHlFcnJvcikge1xuICAgICAgLy8gQmxvY2tpbmcgY29va2llcyBpbiBDaHJvbWUvRmlyZWZveC9TYWZhcmkgdGhyb3dzIFNlY3VyaXR5RXJyb3Igb24gYW55XG4gICAgICAvLyBhdHRlbXB0IHRvIGFjY2VzcyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX3dhcm5pbmcyWydkZWZhdWx0J10oZmFsc2UsICdbaGlzdG9yeV0gVW5hYmxlIHRvIHNhdmUgc3RhdGU7IHNlc3Npb25TdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvIHNlY3VyaXR5IHNldHRpbmdzJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gUXVvdGFFeGNlZWRlZEVycm9yICYmIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNhZmFyaSBcInByaXZhdGUgbW9kZVwiIHRocm93cyBRdW90YUV4Y2VlZGVkRXJyb3IuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX3dhcm5pbmcyWydkZWZhdWx0J10oZmFsc2UsICdbaGlzdG9yeV0gVW5hYmxlIHRvIHNhdmUgc3RhdGU7IHNlc3Npb25TdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gU2FmYXJpIHByaXZhdGUgbW9kZScpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFN0YXRlKGtleSkge1xuICB2YXIganNvbiA9IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBqc29uID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oY3JlYXRlS2V5KGtleSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvci5uYW1lID09PSBTZWN1cml0eUVycm9yKSB7XG4gICAgICAvLyBCbG9ja2luZyBjb29raWVzIGluIENocm9tZS9GaXJlZm94L1NhZmFyaSB0aHJvd3MgU2VjdXJpdHlFcnJvciBvbiBhbnlcbiAgICAgIC8vIGF0dGVtcHQgdG8gYWNjZXNzIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShmYWxzZSwgJ1toaXN0b3J5XSBVbmFibGUgdG8gcmVhZCBzdGF0ZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBkdWUgdG8gc2VjdXJpdHkgc2V0dGluZ3MnKSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKGpzb24pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBpbnZhbGlkIEpTT04uXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjtcbmV4cG9ydHMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5leHBvcnRzLmdldEhhc2hQYXRoID0gZ2V0SGFzaFBhdGg7XG5leHBvcnRzLnJlcGxhY2VIYXNoUGF0aCA9IHJlcGxhY2VIYXNoUGF0aDtcbmV4cG9ydHMuZ2V0V2luZG93UGF0aCA9IGdldFdpbmRvd1BhdGg7XG5leHBvcnRzLmdvID0gZ287XG5leHBvcnRzLmdldFVzZXJDb25maXJtYXRpb24gPSBnZXRVc2VyQ29uZmlybWF0aW9uO1xuZXhwb3J0cy5zdXBwb3J0c0hpc3RvcnkgPSBzdXBwb3J0c0hpc3Rvcnk7XG5leHBvcnRzLnN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoID0gc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2g7XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gIGlmIChub2RlLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50LCBsaXN0ZW5lcikge1xuICBpZiAobm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgIG5vZGUuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBsaXN0ZW5lcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SGFzaFBhdGgoKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBoZXJlIGJlY2F1c2UgaXQncyBub3RcbiAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMgLSBGaXJlZm94IHdpbGwgcHJlLWRlY29kZSBpdCFcbiAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMV0gfHwgJyc7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VIYXNoUGF0aChwYXRoKSB7XG4gIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyAnIycgKyBwYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93UGF0aCgpIHtcbiAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyB3aW5kb3cubG9jYXRpb24uaGFzaDtcbn1cblxuZnVuY3Rpb24gZ28obikge1xuICBpZiAobikgd2luZG93Lmhpc3RvcnkuZ28obik7XG59XG5cbmZ1bmN0aW9uIGdldFVzZXJDb25maXJtYXRpb24obWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sod2luZG93LmNvbmZpcm0obWVzc2FnZSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgaXMgc3VwcG9ydGVkLiBUYWtlbiBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvaGlzdG9yeS5qc1xuICogY2hhbmdlZCB0byBhdm9pZCBmYWxzZSBuZWdhdGl2ZXMgZm9yIFdpbmRvd3MgUGhvbmVzOiBodHRwczovL2dpdGh1Yi5jb20vcmFja3QvcmVhY3Qtcm91dGVyL2lzc3Vlcy81ODZcbiAqL1xuXG5mdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKSB7XG4gIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIGlmICgodWEuaW5kZXhPZignQW5kcm9pZCAyLicpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdBbmRyb2lkIDQuMCcpICE9PSAtMSkgJiYgdWEuaW5kZXhPZignTW9iaWxlIFNhZmFyaScpICE9PSAtMSAmJiB1YS5pbmRleE9mKCdDaHJvbWUnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignV2luZG93cyBQaG9uZScpID09PSAtMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBGSVhNRTogV29yayBhcm91bmQgb3VyIGJyb3dzZXIgaGlzdG9yeSBub3Qgd29ya2luZyBjb3JyZWN0bHkgb24gQ2hyb21lXG4gIC8vIGlPUzogaHR0cHM6Ly9naXRodWIuY29tL3JhY2t0L3JlYWN0LXJvdXRlci9pc3N1ZXMvMjU2NVxuICBpZiAodWEuaW5kZXhPZignQ3JpT1MnKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5O1xufVxuXG4vKipcbiAqIFJldHVybnMgZmFsc2UgaWYgdXNpbmcgZ28obikgd2l0aCBoYXNoIGhpc3RvcnkgY2F1c2VzIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAqL1xuXG5mdW5jdGlvbiBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaCgpIHtcbiAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgcmV0dXJuIHVhLmluZGV4T2YoJ0ZpcmVmb3gnKSA9PT0gLTE7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5leHBvcnRzLmNhblVzZURPTSA9IGNhblVzZURPTTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9pbnZhcmlhbnQgPSByZXF1aXJlKCdpbnZhcmlhbnQnKTtcblxudmFyIF9pbnZhcmlhbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW52YXJpYW50KTtcblxudmFyIF9BY3Rpb25zID0gcmVxdWlyZSgnLi9BY3Rpb25zJyk7XG5cbnZhciBfRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBfRE9NVXRpbHMgPSByZXF1aXJlKCcuL0RPTVV0aWxzJyk7XG5cbnZhciBfRE9NU3RhdGVTdG9yYWdlID0gcmVxdWlyZSgnLi9ET01TdGF0ZVN0b3JhZ2UnKTtcblxudmFyIF9jcmVhdGVET01IaXN0b3J5ID0gcmVxdWlyZSgnLi9jcmVhdGVET01IaXN0b3J5Jyk7XG5cbnZhciBfY3JlYXRlRE9NSGlzdG9yeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVET01IaXN0b3J5KTtcblxudmFyIF9wYXJzZVBhdGggPSByZXF1aXJlKCcuL3BhcnNlUGF0aCcpO1xuXG52YXIgX3BhcnNlUGF0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYXJzZVBhdGgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBoaXN0b3J5IG9iamVjdCB0aGF0IHVzZXMgSFRNTDUncyBoaXN0b3J5IEFQSVxuICogKHB1c2hTdGF0ZSwgcmVwbGFjZVN0YXRlLCBhbmQgdGhlIHBvcHN0YXRlIGV2ZW50KSB0byBtYW5hZ2UgaGlzdG9yeS5cbiAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBvZiBtYW5hZ2luZyBoaXN0b3J5IGluIGJyb3dzZXJzIGJlY2F1c2VcbiAqIGl0IHByb3ZpZGVzIHRoZSBjbGVhbmVzdCBVUkxzLlxuICpcbiAqIE5vdGU6IEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIEhUTUw1IGhpc3RvcnkgQVBJIGZ1bGxcbiAqIHBhZ2UgcmVsb2FkcyB3aWxsIGJlIHVzZWQgdG8gcHJlc2VydmUgVVJMcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnJvd3Nlckhpc3RvcnkoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgIV9FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX2ludmFyaWFudDJbJ2RlZmF1bHQnXShmYWxzZSwgJ0Jyb3dzZXIgaGlzdG9yeSBuZWVkcyBhIERPTScpIDogX2ludmFyaWFudDJbJ2RlZmF1bHQnXShmYWxzZSkgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGZvcmNlUmVmcmVzaCA9IG9wdGlvbnMuZm9yY2VSZWZyZXNoO1xuXG4gIHZhciBpc1N1cHBvcnRlZCA9IF9ET01VdGlscy5zdXBwb3J0c0hpc3RvcnkoKTtcbiAgdmFyIHVzZVJlZnJlc2ggPSAhaXNTdXBwb3J0ZWQgfHwgZm9yY2VSZWZyZXNoO1xuXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbihoaXN0b3J5U3RhdGUpIHtcbiAgICBoaXN0b3J5U3RhdGUgPSBoaXN0b3J5U3RhdGUgfHwgd2luZG93Lmhpc3Rvcnkuc3RhdGUgfHwge307XG5cbiAgICB2YXIgcGF0aCA9IF9ET01VdGlscy5nZXRXaW5kb3dQYXRoKCk7XG4gICAgdmFyIF9oaXN0b3J5U3RhdGUgPSBoaXN0b3J5U3RhdGU7XG4gICAgdmFyIGtleSA9IF9oaXN0b3J5U3RhdGUua2V5O1xuXG4gICAgdmFyIHN0YXRlID0gdW5kZWZpbmVkO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIHN0YXRlID0gX0RPTVN0YXRlU3RvcmFnZS5yZWFkU3RhdGUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUgPSBudWxsO1xuICAgICAga2V5ID0gaGlzdG9yeS5jcmVhdGVLZXkoKTtcblxuICAgICAgaWYgKGlzU3VwcG9ydGVkKSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoX2V4dGVuZHMoe30sIGhpc3RvcnlTdGF0ZSwgeyBrZXk6IGtleSB9KSwgbnVsbCwgcGF0aCk7XG4gICAgfVxuXG4gICAgdmFyIGxvY2F0aW9uID0gX3BhcnNlUGF0aDJbJ2RlZmF1bHQnXShwYXRoKTtcblxuICAgIHJldHVybiBoaXN0b3J5LmNyZWF0ZUxvY2F0aW9uKF9leHRlbmRzKHt9LCBsb2NhdGlvbiwgeyBzdGF0ZTogc3RhdGUgfSksIHVuZGVmaW5lZCwga2V5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihfcmVmKSB7XG4gICAgdmFyIHRyYW5zaXRpb25UbyA9IF9yZWYudHJhbnNpdGlvblRvO1xuXG4gICAgZnVuY3Rpb24gcG9wU3RhdGVMaXN0ZW5lcihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gSWdub3JlIGV4dHJhbmVvdXMgcG9wc3RhdGUgZXZlbnRzIGluIFdlYktpdC5cblxuICAgICAgdHJhbnNpdGlvblRvKGdldEN1cnJlbnRMb2NhdGlvbihldmVudC5zdGF0ZSkpO1xuICAgIH1cblxuICAgIF9ET01VdGlscy5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3BvcHN0YXRlJywgcG9wU3RhdGVMaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgX0RPTVV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCAncG9wc3RhdGUnLCBwb3BTdGF0ZUxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluaXNoVHJhbnNpdGlvbihsb2NhdGlvbikge1xuICAgIHZhciBiYXNlbmFtZSA9IGxvY2F0aW9uLmJhc2VuYW1lO1xuICAgIHZhciBwYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIHZhciBzZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuICAgIHZhciBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xuICAgIHZhciBhY3Rpb24gPSBsb2NhdGlvbi5hY3Rpb247XG4gICAgdmFyIGtleSA9IGxvY2F0aW9uLmtleTtcblxuICAgIGlmIChhY3Rpb24gPT09IF9BY3Rpb25zLlBPUCkgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGRvLlxuXG4gICAgX0RPTVN0YXRlU3RvcmFnZS5zYXZlU3RhdGUoa2V5LCBzdGF0ZSk7XG5cbiAgICB2YXIgcGF0aCA9IChiYXNlbmFtZSB8fCAnJykgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG4gICAgdmFyIGhpc3RvcnlTdGF0ZSA9IHtcbiAgICAgIGtleToga2V5XG4gICAgfTtcblxuICAgIGlmIChhY3Rpb24gPT09IF9BY3Rpb25zLlBVU0gpIHtcbiAgICAgIGlmICh1c2VSZWZyZXNoKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQcmV2ZW50IGxvY2F0aW9uIHVwZGF0ZS5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKGhpc3RvcnlTdGF0ZSwgbnVsbCwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUkVQTEFDRVxuICAgICAgaWYgKHVzZVJlZnJlc2gpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UocGF0aCk7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gUHJldmVudCBsb2NhdGlvbiB1cGRhdGUuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShoaXN0b3J5U3RhdGUsIG51bGwsIHBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGhpc3RvcnkgPSBfY3JlYXRlRE9NSGlzdG9yeTJbJ2RlZmF1bHQnXShfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgIGdldEN1cnJlbnRMb2NhdGlvbjogZ2V0Q3VycmVudExvY2F0aW9uLFxuICAgIGZpbmlzaFRyYW5zaXRpb246IGZpbmlzaFRyYW5zaXRpb24sXG4gICAgc2F2ZVN0YXRlOiBfRE9NU3RhdGVTdG9yYWdlLnNhdmVTdGF0ZVxuICB9KSk7XG5cbiAgdmFyIGxpc3RlbmVyQ291bnQgPSAwLFxuICAgICAgc3RvcFBvcFN0YXRlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gbGlzdGVuQmVmb3JlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCsrbGlzdGVuZXJDb3VudCA9PT0gMSkgc3RvcFBvcFN0YXRlTGlzdGVuZXIgPSBzdGFydFBvcFN0YXRlTGlzdGVuZXIoaGlzdG9yeSk7XG5cbiAgICB2YXIgdW5saXN0ZW4gPSBoaXN0b3J5Lmxpc3RlbkJlZm9yZShsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdW5saXN0ZW4oKTtcblxuICAgICAgaWYgKC0tbGlzdGVuZXJDb3VudCA9PT0gMCkgc3RvcFBvcFN0YXRlTGlzdGVuZXIoKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgaWYgKCsrbGlzdGVuZXJDb3VudCA9PT0gMSkgc3RvcFBvcFN0YXRlTGlzdGVuZXIgPSBzdGFydFBvcFN0YXRlTGlzdGVuZXIoaGlzdG9yeSk7XG5cbiAgICB2YXIgdW5saXN0ZW4gPSBoaXN0b3J5Lmxpc3RlbihsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdW5saXN0ZW4oKTtcblxuICAgICAgaWYgKC0tbGlzdGVuZXJDb3VudCA9PT0gMCkgc3RvcFBvcFN0YXRlTGlzdGVuZXIoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiByZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICBpZiAoKytsaXN0ZW5lckNvdW50ID09PSAxKSBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihoaXN0b3J5KTtcblxuICAgIGhpc3RvcnkucmVnaXN0ZXJUcmFuc2l0aW9uSG9vayhob29rKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICBoaXN0b3J5LnVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vayhob29rKTtcblxuICAgIGlmICgtLWxpc3RlbmVyQ291bnQgPT09IDApIHN0b3BQb3BTdGF0ZUxpc3RlbmVyKCk7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIGhpc3RvcnksIHtcbiAgICBsaXN0ZW5CZWZvcmU6IGxpc3RlbkJlZm9yZSxcbiAgICBsaXN0ZW46IGxpc3RlbixcbiAgICByZWdpc3RlclRyYW5zaXRpb25Ib29rOiByZWdpc3RlclRyYW5zaXRpb25Ib29rLFxuICAgIHVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vazogdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rXG4gIH0pO1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBjcmVhdGVCcm93c2VySGlzdG9yeTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX0V4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgX0RPTVV0aWxzID0gcmVxdWlyZSgnLi9ET01VdGlscycpO1xuXG52YXIgX2NyZWF0ZUhpc3RvcnkgPSByZXF1aXJlKCcuL2NyZWF0ZUhpc3RvcnknKTtcblxudmFyIF9jcmVhdGVIaXN0b3J5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUhpc3RvcnkpO1xuXG5mdW5jdGlvbiBjcmVhdGVET01IaXN0b3J5KG9wdGlvbnMpIHtcbiAgdmFyIGhpc3RvcnkgPSBfY3JlYXRlSGlzdG9yeTJbJ2RlZmF1bHQnXShfZXh0ZW5kcyh7XG4gICAgZ2V0VXNlckNvbmZpcm1hdGlvbjogX0RPTVV0aWxzLmdldFVzZXJDb25maXJtYXRpb25cbiAgfSwgb3B0aW9ucywge1xuICAgIGdvOiBfRE9NVXRpbHMuZ29cbiAgfSkpO1xuXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgICFfRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF9pbnZhcmlhbnQyWydkZWZhdWx0J10oZmFsc2UsICdET00gaGlzdG9yeSBuZWVkcyBhIERPTScpIDogX2ludmFyaWFudDJbJ2RlZmF1bHQnXShmYWxzZSkgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gaGlzdG9yeS5saXN0ZW4obGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBoaXN0b3J5LCB7XG4gICAgbGlzdGVuOiBsaXN0ZW5cbiAgfSk7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZURPTUhpc3Rvcnk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvL2ltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9kZWVwRXF1YWwgPSByZXF1aXJlKCdkZWVwLWVxdWFsJyk7XG5cbnZhciBfZGVlcEVxdWFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZXBFcXVhbCk7XG5cbnZhciBfQXN5bmNVdGlscyA9IHJlcXVpcmUoJy4vQXN5bmNVdGlscycpO1xuXG52YXIgX0FjdGlvbnMgPSByZXF1aXJlKCcuL0FjdGlvbnMnKTtcblxudmFyIF9jcmVhdGVMb2NhdGlvbjIgPSByZXF1aXJlKCcuL2NyZWF0ZUxvY2F0aW9uJyk7XG5cbnZhciBfY3JlYXRlTG9jYXRpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlTG9jYXRpb24yKTtcblxudmFyIF9ydW5UcmFuc2l0aW9uSG9vayA9IHJlcXVpcmUoJy4vcnVuVHJhbnNpdGlvbkhvb2snKTtcblxudmFyIF9ydW5UcmFuc2l0aW9uSG9vazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ydW5UcmFuc2l0aW9uSG9vayk7XG5cbnZhciBfcGFyc2VQYXRoID0gcmVxdWlyZSgnLi9wYXJzZVBhdGgnKTtcblxudmFyIF9wYXJzZVBhdGgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VQYXRoKTtcblxudmFyIF9kZXByZWNhdGUgPSByZXF1aXJlKCcuL2RlcHJlY2F0ZScpO1xuXG52YXIgX2RlcHJlY2F0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGUpO1xuXG5mdW5jdGlvbiBjcmVhdGVSYW5kb21LZXkobGVuZ3RoKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgbGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gbG9jYXRpb25zQXJlRXF1YWwoYSwgYikge1xuICByZXR1cm4gYS5wYXRobmFtZSA9PT0gYi5wYXRobmFtZSAmJiBhLnNlYXJjaCA9PT0gYi5zZWFyY2ggJiZcbiAgLy9hLmFjdGlvbiA9PT0gYi5hY3Rpb24gJiYgLy8gRGlmZmVyZW50IGFjdGlvbiAhPT0gbG9jYXRpb24gY2hhbmdlLlxuICBhLmtleSA9PT0gYi5rZXkgJiYgX2RlZXBFcXVhbDJbJ2RlZmF1bHQnXShhLnN0YXRlLCBiLnN0YXRlKTtcbn1cblxudmFyIERlZmF1bHRLZXlMZW5ndGggPSA2O1xuXG5mdW5jdGlvbiBjcmVhdGVIaXN0b3J5KCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuICB2YXIgZ2V0Q3VycmVudExvY2F0aW9uID0gb3B0aW9ucy5nZXRDdXJyZW50TG9jYXRpb247XG4gIHZhciBmaW5pc2hUcmFuc2l0aW9uID0gb3B0aW9ucy5maW5pc2hUcmFuc2l0aW9uO1xuICB2YXIgc2F2ZVN0YXRlID0gb3B0aW9ucy5zYXZlU3RhdGU7XG4gIHZhciBnbyA9IG9wdGlvbnMuZ287XG4gIHZhciBrZXlMZW5ndGggPSBvcHRpb25zLmtleUxlbmd0aDtcbiAgdmFyIGdldFVzZXJDb25maXJtYXRpb24gPSBvcHRpb25zLmdldFVzZXJDb25maXJtYXRpb247XG5cbiAgaWYgKHR5cGVvZiBrZXlMZW5ndGggIT09ICdudW1iZXInKSBrZXlMZW5ndGggPSBEZWZhdWx0S2V5TGVuZ3RoO1xuXG4gIHZhciB0cmFuc2l0aW9uSG9va3MgPSBbXTtcblxuICBmdW5jdGlvbiBsaXN0ZW5CZWZvcmUoaG9vaykge1xuICAgIHRyYW5zaXRpb25Ib29rcy5wdXNoKGhvb2spO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zaXRpb25Ib29rcyA9IHRyYW5zaXRpb25Ib29rcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGhvb2s7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGFsbEtleXMgPSBbXTtcbiAgdmFyIGNoYW5nZUxpc3RlbmVycyA9IFtdO1xuICB2YXIgbG9jYXRpb24gPSB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudCgpIHtcbiAgICBpZiAocGVuZGluZ0xvY2F0aW9uICYmIHBlbmRpbmdMb2NhdGlvbi5hY3Rpb24gPT09IF9BY3Rpb25zLlBPUCkge1xuICAgICAgcmV0dXJuIGFsbEtleXMuaW5kZXhPZihwZW5kaW5nTG9jYXRpb24ua2V5KTtcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gYWxsS2V5cy5pbmRleE9mKGxvY2F0aW9uLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvbihuZXdMb2NhdGlvbikge1xuICAgIHZhciBjdXJyZW50ID0gZ2V0Q3VycmVudCgpO1xuXG4gICAgbG9jYXRpb24gPSBuZXdMb2NhdGlvbjtcblxuICAgIGlmIChsb2NhdGlvbi5hY3Rpb24gPT09IF9BY3Rpb25zLlBVU0gpIHtcbiAgICAgIGFsbEtleXMgPSBbXS5jb25jYXQoYWxsS2V5cy5zbGljZSgwLCBjdXJyZW50ICsgMSksIFtsb2NhdGlvbi5rZXldKTtcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUkVQTEFDRSkge1xuICAgICAgYWxsS2V5c1tjdXJyZW50XSA9IGxvY2F0aW9uLmtleTtcbiAgICB9XG5cbiAgICBjaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKGxvY2F0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgIGNoYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgbGlzdGVuZXIobG9jYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2xvY2F0aW9uID0gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgICBhbGxLZXlzID0gW19sb2NhdGlvbi5rZXldO1xuICAgICAgdXBkYXRlTG9jYXRpb24oX2xvY2F0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2hhbmdlTGlzdGVuZXJzID0gY2hhbmdlTGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gbGlzdGVuZXI7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgY2FsbGJhY2spIHtcbiAgICBfQXN5bmNVdGlscy5sb29wQXN5bmModHJhbnNpdGlvbkhvb2tzLmxlbmd0aCwgZnVuY3Rpb24gKGluZGV4LCBuZXh0LCBkb25lKSB7XG4gICAgICBfcnVuVHJhbnNpdGlvbkhvb2syWydkZWZhdWx0J10odHJhbnNpdGlvbkhvb2tzW2luZGV4XSwgbG9jYXRpb24sIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgZG9uZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgIGlmIChnZXRVc2VyQ29uZmlybWF0aW9uICYmIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBnZXRVc2VyQ29uZmlybWF0aW9uKG1lc3NhZ2UsIGZ1bmN0aW9uIChvaykge1xuICAgICAgICAgIGNhbGxiYWNrKG9rICE9PSBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobWVzc2FnZSAhPT0gZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdMb2NhdGlvbiA9IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uVG8obmV4dExvY2F0aW9uKSB7XG4gICAgaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uc0FyZUVxdWFsKGxvY2F0aW9uLCBuZXh0TG9jYXRpb24pKSByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uXG5cbiAgICBwZW5kaW5nTG9jYXRpb24gPSBuZXh0TG9jYXRpb247XG5cbiAgICBjb25maXJtVHJhbnNpdGlvblRvKG5leHRMb2NhdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAocGVuZGluZ0xvY2F0aW9uICE9PSBuZXh0TG9jYXRpb24pIHJldHVybjsgLy8gVHJhbnNpdGlvbiB3YXMgaW50ZXJydXB0ZWQuXG5cbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyB0cmVhdCBQVVNIIHRvIGN1cnJlbnQgcGF0aCBsaWtlIFJFUExBQ0UgdG8gYmUgY29uc2lzdGVudCB3aXRoIGJyb3dzZXJzXG4gICAgICAgIGlmIChuZXh0TG9jYXRpb24uYWN0aW9uID09PSBfQWN0aW9ucy5QVVNIKSB7XG4gICAgICAgICAgdmFyIHByZXZQYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XG4gICAgICAgICAgdmFyIG5leHRQYXRoID0gY3JlYXRlUGF0aChuZXh0TG9jYXRpb24pO1xuXG4gICAgICAgICAgaWYgKG5leHRQYXRoID09PSBwcmV2UGF0aCkgbmV4dExvY2F0aW9uLmFjdGlvbiA9IF9BY3Rpb25zLlJFUExBQ0U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluaXNoVHJhbnNpdGlvbihuZXh0TG9jYXRpb24pICE9PSBmYWxzZSkgdXBkYXRlTG9jYXRpb24obmV4dExvY2F0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24gJiYgbmV4dExvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUE9QKSB7XG4gICAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxLZXlzLmluZGV4T2YobG9jYXRpb24ua2V5KTtcbiAgICAgICAgdmFyIG5leHRJbmRleCA9IGFsbEtleXMuaW5kZXhPZihuZXh0TG9jYXRpb24ua2V5KTtcblxuICAgICAgICBpZiAocHJldkluZGV4ICE9PSAtMSAmJiBuZXh0SW5kZXggIT09IC0xKSBnbyhwcmV2SW5kZXggLSBuZXh0SW5kZXgpOyAvLyBSZXN0b3JlIHRoZSBVUkwuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwdXNoKGxvY2F0aW9uKSB7XG4gICAgdHJhbnNpdGlvblRvKGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBfQWN0aW9ucy5QVVNILCBjcmVhdGVLZXkoKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwbGFjZShsb2NhdGlvbikge1xuICAgIHRyYW5zaXRpb25UbyhjcmVhdGVMb2NhdGlvbihsb2NhdGlvbiwgX0FjdGlvbnMuUkVQTEFDRSwgY3JlYXRlS2V5KCkpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICBnbygtMSk7XG4gIH1cblxuICBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgZ28oMSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVLZXkoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJhbmRvbUtleShrZXlMZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGF0aChsb2NhdGlvbikge1xuICAgIGlmIChsb2NhdGlvbiA9PSBudWxsIHx8IHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBsb2NhdGlvbjtcblxuICAgIHZhciBwYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIHZhciBzZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuXG4gICAgdmFyIHJlc3VsdCA9IHBhdGhuYW1lO1xuXG4gICAgaWYgKHNlYXJjaCkgcmVzdWx0ICs9IHNlYXJjaDtcblxuICAgIGlmIChoYXNoKSByZXN1bHQgKz0gaGFzaDtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVBhdGgobG9jYXRpb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24obG9jYXRpb24sIGFjdGlvbikge1xuICAgIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBjcmVhdGVLZXkoKSA6IGFyZ3VtZW50c1syXTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgLy93YXJuaW5nKFxuICAgICAgLy8gIGZhbHNlLFxuICAgICAgLy8gICdUaGUgc3RhdGUgKDJuZCkgYXJndW1lbnQgdG8gaGlzdG9yeS5jcmVhdGVMb2NhdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgYSAnICtcbiAgICAgIC8vICAnbG9jYXRpb24gZGVzY3JpcHRvciBpbnN0ZWFkJ1xuICAgICAgLy8pXG5cbiAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSBsb2NhdGlvbiA9IF9wYXJzZVBhdGgyWydkZWZhdWx0J10obG9jYXRpb24pO1xuXG4gICAgICBsb2NhdGlvbiA9IF9leHRlbmRzKHt9LCBsb2NhdGlvbiwgeyBzdGF0ZTogYWN0aW9uIH0pO1xuXG4gICAgICBhY3Rpb24gPSBrZXk7XG4gICAgICBrZXkgPSBhcmd1bWVudHNbM10gfHwgY3JlYXRlS2V5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9jcmVhdGVMb2NhdGlvbjNbJ2RlZmF1bHQnXShsb2NhdGlvbiwgYWN0aW9uLCBrZXkpO1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgdXBkYXRlTG9jYXRpb25TdGF0ZShsb2NhdGlvbiwgc3RhdGUpO1xuICAgICAgdXBkYXRlTG9jYXRpb24obG9jYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVMb2NhdGlvblN0YXRlKGdldEN1cnJlbnRMb2NhdGlvbigpLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTG9jYXRpb25TdGF0ZShsb2NhdGlvbiwgc3RhdGUpIHtcbiAgICBsb2NhdGlvbi5zdGF0ZSA9IF9leHRlbmRzKHt9LCBsb2NhdGlvbi5zdGF0ZSwgc3RhdGUpO1xuICAgIHNhdmVTdGF0ZShsb2NhdGlvbi5rZXksIGxvY2F0aW9uLnN0YXRlKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gcmVnaXN0ZXJUcmFuc2l0aW9uSG9vayhob29rKSB7XG4gICAgaWYgKHRyYW5zaXRpb25Ib29rcy5pbmRleE9mKGhvb2spID09PSAtMSkgdHJhbnNpdGlvbkhvb2tzLnB1c2goaG9vayk7XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vayhob29rKSB7XG4gICAgdHJhbnNpdGlvbkhvb2tzID0gdHJhbnNpdGlvbkhvb2tzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0gIT09IGhvb2s7XG4gICAgfSk7XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHB1c2hTdGF0ZShzdGF0ZSwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHBhdGggPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuXG4gICAgcHVzaChfZXh0ZW5kcyh7IHN0YXRlOiBzdGF0ZSB9LCBwYXRoKSk7XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZShzdGF0ZSwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHBhdGggPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuXG4gICAgcmVwbGFjZShfZXh0ZW5kcyh7IHN0YXRlOiBzdGF0ZSB9LCBwYXRoKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxpc3RlbkJlZm9yZTogbGlzdGVuQmVmb3JlLFxuICAgIGxpc3RlbjogbGlzdGVuLFxuICAgIHRyYW5zaXRpb25UbzogdHJhbnNpdGlvblRvLFxuICAgIHB1c2g6IHB1c2gsXG4gICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICBnbzogZ28sXG4gICAgZ29CYWNrOiBnb0JhY2ssXG4gICAgZ29Gb3J3YXJkOiBnb0ZvcndhcmQsXG4gICAgY3JlYXRlS2V5OiBjcmVhdGVLZXksXG4gICAgY3JlYXRlUGF0aDogY3JlYXRlUGF0aCxcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmLFxuICAgIGNyZWF0ZUxvY2F0aW9uOiBjcmVhdGVMb2NhdGlvbixcblxuICAgIHNldFN0YXRlOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHNldFN0YXRlLCAnc2V0U3RhdGUgaXMgZGVwcmVjYXRlZDsgdXNlIGxvY2F0aW9uLmtleSB0byBzYXZlIHN0YXRlIGluc3RlYWQnKSxcbiAgICByZWdpc3RlclRyYW5zaXRpb25Ib29rOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2ssICdyZWdpc3RlclRyYW5zaXRpb25Ib29rIGlzIGRlcHJlY2F0ZWQ7IHVzZSBsaXN0ZW5CZWZvcmUgaW5zdGVhZCcpLFxuICAgIHVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vazogX2RlcHJlY2F0ZTJbJ2RlZmF1bHQnXSh1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2ssICd1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2sgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIGxpc3RlbkJlZm9yZSBpbnN0ZWFkJyksXG4gICAgcHVzaFN0YXRlOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHB1c2hTdGF0ZSwgJ3B1c2hTdGF0ZSBpcyBkZXByZWNhdGVkOyB1c2UgcHVzaCBpbnN0ZWFkJyksXG4gICAgcmVwbGFjZVN0YXRlOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHJlcGxhY2VTdGF0ZSwgJ3JlcGxhY2VTdGF0ZSBpcyBkZXByZWNhdGVkOyB1c2UgcmVwbGFjZSBpbnN0ZWFkJylcbiAgfTtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gY3JlYXRlSGlzdG9yeTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8vaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZydcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX0FjdGlvbnMgPSByZXF1aXJlKCcuL0FjdGlvbnMnKTtcblxudmFyIF9wYXJzZVBhdGggPSByZXF1aXJlKCcuL3BhcnNlUGF0aCcpO1xuXG52YXIgX3BhcnNlUGF0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYXJzZVBhdGgpO1xuXG5mdW5jdGlvbiBjcmVhdGVMb2NhdGlvbigpIHtcbiAgdmFyIGxvY2F0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJy8nIDogYXJndW1lbnRzWzBdO1xuICB2YXIgYWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX0FjdGlvbnMuUE9QIDogYXJndW1lbnRzWzFdO1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1syXTtcblxuICB2YXIgX2ZvdXJ0aEFyZyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbM107XG5cbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3N0cmluZycpIGxvY2F0aW9uID0gX3BhcnNlUGF0aDJbJ2RlZmF1bHQnXShsb2NhdGlvbik7XG5cbiAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdvYmplY3QnKSB7XG4gICAgLy93YXJuaW5nKFxuICAgIC8vICBmYWxzZSxcbiAgICAvLyAgJ1RoZSBzdGF0ZSAoMm5kKSBhcmd1bWVudCB0byBjcmVhdGVMb2NhdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgYSAnICtcbiAgICAvLyAgJ2xvY2F0aW9uIGRlc2NyaXB0b3IgaW5zdGVhZCdcbiAgICAvLylcblxuICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7IHN0YXRlOiBhY3Rpb24gfSk7XG5cbiAgICBhY3Rpb24gPSBrZXkgfHwgX0FjdGlvbnMuUE9QO1xuICAgIGtleSA9IF9mb3VydGhBcmc7XG4gIH1cblxuICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSB8fCAnLyc7XG4gIHZhciBzZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggfHwgJyc7XG4gIHZhciBoYXNoID0gbG9jYXRpb24uaGFzaCB8fCAnJztcbiAgdmFyIHN0YXRlID0gbG9jYXRpb24uc3RhdGUgfHwgbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoLFxuICAgIHN0YXRlOiBzdGF0ZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBrZXk6IGtleVxuICB9O1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBjcmVhdGVMb2NhdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8vaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZydcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBkZXByZWNhdGUoZm4pIHtcbiAgcmV0dXJuIGZuO1xuICAvL3JldHVybiBmdW5jdGlvbiAoKSB7XG4gIC8vICB3YXJuaW5nKGZhbHNlLCAnW2hpc3RvcnldICcgKyBtZXNzYWdlKVxuICAvLyAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgLy99XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZGVwcmVjYXRlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmZ1bmN0aW9uIGV4dHJhY3RQYXRoKHN0cmluZykge1xuICB2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goL15odHRwcz86XFwvXFwvW15cXC9dKi8pO1xuXG4gIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gc3RyaW5nO1xuXG4gIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXh0cmFjdFBhdGg7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9leHRyYWN0UGF0aCA9IHJlcXVpcmUoJy4vZXh0cmFjdFBhdGgnKTtcblxudmFyIF9leHRyYWN0UGF0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRyYWN0UGF0aCk7XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBwYXRobmFtZSA9IF9leHRyYWN0UGF0aDJbJ2RlZmF1bHQnXShwYXRoKTtcbiAgdmFyIHNlYXJjaCA9ICcnO1xuICB2YXIgaGFzaCA9ICcnO1xuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShwYXRoID09PSBwYXRobmFtZSwgJ0EgcGF0aCBtdXN0IGJlIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaCBvbmx5LCBub3QgYSBmdWxseSBxdWFsaWZpZWQgVVJMIGxpa2UgXCIlc1wiJywgcGF0aCkgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGhhc2hJbmRleCA9IHBhdGhuYW1lLmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBoYXNoID0gcGF0aG5hbWUuc3Vic3RyaW5nKGhhc2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHJpbmcoMCwgaGFzaEluZGV4KTtcbiAgfVxuXG4gIHZhciBzZWFyY2hJbmRleCA9IHBhdGhuYW1lLmluZGV4T2YoJz8nKTtcbiAgaWYgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgIHNlYXJjaCA9IHBhdGhuYW1lLnN1YnN0cmluZyhzZWFyY2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHJpbmcoMCwgc2VhcmNoSW5kZXgpO1xuICB9XG5cbiAgaWYgKHBhdGhuYW1lID09PSAnJykgcGF0aG5hbWUgPSAnLyc7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2gsXG4gICAgaGFzaDogaGFzaFxuICB9O1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBwYXJzZVBhdGg7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIHJ1blRyYW5zaXRpb25Ib29rKGhvb2ssIGxvY2F0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgcmVzdWx0ID0gaG9vayhsb2NhdGlvbiwgY2FsbGJhY2spO1xuXG4gIGlmIChob29rLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBBc3N1bWUgdGhlIGhvb2sgcnVucyBzeW5jaHJvbm91c2x5IGFuZCBhdXRvbWF0aWNhbGx5XG4gICAgLy8gY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLlxuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF93YXJuaW5nMlsnZGVmYXVsdCddKHJlc3VsdCA9PT0gdW5kZWZpbmVkLCAnWW91IHNob3VsZCBub3QgXCJyZXR1cm5cIiBpbiBhIHRyYW5zaXRpb24gaG9vayB3aXRoIGEgY2FsbGJhY2sgYXJndW1lbnQ7IGNhbGwgdGhlIGNhbGxiYWNrIGluc3RlYWQnKSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBydW5UcmFuc2l0aW9uSG9vaztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXQubGVuZ3RoIDwgMTAgfHwgKC9eW3NcXFddKiQvKS50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB3YXJuaW5nIGZvcm1hdCBzaG91bGQgYmUgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzICcgK1xuICAgICAgICAnd2FybmluZy4gUGxlYXNlLCB1c2UgYSBtb3JlIGRlc2NyaXB0aXZlIGZvcm1hdCB0aGFuOiAnICsgZm9ybWF0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2goeCkge31cbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVmcmVzaCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBnZXRNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNpZ25lZEluKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoXG4gICAgICAgIGdldHRleHQoXCJZb3UgaGF2ZSBzaWduZWQgaW4gYXMgJSh1c2VybmFtZSlzLiBQbGVhc2UgcmVmcmVzaCB0aGUgcGFnZSBiZWZvcmUgY29udGludWluZy5cIiksXG4gICAgICAgIHt1c2VybmFtZTogdGhpcy5wcm9wcy5zaWduZWRJbi51c2VybmFtZX0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zaWduZWRPdXQpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91IGhhdmUgYmVlbiBzaWduZWQgb3V0LiBQbGVhc2UgcmVmcmVzaCB0aGUgcGFnZSBiZWZvcmUgY29udGludWluZy5cIiksXG4gICAgICAgIHt1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNpZ25lZEluIHx8IHRoaXMucHJvcHMuc2lnbmVkT3V0KSB7XG4gICAgICByZXR1cm4gXCJhdXRoLW1lc3NhZ2Ugc2hvd1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJhdXRoLW1lc3NhZ2VcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+e3RoaXMuZ2V0TWVzc2FnZSgpfTwvcD5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucmVmcmVzaH0+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIlJlbG9hZCBwYWdlXCIpfVxuICAgICAgICAgIDwvYnV0dG9uPiA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4teHMgaGlkZGVuLXNtIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwib3IgcHJlc3MgRjUga2V5LlwiKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICB1c2VyOiBzdGF0ZS5hdXRoLnVzZXIsXG4gICAgc2lnbmVkSW46IHN0YXRlLmF1dGguc2lnbmVkSW4sXG4gICAgc2lnbmVkT3V0OiBzdGF0ZS5hdXRoLnNpZ25lZE91dFxuICB9O1xufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJCgnYmFzZScpLmF0dHIoJ2hyZWYnKSArICd1c2VyLWF2YXRhci8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldFNyYygpIHtcbiAgICBsZXQgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCAxMDA7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgIGxldCB1cmwgPSBCQVNFX1VSTDtcblxuICAgIGlmICh0aGlzLnByb3BzLnVzZXIgJiYgdGhpcy5wcm9wcy51c2VyLmlkKSB7XG4gICAgICAvLyBqdXN0IGF2YXRhciBoYXNoLCBzaXplIGFuZCB1c2VyIGlkXG4gICAgICB1cmwgKz0gdGhpcy5wcm9wcy51c2VyLmF2YXRhcl9oYXNoICsgJy8nICsgc2l6ZSArICcvJyArIHRoaXMucHJvcHMudXNlci5pZCArICcucG5nJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCBhcHBlbmQgYXZhdGFyIHNpemUgdG8gZmlsZSB0byBwcm9kdWNlIG5vLWF2YXRhciBwbGFjZWhvbGRlclxuICAgICAgdXJsICs9IHNpemUgKyAnLnBuZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxpbWcgc3JjPXt0aGlzLmdldFNyYygpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJ3VzZXItYXZhdGFyJ31cbiAgICAgICAgICAgICAgICB0aXRsZT17Z2V0dGV4dChcIlVzZXIgYXZhdGFyXCIpfS8+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0UmVhc29uTWVzc2FnZSgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMucHJvcHMubWVzc2FnZS5odG1sKSB7XG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICBfX2h0bWw6IHRoaXMucHJvcHMubWVzc2FnZS5odG1sXG4gICAgICAgIH19IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPHAgY2xhc3NOYW1lPVwibGVhZFwiPnt0aGlzLnByb3BzLm1lc3NhZ2UucGxhaW59PC9wPjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldEV4cGlyYXRpb25NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmV4cGlyZXMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmV4cGlyZXMuaXNBZnRlcihtb21lbnQoKSkpIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICBsZXQgdGl0bGUgPSBpbnRlcnBvbGF0ZShcbiAgICAgICAgICBnZXR0ZXh0KFwiVGhpcyBiYW4gZXhwaXJlcyBvbiAlKGV4cGlyZXNfb24pcy5cIiksIHtcbiAgICAgICAgICAgICdleHBpcmVzX29uJzogdGhpcy5wcm9wcy5leHBpcmVzLmZvcm1hdCgnTEwsIExUJylcbiAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICBsZXQgbWVzc2FnZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgIGdldHRleHQoXCJUaGlzIGJhbiBleHBpcmVzICUoZXhwaXJlc19vbilzLlwiKSwge1xuICAgICAgICAgICAgJ2V4cGlyZXNfb24nOiB0aGlzLnByb3BzLmV4cGlyZXMuZnJvbU5vdygpXG4gICAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIDxhYmJyIHRpdGxlPXt0aXRsZX0+XG4gICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgIDwvYWJicj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2V0dGV4dChcIlRoaXMgYmFuIGhhcyBleHBpcmVkLlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGJhbiBpcyBwZXJtYW5lbnQuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLWVycm9yIHBhZ2UtZXJyb3ItYmFubmVkXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtcGFuZWxcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+aGlnaGxpZ2h0X29mZjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgICAge3RoaXMuZ2V0UmVhc29uTWVzc2FnZSgpfVxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibWVzc2FnZS1mb290bm90ZVwiPlxuICAgICAgICAgICAgICB7dGhpcy5nZXRFeHBpcmF0aW9uTWVzc2FnZSgpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSAnYnRuICcgKyB0aGlzLnByb3BzLmNsYXNzTmFtZTtcbiAgICBsZXQgZGlzYWJsZWQgPSB0aGlzLnByb3BzLmRpc2FibGVkO1xuXG4gICAgaWYgKHRoaXMucHJvcHMubG9hZGluZykge1xuICAgICAgY2xhc3NOYW1lICs9ICcgYnRuLWxvYWRpbmcnO1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPXt0aGlzLnByb3BzLm9uQ2xpY2sgPyAnYnV0dG9uJyA6ICdzdWJtaXQnfVxuICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxuICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICB7dGhpcy5wcm9wcy5sb2FkaW5nID8gPExvYWRlciAvPiA6IG51bGx9XG4gICAgPC9idXR0b24+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuXG5CdXR0b24uZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6IFwiYnRuLWRlZmF1bHRcIixcblxuICB0eXBlOiBcInN1Ym1pdFwiLFxuXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG5cbiAgb25DbGljazogbnVsbFxufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTGFzdEFjdGl2aXR5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NhdGVnb3JpZXMvbGFzdC1hY3Rpdml0eSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWRJY29uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NhdGVnb3JpZXMvcmVhZC1pY29uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2F0ZWdvcmllcy9zdGF0cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiAncGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1jYXRlZ29yeSBwYW5lbC1jYXRlZ29yeS0nICsgdGhpcy5wcm9wcy5jYXRlZ29yeS5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1jYXRlZ29yeSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVhZGluZ0NsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5zdWJjYXRlZ29yaWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICdwYW5lbC1oZWFkaW5nJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdwYW5lbC1oZWFkaW5nIGhlYWRpbmctYWxvbmUnO1xuICAgIH1cbiAgfVxuXG4gIGdldENhdGVnb3J5RGVzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuY2F0ZWdvcnkuZGVzY3JpcHRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgY2F0ZWdvcnktZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICAgICAgX19odG1sOiB0aGlzLnByb3BzLmNhdGVnb3J5LmRlc2NyaXB0aW9uLmh0bWxcbiAgICAgICAgICAgICAgICAgIH19IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3ViY2F0ZWdvcnlDbGFzcyhjYXRlZ29yeSkge1xuICAgIGlmIChjYXRlZ29yeS5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiAnbGlzdC1ncm91cC1pdGVtIGNhdGVnb3J5LXN1YmNhdGVnb3J5IHN1YmNhdGVnb3J5LScgKyBjYXRlZ29yeS5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbGlzdC1ncm91cC1pdGVtIGNhdGVnb3J5LXN1YmNhdGVnb3J5JztcbiAgICB9XG4gIH1cblxuICBnZXRTdWJjYXRlZ29yeURlc2NyaXB0aW9uKGNhdGVnb3J5KSB7XG4gICAgaWYgKGNhdGVnb3J5LmRlc2NyaXB0aW9uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJzdWJjYXRlZ29yeS1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGNhdGVnb3J5LmRlc2NyaXB0aW9uLmh0bWxcbiAgICAgICAgICAgICAgICAgIH19IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3ViY2F0ZWdvcnlTdWJjYXRlZ29yeUNsYXNzKGNhdGVnb3J5KSB7XG4gICAgaWYgKGNhdGVnb3J5LmNzc19jbGFzcykge1xuICAgICAgcmV0dXJuICdzdWJjYXRlZ29yeSBzdWJjYXRlZ29yeS0nICsgY2F0ZWdvcnkuY3NzX2NsYXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3N1YmNhdGVnb3J5JztcbiAgICB9XG4gIH1cblxuICBnZXRTdWJjYXRlZ29yeVN1YmNhdGVnb3JpZXMoY2F0ZWdvcnkpIHtcbiAgICBpZiAoY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJsaXN0LWlubGluZSBzdWJjYXRlZ29yeS1zdWJjYXRlZ29yaWVzXCI+XG4gICAgICAgIHtjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGtleT17Y2F0ZWdvcnkuaWR9PlxuICAgICAgICAgICAgPGEgaHJlZj17Y2F0ZWdvcnkuYWJzb2x1dGVfdXJsfVxuICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldFN1YmNhdGVnb3J5U3ViY2F0ZWdvcnlDbGFzcyhjYXRlZ29yeSl9PlxuICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2xpPjtcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFN1YmNhdGVnb3JpZXMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJsaXN0LWdyb3VwIGNhdGVnb3J5LXN1YmNhdGVnb3JpZXNcIj5cbiAgICAgICAge3RoaXMucHJvcHMuY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJsaXN0LWdyb3VwLWl0ZW0gY2F0ZWdvcnktc3ViY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICA8aDQ+XG4gICAgICAgICAgICAgICAgPFJlYWRJY29uIGNhdGVnb3J5PXtjYXRlZ29yeX0gLz5cbiAgICAgICAgICAgICAgICA8YSBocmVmPXtjYXRlZ29yeS5hYnNvbHV0ZV91cmx9IGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgPFN0YXRzIGNhdGVnb3J5PXtjYXRlZ29yeX0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8TGFzdEFjdGl2aXR5IGNhdGVnb3J5PXtjYXRlZ29yeX0gLz5cblxuICAgICAgICAgICAge3RoaXMuZ2V0U3ViY2F0ZWdvcnlEZXNjcmlwdGlvbihjYXRlZ29yeSl9XG4gICAgICAgICAgICB7dGhpcy5nZXRTdWJjYXRlZ29yeVN1YmNhdGVnb3JpZXMoY2F0ZWdvcnkpfVxuXG4gICAgICAgICAgPC9saT47XG4gICAgICAgIH0pfVxuICAgICAgPC91bD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGlkPXsncGFuZWwtY2F0ZWdvcnktJyArIHRoaXMucHJvcHMuY2F0ZWdvcnkuaWR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldEhlYWRpbmdDbGFzc05hbWUoKX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZy1pbmJsb2NrXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nLXRvcC1yb3dcIj5cbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICA8UmVhZEljb24gY2F0ZWdvcnk9e3RoaXMucHJvcHMuY2F0ZWdvcnl9IC8+XG4gICAgICAgICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMuY2F0ZWdvcnkuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2F0ZWdvcnkubmFtZX1cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxTdGF0cyBjYXRlZ29yeT17dGhpcy5wcm9wcy5jYXRlZ29yeX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8TGFzdEFjdGl2aXR5IGNhdGVnb3J5PXt0aGlzLnByb3BzLmNhdGVnb3J5fSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7dGhpcy5nZXRDYXRlZ29yeURlc2NyaXB0aW9uKCl9XG5cbiAgICAgIHt0aGlzLmdldFN1YmNhdGVnb3JpZXMoKX1cblxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtcGFuZWxcIj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmluZm9fb3V0bGluZTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+e2dldHRleHQoXCJObyBjYXRlZ29yaWVzIGFyZSBhdmFpbGFibGUuXCIpfTwvcD5cbiAgICAgICAgPHA+e2dldHRleHQoXCJObyBjYXRlZ29yaWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBvciB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHNlZSB0aGVtLlwiKX08L3A+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRMYXN0UG9zdGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNhdGVnb3J5Lmxhc3RfcG9zdGVyX3VybCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e3RoaXMucHJvcHMuY2F0ZWdvcnkubGFzdF9wb3N0ZXJfdXJsfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAge3RoaXMucHJvcHMuY2F0ZWdvcnkubGFzdF9wb3N0ZXJfbmFtZX1cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5jYXRlZ29yeS5sYXN0X3Bvc3Rlcl9uYW1lfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0VGhyZWFkRGV0YWlscygpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIFtcbiAgICAgIDxsaSBjbGFzc05hbWU9XCJ0aHJlYWQtdGl0bGVcIiBrZXk9XCJ0aXRsZVwiPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLmNhdGVnb3J5Lmxhc3RfdGhyZWFkX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmNhdGVnb3J5Lmxhc3RfdGhyZWFkX3RpdGxlfVxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPixcbiAgICAgIDxsaSBjbGFzc05hbWU9XCJwb3N0ZXItbmFtZVwiIGtleT1cInBvc3RlclwiPlxuICAgICAgICB7dGhpcy5nZXRMYXN0UG9zdGVyKCl9XG4gICAgICA8L2xpPixcbiAgICAgIDxsaSBjbGFzc05hbWU9XCJ0aHJlYWQtZGF0ZVwiIGtleT1cImRhdGVcIj5cbiAgICAgICAgPGFiYnIgdGl0bGU9e3RoaXMucHJvcHMuY2F0ZWdvcnkubGFzdF9wb3N0X29uLmZvcm1hdCgnTEwsIExUJyl9PlxuICAgICAgICAgIHt0aGlzLnByb3BzLmNhdGVnb3J5Lmxhc3RfcG9zdF9vbi5mcm9tTm93KCl9XG4gICAgICAgIDwvYWJicj5cbiAgICAgIDwvbGk+XG4gICAgXTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0TGFzdEFjdGl2aXR5KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNhdGVnb3J5LmFjbC5jYW5fYnJvd3NlKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuY2F0ZWdvcnkuYWNsLmNhbl9zZWVfYWxsX3RocmVhZHMpIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInRocmVhZC1tZXNzYWdlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiVGhpcyBjYXRlZ29yeSBpcyBwcml2YXRlLiBZb3UgY2FuIHNlZSBvbmx5IHlvdXIgb3duIHRocmVhZHMgd2l0aGluIGl0LlwiKX1cbiAgICAgICAgPC9saT47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuY2F0ZWdvcnkubGFzdF90aHJlYWRfdGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGhyZWFkRGV0YWlscygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInRocmVhZC1tZXNzYWdlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgZXJyb3Jfb3V0bGluZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIlRoaXMgY2F0ZWdvcnkgaXMgZW1wdHkuXCIpfVxuICAgICAgICA8L2xpPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ0aHJlYWQtbWVzc2FnZVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgaGlnaGxpZ2h0X29mZlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHtnZXR0ZXh0KFwiVGhpcyBjYXRlZ29yeSBpcyBwcm90ZWN0ZWQuIFlvdSBjYW4ndCBicm93c2UgaXQncyBjb250ZW50cy5cIil9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImxpc3QtaW5saW5lIGNhdGVnb3J5LWxhc3QtYWN0aXZpdHlcIj5cbiAgICAgIHt0aGlzLmdldExhc3RBY3Rpdml0eSgpfVxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5pc19yZWFkKSB7XG4gICAgICByZXR1cm4gJ21hdGVyaWFsLWljb24gcmVhZC1zdGF0dXMgaXRlbS1yZWFkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdtYXRlcmlhbC1pY29uIHJlYWQtc3RhdHVzIGl0ZW0tbmV3JztcbiAgICB9XG4gIH1cblxuICBnZXRUaXRsZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5pc19jbG9zZWQpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmNhdGVnb3J5LmlzX3JlYWQpIHtcbiAgICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGNhdGVnb3J5IGhhcyBubyBuZXcgcG9zdHMuIChjbG9zZWQpXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGNhdGVnb3J5IGhhcyBuZXcgcG9zdHMuIChjbG9zZWQpXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5pc19yZWFkKSB7XG4gICAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBjYXRlZ29yeSBoYXMgbm8gbmV3IHBvc3RzLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBjYXRlZ29yeSBoYXMgbmV3IHBvc3RzLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJY29uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNhdGVnb3J5LmlzX2Nsb3NlZCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuY2F0ZWdvcnkuaXNfcmVhZCkge1xuICAgICAgICByZXR1cm4gJ2xvY2tfb3V0bGluZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2xvY2snO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jYXRlZ29yeS5pc19yZWFkKSB7XG4gICAgICAgIHJldHVybiAnY2hhdF9idWJibGVfb3V0bGluZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2NoYXRfYnViYmxlJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9IHRpdGxlPXt0aGlzLmdldFRpdGxlKCl9PlxuICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgIDwvc3Bhbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2F0ZWdvcnkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2F0ZWdvcmllcy9jYXRlZ29yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEVtcHR5TWVzc2FnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jYXRlZ29yaWVzL2VtcHR5LW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuXG5sZXQgZGVoeWRyYXRlID0gZnVuY3Rpb24oY2F0ZWdvcnkpIHtcbiAgY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyA9IGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMubWFwKGRlaHlkcmF0ZSk7XG5cbiAgaWYgKGNhdGVnb3J5Lmxhc3RfcG9zdF9vbikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNhdGVnb3J5LCB7XG4gICAgICBsYXN0X3Bvc3Rfb246IG1vbWVudChjYXRlZ29yeS5sYXN0X3Bvc3Rfb24pXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhdGVnb3J5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNhdGVnb3JpZXM6IG1pc2Fnby5nZXQoJ0NBVEVHT1JJRVMnKS5tYXAoZGVoeWRyYXRlKVxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhtaXNhZ28uZ2V0KCdDQVRFR09SSUVTX0FQSScpKTtcbiAgfVxuXG4gIHN0YXJ0UG9sbGluZyhhcGkpIHtcbiAgICBwb2xscy5zdGFydCh7XG4gICAgICBwb2xsOiAnY2F0ZWdvcmllcycsXG4gICAgICB1cmw6IGFwaSxcbiAgICAgIGZyZXF1ZW5jeTogMTgwICogMTAwMCxcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNhdGVnb3JpZXM6IGRhdGEubWFwKGRlaHlkcmF0ZSlcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAncGFnZSBwYWdlLWNhdGVnb3JpZXMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3BhZ2UgcGFnZS1jYXRlZ29yaWVzIHBhZ2UtbWVzc2FnZSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVhZGluZygpIHtcbiAgICBpZiAobWlzYWdvLmdldCgnQ0FURUdPUklFU19PTl9JTkRFWCcpKSB7XG4gICAgICByZXR1cm4gbWlzYWdvLmdldCgnU0VUVElOR1MnKS5mb3J1bV9uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkNhdGVnb3JpZXNcIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2F0ZWdvcmllc0xpc3QoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImNhdGVnb3JpZXMtbGlzdFwiPlxuICAgICAgICB7dGhpcy5zdGF0ZS5jYXRlZ29yaWVzLm1hcChmdW5jdGlvbihjYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiA8Q2F0ZWdvcnkgY2F0ZWdvcnk9e2NhdGVnb3J5fSBrZXk9e2NhdGVnb3J5LmlkfSAvPjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEVtcHR5TWVzc2FnZSAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYWdlLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGgxPnt0aGlzLmdldEhlYWRpbmcoKX08L2gxPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICB7dGhpcy5nZXRDYXRlZ29yaWVzTGlzdCgpfVxuICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gIH07XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRUaHJlYWRzQ291bnQoKSB7XG4gICAgbGV0IHN0cmluZyA9IG5nZXR0ZXh0KFxuICAgICAgXCIlKHRocmVhZHMpcyB0aHJlYWRcIixcbiAgICAgIFwiJSh0aHJlYWRzKXMgdGhyZWFkc1wiLFxuICAgICAgdGhpcy5wcm9wcy5jYXRlZ29yeS50aHJlYWRzKTtcblxuICAgIHJldHVybiBpbnRlcnBvbGF0ZShzdHJpbmcsIHtcbiAgICAgICd0aHJlYWRzJzogdGhpcy5wcm9wcy5jYXRlZ29yeS50aHJlYWRzXG4gICAgfSwgdHJ1ZSk7XG4gIH1cblxuICBnZXRQb3N0c0NvdW50KCkge1xuICAgIGxldCBzdHJpbmcgPSBuZ2V0dGV4dChcbiAgICAgIFwiJShwb3N0cylzIHBvc3RcIixcbiAgICAgIFwiJShwb3N0cylzIHBvc3RzXCIsXG4gICAgICB0aGlzLnByb3BzLmNhdGVnb3J5LnBvc3RzKTtcblxuICAgIHJldHVybiBpbnRlcnBvbGF0ZShzdHJpbmcsIHtcbiAgICAgICdwb3N0cyc6IHRoaXMucHJvcHMuY2F0ZWdvcnkucG9zdHNcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJsaXN0LWlubGluZSBjYXRlZ29yeS1zdGF0c1wiPlxuICAgICAgPGxpIGNsYXNzTmFtZT1cImNhdGVnb3J5LXRocmVhZHNcIj5cbiAgICAgICAge3RoaXMuZ2V0VGhyZWFkc0NvdW50KCl9XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzTmFtZT1cImNhdGVnb3J5LXBvc3RzXCI+XG4gICAgICAgIHt0aGlzLmdldFBvc3RzQ291bnQoKX1cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmNvbnN0IEJBU0VfVVJMID0gJCgnYmFzZScpLmF0dHIoJ2hyZWYnKSArICd1c2VyLWF2YXRhcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGdldEF2YXRhclNpemUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXBsb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmNyb3BfdG1wLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF9vcmcuc2l6ZTtcbiAgICB9XG4gIH1cblxuICBnZXRBdmF0YXJTZWNyZXQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXBsb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmNyb3BfdG1wLnNlY3JldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5jcm9wX29yZy5zZWNyZXQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXZhdGFySGFzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy51cGxvYWQgfHwgdGhpcy5wcm9wcy51c2VyLmF2YXRhcl9oYXNoO1xuICB9XG5cbiAgZ2V0SW1hZ2VQYXRoKCkge1xuICAgIHJldHVybiBbXG4gICAgICBCQVNFX1VSTCxcbiAgICAgIHRoaXMuZ2V0QXZhdGFyU2VjcmV0KCkgKyAnOicgKyB0aGlzLmdldEF2YXRhckhhc2goKSxcbiAgICAgIHRoaXMucHJvcHMudXNlci5pZCArICcucG5nJ1xuICAgIF0uam9pbignLycpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgbGV0IGNyb3BpdCA9ICQoJy5jcm9wLWZvcm0nKTtcbiAgICBjcm9waXQud2lkdGgodGhpcy5nZXRBdmF0YXJTaXplKCkpO1xuXG4gICAgY3JvcGl0LmNyb3BpdCh7XG4gICAgICAnd2lkdGgnOiB0aGlzLmdldEF2YXRhclNpemUoKSxcbiAgICAgICdoZWlnaHQnOiB0aGlzLmdldEF2YXRhclNpemUoKSxcbiAgICAgICdpbWFnZVN0YXRlJzoge1xuICAgICAgICAnc3JjJzogdGhpcy5nZXRJbWFnZVBhdGgoKVxuICAgICAgfSxcbiAgICAgIG9uSW1hZ2VMb2FkZWQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudXBsb2FkKSB7XG4gICAgICAgICAgLy8gY2VudGVyIHVwbG9hZGVkIGltYWdlXG4gICAgICAgICAgbGV0IHpvb21MZXZlbCA9IGNyb3BpdC5jcm9waXQoJ3pvb20nKTtcbiAgICAgICAgICBsZXQgaW1hZ2VTaXplID0gY3JvcGl0LmNyb3BpdCgnaW1hZ2VTaXplJyk7XG5cbiAgICAgICAgICAvLyBpcyBpdCB3aWRlciB0aGFuIHRhbGxlcj9cbiAgICAgICAgICBpZiAoaW1hZ2VTaXplLndpZHRoID4gaW1hZ2VTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IGRpc3BsYXllZFdpZHRoID0gKGltYWdlU2l6ZS53aWR0aCAqIHpvb21MZXZlbCk7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0WCA9IChkaXNwbGF5ZWRXaWR0aCAtIHRoaXMuZ2V0QXZhdGFyU2l6ZSgpKSAvIC0yO1xuXG4gICAgICAgICAgICBjcm9waXQuY3JvcGl0KCdvZmZzZXQnLCB7XG4gICAgICAgICAgICAgICd4Jzogb2Zmc2V0WCxcbiAgICAgICAgICAgICAgJ3knOiAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlU2l6ZS53aWR0aCA8IGltYWdlU2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5ZWRIZWlnaHQgPSAoaW1hZ2VTaXplLmhlaWdodCAqIHpvb21MZXZlbCk7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0WSA9IChkaXNwbGF5ZWRIZWlnaHQgLSB0aGlzLmdldEF2YXRhclNpemUoKSkgLyAtMjtcblxuICAgICAgICAgICAgY3JvcGl0LmNyb3BpdCgnb2Zmc2V0Jywge1xuICAgICAgICAgICAgICAneCc6IDAsXG4gICAgICAgICAgICAgICd5Jzogb2Zmc2V0WVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVzZSBwcmVzZXJ2ZWQgY3JvcFxuICAgICAgICAgIGxldCBjcm9wID0gdGhpcy5wcm9wcy5vcHRpb25zLmNyb3Bfb3JnLmNyb3A7XG4gICAgICAgICAgaWYgKGNyb3ApIHtcbiAgICAgICAgICAgIGNyb3BpdC5jcm9waXQoJ3pvb20nLCBjcm9wLnpvb20pO1xuICAgICAgICAgICAgY3JvcGl0LmNyb3BpdCgnb2Zmc2V0Jywge1xuICAgICAgICAgICAgICAneCc6IGNyb3AueCxcbiAgICAgICAgICAgICAgJ3knOiBjcm9wLnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgJCgnLmNyb3AtZm9ybScpLmNyb3BpdCgnZGlzYWJsZScpO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjcm9wQXZhdGFyID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGxldCBhdmF0YXJUeXBlID0gdGhpcy5wcm9wcy51cGxvYWQgPyAnY3JvcF90bXAnIDogJ2Nyb3Bfb3JnJztcbiAgICBsZXQgY3JvcGl0ID0gJCgnLmNyb3AtZm9ybScpO1xuXG4gICAgYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLmF2YXRhciwge1xuICAgICAgJ2F2YXRhcic6IGF2YXRhclR5cGUsXG4gICAgICAnY3JvcCc6IHtcbiAgICAgICAgJ29mZnNldCc6IGNyb3BpdC5jcm9waXQoJ29mZnNldCcpLFxuICAgICAgICAnem9vbSc6IGNyb3BpdC5jcm9waXQoJ3pvb20nKVxuICAgICAgfVxuICAgIH0pLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZShkYXRhLmF2YXRhcl9oYXNoLCBkYXRhLm9wdGlvbnMpO1xuICAgICAgc25hY2tiYXIuc3VjY2VzcyhkYXRhLmRldGFpbCk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci1jcm9wXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY3JvcC1mb3JtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjcm9waXQtaW1hZ2UtcHJldmlld1wiPjwvZGl2PlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzc05hbWU9XCJjcm9waXQtaW1hZ2Utem9vbS1pbnB1dFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC02IGNvbC1tZC1vZmZzZXQtM1wiPlxuXG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLmNyb3BBdmF0YXJ9XG4gICAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMudXBsb2FkID8gZ2V0dGV4dChcIlNldCBhdmF0YXJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldHRleHQoXCJDcm9wIGltYWdlXCIpfVxuICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAge2dldHRleHQoXCJDYW5jZWxcIil9XG4gICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYmF0Y2ggZnJvbSAnbWlzYWdvL3V0aWxzL2JhdGNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBHYWxsZXJ5SXRlbSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2VsZWN0ID0gKCkgPT4ge1xuICAgIHRoaXMucHJvcHMuc2VsZWN0KHRoaXMucHJvcHMuaW1hZ2UpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zZWxlY3Rpb24gPT09IHRoaXMucHJvcHMuaW1hZ2UpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXIgYnRuLWRpc2FibGVkIGF2YXRhci1zZWxlY3RlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2J0biBidG4tYXZhdGFyIGF2YXRhci1zZWxlY3RlZCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tYXZhdGFyIGJ0bi1kaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXInO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnByb3BzLmRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0fT5cbiAgICAgIDxpbWcgc3JjPXttaXNhZ28uZ2V0KCdNRURJQV9VUkwnKSArIHRoaXMucHJvcHMuaW1hZ2V9IC8+XG4gICAgPC9idXR0b24+XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2FsbGVyeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYXZhdGFycy1nYWxsZXJ5XCI+XG4gICAgICA8aDM+e3RoaXMucHJvcHMubmFtZX08L2gzPlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhcnMtZ2FsbGVyeS1pbWFnZXNcIj5cbiAgICAgICAge2JhdGNoKHRoaXMucHJvcHMuaW1hZ2VzLCA0LCBudWxsKS5tYXAoKHJvdywgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiIGtleT17aX0+XG4gICAgICAgICAgICB7cm93Lm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJjb2wteHMtM1wiIGtleT17aX0+XG4gICAgICAgICAgICAgICAge2l0ZW0gPyA8R2FsbGVyeUl0ZW0gaW1hZ2U9e2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PXt0aGlzLnByb3BzLnNlbGVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb249e3RoaXMucHJvcHMuc2VsZWN0aW9ufSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDogPGRpdiBjbGFzc05hbWU9XCJibGFuay1hdmF0YXJcIiAvPn1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdzZWxlY3Rpb24nOiBudWxsLFxuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2VsZWN0ID0gKGltYWdlKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3Rpb246IGltYWdlXG4gICAgfSk7XG4gIH07XG5cbiAgc2F2ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgfSk7XG5cbiAgICBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCB7XG4gICAgICBhdmF0YXI6ICdnYWxsZXJpZXMnLFxuICAgICAgaW1hZ2U6IHRoaXMuc3RhdGUuc2VsZWN0aW9uXG4gICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBzbmFja2Jhci5zdWNjZXNzKHJlc3BvbnNlLmRldGFpbCk7XG4gICAgICB0aGlzLnByb3BzLm9uQ29tcGxldGUocmVzcG9uc2UuYXZhdGFyX2hhc2gsIHJlc3BvbnNlLm9wdGlvbnMpO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvcHMuc2hvd0Vycm9yKHJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1hdmF0YXItZ2FsbGVyeVwiPlxuXG4gICAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMuZ2FsbGVyaWVzLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8R2FsbGVyeSBuYW1lPXtpdGVtLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcz17aXRlbS5pbWFnZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbj17dGhpcy5zdGF0ZS5zZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PXt0aGlzLnNlbGVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpfSAvPjtcbiAgICAgICAgfSl9XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC02IGNvbC1tZC1vZmZzZXQtM1wiPlxuXG4gICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuc2F2ZX1cbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5zdGF0ZS5zZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5zZWxlY3Rpb24gPyBnZXR0ZXh0KFwiU2F2ZSBjaG9pY2VcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0dGV4dChcIlNlbGVjdCBhdmF0YXJcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJDYW5jZWxcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjYWxsQXBpKGF2YXRhclR5cGUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgfSk7XG5cbiAgICBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCB7XG4gICAgICBhdmF0YXI6IGF2YXRhclR5cGVcbiAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHNuYWNrYmFyLnN1Y2Nlc3MocmVzcG9uc2UuZGV0YWlsKTtcbiAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZShyZXNwb25zZS5hdmF0YXJfaGFzaCwgcmVzcG9uc2Uub3B0aW9ucyk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2V0R3JhdmF0YXIgPSAoKSA9PiB7XG4gICAgdGhpcy5jYWxsQXBpKCdncmF2YXRhcicpO1xuICB9O1xuXG4gIHNldEdlbmVyYXRlZCA9ICgpID0+IHtcbiAgICB0aGlzLmNhbGxBcGkoJ2dlbmVyYXRlZCcpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldEdyYXZhdGFyQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMuZ3JhdmF0YXIpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuc2V0R3JhdmF0YXJ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItZ3JhdmF0YXJcIj5cbiAgICAgICAge2dldHRleHQoXCJEb3dubG9hZCBteSBHcmF2YXRhclwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldENyb3BCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5jcm9wX29yZykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxCdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5zaG93Q3JvcH1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2sgYnRuLWF2YXRhci1jcm9wXCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiUmUtY3JvcCB1cGxvYWRlZCBpbWFnZVwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFVwbG9hZEJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLnVwbG9hZCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxCdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5zaG93VXBsb2FkfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9jayBidG4tYXZhdGFyLXVwbG9hZFwiPlxuICAgICAgICB7Z2V0dGV4dChcIlVwbG9hZCBuZXcgaW1hZ2VcIil9XG4gICAgICA8L0J1dHRvbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRHYWxsZXJ5QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMuZ2FsbGVyaWVzKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dHYWxsZXJ5fVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9jayBidG4tYXZhdGFyLWdhbGxlcnlcIj5cbiAgICAgICAge2dldHRleHQoXCJQaWNrIGF2YXRhciBmcm9tIGdhbGxlcnlcIil9XG4gICAgICA8L0J1dHRvbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRBdmF0YXJQcmV2aWV3KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBsZXQgdXNlclBldmlldyA9IHtcbiAgICAgIGlkOiB0aGlzLnByb3BzLnVzZXIuaWQsXG4gICAgICBhdmF0YXJfaGFzaDogdGhpcy5wcm9wcy5vcHRpb25zLmF2YXRhcl9oYXNoXG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhci1wcmV2aWV3IHByZXZpZXctbG9hZGluZ1wiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e3VzZXJQZXZpZXd9IHNpemU9XCIyMDBcIiAvPlxuICAgICAgICA8TG9hZGVyIC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhdmF0YXItcHJldmlld1wiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e3VzZXJQZXZpZXd9IHNpemU9XCIyMDBcIiAvPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHkgbW9kYWwtYXZhdGFyLWluZGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC01XCI+XG5cbiAgICAgICAgICB7dGhpcy5nZXRBdmF0YXJQcmV2aWV3KCl9XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTdcIj5cblxuICAgICAgICAgIHt0aGlzLmdldEdyYXZhdGFyQnV0dG9uKCl9XG5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuc2V0R2VuZXJhdGVkfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItZ2VuZXJhdGVcIj5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiR2VuZXJhdGUgbXkgaW5kaXZpZHVhbCBhdmF0YXJcIil9XG4gICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICB7dGhpcy5nZXRDcm9wQnV0dG9uKCl9XG4gICAgICAgICAge3RoaXMuZ2V0VXBsb2FkQnV0dG9uKCl9XG4gICAgICAgICAge3RoaXMuZ2V0R2FsbGVyeUJ1dHRvbigpfVxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhckluZGV4IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBBdmF0YXJDcm9wIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvY3JvcCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhclVwbG9hZCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL3VwbG9hZCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhckdhbGxlcnkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9nYWxsZXJ5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL21vZGFsLWxvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgdXBkYXRlQXZhdGFyIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VBdmF0YXJFcnJvciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEVycm9yUmVhc29uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJlYXNvbikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0aGlzLnByb3BzLnJlYXNvbn19IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgcmVtb3ZlX2NpcmNsZV9vdXRsaW5lXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgIDwvcD5cbiAgICAgICAge3RoaXMuZ2V0RXJyb3JSZWFzb24oKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgYWpheC5nZXQodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyKS50aGVuKChvcHRpb25zKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckluZGV4LFxuICAgICAgICAnb3B0aW9ucyc6IG9wdGlvbnMsXG4gICAgICAgICdlcnJvcic6IG51bGxcbiAgICAgIH0pO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKHJlamVjdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNob3dFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZXJyb3JcbiAgICB9KTtcbiAgfTtcblxuICBzaG93SW5kZXggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFySW5kZXhcbiAgICB9KTtcbiAgfTtcblxuICBzaG93VXBsb2FkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhclVwbG9hZFxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dDcm9wID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckNyb3BcbiAgICB9KTtcbiAgfTtcblxuICBzaG93R2FsbGVyeSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdjb21wb25lbnQnOiBBdmF0YXJHYWxsZXJ5XG4gICAgfSk7XG4gIH07XG5cbiAgY29tcGxldGVGbG93ID0gKGF2YXRhckhhc2gsIG9wdGlvbnMpID0+IHtcbiAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVBdmF0YXIodGhpcy5wcm9wcy51c2VyLCBhdmF0YXJIYXNoKSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdjb21wb25lbnQnOiBBdmF0YXJJbmRleCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8Q2hhbmdlQXZhdGFyRXJyb3IgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvci5kZXRhaWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uPXt0aGlzLnN0YXRlLmVycm9yLnJlYXNvbn0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8dGhpcy5zdGF0ZS5jb21wb25lbnQgb3B0aW9ucz17dGhpcy5zdGF0ZS5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlPXt0aGlzLmNvbXBsZXRlRmxvd31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3I9e3RoaXMuc2hvd0Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbmRleD17dGhpcy5zaG93SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Nyb3A9e3RoaXMuc2hvd0Nyb3B9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1VwbG9hZD17dGhpcy5zaG93VXBsb2FkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dHYWxsZXJ5PXt0aGlzLnNob3dHYWxsZXJ5fSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMb2FkZXIgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgIGlmICh0aGlzLnN0YXRlICYmIHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIHJldHVybiBcIm1vZGFsLWRpYWxvZyBtb2RhbC1tZXNzYWdlIG1vZGFsLWNoYW5nZS1hdmF0YXJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLWNoYW5nZS1hdmF0YXJcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgeW91ciBhdmF0YXJcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge3RoaXMuZ2V0Qm9keSgpfVxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0YXRlKSB7XG4gIHJldHVybiB7XG4gICAgJ3VzZXInOiBzdGF0ZS5hdXRoLnVzZXJcbiAgfTtcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFyQ3JvcCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2Nyb3AnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGZpbGVTaXplIGZyb20gJ21pc2Fnby91dGlscy9maWxlLXNpemUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpbWFnZSc6IG51bGwsXG4gICAgICAncHJldmlldyc6IG51bGwsXG4gICAgICAncHJvZ3Jlc3MnOiAwLFxuICAgICAgJ3VwbG9hZGVkJzogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgdmFsaWRhdGVGaWxlKGltYWdlKSB7XG4gICAgaWYgKGltYWdlLnNpemUgPiB0aGlzLnByb3BzLm9wdGlvbnMudXBsb2FkLmxpbWl0KSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIlNlbGVjdGVkIGZpbGUgaXMgdG9vIGJpZy4gKCUoZmlsZXNpemUpcylcIiksIHtcbiAgICAgICAgJ2ZpbGVzaXplJzogZmlsZVNpemUoaW1hZ2Uuc2l6ZSlcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIGxldCBpbnZhbGlkVHlwZU1zZyA9IGdldHRleHQoXCJTZWxlY3RlZCBmaWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQuYWxsb3dlZF9taW1lX3R5cGVzLmluZGV4T2YoaW1hZ2UudHlwZSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFR5cGVNc2c7XG4gICAgfVxuXG4gICAgbGV0IGV4dGVuc2lvbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGxvd2VyZWRGaWxlbmFtZSA9IGltYWdlLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnByb3BzLm9wdGlvbnMudXBsb2FkLmFsbG93ZWRfZXh0ZW5zaW9ucy5tYXAoZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAobG93ZXJlZEZpbGVuYW1lLnN1YnN0cihleHRlbnNpb24ubGVuZ3RoICogLTEpID09PSBleHRlbnNpb24pIHtcbiAgICAgICAgZXh0ZW5zaW9uRm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFleHRlbnNpb25Gb3VuZCkge1xuICAgICAgcmV0dXJuIGludmFsaWRUeXBlTXNnO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgcGlja0ZpbGUgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YXRhci1oaWRkZW4tdXBsb2FkJykuY2xpY2soKTtcbiAgfTtcblxuICB1cGxvYWRGaWxlID0gKCkgPT4ge1xuICAgIGxldCBpbWFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdmF0YXItaGlkZGVuLXVwbG9hZCcpLmZpbGVzWzBdO1xuXG4gICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IHRoaXMudmFsaWRhdGVGaWxlKGltYWdlKTtcbiAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaW1hZ2UsXG4gICAgICAncHJldmlldyc6IFVSTC5jcmVhdGVPYmplY3RVUkwoaW1hZ2UpLFxuICAgICAgJ3Byb2dyZXNzJzogMFxuICAgIH0pO1xuXG4gICAgbGV0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBkYXRhLmFwcGVuZCgnYXZhdGFyJywgJ3VwbG9hZCcpO1xuICAgIGRhdGEuYXBwZW5kKCdpbWFnZScsIGltYWdlKTtcblxuICAgIGFqYXgudXBsb2FkKHRoaXMucHJvcHMudXNlci5hcGlfdXJsLmF2YXRhciwgZGF0YSwgKHByb2dyZXNzKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcHJvZ3Jlc3NcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnb3B0aW9ucyc6IGRhdGEub3B0aW9ucyxcbiAgICAgICAgJ3VwbG9hZGVkJzogZGF0YS5kZXRhaWxcbiAgICAgIH0pO1xuICAgICAgc25hY2tiYXIuaW5mbyhnZXR0ZXh0KFwiWW91ciBpbWFnZSBoYXMgYmVlbiB1cGxvYWRlZCBhbmQgeW91IG1heSBub3cgY3JvcCBpdC5cIikpO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICAgICAnaW1hZ2UnOiBudWxsLFxuICAgICAgICAgICdwcm9ncmVzcyc6IDBcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvcHMuc2hvd0Vycm9yKHJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VXBsb2FkUmVxdWlyZW1lbnRzKG9wdGlvbnMpIHtcbiAgICBsZXQgZXh0ZW5zaW9ucyA9IG9wdGlvbnMuYWxsb3dlZF9leHRlbnNpb25zLm1hcChmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBleHRlbnNpb24uc3Vic3RyKDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKGZpbGVzKXMgZmlsZXMgc21hbGxlciB0aGFuICUobGltaXQpc1wiKSwge1xuICAgICAgICAnZmlsZXMnOiBleHRlbnNpb25zLmpvaW4oJywgJyksXG4gICAgICAgICdsaW1pdCc6IGZpbGVTaXplKG9wdGlvbnMubGltaXQpXG4gICAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIGdldFVwbG9hZEJ1dHRvbigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1hdmF0YXItdXBsb2FkXCI+XG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXBpY2stZmlsZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5waWNrRmlsZX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiU2VsZWN0IGZpbGVcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAge3RoaXMuZ2V0VXBsb2FkUmVxdWlyZW1lbnRzKHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQpfVxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRVcGxvYWRQcm9ncmVzc0xhYmVsKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJShwcm9ncmVzcylzICUgY29tcGxldGVcIiksIHtcbiAgICAgICAgJ3Byb2dyZXNzJzogdGhpcy5zdGF0ZS5wcm9ncmVzc1xuICAgICAgfSwgdHJ1ZSk7XG4gIH1cblxuICBnZXRVcGxvYWRQcm9ncmVzcygpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1hdmF0YXItdXBsb2FkXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXBsb2FkLXByb2dyZXNzXCI+XG4gICAgICAgICAgPGltZyBzcmM9e3RoaXMuc3RhdGUucHJldmlld30gLz5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW5vdz1cInt0aGlzLnN0YXRlLnByb2dyZXNzfVwiXG4gICAgICAgICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6IHRoaXMuc3RhdGUucHJvZ3Jlc3MgKyAnJSd9fT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3Itb25seVwiPnt0aGlzLmdldFVwbG9hZFByb2dyZXNzTGFiZWwoKX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICByZW5kZXJVcGxvYWQoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICBpZD1cImF2YXRhci1oaWRkZW4tdXBsb2FkXCJcbiAgICAgICAgICAgICBjbGFzc05hbWU9XCJoaWRkZW4tZmlsZS11cGxvYWRcIlxuICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnVwbG9hZEZpbGV9IC8+XG4gICAgICB7dGhpcy5zdGF0ZS5pbWFnZSA/IHRoaXMuZ2V0VXBsb2FkUHJvZ3Jlc3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldFVwbG9hZEJ1dHRvbigpfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtNiBjb2wtbWQtb2Zmc2V0LTNcIj5cblxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5zaG93SW5kZXh9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ISF0aGlzLnN0YXRlLmltYWdlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyQ3JvcCgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxBdmF0YXJDcm9wIG9wdGlvbnM9e3RoaXMuc3RhdGUub3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQ9e3RoaXMuc3RhdGUudXBsb2FkZWR9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU9e3RoaXMucHJvcHMub25Db21wbGV0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yPXt0aGlzLnByb3BzLnNob3dFcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgc2hvd0luZGV4PXt0aGlzLnByb3BzLnNob3dJbmRleH0gLz47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuICh0aGlzLnN0YXRlLnVwbG9hZGVkID8gdGhpcy5yZW5kZXJDcm9wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJlbmRlclVwbG9hZCgpKTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBpc1ZhbGlkYXRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucHJvcHMudmFsaWRhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJ2Zvcm0tZ3JvdXAnO1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGVkKCkpIHtcbiAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1mZWVkYmFjayc7XG4gICAgICBpZiAodGhpcy5wcm9wcy52YWxpZGF0aW9uID09PSBudWxsKSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1zdWNjZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBnZXRGZWVkYmFjaygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy52YWxpZGF0aW9uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJoZWxwLWJsb2NrIGVycm9yc1wiPlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uLm1hcCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPHAga2V5PXt0aGlzLnByb3BzLmZvciArICdGZWVkYmFja0l0ZW0nICsgaX0+e2Vycm9yfTwvcD47XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmVlZGJhY2tJY29uKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGVkKCkpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIga2V5PXt0aGlzLnByb3BzLmZvciArICdGZWVkYmFja0ljb24nfT5cbiAgICAgICAge3RoaXMucHJvcHMudmFsaWRhdGlvbiA/ICdjbGVhcicgOiAnY2hlY2snfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEZlZWRiYWNrRGVzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGlkPXt0aGlzLnByb3BzLmZvciArICdfc3RhdHVzJ30gY2xhc3NOYW1lPVwic3Itb25seVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uID8gZ2V0dGV4dCgnKGVycm9yKScpIDogZ2V0dGV4dCgnKHN1Y2Nlc3MpJyl9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaGVscFRleHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJoZWxwLWJsb2NrXCI+e3RoaXMucHJvcHMuaGVscFRleHR9PC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9eydjb250cm9sLWxhYmVsICcgKyAodGhpcy5wcm9wcy5sYWJlbENsYXNzIHx8ICcnKX1cbiAgICAgICAgICAgICBodG1sRm9yPXt0aGlzLnByb3BzLmZvciB8fCAnJ30+XG4gICAgICAgIHt0aGlzLnByb3BzLmxhYmVsICsgJzonfVxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNvbnRyb2xDbGFzcyB8fCAnJ30+XG4gICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICB7dGhpcy5nZXRGZWVkYmFja0ljb24oKX1cbiAgICAgICAge3RoaXMuZ2V0RmVlZGJhY2tEZXNjcmlwdGlvbigpfVxuICAgICAgICB7dGhpcy5nZXRGZWVkYmFjaygpfVxuICAgICAgICB7dGhpcy5nZXRIZWxwVGV4dCgpfVxuICAgICAgICB7dGhpcy5wcm9wcy5leHRyYSB8fCBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlcXVpcmVkIH0gZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5sZXQgdmFsaWRhdGVSZXF1aXJlZCA9IHJlcXVpcmVkKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgdmFsaWRhdGUoKSB7XG4gICAgbGV0IGVycm9ycyA9IHt9O1xuICAgIGlmICghdGhpcy5zdGF0ZS52YWxpZGF0b3JzKSB7XG4gICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGxldCB2YWxpZGF0b3JzID0ge1xuICAgICAgcmVxdWlyZWQ6IHRoaXMuc3RhdGUudmFsaWRhdG9ycy5yZXF1aXJlZCB8fCB0aGlzLnN0YXRlLnZhbGlkYXRvcnMsXG4gICAgICBvcHRpb25hbDogdGhpcy5zdGF0ZS52YWxpZGF0b3JzLm9wdGlvbmFsIHx8IHt9XG4gICAgfTtcblxuICAgIGxldCB2YWxpZGF0ZWRGaWVsZHMgPSBbXTtcblxuICAgIC8vIGFkZCByZXF1aXJlZCBmaWVsZHMgdG8gdmFsaWRhdGlvblxuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgaWYgKHZhbGlkYXRvcnMucmVxdWlyZWQuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICB2YWxpZGF0b3JzLnJlcXVpcmVkW25hbWVdKSB7XG4gICAgICAgIHZhbGlkYXRlZEZpZWxkcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCBvcHRpb25hbCBmaWVsZHMgdG8gdmFsaWRhdGlvblxuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgaWYgKHZhbGlkYXRvcnMub3B0aW9uYWwuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICB2YWxpZGF0b3JzLm9wdGlvbmFsW25hbWVdKSB7XG4gICAgICAgIHZhbGlkYXRlZEZpZWxkcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZpZWxkcyB2YWx1ZXNcbiAgICBmb3IgKGxldCBpIGluIHZhbGlkYXRlZEZpZWxkcykge1xuICAgICAgbGV0IG5hbWUgPSB2YWxpZGF0ZWRGaWVsZHNbaV07XG4gICAgICBsZXQgZmllbGRFcnJvcnMgPSB0aGlzLnZhbGlkYXRlRmllbGQobmFtZSwgdGhpcy5zdGF0ZVtuYW1lXSk7XG5cbiAgICAgIGlmIChmaWVsZEVycm9ycyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnNbbmFtZV0gPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZEVycm9ycykge1xuICAgICAgICBlcnJvcnNbbmFtZV0gPSBmaWVsZEVycm9ycztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgaXNWYWxpZCgpIHtcbiAgICBsZXQgZXJyb3JzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGZvciAobGV0IGZpZWxkIGluIGVycm9ycykge1xuICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgaWYgKGVycm9yc1tmaWVsZF0gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhbGlkYXRlRmllbGQobmFtZSwgdmFsdWUpIHtcbiAgICBsZXQgZXJyb3JzID0gW107XG4gICAgaWYgKCF0aGlzLnN0YXRlLnZhbGlkYXRvcnMpIHtcbiAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRvcnMgPSB7XG4gICAgICByZXF1aXJlZDogKHRoaXMuc3RhdGUudmFsaWRhdG9ycy5yZXF1aXJlZCB8fCB0aGlzLnN0YXRlLnZhbGlkYXRvcnMpW25hbWVdLFxuICAgICAgb3B0aW9uYWw6ICh0aGlzLnN0YXRlLnZhbGlkYXRvcnMub3B0aW9uYWwgfHwge30pW25hbWVdXG4gICAgfTtcblxuICAgIGxldCByZXF1aXJlZEVycm9yID0gdmFsaWRhdGVSZXF1aXJlZCh2YWx1ZSkgfHwgZmFsc2U7XG5cbiAgICBpZiAodmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgaWYgKHJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgZXJyb3JzID0gW3JlcXVpcmVkRXJyb3JdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICAgICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRvcnMucmVxdWlyZWRbaV0odmFsdWUpO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID8gZXJyb3JzIDogbnVsbDtcbiAgICB9IGVsc2UgaWYgKHJlcXVpcmVkRXJyb3IgPT09IGZhbHNlICYmIHZhbGlkYXRvcnMub3B0aW9uYWwpIHtcbiAgICAgIGZvciAobGV0IGkgaW4gdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9ycy5vcHRpb25hbFtpXSh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCh2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID8gZXJyb3JzIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIGZhbHNlID09PSBmaWVsZCB3YXNuJ3QgdmFsaWRhdGVkXG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGJpbmRJbnB1dCA9IChuYW1lKSA9PiB7XG4gICAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgICAgbGV0IG5ld1N0YXRlID0ge1xuICAgICAgICBbbmFtZV06IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgfTtcblxuICAgICAgbGV0IGZvcm1FcnJvcnMgPSB0aGlzLnN0YXRlLmVycm9ycyB8fCB7fTtcbiAgICAgIGZvcm1FcnJvcnNbbmFtZV0gPSB0aGlzLnZhbGlkYXRlRmllbGQobmFtZSwgbmV3U3RhdGVbbmFtZV0pO1xuICAgICAgbmV3U3RhdGUuZXJyb3JzID0gZm9ybUVycm9ycztcblxuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNsZWFuKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3Moc3VjY2Vzcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gIH1cblxuICBoYW5kbGVTdWJtaXQgPSAoZXZlbnQpID0+IHtcbiAgICAvLyB3ZSBkb24ndCByZWxvYWQgcGFnZSBvbiBzdWJtaXNzaW9uc1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGVhbigpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpc0xvYWRpbmc6IHRydWV9KTtcbiAgICAgIGxldCBwcm9taXNlID0gdGhpcy5zZW5kKCk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2UudGhlbigoc3VjY2VzcykgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogZmFsc2V9KTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3Moc3VjY2Vzcyk7XG4gICAgICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpc0xvYWRpbmc6IGZhbHNlfSk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZWplY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogZmFsc2V9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBpc0FjdGl2ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wYXRoKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZih0aGlzLnByb3BzLnBhdGgpID09PSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHJldHVybiAodGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJycpICsgJyAnKyAodGhpcy5wcm9wcy5hY3RpdmVDbGFzc05hbWUgfHwgJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICA8L2xpPjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJsb2FkZXJcIn0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImxvYWRlci1zcGlubmluZy13aGVlbFwiPjwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHkgbW9kYWwtbG9hZGVyXCI+XG4gICAgICA8TG9hZGVyIC8+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUGFuZWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLW1lc3NhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFBhbmVsTWVzc2FnZSB7XG4gIGdldEhlbHBUZXh0KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmhlbHBUZXh0KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHAgY2xhc3NOYW1lPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICB7dGhpcy5wcm9wcy5oZWxwVGV4dH1cbiAgICAgIDwvcD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICB7dGhpcy5wcm9wcy5pY29uIHx8ICdpbmZvX291dGxpbmUnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxuICAgICAgICA8L3A+XG4gICAgICAgIHt0aGlzLmdldEhlbHBUZXh0KCl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFuZWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHBhbmVsLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZ1wiPlxuICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSB1c2VybmFtZVwiKX08L2gzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxQYW5lbExvYWRlciAvPlxuXG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBhbmVsTWVzc2FnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wYW5lbC1tZXNzYWdlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5uZXh0X29uKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIllvdSB3aWxsIGJlIGFibGUgdG8gY2hhbmdlIHlvdXIgdXNlcm5hbWUgJShuZXh0X2NoYW5nZSlzLlwiKSxcbiAgICAgICAgICB7J25leHRfY2hhbmdlJzogdGhpcy5wcm9wcy5vcHRpb25zLm5leHRfb24uZnJvbU5vdygpfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiWW91IGhhdmUgdXNlZCB1cCBhdmFpbGFibGUgbmFtZSBjaGFuZ2VzLlwiKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfTwvaDM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPFBhbmVsTWVzc2FnZSBtZXNzYWdlPXtnZXR0ZXh0KFwiWW91IGNhbid0IGNoYW5nZSB5b3VyIHVzZXJuYW1lIGF0IHRoZSBtb21lbnQuXCIpfVxuICAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17dGhpcy5nZXRIZWxwVGV4dCgpfSAvPlxuXG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB1c2VybmFtZTogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgdXNlcm5hbWU6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lQ29udGVudCgpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNaW5MZW5ndGgoe1xuICAgICAgICAgICAgdXNlcm5hbWVfbGVuZ3RoX21pbjogcHJvcHMub3B0aW9ucy5sZW5ndGhfbWluXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1heExlbmd0aCh7XG4gICAgICAgICAgICB1c2VybmFtZV9sZW5ndGhfbWF4OiBwcm9wcy5vcHRpb25zLmxlbmd0aF9tYXhcbiAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgICB9LFxuXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGdldEhlbHBUZXh0KCkge1xuICAgIGxldCBwaHJhc2VzID0gW107XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLmNoYW5nZXNfbGVmdCA+IDApIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiWW91IGNhbiBjaGFuZ2UgeW91ciB1c2VybmFtZSAlKGNoYW5nZXNfbGVmdClzIG1vcmUgdGltZS5cIixcbiAgICAgICAgXCJZb3UgY2FuIGNoYW5nZSB5b3VyIHVzZXJuYW1lICUoY2hhbmdlc19sZWZ0KXMgbW9yZSB0aW1lcy5cIixcbiAgICAgICAgdGhpcy5wcm9wcy5vcHRpb25zLmNoYW5nZXNfbGVmdCk7XG5cbiAgICAgIHBocmFzZXMucHVzaChpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICdjaGFuZ2VzX2xlZnQnOiB0aGlzLnByb3BzLm9wdGlvbnMuY2hhbmdlc19sZWZ0XG4gICAgICB9LCB0cnVlKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMudXNlci5hY2wubmFtZV9jaGFuZ2VzX2V4cGlyZSA+IDApIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiVXNlZCBjaGFuZ2VzIHJlZGVlbSBhZnRlciAlKG5hbWVfY2hhbmdlc19leHBpcmUpcyBkYXkuXCIsXG4gICAgICAgIFwiVXNlZCBjaGFuZ2VzIHJlZGVlbSBhZnRlciAlKG5hbWVfY2hhbmdlc19leHBpcmUpcyBkYXlzLlwiLFxuICAgICAgICB0aGlzLnByb3BzLnVzZXIuYWNsLm5hbWVfY2hhbmdlc19leHBpcmUpO1xuXG4gICAgICBwaHJhc2VzLnB1c2goaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAnbmFtZV9jaGFuZ2VzX2V4cGlyZSc6IHRoaXMucHJvcHMudXNlci5hY2wubmFtZV9jaGFuZ2VzX2V4cGlyZVxuICAgICAgfSwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwaHJhc2VzLmxlbmd0aCA/IHBocmFzZXMuam9pbignICcpIDogbnVsbDtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGxldCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKGVycm9ycy51c2VybmFtZSkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZXJyb3JzLnVzZXJuYW1lWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGlmICh0aGlzLnN0YXRlLnVzZXJuYW1lLnRyaW0oKSA9PT0gdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lKSB7XG4gICAgICBzbmFja2Jhci5pbmZvKGdldHRleHQoXCJZb3VyIG5ldyB1c2VybmFtZSBpcyBzYW1lIGFzIGN1cnJlbnQgb25lLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC51c2VybmFtZSwge1xuICAgICAgJ3VzZXJuYW1lJzogdGhpcy5zdGF0ZS51c2VybmFtZVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhzdWNjZXNzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAndXNlcm5hbWUnOiAnJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9wcy5jb21wbGV0ZShzdWNjZXNzLnVzZXJuYW1lLCBzdWNjZXNzLnNsdWcsIHN1Y2Nlc3Mub3B0aW9ucyk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1mb3JtXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZ1wiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHlcIj5cblxuICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJOZXcgdXNlcm5hbWVcIil9IGZvcj1cImlkX3VzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXt0aGlzLmdldEhlbHBUZXh0KCl9PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF91c2VybmFtZVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgndXNlcm5hbWUnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1mb290ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tOCBjb2wtc20tb2Zmc2V0LTRcIj5cblxuICAgICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtTG9hZGluZyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLWxvYWRpbmcnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtTG9ja2VkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9ja2VkJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcm5hbWVIaXN0b3J5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSwgYWRkTmFtZUNoYW5nZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2VybmFtZS1oaXN0b3J5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVVc2VybmFtZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHRpdGxlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wYWdlLXRpdGxlJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG51bGxcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiQ2hhbmdlIHlvdXIgb3B0aW9uc1wiKVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoW1xuICAgICAgYWpheC5nZXQodGhpcy5wcm9wcy51c2VyLmFwaV91cmwudXNlcm5hbWUpLFxuICAgICAgYWpheC5nZXQobWlzYWdvLmdldCgnVVNFUk5BTUVfQ0hBTkdFU19BUEknKSwge3VzZXI6IHRoaXMucHJvcHMudXNlci5pZH0pXG4gICAgXSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGFbMV0ucmVzdWx0cykpO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjaGFuZ2VzX2xlZnQ6IGRhdGFbMF0uY2hhbmdlc19sZWZ0LFxuICAgICAgICAgIGxlbmd0aF9taW46IGRhdGFbMF0ubGVuZ3RoX21pbixcbiAgICAgICAgICBsZW5ndGhfbWF4OiBkYXRhWzBdLmxlbmd0aF9tYXgsXG4gICAgICAgICAgbmV4dF9vbjogZGF0YVswXS5uZXh0X29uID8gbW9tZW50KGRhdGFbMF0ubmV4dF9vbikgOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgb25Db21wbGV0ZSA9ICh1c2VybmFtZSwgc2x1Zywgb3B0aW9ucykgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goXG4gICAgICBhZGROYW1lQ2hhbmdlKHsgdXNlcm5hbWUsIHNsdWcgfSwgdGhpcy5wcm9wcy51c2VyLCB0aGlzLnByb3BzLnVzZXIpKTtcbiAgICBzdG9yZS5kaXNwYXRjaChcbiAgICAgIHVwZGF0ZVVzZXJuYW1lKHRoaXMucHJvcHMudXNlciwgdXNlcm5hbWUsIHNsdWcpKTtcblxuICAgIHNuYWNrYmFyLnN1Y2Nlc3MoZ2V0dGV4dChcIllvdXIgdXNlcm5hbWUgaGFzIGJlZW4gY2hhbmdlZCBzdWNjZXNzZnVsbHkuXCIpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRDaGFuZ2VGb3JtKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5vcHRpb25zLmNoYW5nZXNfbGVmdCA+IDApIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPEZvcm0gdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17dGhpcy5zdGF0ZS5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU9e3RoaXMub25Db21wbGV0ZX0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8Rm9ybUxvY2tlZCBvcHRpb25zPXt0aGlzLnN0YXRlLm9wdGlvbnN9IC8+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEZvcm1Mb2FkaW5nIC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAge3RoaXMuZ2V0Q2hhbmdlRm9ybSgpfVxuICAgICAgPFVzZXJuYW1lSGlzdG9yeSBpc0xvYWRlZD17dGhpcy5zdGF0ZS5pc0xvYWRlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcz17dGhpcy5wcm9wc1sndXNlcm5hbWUtaGlzdG9yeSddfSAvPlxuICAgIDwvZGl2PlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFNlbGVjdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zZWxlY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBZZXNOb1N3aXRjaCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy95ZXMtbm8tc3dpdGNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyBwYXRjaFVzZXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvYXV0aCc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuXG4gICAgICAnaXNfaGlkaW5nX3ByZXNlbmNlJzogcHJvcHMudXNlci5pc19oaWRpbmdfcHJlc2VuY2UsXG4gICAgICAnbGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG8nOiBwcm9wcy51c2VyLmxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvLFxuICAgICAgJ3N1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHMnOiBwcm9wcy51c2VyLnN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHMsXG4gICAgICAnc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkcyc6IHByb3BzLnVzZXIuc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkcyxcblxuICAgICAgJ2Vycm9ycyc6IHt9XG4gICAgfTtcblxuICAgIHRoaXMucHJpdmF0ZVRocmVhZEludml0ZXNDaG9pY2VzID0gW1xuICAgICAge1xuICAgICAgICAndmFsdWUnOiAwLFxuICAgICAgICAnaWNvbic6ICdoZWxwX291dGxpbmUnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdFdmVyeWJvZHknKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMSxcbiAgICAgICAgJ2ljb24nOiAnZG9uZV9hbGwnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdVc2VycyBJIGZvbGxvdycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndmFsdWUnOiAyLFxuICAgICAgICAnaWNvbic6ICdoaWdobGlnaHRfb2ZmJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnTm9ib2R5JylcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVUb0Nob2ljZXMgPSBbXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAgICdpY29uJzogJ2Jvb2ttYXJrX2JvcmRlcicsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ05vJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDEsXG4gICAgICAgICdpY29uJzogJ2Jvb2ttYXJrJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnQm9va21hcmsnKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMixcbiAgICAgICAgJ2ljb24nOiAnbWFpbCcsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ0Jvb2ttYXJrIHdpdGggZS1tYWlsIG5vdGlmaWNhdGlvbicpXG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5vcHRpb25zLCB7XG4gICAgICBpc19oaWRpbmdfcHJlc2VuY2U6IHRoaXMuc3RhdGUuaXNfaGlkaW5nX3ByZXNlbmNlLFxuICAgICAgbGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG86IHRoaXMuc3RhdGUubGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG8sXG4gICAgICBzdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzOiB0aGlzLnN0YXRlLnN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHMsXG4gICAgICBzdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzOiB0aGlzLnN0YXRlLnN1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHNcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gICAgc3RvcmUuZGlzcGF0Y2gocGF0Y2hVc2VyKHtcbiAgICAgIGlzX2hpZGluZ19wcmVzZW5jZTogdGhpcy5zdGF0ZS5pc19oaWRpbmdfcHJlc2VuY2UsXG4gICAgICBsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190bzogdGhpcy5zdGF0ZS5saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190byxcbiAgICAgIHN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyxcbiAgICAgIHN1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkc1xuICAgIH0pKTtcbiAgICBzbmFja2Jhci5zdWNjZXNzKGdldHRleHQoXCJZb3VyIGZvcnVtIG9wdGlvbnMgaGF2ZSBiZWVuIGNoYW5nZWQuXCIpKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJQbGVhc2UgcmVsb2FkIHBhZ2UgYW5kIHRyeSBhZ2Fpbi5cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogZ2V0dGV4dChcIkZvcnVtIG9wdGlvbnNcIiksXG4gICAgICBwYXJlbnQ6IGdldHRleHQoXCJDaGFuZ2UgeW91ciBvcHRpb25zXCIpXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHBhbmVsLWZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgZm9ydW0gb3B0aW9uc1wiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cbiAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICA8bGVnZW5kPntnZXR0ZXh0KFwiUHJpdmFjeSBzZXR0aW5nc1wiKX08L2xlZ2VuZD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIkhpZGUgbXkgcHJlc2VuY2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiSWYgeW91IGhpZGUgeW91ciBwcmVzZW5jZSwgb25seSBtZW1iZXJzIHdpdGggcGVybWlzc2lvbiB0byBzZWUgaGlkZGVuIHVzZXJzIHdpbGwgc2VlIHdoZW4geW91IGFyZSBvbmxpbmUuXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9pc19oaWRpbmdfcHJlc2VuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICA8WWVzTm9Td2l0Y2ggaWQ9XCJpZF9pc19oaWRpbmdfcHJlc2VuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk9uPVwidmlzaWJpbGl0eV9vZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk9mZj1cInZpc2liaWxpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPbj17Z2V0dGV4dChcIkhpZGUgbXkgcHJlc2VuY2UgZnJvbSBvdGhlciB1c2Vyc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT2ZmPXtnZXR0ZXh0KFwiU2hvdyBteSBwcmVzZW5jZSB0byBvdGhlciB1c2Vyc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnaXNfaGlkaW5nX3ByZXNlbmNlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5pc19oaWRpbmdfcHJlc2VuY2V9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlByaXZhdGUgdGhyZWFkIGludml0YXRpb25zXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190b1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxTZWxlY3QgaWQ9XCJpZF9saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190b1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnbGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG8nKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190b31cbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPXt0aGlzLnByaXZhdGVUaHJlYWRJbnZpdGVzQ2hvaWNlc30gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICA8bGVnZW5kPntnZXR0ZXh0KFwiQXV0b21hdGljIHN1YnNjcmlwdGlvbnNcIil9PC9sZWdlbmQ+XG5cbiAgICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJUaHJlYWRzIEkgc3RhcnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX3N1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICA8U2VsZWN0IGlkPVwiaWRfc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcycpfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHN9XG4gICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz17dGhpcy5zdWJzY3JpYmVUb0Nob2ljZXN9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlRocmVhZHMgSSByZXBseSB0b1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxTZWxlY3QgaWQ9XCJpZF9zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdzdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzJyl9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkc31cbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPXt0aGlzLnN1YnNjcmliZVRvQ2hvaWNlc30gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTggY29sLXNtLW9mZnNldC00XCI+XG5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNhdmUgY2hhbmdlc1wiKX1cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMaSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9saSc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBTaWRlTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsaXN0LWdyb3VwIG5hdi1zaWRlXCI+XG4gICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiA8TGluayB0bz17dGhpcy5wcm9wcy5iYXNlVXJsICsgb3B0aW9uLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJhY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAga2V5PXtvcHRpb24uY29tcG9uZW50fT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICB7b3B0aW9uLmljb259XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtvcHRpb24ubmFtZX1cbiAgICAgICAgPC9MaW5rPjtcbiAgICAgIH0pfVxuICAgIDwvZGl2PjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0TmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gPExpIHBhdGg9e3RoaXMucHJvcHMuYmFzZVVybCArIG9wdGlvbi5jb21wb25lbnQgKyAnLyd9XG4gICAgICAgICAgICAgICAgICAga2V5PXtvcHRpb24uY29tcG9uZW50fT5cbiAgICAgICAgICA8TGluayB0bz17dGhpcy5wcm9wcy5iYXNlVXJsICsgb3B0aW9uLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmhpZGVOYXZ9PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICB7b3B0aW9uLmljb259XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB7b3B0aW9uLm5hbWV9XG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICA8L0xpPjtcbiAgICAgIH0pfVxuICAgIDwvdWw+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFNpZGVOYXYsIENvbXBhY3ROYXYgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL25hdnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBDaGFuZ2VGb3J1bU9wdGlvbnMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9mb3J1bS1vcHRpb25zJztcbmltcG9ydCBDaGFuZ2VVc2VybmFtZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9yb290JztcbmltcG9ydCBDaGFuZ2VTaWduSW5DcmVkZW50aWFscyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvcm9vdCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdG9nZ2xlTmF2ID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyb3Bkb3duOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgaGlkZU5hdiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyb3Bkb3duOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldFRvZ2dsZU5hdkNsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcm9wZG93bikge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24gb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1pY29uJztcbiAgICB9XG4gIH1cblxuICBnZXRDb21wYWN0TmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2NvbXBhY3QtbmF2IG9wZW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NvbXBhY3QtbmF2JztcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS1vcHRpb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwicHVsbC1sZWZ0XCI+e2dldHRleHQoXCJDaGFuZ2UgeW91ciBvcHRpb25zXCIpfTwvaDE+XG5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYWxpZ25lZCBidG4taWNvbiBidG4tZHJvcGRvd24tdG9nZ2xlIGhpZGRlbi1tZCBoaWRkZW4tbGdcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnRvZ2dsZU5hdn1cbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9e3RoaXMuc3RhdGUuZHJvcGRvd24gPyAndHJ1ZScgOiAnZmFsc2UnfT5cbiAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgbWVudVxuICAgICAgICAgICAgPC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDb21wYWN0TmF2Q2xhc3NOYW1lKCl9PlxuXG4gICAgICAgIDxDb21wYWN0TmF2IG9wdGlvbnM9e21pc2Fnby5nZXQoJ1VTRVJfT1BUSU9OUycpfVxuICAgICAgICAgICAgICAgICAgICBiYXNlVXJsPXttaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJyl9XG4gICAgICAgICAgICAgICAgICAgIGhpZGVOYXY9e3RoaXMuaGlkZU5hdn0gLz5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtMyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG5cbiAgICAgICAgICAgIDxTaWRlTmF2IG9wdGlvbnM9e21pc2Fnby5nZXQoJ1VTRVJfT1BUSU9OUycpfVxuICAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpfSAvPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtOVwiPlxuXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdG9yZSkge1xuICByZXR1cm4ge1xuICAgICd0aWNrJzogc3RvcmUudGljay50aWNrLFxuICAgICd1c2VyJzogc3RvcmUuYXV0aC51c2VyLFxuICAgICd1c2VybmFtZS1oaXN0b3J5Jzogc3RvcmVbJ3VzZXJuYW1lLWhpc3RvcnknXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpICsgJ2ZvcnVtLW9wdGlvbnMvJyxcbiAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKENoYW5nZUZvcnVtT3B0aW9ucylcbiAgICB9LFxuICAgIHtcbiAgICAgIHBhdGg6IG1pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKSArICdjaGFuZ2UtdXNlcm5hbWUvJyxcbiAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKENoYW5nZVVzZXJuYW1lKVxuICAgIH0sXG4gICAge1xuICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpICsgJ3NpZ24taW4tY3JlZGVudGlhbHMvJyxcbiAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKENoYW5nZVNpZ25JbkNyZWRlbnRpYWxzKVxuICAgIH1cbiAgXTtcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBuZXdfZW1haWw6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnLFxuXG4gICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgIG5ld19lbWFpbDogW1xuICAgICAgICAgIHZhbGlkYXRvcnMuZW1haWwoKVxuICAgICAgICBdLFxuICAgICAgICBwYXNzd29yZDogW11cbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgbGV0IGVycm9ycyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBsZXQgbGVuZ3RocyA9IFtcbiAgICAgIHRoaXMuc3RhdGUubmV3X2VtYWlsLnRyaW0oKS5sZW5ndGgsXG4gICAgICB0aGlzLnN0YXRlLnBhc3N3b3JkLnRyaW0oKS5sZW5ndGhcbiAgICBdO1xuXG4gICAgaWYgKGxlbmd0aHMuaW5kZXhPZigwKSAhPT0gLTEpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGaWxsIG91dCBhbGwgZmllbGRzLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5uZXdfZW1haWwpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGVycm9ycy5uZXdfZW1haWxbMF0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLmNoYW5nZV9lbWFpbCwge1xuICAgICAgbmV3X2VtYWlsOiB0aGlzLnN0YXRlLm5ld19lbWFpbCxcbiAgICAgIHBhc3N3b3JkOiB0aGlzLnN0YXRlLnBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbmV3X2VtYWlsOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJ1xuICAgIH0pO1xuXG4gICAgc25hY2tiYXIuc3VjY2VzcyhyZXNwb25zZS5kZXRhaWwpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgaWYgKHJlamVjdGlvbi5uZXdfZW1haWwpIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLm5ld19lbWFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24ucGFzc3dvcmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0gY2xhc3NOYW1lPVwiZm9ybS1ob3Jpem9udGFsXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInR5cGVcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fSAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHBhbmVsLWZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgZS1tYWlsIGFkZHJlc3NcIil9PC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keVwiPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIk5ldyBlLW1haWxcIil9IGZvcj1cImlkX25ld19lbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF9uZXdfZW1haWxcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ25ld19lbWFpbCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLm5ld19lbWFpbH0gLz5cbiAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgIDxociAvPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIllvdXIgY3VycmVudCBwYXNzd29yZFwiKX0gZm9yPVwiaWRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImlkX3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdwYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWZvb3RlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS04IGNvbC1zbS1vZmZzZXQtNFwiPlxuXG4gICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgZS1tYWlsXCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG5ld19wYXNzd29yZDogJycsXG4gICAgICByZXBlYXRfcGFzc3dvcmQ6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnLFxuXG4gICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgIG5ld19wYXNzd29yZDogW1xuICAgICAgICAgIHZhbGlkYXRvcnMucGFzc3dvcmRNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSlcbiAgICAgICAgXSxcbiAgICAgICAgcmVwZWF0X3Bhc3N3b3JkOiBbXSxcbiAgICAgICAgcGFzc3dvcmQ6IFtdXG4gICAgICB9LFxuXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGxldCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgbGV0IGxlbmd0aHMgPSBbXG4gICAgICB0aGlzLnN0YXRlLm5ld19wYXNzd29yZC50cmltKCkubGVuZ3RoLFxuICAgICAgdGhpcy5zdGF0ZS5yZXBlYXRfcGFzc3dvcmQudHJpbSgpLmxlbmd0aCxcbiAgICAgIHRoaXMuc3RhdGUucGFzc3dvcmQudHJpbSgpLmxlbmd0aFxuICAgIF07XG5cbiAgICBpZiAobGVuZ3Rocy5pbmRleE9mKDApICE9PSAtMSkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZpbGwgb3V0IGFsbCBmaWVsZHMuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLm5ld19wYXNzd29yZCkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZXJyb3JzLm5ld19wYXNzd29yZFswXSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubmV3X3Bhc3N3b3JkLnRyaW0oKSAhPT0gdGhpcy5zdGF0ZS5yZXBlYXRfcGFzc3dvcmQudHJpbSgpKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiTmV3IHBhc3N3b3JkcyBhcmUgZGlmZmVyZW50LlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuY2hhbmdlX3Bhc3N3b3JkLCB7XG4gICAgICBuZXdfcGFzc3dvcmQ6IHRoaXMuc3RhdGUubmV3X3Bhc3N3b3JkLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuc3RhdGUucGFzc3dvcmRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG5ld19wYXNzd29yZDogJycsXG4gICAgICByZXBlYXRfcGFzc3dvcmQ6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnXG4gICAgfSk7XG5cbiAgICBzbmFja2Jhci5zdWNjZXNzKHJlc3BvbnNlLmRldGFpbCk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLm5ld19wYXNzd29yZCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24ubmV3X3Bhc3N3b3JkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5wYXNzd29yZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidHlwZVwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSBwYXNzd29yZFwiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiTmV3IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9uZXdfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImlkX25ld19wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnbmV3X3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUubmV3X3Bhc3N3b3JkfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlJlcGVhdCBwYXNzd29yZFwiKX0gZm9yPVwiaWRfcmVwZWF0X3Bhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJpZF9yZXBlYXRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3JlcGVhdF9wYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnJlcGVhdF9wYXNzd29yZH0gLz5cbiAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgIDxociAvPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIllvdXIgY3VycmVudCBwYXNzd29yZFwiKX0gZm9yPVwiaWRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImlkX3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdwYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWZvb3RlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS04IGNvbC1zbS1vZmZzZXQtNFwiPlxuXG4gICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgcGFzc3dvcmRcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hhbmdlRW1haWwgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1lbWFpbCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IENoYW5nZVBhc3N3b3JkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9jaGFuZ2UtcGFzc3dvcmQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogZ2V0dGV4dChcIkNoYW5nZSBlbWFpbCBvciBwYXNzd29yZFwiKSxcbiAgICAgIHBhcmVudDogZ2V0dGV4dChcIkNoYW5nZSB5b3VyIG9wdGlvbnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8Q2hhbmdlRW1haWwgdXNlcj17dGhpcy5wcm9wcy51c2VyfSAvPlxuICAgICAgPENoYW5nZVBhc3N3b3JkIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz5cblxuICAgICAgPHAgY2xhc3NOYW1lPVwibWVzc2FnZS1saW5lXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICB3YXJuaW5nXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGEgaHJlZj17bWlzYWdvLmdldCgnRk9SR09UVEVOX1BBU1NXT1JEX1VSTCcpfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBmb3Jnb3R0ZW4gcGFzc3dvcmRcIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5IHBhbmVsLWJvZHktbG9hZGluZ1wiPlxuICAgICAgPExvYWRlciBjbGFzc05hbWU9XCJsb2FkZXIgbG9hZGVyLXNwYWNlZFwiIC8+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRIZWxwVGV4dCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5oZWxwVGV4dCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGNsYXNzTmFtZT1cImhlbHAtYmxvY2tcIj5cbiAgICAgICAge3RoaXMucHJvcHMuaGVscFRleHR9XG4gICAgICA8L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5IHBhbmVsLW1lc3NhZ2UtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmljb24gfHwgJ2luZm9fb3V0bGluZSd9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgIDwvcD5cbiAgICAgICAge3RoaXMuZ2V0SGVscFRleHQoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHp4Y3ZibiBmcm9tICdtaXNhZ28vc2VydmljZXMvenhjdmJuJztcblxuZXhwb3J0IGNvbnN0IFNUWUxFUyA9IFtcbiAgJ3Byb2dyZXNzLWJhci1kYW5nZXInLFxuICAncHJvZ3Jlc3MtYmFyLXdhcm5pbmcnLFxuICAncHJvZ3Jlc3MtYmFyLXdhcm5pbmcnLFxuICAncHJvZ3Jlc3MtYmFyLXByaW1hcnknLFxuICAncHJvZ3Jlc3MtYmFyLXN1Y2Nlc3MnXG5dO1xuXG5leHBvcnQgY29uc3QgTEFCRUxTID0gW1xuICBnZXR0ZXh0KFwiRW50ZXJlZCBwYXNzd29yZCBpcyB2ZXJ5IHdlYWsuXCIpLFxuICBnZXR0ZXh0KFwiRW50ZXJlZCBwYXNzd29yZCBpcyB3ZWFrLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgYXZlcmFnZS5cIiksXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHN0cm9uZy5cIiksXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHZlcnkgc3Ryb25nLlwiKVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuX3Njb3JlID0gMDtcbiAgICB0aGlzLl9wYXNzd29yZCA9IG51bGw7XG4gICAgdGhpcy5faW5wdXRzID0gW107XG4gIH1cblxuICBnZXRTY29yZShwYXNzd29yZCwgaW5wdXRzKSB7XG4gICAgbGV0IGNhY2hlU3RhbGUgPSBmYWxzZTtcblxuICAgIGlmIChwYXNzd29yZC50cmltKCkgIT09IHRoaXMuX3Bhc3N3b3JkKSB7XG4gICAgICBjYWNoZVN0YWxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRzLmxlbmd0aCAhPT0gdGhpcy5faW5wdXRzLmxlbmd0aCkge1xuICAgICAgY2FjaGVTdGFsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0cy5tYXAoKHZhbHVlLCBpKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS50cmltKCkgIT09IHRoaXMuX2lucHV0c1tpXSkge1xuICAgICAgICAgIGNhY2hlU3RhbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2FjaGVTdGFsZSkge1xuICAgICAgdGhpcy5fc2NvcmUgPSB6eGN2Ym4uc2NvcmVQYXNzd29yZChwYXNzd29yZCwgaW5wdXRzKTtcbiAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQudHJpbSgpO1xuICAgICAgdGhpcy5faW5wdXRzID0gaW5wdXRzLm1hcChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Njb3JlO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBsZXQgc2NvcmUgPSB0aGlzLmdldFNjb3JlKHRoaXMucHJvcHMucGFzc3dvcmQsIHRoaXMucHJvcHMuaW5wdXRzKTtcblxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImhlbHAtYmxvY2sgcGFzc3dvcmQtc3RyZW5ndGhcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e1wicHJvZ3Jlc3MtYmFyIFwiICsgU1RZTEVTW3Njb3JlXX1cbiAgICAgICAgICAgICBzdHlsZT17e3dpZHRoOiAoMjAgKyAoMjAgKiBzY29yZSkpICsgJyUnfX1cbiAgICAgICAgICAgICByb2xlPVwicHJvZ3Jlc3MtYmFyXCJcbiAgICAgICAgICAgICBhcmlhLXZhbHVlbm93PXtzY29yZX1cbiAgICAgICAgICAgICBhcmlhLXZhbHVlbWluPVwiMFwiXG4gICAgICAgICAgICAgYXJpYS12YWx1ZW1heD1cIjRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICB7TEFCRUxTW3Njb3JlXX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtYWxsXCI+XG4gICAgICAgIHtMQUJFTFNbc2NvcmVdfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9sbG93QnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93LWJ1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IE1vZGVyYXRpb25OYXYgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL25hdic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFN0YXR1cywgeyBTdGF0dXNJY29uLCBTdGF0dXNMYWJlbCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXItc3RhdHVzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0VXNlclN0YXR1cygpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXN0YXR1cy1kaXNwbGF5XCI+XG4gICAgICA8U3RhdHVzIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX0gc3RhdHVzPXt0aGlzLnByb3BzLnByb2ZpbGUuc3RhdHVzfT5cbiAgICAgICAgPFN0YXR1c0ljb24gdXNlcj17dGhpcy5wcm9wcy5wcm9maWxlfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3RoaXMucHJvcHMucHJvZmlsZS5zdGF0dXN9IC8+XG4gICAgICAgIDxTdGF0dXNMYWJlbCB1c2VyPXt0aGlzLnByb3BzLnByb2ZpbGV9XG4gICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3RoaXMucHJvcHMucHJvZmlsZS5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWxcIiAvPlxuICAgICAgPC9TdGF0dXM+XG4gICAgPC9saT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldFVzZXJSYW5rKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUucmFuay5pc190YWIpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwidXNlci1yYW5rXCI+XG4gICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMucHJvZmlsZS5yYW5rLmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUucmFuay5uYW1lfVxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwidXNlci1yYW5rXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj57dGhpcy5wcm9wcy5wcm9maWxlLnJhbmsubmFtZX08L3NwYW4+XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlclRpdGxlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUudGl0bGUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwidXNlci10aXRsZVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5wcm9maWxlLnRpdGxlfVxuICAgICAgPC9saT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5wcm9maWxlLnJhbmsudGl0bGUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwidXNlci10aXRsZVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5wcm9maWxlLnJhbmsudGl0bGV9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEpvaW5lZE9uKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBsZXQgdGl0bGUgPSBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiSm9pbmVkIG9uICUoam9pbmVkX29uKXNcIiksIHtcbiAgICAgICdqb2luZWRfb24nOiB0aGlzLnByb3BzLnByb2ZpbGUuam9pbmVkX29uLmZvcm1hdCgnTEwsIExUJylcbiAgICB9LCB0cnVlKTtcblxuICAgIGxldCBhZ2UgPSBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiSm9pbmVkICUoam9pbmVkX29uKXNcIiksIHtcbiAgICAgICdqb2luZWRfb24nOiB0aGlzLnByb3BzLnByb2ZpbGUuam9pbmVkX29uLmZyb21Ob3coKVxuICAgIH0sIHRydWUpO1xuXG4gICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLWpvaW5lZC1vblwiPlxuICAgICAgPGFiYnIgdGl0bGU9e3RpdGxlfT5cbiAgICAgICAge2FnZX1cbiAgICAgIDwvYWJicj5cbiAgICA8L2xpPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RW1haWwoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5lbWFpbCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLWVtYWlsXCI+XG4gICAgICAgIDxhIGhyZWY9eydtYWlsdG86JyArIHRoaXMucHJvcHMucHJvZmlsZS5lbWFpbH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUuZW1haWx9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rm9sbG93QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9mb2xsb3cpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Rm9sbG93QnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tYWxpZ25lZCBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRNb2RlcmF0aW9uQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9tb2RlcmF0ZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYnRuLWdyb3VwIGJ0bi1hbGlnbmVkIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHQgYnRuLW1vZGVyYXRlIGRyb3Bkb3duLXRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIHRvbmFsaXR5XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiTW9kZXJhdGlvblwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxNb2RlcmF0aW9uTmF2IHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuPGRpdiBjbGFzc05hbWU9XCJwYWdlLWhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTkgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnByb2ZpbGV9IHNpemU9XCIxMDBcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj57dGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG5cbiAgICAgICAgICAgIHt0aGlzLmdldEZvbGxvd0J1dHRvbigpfVxuICAgICAgICAgICAge3RoaXMuZ2V0TW9kZXJhdGlvbkJ1dHRvbigpfVxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYWxpZ25lZCBidG4taWNvbiBidG4tZHJvcGRvd24tdG9nZ2xlIGhpZGRlbi1tZCBoaWRkZW4tbGdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy50b2dnbGVOYXZ9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17dGhpcy5wcm9wcy5kcm9wZG93biA/ICd0cnVlJyA6ICdmYWxzZSd9PlxuICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgICAgbWVudVxuICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImhlYWRlci1zdGF0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC05IGNvbC1tZC1vZmZzZXQtM1wiPlxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJsaXN0LWlubGluZVwiPlxuICAgICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5nZXRVc2VyUmFuaygpfVxuICAgICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJUaXRsZSgpfVxuICAgICAgICAgICAgICAgIHt0aGlzLmdldEpvaW5lZE9uKCl9XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0RW1haWwoKX1cbiAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBhbmVsTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLWxvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFBhbmVsTWVzc2FnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wYW5lbC1tZXNzYWdlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAobWlzYWdvLmhhcygnUFJPRklMRV9CQU4nKSkge1xuICAgICAgdGhpcy5pbml0V2l0aFByZWxvYWRlZERhdGEobWlzYWdvLnBvcCgnUFJPRklMRV9CQU4nKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFBvbGxpbmcocHJvcHMucHJvZmlsZS5hcGlfdXJsLmJhbik7XG4gIH1cblxuICBpbml0V2l0aFByZWxvYWRlZERhdGEoYmFuKSB7XG4gICAgaWYgKGJhbi5leHBpcmVzX29uKSB7XG4gICAgICBiYW4uZXhwaXJlc19vbiA9IG1vbWVudChiYW4uZXhwaXJlc19vbik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgYmFuXG4gICAgfTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0UG9sbGluZyhhcGkpIHtcbiAgICBwb2xscy5zdGFydCh7XG4gICAgICBwb2xsOiAnYmFuLWRldGFpbHMnLFxuICAgICAgdXJsOiBhcGksXG4gICAgICBmcmVxdWVuY3k6IDkwICogMTAwMCxcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGUsXG4gICAgICBlcnJvcjogdGhpcy5lcnJvclxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoYmFuKSA9PiB7XG4gICAgaWYgKGJhbi5leHBpcmVzX29uKSB7XG4gICAgICBiYW4uZXhwaXJlc19vbiA9IG1vbWVudChiYW4uZXhwaXJlc19vbik7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGVycm9yOiBudWxsLFxuXG4gICAgICBiYW5cbiAgICB9KTtcbiAgfTtcblxuICBlcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICBlcnJvcjogZXJyb3IuZGV0YWlsLFxuICAgICAgYmFuOiBudWxsXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiQmFuIGRldGFpbHNcIiksXG4gICAgICBwYXJlbnQ6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgcG9sbHMuc3RvcCgnYmFuLWRldGFpbHMnKTtcbiAgfVxuXG4gIGdldFVzZXJNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmJhbi51c2VyX21lc3NhZ2UpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgYmFuLW1lc3NhZ2UgYmFuLXVzZXItbWVzc2FnZVwiPlxuICAgICAgICA8aDQ+e2dldHRleHQoXCJVc2VyLXNob3duIGJhbiBtZXNzYWdlXCIpfTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVhZFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IHRoaXMuc3RhdGUuYmFuLnVzZXJfbWVzc2FnZS5odG1sXG4gICAgICAgICAgfX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YWZmTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5iYW4uc3RhZmZfbWVzc2FnZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keSBiYW4tbWVzc2FnZSBiYW4tc3RhZmYtbWVzc2FnZVwiPlxuICAgICAgICA8aDQ+e2dldHRleHQoXCJUZWFtLXNob3duIGJhbiBtZXNzYWdlXCIpfTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVhZFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IHRoaXMuc3RhdGUuYmFuLnN0YWZmX21lc3NhZ2UuaHRtbFxuICAgICAgICAgIH19IC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEV4cGlyYXRpb25NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmJhbi5leHBpcmVzX29uKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5iYW4uZXhwaXJlc19vbi5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgIGdldHRleHQoXCJUaGlzIGJhbiBleHBpcmVzIG9uICUoZXhwaXJlc19vbilzLlwiKSwge1xuICAgICAgICAgICAgJ2V4cGlyZXNfb24nOiB0aGlzLnN0YXRlLmJhbi5leHBpcmVzX29uLmZvcm1hdCgnTEwsIExUJylcbiAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICBsZXQgbWVzc2FnZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgIGdldHRleHQoXCJUaGlzIGJhbiBleHBpcmVzICUoZXhwaXJlc19vbilzLlwiKSwge1xuICAgICAgICAgICAgJ2V4cGlyZXNfb24nOiB0aGlzLnN0YXRlLmJhbi5leHBpcmVzX29uLmZyb21Ob3coKVxuICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiA8YWJiciB0aXRsZT17dGl0bGV9PlxuICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICA8L2FiYnI+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGJhbiBoYXMgZXhwaXJlZC5cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzJ3MgYmFuIGlzIHBlcm1hbmVudC5cIiksIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRQYW5lbEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYmFuKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZS5iYW4pLmxlbmd0aCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8ZGl2PlxuICAgICAgICAgIHt0aGlzLmdldFVzZXJNZXNzYWdlKCl9XG4gICAgICAgICAge3RoaXMuZ2V0U3RhZmZNZXNzYWdlKCl9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgYmFuLWV4cGlyZXNcIj5cbiAgICAgICAgICAgIDxoND57Z2V0dGV4dChcIkJhbiBleHBpcmF0aW9uXCIpfTwvaDQ+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAgICAgIHt0aGlzLmdldEV4cGlyYXRpb25NZXNzYWdlKCl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgICAgPFBhbmVsTWVzc2FnZSBtZXNzYWdlPXtnZXR0ZXh0KFwiTm8gYmFuIGlzIGFjdGl2ZSBhdCB0aGUgbW9tZW50LlwiKX0gLz5cbiAgICAgICAgPC9kaXY+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgIDxQYW5lbE1lc3NhZ2UgaWNvbj1cImVycm9yX291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUuZXJyb3J9IC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdj5cbiAgICAgICAgPFBhbmVsTG9hZGVyIC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicHJvZmlsZS1iYW4tZGV0YWlsc1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZ1wiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQmFuIGRldGFpbHNcIil9PC9oMz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge3RoaXMuZ2V0UGFuZWxCb2R5KCl9XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyBwYXRjaFByb2ZpbGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvcHJvZmlsZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlzX2ZvbGxvd2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWUgKyAnIGJ0bi1kZWZhdWx0IGJ0bi1mb2xsb3dpbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWUgKyAnIGJ0bi1kZWZhdWx0IGJ0bi1mb2xsb3cnO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pc19mb2xsb3dlZCkge1xuICAgICAgcmV0dXJuICdmYXZvcml0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZmF2b3JpdGVfYm9yZGVyJztcbiAgICB9XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlzX2ZvbGxvd2VkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkZvbGxvd2luZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJGb2xsb3dcIik7XG4gICAgfVxuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBhY3Rpb24gPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRpbmc6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaXNfZm9sbG93ZWQpIHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKHBhdGNoUHJvZmlsZSh7XG4gICAgICAgIGlzX2ZvbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgZm9sbG93ZXJzOiB0aGlzLnByb3BzLnByb2ZpbGUuZm9sbG93ZXJzIC0gMVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZS5kaXNwYXRjaChwYXRjaFByb2ZpbGUoe1xuICAgICAgICBpc19mb2xsb3dlZDogdHJ1ZSxcbiAgICAgICAgZm9sbG93ZXJzOiB0aGlzLnByb3BzLnByb2ZpbGUuZm9sbG93ZXJzICsgMVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5mb2xsb3cpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgc3RvcmUuZGlzcGF0Y2gocGF0Y2hQcm9maWxlKGRhdGEpKTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxCdXR0b24gY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmFjdGlvbn0+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgIHt0aGlzLmdldEljb24oKX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHt0aGlzLmdldExhYmVsKCl9XG4gICAgPC9CdXR0b24+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTZWFyY2ggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2VhcmNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcnNMaXN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzLWxpc3Qvcm9vdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlLCBhcHBlbmQgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zZXRTcGVjaWFsUHJvcHMoKTtcblxuICAgIGlmIChtaXNhZ28uaGFzKHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZKSkge1xuICAgICAgdGhpcy5pbml0V2l0aFByZWxvYWRlZERhdGEobWlzYWdvLnBvcCh0aGlzLlBSRUxPQURFRF9EQVRBX0tFWSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFNwZWNpYWxQcm9wcygpIHtcbiAgICB0aGlzLlBSRUxPQURFRF9EQVRBX0tFWSA9ICdQUk9GSUxFX0ZPTExPV0VSUyc7XG4gICAgdGhpcy5USVRMRSA9IGdldHRleHQoJ0ZvbGxvd2VycycpO1xuICAgIHRoaXMuQVBJX0ZJTFRFUiA9ICdmb2xsb3dlcnMnO1xuICB9XG5cbiAgaW5pdFdpdGhQcmVsb2FkZWREYXRhKGRhdGEpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICBpc0J1c3k6IGZhbHNlLFxuXG4gICAgICBzZWFyY2g6ICcnLFxuXG4gICAgICBjb3VudDogZGF0YS5jb3VudCxcbiAgICAgIG1vcmU6IGRhdGEubW9yZSxcblxuICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgcGFnZXM6IGRhdGEucGFnZXNcbiAgICB9O1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICB9XG5cbiAgaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0J1c3k6IGZhbHNlLFxuXG4gICAgICBzZWFyY2g6ICcnLFxuXG4gICAgICBjb3VudDogMCxcbiAgICAgIG1vcmU6IDAsXG5cbiAgICAgIHBhZ2U6IDEsXG4gICAgICBwYWdlczogMVxuICAgIH07XG5cbiAgICB0aGlzLmxvYWRVc2VycygpO1xuICB9XG5cbiAgbG9hZFVzZXJzKHBhZ2U9MSwgc2VhcmNoPW51bGwpIHtcbiAgICBhamF4LmdldChtaXNhZ28uZ2V0KCdVU0VSU19BUEknKSwge1xuICAgICAgW3RoaXMuQVBJX0ZJTFRFUl06IHRoaXMucHJvcHMucHJvZmlsZS5pZCxcbiAgICAgIG5hbWU6IHNlYXJjaCxcbiAgICAgIHBhZ2U6IHBhZ2UgfHwgMVxuICAgIH0sICd1c2VyLScgKyB0aGlzLkFQSV9GSUxURVIpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKGFwcGVuZChkYXRhLnJlc3VsdHMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBpc0J1c3k6IGZhbHNlLFxuXG4gICAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgICBtb3JlOiBkYXRhLm1vcmUsXG5cbiAgICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgICBwYWdlczogZGF0YS5wYWdlc1xuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogdGhpcy5USVRMRSxcbiAgICAgIHBhcmVudDogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGxvYWRNb3JlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNCdXN5OiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRVc2Vycyh0aGlzLnN0YXRlLnBhZ2UgKyAxLCB0aGlzLnN0YXRlLnNlYXJjaCk7XG4gIH07XG5cbiAgc2VhcmNoID0gKGV2KSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0J1c3k6IHRydWUsXG5cbiAgICAgIHNlYXJjaDogZXYudGFyZ2V0LnZhbHVlLFxuXG4gICAgICBjb3VudDogMCxcbiAgICAgIG1vcmU6IDAsXG5cbiAgICAgIHBhZ2U6IDEsXG4gICAgICBwYWdlczogMVxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2FkVXNlcnMoMSwgZXYudGFyZ2V0LnZhbHVlKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRMYWJlbCgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KCdMb2FkaW5nLi4uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlci5cIixcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pZCA9PT0gdGhpcy5wcm9wcy51c2VyLmlkKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIllvdSBoYXZlICUodXNlcnMpcyBmb2xsb3dlci5cIixcbiAgICAgICAgXCJZb3UgaGF2ZSAlKHVzZXJzKXMgZm9sbG93ZXJzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ3VzZXJzJzogdGhpcy5zdGF0ZS5jb3VudFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiJSh1c2VybmFtZSlzIGhhcyAlKHVzZXJzKXMgZm9sbG93ZXIuXCIsXG4gICAgICAgIFwiJSh1c2VybmFtZSlzIGhhcyAlKHVzZXJzKXMgZm9sbG93ZXJzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lLFxuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbXB0eU1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlNlYXJjaCByZXR1cm5lZCBubyB1c2VycyBtYXRjaGluZyBzcGVjaWZpZWQgY3JpdGVyaWEuXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51c2VyLmlkID09PSB0aGlzLnByb3BzLnByb2ZpbGUuaWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiWW91IGhhdmUgbm8gZm9sbG93ZXJzLlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaGFzIG5vIGZvbGxvd2Vycy5cIiksIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRNb3JlQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLm1vcmUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2VyLW1vcmVcIj5cbiAgICAgICAgPEJ1dHRvbiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzQnVzeX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvYWRNb3JlfT5cbiAgICAgICAgICB7aW50ZXJwb2xhdGUoZ2V0dGV4dChcIlNob3cgbW9yZSAoJShtb3JlKXMpXCIpLCB7XG4gICAgICAgICAgICAnbW9yZSc6IHRoaXMuc3RhdGUubW9yZVxuICAgICAgICAgIH0sIHRydWUpfVxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldExpc3RCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkICYmIHRoaXMuc3RhdGUuY291bnQgPT09IDApIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgIHt0aGlzLmdldEVtcHR5TWVzc2FnZSgpfVxuICAgICAgPC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2PlxuICAgICAgICA8VXNlcnNMaXN0IGlzTG9hZGVkPXt0aGlzLnN0YXRlLmlzTG9hZGVkfVxuICAgICAgICAgICAgICAgICAgIHVzZXJzPXt0aGlzLnByb3BzLnVzZXJzfVxuICAgICAgICAgICAgICAgICAgIHNob3dSYW5rPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgIGNvbHM9ezJ9IC8+XG5cbiAgICAgICAge3RoaXMuZ2V0TW9yZUJ1dHRvbigpfVxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdwcm9maWxlLScgKyB0aGlzLkFQSV9GSUxURVI7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG5cbiAgICAgIDxuYXYgY2xhc3NOYW1lPVwidG9vbGJhclwiPlxuICAgICAgICA8aDMgY2xhc3NOYW1lPVwidG9vbGJhci1sZWZ0XCI+XG4gICAgICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICAgICAgPC9oMz5cblxuICAgICAgICA8U2VhcmNoIGNsYXNzTmFtZT1cInRvb2xiYXItcmlnaHRcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnNlYXJjaH1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5zZWFyY2h9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJTZWFyY2ggaGlzdG9yeS4uLlwiKX0gLz5cbiAgICAgIDwvbmF2PlxuXG4gICAgICB7dGhpcy5nZXRMaXN0Qm9keSgpfVxuXG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dlcnMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3dlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvbGxvd2VycyB7XG4gIHNldFNwZWNpYWxQcm9wcygpIHtcbiAgICB0aGlzLlBSRUxPQURFRF9EQVRBX0tFWSA9ICdQUk9GSUxFX0ZPTExPV1MnO1xuICAgIHRoaXMuVElUTEUgPSBnZXR0ZXh0KCdGb2xsb3dzJyk7XG4gICAgdGhpcy5BUElfRklMVEVSID0gJ2ZvbGxvd3MnO1xuICB9XG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dCgnTG9hZGluZy4uLicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiRm91bmQgJSh1c2VycylzIHVzZXIuXCIsXG4gICAgICAgIFwiRm91bmQgJSh1c2VycylzIHVzZXJzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ3VzZXJzJzogdGhpcy5zdGF0ZS5jb3VudFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaWQgPT09IHRoaXMucHJvcHMudXNlci5pZCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJZb3UgYXJlIGZvbGxvd2luZyAlKHVzZXJzKXMgdXNlci5cIixcbiAgICAgICAgXCJZb3UgYXJlIGZvbGxvd2luZyAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMgaXMgZm9sbG93aW5nICUodXNlcnMpcyB1c2VyLlwiLFxuICAgICAgICBcIiUodXNlcm5hbWUpcyBpcyBmb2xsb3dpbmcgJSh1c2VycylzIHVzZXJzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lLFxuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbXB0eU1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlNlYXJjaCByZXR1cm5lZCBubyB1c2VycyBtYXRjaGluZyBzcGVjaWZpZWQgY3JpdGVyaWEuXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51c2VyLmlkID09PSB0aGlzLnByb3BzLnByb2ZpbGUuaWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiWW91IGFyZSBub3QgZm9sbG93aW5nIGFueSB1c2Vycy5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIGlzIG5vdCBmb2xsb3dpbmcgYW55IHVzZXJzLlwiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL21vZGFsLWxvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFllc05vU3dpdGNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3llcy1uby1zd2l0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RhbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbWVzc2FnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgdXBkYXRlQXZhdGFyIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIGlzX2F2YXRhcl9sb2NrZWQ6ICcnLFxuICAgICAgYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlOiAnJyxcbiAgICAgIGF2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2U6ICcnXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGFqYXguZ2V0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLm1vZGVyYXRlX2F2YXRhcikudGhlbigob3B0aW9ucykgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuXG4gICAgICAgIGlzX2F2YXRhcl9sb2NrZWQ6IG9wdGlvbnMuaXNfYXZhdGFyX2xvY2tlZCxcbiAgICAgICAgYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlOiBvcHRpb25zLmF2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZSxcbiAgICAgICAgYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZTogb3B0aW9ucy5hdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIGVycm9yOiByZWplY3Rpb24uZGV0YWlsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKHRoaXMudmFsaWRhdGUoKS51c2VybmFtZVswXSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLm1vZGVyYXRlX2F2YXRhciwge1xuICAgICAgaXNfYXZhdGFyX2xvY2tlZDogdGhpcy5zdGF0ZS5pc19hdmF0YXJfbG9ja2VkLFxuICAgICAgYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlOiB0aGlzLnN0YXRlLmF2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZSxcbiAgICAgIGF2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2U6IHRoaXMuc3RhdGUuYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZUF2YXRhcih0aGlzLnByb3BzLnByb2ZpbGUsIGFwaVJlc3BvbnNlLmF2YXRhcl9oYXNoKSk7XG4gICAgc25hY2tiYXIuc3VjY2VzcyhnZXR0ZXh0KFwiQXZhdGFyIGNvbnRyb2xzIGhhdmUgYmVlbiBjaGFuZ2VkLlwiKSk7XG4gIH1cblxuICBnZXRGb3JtQm9keSgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cblxuICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiTG9jayBhdmF0YXJcIil9XG4gICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJMb2NraW5nIHVzZXIgYXZhdGFyIHdpbGwgcHJvaGliaXQgdXNlciBmcm9tIGNoYW5naW5nIGhpcyBhdmF0YXIgYW5kIHdpbGwgcmVzZXQgaGlzL2hlciBhdmF0YXIgdG8gZGVmYXVsdCBvbmUuXCIpfVxuICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2lzX2F2YXRhcl9sb2NrZWRcIj5cbiAgICAgICAgICA8WWVzTm9Td2l0Y2ggaWQ9XCJpZF9pc19hdmF0YXJfbG9ja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBpY29uT249XCJsb2NrX291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICBpY29uT2ZmPVwibG9ja19vcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPbj17Z2V0dGV4dChcIkRpc2FsbG93IHVzZXIgZnJvbSBjaGFuZ2luZyBhdmF0YXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT2ZmPXtnZXR0ZXh0KFwiQWxsb3cgdXNlciB0byBjaGFuZ2UgYXZhdGFyXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2lzX2F2YXRhcl9sb2NrZWQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuaXNfYXZhdGFyX2xvY2tlZH0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlVzZXIgbWVzc2FnZVwiKX1cbiAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17Z2V0dGV4dChcIk9wdGlvbmFsIG1lc3NhZ2UgZm9yIHVzZXIgZXhwbGFpbmluZyB3aHkgaGUvc2hlIGlzIHByb2hpYml0ZWQgZm9ybSBjaGFuZ2luZyBhdmF0YXIuXCIpfVxuICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2F2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImlkX2F2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvd3M9XCI0XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2F2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZScpfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5hdmF0YXJfbG9ja191c2VyX21lc3NhZ2V9IC8+XG4gICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJTdGFmZiBtZXNzYWdlXCIpfVxuICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiT3B0aW9uYWwgbWVzc2FnZSBmb3IgZm9ydW0gdGVhbSBtZW1iZXJzIGV4cGxhaW5pbmcgd2h5IHVzZXIgaXMgcHJvaGliaXRlZCBmb3JtIGNoYW5naW5nIGF2YXRhci5cIil9XG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImlkX2F2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICByb3dzPVwiNFwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdhdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlJyl9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmF2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2V9IC8+XG4gICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XG4gICAgICAgICAge2dldHRleHQoXCJDbG9zZVwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAge2dldHRleHQoXCJTYXZlIGNoYW5nZXNcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0TW9kYWxCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPE1vZGFsTWVzc2FnZSBpY29uPVwicmVtb3ZlX2NpcmNsZV9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUuZXJyb3J9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZvcm1Cb2R5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TG9hZGVyIC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIHJldHVybiBcIm1vZGFsLWRpYWxvZyBtb2RhbC1tZXNzYWdlIG1vZGFsLWF2YXRhci1jb250cm9sc1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtYXZhdGFyLWNvbnRyb2xzXCI7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2dldHRleHQoXCJDbG9zZVwiKX0+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJtb2RhbC10aXRsZVwiPntnZXR0ZXh0KFwiQXZhdGFyIGNvbnRyb2xzXCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5nZXRNb2RhbEJvZHkoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTW9kYWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL21vZGFsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGFkZE5hbWVDaGFuZ2UgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgdXBkYXRlVXNlcm5hbWUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGVycm9yOiBudWxsLFxuXG4gICAgICB1c2VybmFtZTogJycsXG4gICAgICB2YWxpZGF0b3JzOiB7XG4gICAgICAgIHVzZXJuYW1lOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZUNvbnRlbnQoKSxcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lTWluTGVuZ3RoKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNYXhMZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSlcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBhamF4LmdldCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5tb2RlcmF0ZV91c2VybmFtZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgZXJyb3I6IHJlamVjdGlvbi5kZXRhaWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IodGhpcy52YWxpZGF0ZSgpLnVzZXJuYW1lWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwubW9kZXJhdGVfdXNlcm5hbWUsIHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnN0YXRlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB1c2VybmFtZTogJydcbiAgICB9KTtcblxuICAgIHN0b3JlLmRpc3BhdGNoKGFkZE5hbWVDaGFuZ2UoXG4gICAgICBhcGlSZXNwb25zZSwgdGhpcy5wcm9wcy5wcm9maWxlLCB0aGlzLnByb3BzLnVzZXIpKTtcbiAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVVc2VybmFtZShcbiAgICAgIHRoaXMucHJvcHMucHJvZmlsZSwgYXBpUmVzcG9uc2UudXNlcm5hbWUsIGFwaVJlc3BvbnNlLnNsdWcpKTtcblxuICAgIHNuYWNrYmFyLnN1Y2Nlc3MoZ2V0dGV4dChcIlVzZXJuYW1lIGhhcyBiZWVuIGNoYW5nZWQuXCIpKTtcbiAgfVxuXG4gIGdldEZvcm1Cb2R5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJOZXcgdXNlcm5hbWVcIil9IGZvcj1cImlkX3VzZXJuYW1lXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF91c2VybmFtZVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNsb3NlXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSB1c2VybmFtZVwiKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRNb2RhbEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TW9kYWxNZXNzYWdlIGljb249XCJyZW1vdmVfY2lyY2xlX291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvcn0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUJvZHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMb2FkZXIgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtcmVuYW1lLXVzZXJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLXJlbmFtZS11c2VyXCI7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2dldHRleHQoXCJDbG9zZVwiKX0+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJtb2RhbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5nZXRNb2RhbEJvZHkoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTW9kYWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL21vZGFsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBZZXNOb1N3aXRjaCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy95ZXMtbm8tc3dpdGNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHBvbGxzIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wb2xscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBpc0RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIGNvdW50ZG93bjogNSxcbiAgICAgIGNvbmZpcm06IGZhbHNlLFxuXG4gICAgICB3aXRoX2NvbnRlbnQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGFqYXguZ2V0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLmRlbGV0ZSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvdW50ZG93bigpO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgZXJyb3I6IHJlamVjdGlvbi5kZXRhaWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb3VudGRvd24gPSAoKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuY291bnRkb3duID4gMSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjb3VudGRvd246IHRoaXMuc3RhdGUuY291bnRkb3duIC0gMSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY291bnRkb3duKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlLmNvbmZpcm0pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY29uZmlybTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwuZGVsZXRlLCB7XG4gICAgICB3aXRoX2NvbnRlbnQ6IHRoaXMuc3RhdGUud2l0aF9jb250ZW50XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKCkge1xuICAgIHBvbGxzLnN0b3AoJ3VzZXItcHJvZmlsZScpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUud2l0aF9jb250ZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNEZWxldGVkOiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzJ3MgYWNjb3VudCwgdGhyZWFkcywgcG9zdHMgYW5kIG90aGVyIGNvbnRlbnQgaGFzIGJlZW4gZGVsZXRlZC5cIiksIHtcbiAgICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgICAgfSwgdHJ1ZSlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNEZWxldGVkOiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzJ3MgYWNjb3VudCBoYXMgYmVlbiBkZWxldGVkIGFuZCBvdGhlciBjb250ZW50IGhhcyBiZWVuIGhpZGRlbi5cIiksIHtcbiAgICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgICAgfSwgdHJ1ZSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEJ1dHRvbkxhYmVsKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbmZpcm0pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiRGVsZXRlICUodXNlcm5hbWUpc1wiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIlBsZWFzZSB3YWl0Li4uICglKGNvdW50ZG93bilzcylcIiksIHtcbiAgICAgICAgJ2NvdW50ZG93bic6IHRoaXMuc3RhdGUuY291bnRkb3duXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGb3JtKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJVc2VyIGNvbnRlbnRcIil9XG4gICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIlxuICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX3dpdGhfY29udGVudFwiPlxuICAgICAgICAgIDxZZXNOb1N3aXRjaCBpZD1cImlkX3dpdGhfY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPbj17Z2V0dGV4dChcIkRlbGV0ZSB0b2dldGhlciB3aXRoIHVzZXIncyBhY2NvdW50XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9mZj17Z2V0dGV4dChcIkhpZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlcidzIGFjY291bnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnd2l0aF9jb250ZW50Jyl9XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLndpdGhfY29udGVudH0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXRoaXMuc3RhdGUuY29uZmlybX0+XG4gICAgICAgICAge3RoaXMuZ2V0QnV0dG9uTGFiZWwoKX1cbiAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldERlbGV0ZWRCb2R5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnN0YXRlLmlzRGVsZXRlZH1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpfT5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmV0dXJuIHRvIHVzZXJzIGxpc3RcIil9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldE1vZGFsQm9keSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxNb2RhbE1lc3NhZ2UgaWNvbj1cInJlbW92ZV9jaXJjbGVfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXt0aGlzLnN0YXRlLmVycm9yfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5pc0RlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVsZXRlZEJvZHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZvcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMb2FkZXIgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvciB8fCB0aGlzLnN0YXRlLmlzRGVsZXRlZCkge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtZGVsZXRlLWFjY291bnRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLWRlbGV0ZS1hY2NvdW50XCI7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2dldHRleHQoXCJDbG9zZVwiKX0+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJtb2RhbC10aXRsZVwiPntnZXR0ZXh0KFwiRGVsZXRlIHVzZXIgYWNjb3VudFwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3RoaXMuZ2V0TW9kYWxCb2R5KCl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBBdmF0YXJDb250cm9scyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vYXZhdGFyLWNvbnRyb2xzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQ2hhbmdlVXNlcm5hbWUgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL2NoYW5nZS11c2VybmFtZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IERlbGV0ZUFjY291bnQgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL2RlbGV0ZS1hY2NvdW50JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbi8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbmxldCBzZWxlY3QgPSBmdW5jdGlvbihzdG9yZSkge1xuICByZXR1cm4ge1xuICAgIHRpY2s6IHN0b3JlLnRpY2ssXG4gICAgdXNlcjogc3RvcmUuYXV0aCxcbiAgICBwcm9maWxlOiBzdG9yZS5wcm9maWxlLFxuICB9O1xufTtcbi8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzaG93QXZhdGFyRGlhbG9nID0gKCkgPT4ge1xuICAgIG1vZGFsLnNob3coY29ubmVjdChzZWxlY3QpKEF2YXRhckNvbnRyb2xzKSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0QXZhdGFyQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9tb2RlcmF0ZV9hdmF0YXIpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGk+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNob3dBdmF0YXJEaWFsb2d9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIHBvcnRyYWl0XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQXZhdGFyIGNvbnRyb2xzXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNob3dSZW5hbWVEaWFsb2cgPSAoKSA9PiB7XG4gICAgbW9kYWwuc2hvdyhjb25uZWN0KHNlbGVjdCkoQ2hhbmdlVXNlcm5hbWUpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRSZW5hbWVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX3JlbmFtZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd1JlbmFtZURpYWxvZ30+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY3JlZGl0X2NhcmRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd0RlbGV0ZURpYWxvZyA9ICgpID0+IHtcbiAgICBtb2RhbC5zaG93KGNvbm5lY3Qoc2VsZWN0KShEZWxldGVBY2NvdW50KSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0RGVsZXRlQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9kZWxldGUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGk+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNob3dEZWxldGVEaWFsb2d9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGNsZWFyXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiRGVsZXRlIGFjY291bnRcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIiByb2xlPVwibWVudVwiPlxuICAgICAge3RoaXMuZ2V0QXZhdGFyQnV0dG9uKCl9XG4gICAgICB7dGhpcy5nZXRSZW5hbWVCdXR0b24oKX1cbiAgICAgIHt0aGlzLmdldERlbGV0ZUJ1dHRvbigpfVxuICAgICAgPGxpIGNsYXNzTmFtZT1cImRpdmlkZXIgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiIC8+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24tYnV0dG9ucyBoaWRkZW4tbWQgaGlkZGVuLWxnXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMudG9nZ2xlTmF2fT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBtZW51XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiTWVudVwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xpJzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBTaWRlTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TWV0YShtZXRhKSB7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJiYWRnZVwiPnt0aGlzLnByb3BzLnByb2ZpbGVbbWV0YS5hdHRyXX08L3NwYW4+O1xuICAgICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsaXN0LWdyb3VwIG5hdi1zaWRlXCI+XG4gICAgICB7dGhpcy5wcm9wcy5wYWdlcy5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBwYWdlLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJhY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAga2V5PXtwYWdlLmNvbXBvbmVudH0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAge3BhZ2UuaWNvbn1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge3BhZ2UubmFtZX1cbiAgICAgICAgICB7dGhpcy5nZXRNZXRhKHBhZ2UubWV0YSl9XG4gICAgICAgIDwvTGluaz47XG4gICAgICB9KX1cbiAgICA8L2Rpdj47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdE5hdiBleHRlbmRzIFNpZGVOYXYge1xuICBzaG93U3BlY2lhbE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX2ZvbGxvdyB8fCB0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9tb2RlcmF0ZTtcbiAgfVxuXG4gIGdldEZvbGxvd0J1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmFjbC5jYW5fZm9sbG93KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEZvbGxvd0J1dHRvbiBjbGFzc05hbWU9XCJidG4gYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRNb2RlcmF0aW9uQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9tb2RlcmF0ZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy50b2dnbGVNb2RlcmF0aW9ufT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHRvbmFsaXR5XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAge2dldHRleHQoXCJNb2RlcmF0aW9uXCIpfVxuICAgICAgPC9idXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3BlY2lhbE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuc2hvd1NwZWNpYWxPcHRpb25zKCkpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24tYnV0dG9uc1wiPlxuICAgICAgICB7dGhpcy5nZXRGb2xsb3dCdXR0b24oKX1cbiAgICAgICAge3RoaXMuZ2V0TW9kZXJhdGlvbkJ1dHRvbigpfVxuICAgICAgPC9saT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7dGhpcy5nZXRTcGVjaWFsT3B0aW9ucygpfVxuICAgICAge3RoaXMuc2hvd1NwZWNpYWxPcHRpb25zKCkgPyA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlclwiIC8+IDogbnVsbH1cbiAgICAgIHt0aGlzLnByb3BzLnBhZ2VzLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICByZXR1cm4gPExpIHBhdGg9e3RoaXMucHJvcHMuYmFzZVVybCArIHBhZ2UuY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgICAgIGtleT17cGFnZS5jb21wb25lbnR9PlxuICAgICAgICAgIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBwYWdlLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmhpZGVOYXZ9PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICB7cGFnZS5pY29ufVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAge3BhZ2UubmFtZX1cbiAgICAgICAgICAgIHt0aGlzLmdldE1ldGEocGFnZS5tZXRhKX1cbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgIDwvTGk+O1xuICAgICAgfSl9XG4gICAgPC91bD47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCYW5EZXRhaWxzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvYmFuLWRldGFpbHMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dlcnMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3dlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFVzZXJuYW1lSGlzdG9yeSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBIZWFkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9IZWFkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RlcmF0aW9uTmF2IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9uYXYnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IFNpZGVOYXYsIENvbXBhY3ROYXYgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL25hdnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydFBvbGxpbmcocHJvcHMucHJvZmlsZS5hcGlfdXJsLnJvb3QpO1xuICB9XG5cbiAgc3RhcnRQb2xsaW5nKGFwaSkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICd1c2VyLXByb2ZpbGUnLFxuICAgICAgdXJsOiBhcGksXG4gICAgICBmcmVxdWVuY3k6IDkwICogMTAwMCxcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YSkpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdG9nZ2xlTmF2ID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duID09PSAncGFnZXMnKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyb3Bkb3duOiAncGFnZXMnXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdG9nZ2xlTW9kZXJhdGlvbiA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcm9wZG93biA9PT0gJ21vZGVyYXRpb24nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyb3Bkb3duOiAnbW9kZXJhdGlvbidcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBoaWRlTmF2ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VG9nZ2xlTmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24nO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhY3ROYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYgb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYnO1xuICAgIH1cbiAgfVxuXG4gIGdldE5hdkRyb3Bkb3duKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duID09PSAncGFnZXMnKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPENvbXBhY3ROYXYgcGFnZXM9e21pc2Fnby5nZXQoJ1BST0ZJTEVfUEFHRVMnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVXJsPXttaXNhZ28uZ2V0KCdQUk9GSUxFJykuYWJzb2x1dGVfdXJsfVxuICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVNb2RlcmF0aW9uPXt0aGlzLnRvZ2dsZU1vZGVyYXRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgaGlkZU5hdj17dGhpcy5oaWRlTmF2fSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duID09PSAnbW9kZXJhdGlvbicpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TW9kZXJhdGlvbk5hdiBwcm9maWxlPXt0aGlzLnByb3BzLnByb2ZpbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTmF2PXt0aGlzLnRvZ2dsZU5hdn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlTmF2PXt0aGlzLmhpZGVOYXZ9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGNvbnN0IGJhc2VDbGFzcyA9ICdwYWdlIHBhZ2UtdXNlci1wcm9maWxlJztcbiAgICBpZiAoZmFsc2UgJiYgdGhpcy5wcm9wcy5wcm9maWxlLnJhbmsuY3NzX2NsYXNzKSB7XG4gICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBwYWdlLXVzZXItcHJvZmlsZS0nICsgdGhpcy5wcm9wcy5wcm9maWxlLnJhbmsuY3NzX2NsYXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmFzZUNsYXNzO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cblxuICAgICAgPEhlYWRlciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgdG9nZ2xlTmF2PXt0aGlzLnRvZ2dsZU5hdn1cbiAgICAgICAgICAgICAgdG9nZ2xlTW9kZXJhdGlvbj17dGhpcy50b2dnbGVNb2RlcmF0aW9ufSAvPlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDb21wYWN0TmF2Q2xhc3NOYW1lKCl9PlxuICAgICAgICB7dGhpcy5nZXROYXZEcm9wZG93bigpfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtMyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJvZmlsZS1zaWRlLWF2YXRhclwiPlxuICAgICAgICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX0gc2l6ZT1cIjQwMFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPFNpZGVOYXYgcGFnZXM9e21pc2Fnby5nZXQoJ1BST0ZJTEVfUEFHRVMnKX1cbiAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1BST0ZJTEUnKS5hYnNvbHV0ZV91cmx9XG4gICAgICAgICAgICAgICAgICAgICBwcm9maWxlPXt0aGlzLnByb3BzLnByb2ZpbGV9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC05XCI+XG5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gICAgJ3VzZXInOiBzdG9yZS5hdXRoLnVzZXIsXG4gICAgJ3VzZXJzJzogc3RvcmUudXNlcnMsXG4gICAgJ3Byb2ZpbGUnOiBzdG9yZS5wcm9maWxlLFxuICAgICd1c2VybmFtZS1oaXN0b3J5Jzogc3RvcmVbJ3VzZXJuYW1lLWhpc3RvcnknXVxuICB9O1xufVxuXG5jbGFzcyBQbGFjZWhvbGRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICA8cD57XCJIZWxsbywgSSdtIHBsYWNlaG9sZGVyIGZvciBcIiArIHRoaXMucHJvcHMucm91dGUubmFtZX08L3A+XG4gICAgPC9kaXY+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9IHtcbiAgJ3Bvc3RzJzogUGxhY2Vob2xkZXIsXG4gICd0aHJlYWRzJzogUGxhY2Vob2xkZXIsXG4gICdmb2xsb3dlcnMnOiBGb2xsb3dlcnMsXG4gICdmb2xsb3dzJzogRm9sbG93cyxcbiAgJ3VzZXJuYW1lLWhpc3RvcnknOiBVc2VybmFtZUhpc3RvcnksXG4gICdiYW4tZGV0YWlscyc6IEJhbkRldGFpbHNcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocygpIHtcbiAgbGV0IHBhdGhzID0gW107XG5cbiAgbWlzYWdvLmdldCgnUFJPRklMRV9QQUdFUycpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIHBhdGhzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgcGF0aDogbWlzYWdvLmdldCgnUFJPRklMRScpLmFic29sdXRlX3VybCArIGl0ZW0uY29tcG9uZW50ICsgJy8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ09NUE9ORU5UU1tpdGVtLmNvbXBvbmVudF0pLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHBhdGhzO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU2VhcmNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NlYXJjaCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFVzZXJuYW1lSGlzdG9yeSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VybmFtZS1oaXN0b3J5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUsIGFwcGVuZCB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2VybmFtZS1oaXN0b3J5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuaW1wb3J0IHRpdGxlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wYWdlLXRpdGxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGlmIChtaXNhZ28uaGFzKCdQUk9GSUxFX05BTUVfSElTVE9SWScpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKCdQUk9GSUxFX05BTUVfSElTVE9SWScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0V2l0aG91dFByZWxvYWRlZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBpbml0V2l0aFByZWxvYWRlZERhdGEoZGF0YSkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgbW9yZTogZGF0YS5tb3JlLFxuXG4gICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICBwYWdlczogZGF0YS5wYWdlc1xuICAgIH07XG5cbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YS5yZXN1bHRzKSk7XG4gIH1cblxuICBpbml0V2l0aG91dFByZWxvYWRlZERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfTtcblxuICAgIHRoaXMubG9hZENoYW5nZXMoKTtcbiAgfVxuXG4gIGxvYWRDaGFuZ2VzKHBhZ2U9MSwgc2VhcmNoPW51bGwpIHtcbiAgICBhamF4LmdldChtaXNhZ28uZ2V0KCdVU0VSTkFNRV9DSEFOR0VTX0FQSScpLCB7XG4gICAgICB1c2VyOiB0aGlzLnByb3BzLnByb2ZpbGUuaWQsXG4gICAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICAgIHBhZ2U6IHBhZ2UgfHwgMVxuICAgIH0sICdzZWFyY2gtdXNlcm5hbWUtaGlzdG9yeScpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIGlmIChwYWdlID09PSAxKSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKGFwcGVuZChkYXRhLnJlc3VsdHMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBpc0J1c3k6IGZhbHNlLFxuXG4gICAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgICBtb3JlOiBkYXRhLm1vcmUsXG5cbiAgICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgICBwYWdlczogZGF0YS5wYWdlc1xuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogZ2V0dGV4dChcIlVzZXJuYW1lIGhpc3RvcnlcIiksXG4gICAgICBwYXJlbnQ6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBsb2FkTW9yZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzQnVzeTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2FkQ2hhbmdlcyh0aGlzLnN0YXRlLnBhZ2UgKyAxLCB0aGlzLnN0YXRlLnNlYXJjaCk7XG4gIH07XG5cbiAgc2VhcmNoID0gKGV2KSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0J1c3k6IHRydWUsXG5cbiAgICAgIHNlYXJjaDogZXYudGFyZ2V0LnZhbHVlLFxuXG4gICAgICBjb3VudDogMCxcbiAgICAgIG1vcmU6IDAsXG5cbiAgICAgIHBhZ2U6IDEsXG4gICAgICBwYWdlczogMVxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2FkQ2hhbmdlcygxLCBldi50YXJnZXQudmFsdWUpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoJ0xvYWRpbmcuLi4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuc2VhcmNoKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIkZvdW5kICUoY2hhbmdlcylzIHVzZXJuYW1lIGNoYW5nZS5cIixcbiAgICAgICAgXCJGb3VuZCAlKGNoYW5nZXMpcyB1c2VybmFtZSBjaGFuZ2VzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ2NoYW5nZXMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pZCA9PT0gdGhpcy5wcm9wcy51c2VyLmlkKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIllvdXIgdXNlcm5hbWUgd2FzIGNoYW5nZWQgJShjaGFuZ2VzKXMgdGltZS5cIixcbiAgICAgICAgXCJZb3VyIHVzZXJuYW1lIHdhcyBjaGFuZ2VkICUoY2hhbmdlcylzIHRpbWVzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ2NoYW5nZXMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMncyB1c2VybmFtZSB3YXMgY2hhbmdlZCAlKGNoYW5nZXMpcyB0aW1lLlwiLFxuICAgICAgICBcIiUodXNlcm5hbWUpcydzIHVzZXJuYW1lIHdhcyBjaGFuZ2VkICUoY2hhbmdlcylzIHRpbWVzLlwiLFxuICAgICAgICB0aGlzLnN0YXRlLmNvdW50KTtcblxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lLFxuICAgICAgICAnY2hhbmdlcyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiU2VhcmNoIHJldHVybmVkIG5vIHVzZXJuYW1lIGNoYW5nZXMgbWF0Y2hpbmcgc3BlY2lmaWVkIGNyaXRlcmlhLlwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMudXNlci5pZCA9PT0gdGhpcy5wcm9wcy5wcm9maWxlLmlkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIk5vIG5hbWUgY2hhbmdlcyBoYXZlIGJlZW4gcmVjb3JkZWQgZm9yIHlvdXIgYWNjb3VudC5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzJ3MgdXNlcm5hbWUgd2FzIG5ldmVyIGNoYW5nZWQuXCIpLCB7XG4gICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TW9yZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5tb3JlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlci1tb3JlXCI+XG4gICAgICAgIDxCdXR0b24gbG9hZGluZz17dGhpcy5zdGF0ZS5pc0J1c3l9XG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5sb2FkTW9yZX0+XG4gICAgICAgICAge2ludGVycG9sYXRlKGdldHRleHQoXCJTaG93IG9sZGVyICglKG1vcmUpcylcIiksIHtcbiAgICAgICAgICAgICdtb3JlJzogdGhpcy5zdGF0ZS5tb3JlXG4gICAgICAgICAgfSwgdHJ1ZSl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwcm9maWxlLXVzZXJuYW1lLWhpc3RvcnlcIj5cblxuICAgICAgPG5hdiBjbGFzc05hbWU9XCJ0b29sYmFyXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0b29sYmFyLWxlZnRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRMYWJlbCgpfVxuICAgICAgICA8L2gzPlxuXG4gICAgICAgIDxTZWFyY2ggY2xhc3NOYW1lPVwidG9vbGJhci1yaWdodFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc2VhcmNofVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlNlYXJjaCBoaXN0b3J5Li4uXCIpfSAvPlxuICAgICAgPC9uYXY+XG5cbiAgICAgIDxVc2VybmFtZUhpc3RvcnkgaXNMb2FkZWQ9e3RoaXMuc3RhdGUuaXNMb2FkZWR9XG4gICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZT17dGhpcy5nZXRFbXB0eU1lc3NhZ2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcz17dGhpcy5wcm9wc1sndXNlcm5hbWUtaGlzdG9yeSddfSAvPlxuXG4gICAgICB7dGhpcy5nZXRNb3JlQnV0dG9uKCl9XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlZ2lzdGVyTW9kYWwgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVnaXN0ZXIuanMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBjYXB0Y2hhIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9jYXB0Y2hhJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgenhjdmJuIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy96eGN2Ym4nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG4gICAgICAnaXNMb2FkZWQnOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNob3dSZWdpc3Rlck1vZGFsID0gKCkgPT4ge1xuICAgIGlmIChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpLmFjY291bnRfYWN0aXZhdGlvbiA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHNuYWNrYmFyLmluZm8oZ2V0dGV4dChcIk5ldyByZWdpc3RyYXRpb25zIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIG1vZGFsLnNob3coUmVnaXN0ZXJNb2RhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnaXNMb2FkaW5nJzogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgY2FwdGNoYS5sb2FkKCksXG4gICAgICAgIHp4Y3Zibi5sb2FkKClcbiAgICAgIF0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICAgICAgICdpc0xvYWRlZCc6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RhbC5zaG93KFJlZ2lzdGVyTW9kYWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jbGFzc05hbWUgKyAodGhpcy5zdGF0ZS5pc0xvYWRpbmcgPyAnIGJ0bi1sb2FkaW5nJyA6ICcnKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuc2hvd1JlZ2lzdGVyTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnYnRuICcgKyB0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGVkfT5cbiAgICAgIHtnZXR0ZXh0KFwiUmVnaXN0ZXJcIil9XG4gICAgICB7dGhpcy5zdGF0ZS5pc0xvYWRpbmcgPyA8TG9hZGVyIC8+IDogbnVsbCB9XG4gICAgPC9idXR0b24+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBQYXNzd29yZFN0cmVuZ3RoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Bhc3N3b3JkLXN0cmVuZ3RoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgYXV0aCBmcm9tICdtaXNhZ28vc2VydmljZXMvYXV0aCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGNhcHRjaGEgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2NhcHRjaGEnO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlckZvcm0gZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcblxuICAgICAgdXNlcm5hbWU6ICcnLFxuICAgICAgZW1haWw6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgY2FwdGNoYTogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgdXNlcm5hbWU6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lQ29udGVudCgpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1heExlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICBlbWFpbDogW1xuICAgICAgICAgIHZhbGlkYXRvcnMuZW1haWwoKVxuICAgICAgICBdLFxuICAgICAgICBwYXNzd29yZDogW1xuICAgICAgICAgIHZhbGlkYXRvcnMucGFzc3dvcmRNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSlcbiAgICAgICAgXSxcbiAgICAgICAgY2FwdGNoYTogY2FwdGNoYS52YWxpZGF0b3IoKVxuICAgICAgfSxcblxuICAgICAgZXJyb3JzOiB7fVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRm9ybSBjb250YWlucyBlcnJvcnMuXCIpKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvcnM6IHRoaXMudmFsaWRhdGUoKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ1VTRVJTX0FQSScpLCB7XG4gICAgICB1c2VybmFtZTogdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgIGVtYWlsOiB0aGlzLnN0YXRlLmVtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuc3RhdGUucGFzc3dvcmQsXG4gICAgICBjYXB0Y2hhOiB0aGlzLnN0YXRlLmNhcHRjaGFcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnZXJyb3JzJzogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5lcnJvcnMsIHJlamVjdGlvbilcbiAgICAgIH0pO1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZvcm0gY29udGFpbnMgZXJyb3JzLlwiKSk7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGVnYWxGb290Tm90ZSgpIHtcbiAgICBpZiAobWlzYWdvLmdldCgnVEVSTVNfT0ZfU0VSVklDRV9VUkwnKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1RFUk1TX09GX1NFUlZJQ0VfVVJMJyl9XG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiQnkgcmVnaXN0ZXJpbmcgeW91IGFncmVlIHRvIHNpdGUncyB0ZXJtcyBhbmQgY29uZGl0aW9ucy5cIil9XG4gICAgICA8L2E+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1kaWFsb2cgbW9kYWwtcmVnaXN0ZXJcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJSZWdpc3RlclwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInR5cGVcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlVzZXJuYW1lXCIpfSBmb3I9XCJpZF91c2VybmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMudXNlcm5hbWV9PlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpZF91c2VybmFtZV9zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUudXNlcm5hbWV9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIkUtbWFpbFwiKX0gZm9yPVwiaWRfZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e3RoaXMuc3RhdGUuZXJyb3JzLmVtYWlsfT5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF9lbWFpbFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfZW1haWxfc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnZW1haWwnKX1cbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmVtYWlsfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJQYXNzd29yZFwiKX0gZm9yPVwiaWRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e3RoaXMuc3RhdGUuZXJyb3JzLnBhc3N3b3JkfVxuICAgICAgICAgICAgICAgICAgICAgICBleHRyYT17PFBhc3N3b3JkU3RyZW5ndGggcGFzc3dvcmQ9e3RoaXMuc3RhdGUucGFzc3dvcmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9e1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lbWFpbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXX0gLz59ID5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX3Bhc3N3b3JkX3N0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzd29yZH0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICB7Y2FwdGNoYS5jb21wb25lbnQoe1xuICAgICAgICAgICAgICBmb3JtOiB0aGlzLFxuICAgICAgICAgICAgICBsYWJlbENsYXNzOiBcImNvbC1zbS00XCIsXG4gICAgICAgICAgICAgIGNvbnRyb2xDbGFzczogXCJjb2wtc20tOFwiXG4gICAgICAgICAgICB9KX1cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICB7dGhpcy5nZXRMZWdhbEZvb3ROb3RlKCl9XG4gICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyIGFjY291bnRcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyQ29tcGxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRMZWFkKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmFjdGl2YXRpb24gPT09ICd1c2VyJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCIlKHVzZXJuYW1lKXMsIHlvdXIgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCB5b3UgbmVlZCB0byBhY3RpdmF0ZSBpdCBiZWZvcmUgeW91IHdpbGwgYmUgYWJsZSB0byBzaWduIGluLlwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ2FkbWluJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCIlKHVzZXJuYW1lKXMsIHlvdXIgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCBib2FyZCBhZG1pbmlzdHJhdG9yIHdpbGwgaGF2ZSB0byBhY3RpdmF0ZSBpdCBiZWZvcmUgeW91IHdpbGwgYmUgYWJsZSB0byBzaWduIGluLlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdWJzY3JpcHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ3VzZXInKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIldlIGhhdmUgc2VudCBhbiBlLW1haWwgdG8gJShlbWFpbClzIHdpdGggbGluayB0aGF0IHlvdSBoYXZlIHRvIGNsaWNrIHRvIGFjdGl2YXRlIHlvdXIgYWNjb3VudC5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmFjdGl2YXRpb24gPT09ICdhZG1pbicpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiV2Ugd2lsbCBzZW5kIGFuIGUtbWFpbCB0byAlKGVtYWlsKXMgd2hlbiB0aGlzIHRha2VzIHBsYWNlLlwiKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWRpYWxvZyBtb2RhbC1tZXNzYWdlIG1vZGFsLXJlZ2lzdGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJSZWdpc3RyYXRpb24gY29tcGxldGVcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAgICAgIHtpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmdldExlYWQoKSxcbiAgICAgICAgICAgICAgICB7J3VzZXJuYW1lJzogdGhpcy5wcm9wcy51c2VybmFtZX0sIHRydWUpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHtpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YnNjcmlwdCgpLFxuICAgICAgICAgICAgICAgIHsnZW1haWwnOiB0aGlzLnByb3BzLmVtYWlsfSwgdHJ1ZSl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wbGV0ZVJlZ2lzdHJhdGlvbiA9IChhcGlSZXNwb25zZSkgPT4ge1xuICAgIGlmIChhcGlSZXNwb25zZS5hY3RpdmF0aW9uID09PSAnYWN0aXZlJykge1xuICAgICAgbW9kYWwuaGlkZSgpO1xuICAgICAgYXV0aC5zaWduSW4oYXBpUmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY29tcGxldGU6IGFwaVJlc3BvbnNlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5zdGF0ZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIDxSZWdpc3RlckNvbXBsZXRlIGFjdGl2YXRpb249e3RoaXMuc3RhdGUuY29tcGxldGUuYWN0aXZhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZT17dGhpcy5zdGF0ZS5jb21wbGV0ZS51c2VybmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbD17dGhpcy5zdGF0ZS5jb21wbGV0ZS5lbWFpbH0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8UmVnaXN0ZXJGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlUmVnaXN0cmF0aW9ufS8+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RMaW5rRm9ybSBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG5cbiAgICAgICdlbWFpbCc6ICcnLFxuXG4gICAgICAndmFsaWRhdG9ycyc6IHtcbiAgICAgICAgJ2VtYWlsJzogW1xuICAgICAgICAgIHZhbGlkYXRvcnMuZW1haWwoKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnU0VORF9BQ1RJVkFUSU9OX0FQSScpLCB7XG4gICAgICAnZW1haWwnOiB0aGlzLnN0YXRlLmVtYWlsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgdGhpcy5wcm9wcy5jYWxsYmFjayhhcGlSZXNwb25zZSk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAoWydhbHJlYWR5X2FjdGl2ZScsICdpbmFjdGl2ZV9hZG1pbiddLmluZGV4T2YocmVqZWN0aW9uLmNvZGUpID4gLTEpIHtcbiAgICAgIHNuYWNrYmFyLmluZm8ocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1hY3RpdmF0aW9uLWxpbmtcIj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiWW91ciBlLW1haWwgYWRkcmVzc1wiKX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdlbWFpbCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmVtYWlsfSAvPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAge2dldHRleHQoXCJTZW5kIGxpbmtcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmtTZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TWVzc2FnZSgpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIkFjdGl2YXRpb24gbGluayB3YXMgc2VudCB0byAlKGVtYWlsKXNcIiksIHtcbiAgICAgIGVtYWlsOiB0aGlzLnByb3BzLnVzZXIuZW1haWxcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwid2VsbCB3ZWxsLWZvcm0gd2VsbC1mb3JtLXJlcXVlc3QtYWN0aXZhdGlvbi1saW5rIHdlbGwtZG9uZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkb25lLW1lc3NhZ2VcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBjaGVja1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICB7dGhpcy5nZXRNZXNzYWdlKCl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5jYWxsYmFja30+XG4gICAgICAgICAge2dldHRleHQoXCJSZXF1ZXN0IGFub3RoZXIgbGlua1wiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb21wbGV0ZTogYXBpUmVzcG9uc2VcbiAgICB9KTtcbiAgfTtcblxuICByZXNldCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMuc3RhdGUuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiA8TGlua1NlbnQgdXNlcj17dGhpcy5zdGF0ZS5jb21wbGV0ZX0gY2FsbGJhY2s9e3RoaXMucmVzZXR9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPFJlcXVlc3RMaW5rRm9ybSBjYWxsYmFjaz17dGhpcy5jb21wbGV0ZX0gLz47XG4gICAgfTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0UmVzZXRGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ2VtYWlsJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAnZW1haWwnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdTRU5EX1BBU1NXT1JEX1JFU0VUX0FQSScpLCB7XG4gICAgICAnZW1haWwnOiB0aGlzLnN0YXRlLmVtYWlsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgdGhpcy5wcm9wcy5jYWxsYmFjayhhcGlSZXNwb25zZSk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAoWydpbmFjdGl2ZV91c2VyJywgJ2luYWN0aXZlX2FkbWluJ10uaW5kZXhPZihyZWplY3Rpb24uY29kZSkgPiAtMSkge1xuICAgICAgdGhpcy5wcm9wcy5zaG93SW5hY3RpdmVQYWdlKHJlamVjdGlvbik7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1wYXNzd29yZC1yZXNldFwiPlxuICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJZb3VyIGUtbWFpbCBhZGRyZXNzXCIpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2VtYWlsJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuZW1haWx9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNlbmQgbGlua1wiKX1cbiAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua1NlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiUmVzZXQgcGFzc3dvcmQgbGluayB3YXMgc2VudCB0byAlKGVtYWlsKXNcIiksIHtcbiAgICAgIGVtYWlsOiB0aGlzLnByb3BzLnVzZXIuZW1haWxcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwid2VsbCB3ZWxsLWZvcm0gd2VsbC1mb3JtLXJlcXVlc3QtcGFzc3dvcmQtcmVzZXQgd2VsbC1kb25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRvbmUtbWVzc2FnZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGNoZWNrXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIHt0aGlzLmdldE1lc3NhZ2UoKX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNhbGxiYWNrfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlJlcXVlc3QgYW5vdGhlciBsaW5rXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY2NvdW50SW5hY3RpdmVQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0QWN0aXZhdGVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ2luYWN0aXZlX3VzZXInKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHA+XG4gICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1JFUVVFU1RfQUNUSVZBVElPTl9VUkwnKX0+XG4gICAgICAgICAge2dldHRleHQoXCJBY3RpdmF0ZSB5b3VyIGFjY291bnQuXCIpfVxuICAgICAgICA8L2E+XG4gICAgICA8L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlIHBhZ2UtbWVzc2FnZSBwYWdlLW1lc3NhZ2UtaW5mbyBwYWdlLWZvcmdvdHRlbi1wYXNzd29yZC1pbmFjdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLXBhbmVsXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiWW91ciBhY2NvdW50IGlzIGluYWN0aXZlLlwiKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAge3RoaXMuZ2V0QWN0aXZhdGVCdXR0b24oKX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcGxldGUgPSAoYXBpUmVzcG9uc2UpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNvbXBsZXRlOiBhcGlSZXNwb25zZVxuICAgIH0pO1xuICB9O1xuXG4gIHJlc2V0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgc2hvd0luYWN0aXZlUGFnZShhcGlSZXNwb25zZSkge1xuICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgIDxBY2NvdW50SW5hY3RpdmVQYWdlIGFjdGl2YXRpb249e2FwaVJlc3BvbnNlLmNvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXthcGlSZXNwb25zZS5kZXRhaWx9IC8+LFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbW91bnQnKVxuICAgICk7XG4gIH1cbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gPExpbmtTZW50IHVzZXI9e3RoaXMuc3RhdGUuY29tcGxldGV9IGNhbGxiYWNrPXt0aGlzLnJlc2V0fSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxSZXF1ZXN0UmVzZXRGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbmFjdGl2ZVBhZ2U9e3RoaXMuc2hvd0luYWN0aXZlUGFnZX0gLz47XG4gICAgfTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgU2lnbkluTW9kYWwgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2lnbi1pbi5qcyc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgYXV0aCBmcm9tICdtaXNhZ28vc2VydmljZXMvYXV0aCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFBhc3N3b3JkRm9ybSBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG5cbiAgICAgICdwYXNzd29yZCc6ICcnLFxuXG4gICAgICAndmFsaWRhdG9ycyc6IHtcbiAgICAgICAgJ3Bhc3N3b3JkJzogW1xuICAgICAgICAgIHZhbGlkYXRvcnMucGFzc3dvcmRNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSlcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5wYXNzd29yZC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHRoaXMuc3RhdGUuZXJyb3JzLnBhc3N3b3JkWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJFbnRlciBuZXcgcGFzc3dvcmQuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnQ0hBTkdFX1BBU1NXT1JEX0FQSScpLCB7XG4gICAgICAncGFzc3dvcmQnOiB0aGlzLnN0YXRlLnBhc3N3b3JkXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgdGhpcy5wcm9wcy5jYWxsYmFjayhhcGlSZXNwb25zZSk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAzICYmIHJlamVjdGlvbi5iYW4pIHtcbiAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5iYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwid2VsbCB3ZWxsLWZvcm0gd2VsbC1mb3JtLXJlc2V0LXBhc3N3b3JkXCI+XG4gICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJFbnRlciBuZXcgcGFzc3dvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzd29yZH0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIHBhc3N3b3JkXCIpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXNzd29yZENoYW5nZWRQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TWVzc2FnZSgpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91ciBwYXNzd29yZCBoYXMgYmVlbiBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS5cIiksIHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWVcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIHNob3dTaWduSW4oKSB7XG4gICAgbW9kYWwuc2hvdyhTaWduSW5Nb2RhbCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS1tZXNzYWdlIHBhZ2UtbWVzc2FnZS1zdWNjZXNzIHBhZ2UtZm9yZ290dGVuLXBhc3N3b3JkLWNoYW5nZWRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1wYW5lbFwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgY2hlY2tcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAgICAgIHt0aGlzLmdldE1lc3NhZ2UoKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIllvdSB3aWxsIGhhdmUgdG8gc2lnbiBpbiB1c2luZyBuZXcgcGFzc3dvcmQgYmVmb3JlIGNvbnRpbnVpbmcuXCIpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeVwiIG9uQ2xpY2s9e3RoaXMuc2hvd1NpZ25Jbn0+XG4gICAgICAgICAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wbGV0ZSA9IChhcGlSZXNwb25zZSkgPT4ge1xuICAgIGF1dGguc29mdFNpZ25PdXQoKTtcblxuICAgIC8vIG51a2UgXCJyZWRpcmVjdF90b1wiIGZpZWxkIHNvIHdlIGRvbid0IGVuZFxuICAgIC8vIGNvbWluZyBiYWNrIHRvIGVycm9yIHBhZ2UgYWZ0ZXIgc2lnbiBpblxuICAgICQoJyNoaWRkZW4tbG9naW4tZm9ybSBpbnB1dFtuYW1lPVwicmVkaXJlY3RfdG9cIl0nKS5yZW1vdmUoKTtcblxuICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgIDxQYXNzd29yZENoYW5nZWRQYWdlIHVzZXI9e2FwaVJlc3BvbnNlfSAvPixcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50JylcbiAgICApO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxSZXNldFBhc3N3b3JkRm9ybSBjYWxsYmFjaz17dGhpcy5jb21wbGV0ZX0gLz47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIFwiZm9ybS1zZWFyY2ggXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiZm9ybS1zZWFyY2hcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgdmFsdWU9e3RoaXMucHJvcHMudmFsdWV9XG4gICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9XG4gICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXIgfHwgZ2V0dGV4dChcIlNlYXJjaC4uLlwiKX0gLz5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgc2VhcmNoXG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENob2ljZSgpIHtcbiAgICBsZXQgY2hvaWNlID0gbnVsbDtcbiAgICB0aGlzLnByb3BzLmNob2ljZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSA9PT0gdGhpcy5wcm9wcy52YWx1ZSkge1xuICAgICAgICBjaG9pY2UgPSBpdGVtO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaG9pY2U7XG4gIH1cblxuICBnZXRJY29uKCkge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZSgpLmljb247XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2UoKS5sYWJlbDtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY2hhbmdlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2Uoe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJ0bi1ncm91cCBidG4tc2VsZWN0LWdyb3VwXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4gYnRuLXNlbGVjdCBkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICAgICBpZD17dGhpcy5wcm9wcy5pZCB8fCBudWxsfVxuICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXt0aGlzLnByb3BzWydhcmlhLWRlc2NyaWJlZGJ5J10gfHwgbnVsbH1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWQgfHwgZmFsc2V9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHt0aGlzLmdldExhYmVsKCl9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgIHt0aGlzLnByb3BzLmNob2ljZXMubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxsaSBrZXk9e2l9PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmNoYW5nZShpdGVtLnZhbHVlKX0+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICB7aXRlbS5pY29ufVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT47XG4gICAgICAgIH0pfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG4gICAgICAnc2hvd0FjdGl2YXRpb24nOiBmYWxzZSxcblxuICAgICAgJ3VzZXJuYW1lJzogJycsXG4gICAgICAncGFzc3dvcmQnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICd1c2VybmFtZSc6IFtdLFxuICAgICAgICAncGFzc3dvcmQnOiBbXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRmlsbCBvdXQgYm90aCBmaWVsZHMuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ0FVVEhfQVBJJyksIHtcbiAgICAgICd1c2VybmFtZSc6IHRoaXMuc3RhdGUudXNlcm5hbWUsXG4gICAgICAncGFzc3dvcmQnOiB0aGlzLnN0YXRlLnBhc3N3b3JkXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKCkge1xuICAgIGxldCBmb3JtID0gJCgnI2hpZGRlbi1sb2dpbi1mb3JtJyk7XG5cbiAgICBmb3JtLmFwcGVuZCgnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJuYW1lXCIgLz4nKTtcbiAgICBmb3JtLmFwcGVuZCgnPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZFwiIC8+Jyk7XG5cbiAgICAvLyBmaWxsIG91dCBmb3JtIHdpdGggdXNlciBjcmVkZW50aWFscyBhbmQgc3VibWl0IGl0LCB0aGlzIHdpbGwgdGVsbFxuICAgIC8vIE1pc2FnbyB0byByZWRpcmVjdCB1c2VyIGJhY2sgdG8gcmlnaHQgcGFnZSwgYW5kIHdpbGwgdHJpZ2dlciBicm93c2VyJ3NcbiAgICAvLyBrZXkgcmluZyBmZWF0dXJlXG4gICAgZm9ybS5maW5kKCdpbnB1dFt0eXBlPVwiaGlkZGVuXCJdJykudmFsKGFqYXguZ2V0Q3NyZlRva2VuKCkpO1xuICAgIGZvcm0uZmluZCgnaW5wdXRbbmFtZT1cInJlZGlyZWN0X3RvXCJdJykudmFsKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwidXNlcm5hbWVcIl0nKS52YWwodGhpcy5zdGF0ZS51c2VybmFtZSk7XG4gICAgZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwicGFzc3dvcmRcIl0nKS52YWwodGhpcy5zdGF0ZS5wYXNzd29yZCk7XG4gICAgZm9ybS5zdWJtaXQoKTtcblxuICAgIC8vIGtlZXAgZm9ybSBsb2FkaW5nXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnaXNMb2FkaW5nJzogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgaWYgKHJlamVjdGlvbi5jb2RlID09PSAnaW5hY3RpdmVfYWRtaW4nKSB7XG4gICAgICAgIHNuYWNrYmFyLmluZm8ocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5jb2RlID09PSAnaW5hY3RpdmVfdXNlcicpIHtcbiAgICAgICAgc25hY2tiYXIuaW5mbyhyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ3Nob3dBY3RpdmF0aW9uJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLmNvZGUgPT09ICdiYW5uZWQnKSB7XG4gICAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmF0aW9uQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLnNob3dBY3RpdmF0aW9uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGEgaHJlZj17bWlzYWdvLmdldCgnUkVRVUVTVF9BQ1RJVkFUSU9OX1VSTCcpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tc3VjY2VzcyBidG4tYmxvY2tcIj5cbiAgICAgICAgIHtnZXR0ZXh0KFwiQWN0aXZhdGUgYWNjb3VudFwiKX1cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWRpYWxvZyBtb2RhbC1zbSBtb2RhbC1zaWduLWluXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJTaWduIGluXCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRfdXNlcm5hbWVcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJVc2VybmFtZSBvciBlLW1haWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgndXNlcm5hbWUnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUudXNlcm5hbWV9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZF9wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJQYXNzd29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdwYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzd29yZH0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICB7dGhpcy5nZXRBY3RpdmF0aW9uQnV0dG9uKCl9XG4gICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdGT1JHT1RURU5fUEFTU1dPUkRfVVJMJyl9XG4gICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICAgICB7Z2V0dGV4dChcIkZvcmdvdCBwYXNzd29yZD9cIil9XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5jb25zdCBUWVBFU19DTEFTU0VTID0ge1xuICAnaW5mbyc6ICdhbGVydC1pbmZvJyxcbiAgJ3N1Y2Nlc3MnOiAnYWxlcnQtc3VjY2VzcycsXG4gICd3YXJuaW5nJzogJ2FsZXJ0LXdhcm5pbmcnLFxuICAnZXJyb3InOiAnYWxlcnQtZGFuZ2VyJ1xufTtcbi8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbmV4cG9ydCBjbGFzcyBTbmFja2JhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldFNuYWNrYmFyQ2xhc3MoKSB7XG4gICAgbGV0IHNuYWNrYmFyQ2xhc3MgPSAnYWxlcnRzLXNuYWNrYmFyJztcbiAgICBpZiAodGhpcy5wcm9wcy5pc1Zpc2libGUpIHtcbiAgICAgIHNuYWNrYmFyQ2xhc3MgKz0gJyBpbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyQ2xhc3MgKz0gJyBvdXQnO1xuICAgIH1cbiAgICByZXR1cm4gc25hY2tiYXJDbGFzcztcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldFNuYWNrYmFyQ2xhc3MoKX0+XG4gICAgICA8cCBjbGFzc05hbWU9eydhbGVydCAnICsgVFlQRVNfQ0xBU1NFU1t0aGlzLnByb3BzLnR5cGVdfT5cbiAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5zbmFja2Jhcjtcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlZ2lzdGVyQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlZ2lzdGVyLWJ1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFNpZ25Jbk1vZGFsIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NpZ24taW4uanMnO1xuaW1wb3J0IGRyb3Bkb3duIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2JpbGUtbmF2YmFyLWRyb3Bkb3duJztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuXG5leHBvcnQgY2xhc3MgR3Vlc3RNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc2hvd1NpZ25Jbk1vZGFsKCkge1xuICAgIG1vZGFsLnNob3coU2lnbkluTW9kYWwpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnUgdXNlci1kcm9wZG93biBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgIHJvbGU9XCJtZW51XCI+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZ3Vlc3QtcHJldmlld1wiPlxuICAgICAgICA8aDQ+e2dldHRleHQoXCJZb3UgYXJlIGJyb3dzaW5nIGFzIGd1ZXN0LlwiKX08L2g0PlxuICAgICAgICA8cD5cbiAgICAgICAgICB7Z2V0dGV4dCgnU2lnbiBpbiBvciByZWdpc3RlciB0byBzdGFydCBhbmQgcGFydGljaXBhdGUgaW4gZGlzY3Vzc2lvbnMuJyl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC14cy02XCI+XG5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNob3dTaWduSW5Nb2RhbH0+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiU2lnbiBpblwiKX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wteHMtNlwiPlxuXG4gICAgICAgICAgICA8UmVnaXN0ZXJCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVnaXN0ZXJcIil9XG4gICAgICAgICAgICA8L1JlZ2lzdGVyQnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICA8L3VsPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHdWVzdE5hdiBleHRlbmRzIEd1ZXN0TWVudSB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibmF2IG5hdi1ndWVzdFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIG5hdmJhci1idG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNob3dTaWduSW5Nb2RhbH0+XG4gICAgICAgIHtnZXR0ZXh0KFwiU2lnbiBpblwiKX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPFJlZ2lzdGVyQnV0dG9uIGNsYXNzTmFtZT1cIm5hdmJhci1idG4gYnRuLXByaW1hcnlcIj5cbiAgICAgICAge2dldHRleHQoXCJSZWdpc3RlclwiKX1cbiAgICAgIDwvUmVnaXN0ZXJCdXR0b24+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3RHdWVzdE5hdiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHNob3dHdWVzdE1lbnUoKSB7XG4gICAgZHJvcGRvd24uc2hvdyhHdWVzdE1lbnUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5zaG93R3Vlc3RNZW51fT5cbiAgICAgIDxBdmF0YXIgc2l6ZT1cIjY0XCIgLz5cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEd1ZXN0TmF2LCBDb21wYWN0R3Vlc3ROYXYgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLW1lbnUvZ3Vlc3QtbmF2JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyBVc2VyTmF2LCBDb21wYWN0VXNlck5hdn0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1tZW51L3VzZXItbmF2JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBVc2VyTWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMucHJvcHMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICByZXR1cm4gPFVzZXJOYXYgdXNlcj17dGhpcy5wcm9wcy51c2VyfSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxHdWVzdE5hdiAvPjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdFVzZXJNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiA8Q29tcGFjdFVzZXJOYXYgdXNlcj17dGhpcy5wcm9wcy51c2VyfSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxDb21wYWN0R3Vlc3ROYXYgLz47XG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuYXV0aDtcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBDaGFuZ2VBdmF0YXJNb2RhbCwgeyBzZWxlY3QgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL3Jvb3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24nO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGxvZ291dCgpIHtcbiAgICBsZXQgZGVjaXNpb24gPSBjb25maXJtKGdldHRleHQoXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2lnbiBvdXQ/XCIpKTtcbiAgICBpZiAoZGVjaXNpb24pIHtcbiAgICAgICQoJyNoaWRkZW4tbG9nb3V0LWZvcm0nKS5zdWJtaXQoKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VBdmF0YXIoKSB7XG4gICAgbW9kYWwuc2hvdyhjb25uZWN0KHNlbGVjdCkoQ2hhbmdlQXZhdGFyTW9kYWwpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51IHVzZXItZHJvcGRvd24gZHJvcGRvd24tbWVudS1yaWdodFwiXG4gICAgICAgICAgICAgICByb2xlPVwibWVudVwiPlxuICAgICAgPGxpIGNsYXNzTmFtZT1cImRyb3Bkb3duLWhlYWRlclwiPlxuICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIudXNlcm5hbWV9PC9zdHJvbmc+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIGNsYXNzTmFtZT1cImRpdmlkZXJcIiAvPlxuICAgICAgPGxpPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+YWNjb3VudF9jaXJjbGU8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJTZWUgeW91ciBwcm9maWxlXCIpfVxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPlxuICAgICAgPGxpPlxuICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJyl9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5kb25lX2FsbDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBvcHRpb25zXCIpfVxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPlxuICAgICAgPGxpPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4tbGlua1wiIG9uQ2xpY2s9e3RoaXMuY2hhbmdlQXZhdGFyfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+cG9ydHJhaXQ8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgYXZhdGFyXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlclwiIC8+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24tYnV0dG9uc1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5sb2dvdXR9PlxuICAgICAgICAgICAge2dldHRleHQoXCJMb2cgb3V0XCIpfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L3VsPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2VyTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cInVsIG5hdiBuYXZiYXItbmF2IG5hdi11c2VyXCI+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd25cIj5cbiAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiPlxuICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNjRcIiAvPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxVc2VyTWVudSB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFVzZXJNZW51KHN0YXRlKSB7XG4gIHJldHVybiB7dXNlcjogc3RhdGUuYXV0aC51c2VyfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3RVc2VyTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc2hvd1VzZXJNZW51KCkge1xuICAgIGRyb3Bkb3duLnNob3dDb25uZWN0ZWQoJ3VzZXItbWVudScsIGNvbm5lY3Qoc2VsZWN0VXNlck1lbnUpKFVzZXJNZW51KSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLnNob3dVc2VyTWVudX0+XG4gICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gc2l6ZT1cIjY0XCIgLz5cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzcygpIHtcbiAgICBsZXQgc3RhdHVzID0gJyc7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2Jhbm5lZCkge1xuICAgICAgc3RhdHVzID0gJ2Jhbm5lZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19oaWRkZW4pIHtcbiAgICAgIHN0YXR1cyA9ICdvZmZsaW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZV9oaWRkZW4pIHtcbiAgICAgIHN0YXR1cyA9ICdvbmxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZV9oaWRkZW4pIHtcbiAgICAgIHN0YXR1cyA9ICdvZmZsaW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZSkge1xuICAgICAgc3RhdHVzID0gJ29ubGluZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lKSB7XG4gICAgICBzdGF0dXMgPSAnb2ZmbGluZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICd1c2VyLXN0YXR1cyB1c2VyLScgKyBzdGF0dXM7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3MoKX0+XG4gICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0YXR1c0ljb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRJY29uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19iYW5uZWQpIHtcbiAgICAgIHJldHVybiAncmVtb3ZlX2NpcmNsZV9vdXRsaW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2hpZGRlbikge1xuICAgICAgcmV0dXJuICdoZWxwX291dGxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lX2hpZGRlbikge1xuICAgICAgcmV0dXJuICdsYWJlbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lX2hpZGRlbikge1xuICAgICAgcmV0dXJuICdsYWJlbF9vdXRsaW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZSkge1xuICAgICAgcmV0dXJuICdsZW5zJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmUpIHtcbiAgICAgIHJldHVybiAncGFub3JhbWFfZmlzaF9leWUnO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb24gc3RhdHVzLWljb25cIj5cbiAgICAgIHt0aGlzLmdldEljb24oKX1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxufVxuXG5leHBvcnQgY2xhc3MgU3RhdHVzTGFiZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRIZWxwKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19iYW5uZWQpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnN0YXR1cy5iYW5uZWRfdW50aWwpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgYmFubmVkIHVudGlsICUoYmFuX2V4cGlyZXMpc1wiKSwge1xuICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgYmFuX2V4cGlyZXM6IHRoaXMucHJvcHMuc3RhdHVzLmJhbm5lZF91bnRpbC5mb3JtYXQoJ0xMLCBMVCcpXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgYmFubmVkXCIpLCB7XG4gICAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2hpZGRlbikge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgaGlkaW5nIHByZXNlbmNlXCIpLCB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lX2hpZGRlbikge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgb25saW5lIChoaWRkZW4pXCIpLCB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZV9oaWRkZW4pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIHdhcyBsYXN0IHNlZW4gJShsYXN0X2NsaWNrKXMgKGhpZGRlbilcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZSxcbiAgICAgICAgbGFzdF9jbGljazogdGhpcy5wcm9wcy5zdGF0dXMubGFzdF9jbGljay5mcm9tTm93KClcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBvbmxpbmVcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyB3YXMgbGFzdCBzZWVuICUobGFzdF9jbGljaylzXCIpLCB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWUsXG4gICAgICAgIGxhc3RfY2xpY2s6IHRoaXMucHJvcHMuc3RhdHVzLmxhc3RfY2xpY2suZnJvbU5vdygpXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfYmFubmVkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkJhbm5lZFwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2hpZGRlbikge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJIaWRkZW5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIk9ubGluZSAoaGlkZGVuKVwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIk9mZmxpbmUgKGhpZGRlbilcIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmUpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiT25saW5lXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZSkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJPZmZsaW5lXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJzdGF0dXMtbGFiZWxcIn1cbiAgICAgICAgICAgICAgICAgdGl0bGU9e3RoaXMuZ2V0SGVscCgpfT5cbiAgICAgIHt0aGlzLmdldExhYmVsKCl9XG4gICAgPC9zcGFuPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgKiBhcyByYW5kb20gZnJvbSAnbWlzYWdvL3V0aWxzL3JhbmRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlclVzZXJBdmF0YXIoaXRlbSkge1xuICAgIGlmIChpdGVtLmNoYW5nZWRfYnkpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8YSBocmVmPXtpdGVtLmNoYW5nZWRfYnkuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJ1c2VyLWF2YXRhclwiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e2l0ZW0uY2hhbmdlZF9ieX0gc2l6ZT1cIjEwMFwiIC8+XG4gICAgICA8L2E+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgIDxBdmF0YXIgc2l6ZT1cIjEwMFwiIC8+XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXJVc2VybmFtZShpdGVtKSB7XG4gICAgaWYgKGl0ZW0uY2hhbmdlZF9ieSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e2l0ZW0uY2hhbmdlZF9ieS5hYnNvbHV0ZV91cmx9IGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAge2l0ZW0uY2hhbmdlZF9ieS51c2VybmFtZX1cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICB7aXRlbS5jaGFuZ2VkX2J5X3VzZXJuYW1lfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgcmVuZGVySGlzdG9yeSgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtaGlzdG9yeSB1aS1yZWFkeVwiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAge3RoaXMucHJvcHMuY2hhbmdlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbVwiIGtleT17aXRlbS5pZH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdmF0YXJcIj5cbiAgICAgICAgICAgICAge3RoaXMucmVuZGVyVXNlckF2YXRhcihpdGVtKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1jaGFuZ2UtYXV0aG9yXCI+XG4gICAgICAgICAgICAgIHt0aGlzLnJlbmRlclVzZXJuYW1lKGl0ZW0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZVwiPlxuICAgICAgICAgICAgICB7aXRlbS5vbGRfdXNlcm5hbWV9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICBhcnJvd19mb3J3YXJkXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge2l0ZW0ubmV3X3VzZXJuYW1lfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1kYXRlXCI+XG4gICAgICAgICAgICAgIDxhYmJyIHRpdGxlPXtpdGVtLmNoYW5nZWRfb24uZm9ybWF0KCdMTEwnKX0+XG4gICAgICAgICAgICAgICAge2l0ZW0uY2hhbmdlZF9vbi5mcm9tTm93KCl9XG4gICAgICAgICAgICAgIDwvYWJicj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+O1xuICAgICAgICB9KX1cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRFbXB0eU1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZW1wdHlNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5lbXB0eU1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiTm8gbmFtZSBjaGFuZ2VzIGhhdmUgYmVlbiByZWNvcmRlZCBmb3IgeW91ciBhY2NvdW50LlwiKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJFbXB0eUhpc3RvcnkoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWhpc3RvcnkgdWktcmVhZHlcIj5cbiAgICAgIDx1bCBjbGFzc05hbWU9XCJsaXN0LWdyb3VwXCI+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9XCJsaXN0LWdyb3VwLWl0ZW0gZW1wdHktbWVzc2FnZVwiPlxuICAgICAgICAgIHt0aGlzLmdldEVtcHR5TWVzc2FnZSgpfVxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlckhpc3RvcnlQcmV2aWV3KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1oaXN0b3J5IHVpLXByZXZpZXdcIj5cbiAgICAgIDx1bCBjbGFzc05hbWU9XCJsaXN0LWdyb3VwXCI+XG4gICAgICAgIHtyYW5kb20ucmFuZ2UoMywgNSkubWFwKChpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJsaXN0LWdyb3VwLWl0ZW1cIiBrZXk9e2l9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1jaGFuZ2UtYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPEF2YXRhciBzaXplPVwiMTAwXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdXRob3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgMTAwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1jaGFuZ2VcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgICAgYXJyb3dfZm9yd2FyZFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoMzAsIDUwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1jaGFuZ2UtZGF0ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDUwLCAxMDApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT47XG4gICAgICAgIH0pfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pc0xvYWRlZCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuY2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGlzdG9yeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRW1wdHlIaXN0b3J5KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckhpc3RvcnlQcmV2aWV3KCk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVc2VyQ2FyZCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy1saXN0L3VzZXItY2FyZCcgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlclByZXZpZXcgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLXByZXZpZXcnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGJhdGNoIGZyb20gJ21pc2Fnby91dGlscy9iYXRjaCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldFBhZ2VyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnBhZ2VzID4gMSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxQYWdlciB7Li4udGhpcy5wcm9wc30gLz5cbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5jbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBcInVzZXJzLWNhcmRzLWxpc3QgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSArIFwiIHVpLXJlYWR5XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInVzZXJzLWNhcmRzLWxpc3QgdWktcmVhZHlcIjtcbiAgICB9XG4gIH1cblxuICBnZXRDb2xDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIFwiY29sLW1kLVwiICsgKDEyIC8gdGhpcy5wcm9wcy5jb2xzKTtcbiAgfVxuXG4gIGdldEJvZHkoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaXNMb2FkZWQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiBiYXRjaCh0aGlzLnByb3BzLnVzZXJzLCB0aGlzLnByb3BzLmNvbHMpLm1hcCgocm93LCByKSA9PiB7XG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiIGtleT17cn0+XG4gICAgICAgICAge3Jvdy5tYXAoKHVzZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDb2xDbGFzc05hbWUoKX0ga2V5PXt1c2VyLmlkfT5cbiAgICAgICAgICAgICAgPFVzZXJDYXJkIHVzZXI9e3VzZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93U3RhdHVzPXt0aGlzLnByb3BzLnNob3dTdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93UmFuaz17dGhpcy5wcm9wcy5zaG93UmFua30gLz5cbiAgICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9kaXY+O1xuICAgICAgfSk7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBsZXQgcm93ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucHJvcHMuY29sczsgaSArKykge1xuICAgICAgICByb3cucHVzaChpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgIHtyb3cubWFwKChpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbENsYXNzTmFtZSgpfSBrZXk9e2l9PlxuICAgICAgICAgICAgPFVzZXJQcmV2aWV3IHNob3dTdGF0dXM9e3RoaXMucHJvcHMuc2hvd1N0YXR1c30gLz5cbiAgICAgICAgICA8L2Rpdj47XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInVzZXJzLWNhcmRzLWxpc3QgdWktcmVhZHlcIj5cbiAgICAgIHt0aGlzLmdldEJvZHkoKX1cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFN0YXR1cywgeyBTdGF0dXNJY29uLCBTdGF0dXNMYWJlbCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXItc3RhdHVzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVzZXIucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiAndXNlci1jYXJkIHVzZXItY2FyZC0nICsgdGhpcy5wcm9wcy51c2VyLnJhbmsuY3NzX2NsYXNzICsgJyB1aS1yZWFkeSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAndXNlci1jYXJkIHVpLXJlYWR5JztcbiAgICB9XG4gIH1cblxuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dTdGF0dXMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnVzZXIuc3RhdHVzKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxTdGF0dXMgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzdGF0dXM9e3RoaXMucHJvcHMudXNlci5zdGF0dXN9PlxuICAgICAgICAgIDxTdGF0dXNJY29uIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3RoaXMucHJvcHMudXNlci5zdGF0dXN9IC8+XG4gICAgICAgICAgPFN0YXR1c0xhYmVsIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXt0aGlzLnByb3BzLnVzZXIuc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWxcIiAvPlxuICAgICAgICA8L1N0YXR1cz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXN0YXR1c1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlld1wiPlxuICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRSYW5rTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zaG93UmFuaykge1xuICAgICAgaWYgKHRoaXMucHJvcHMudXNlci5yYW5rLmlzX3RhYikge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIucmFuay5hYnNvbHV0ZV91cmx9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpdGVtLXRpdGxlIHJhbmstbmFtZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLnVzZXIucmFuay5uYW1lfVxuICAgICAgICA8L2E+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZSByYW5rLW5hbWVcIj5cbiAgICAgICAgICB7dGhpcy5wcm9wcy51c2VyLnJhbmsubmFtZX1cbiAgICAgICAgPC9zcGFuPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlclRpdGxlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVzZXIudGl0bGUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlXCI+e3RoaXMucHJvcHMudXNlci50aXRsZX08L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlckpvaW5lZE9uKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBsZXQgdGl0bGUgPSBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiSm9pbmVkIG9uICUoam9pbmVkX29uKXNcIiksIHtcbiAgICAgICdqb2luZWRfb24nOiB0aGlzLnByb3BzLnVzZXIuam9pbmVkX29uLmZvcm1hdCgnTEwsIExUJylcbiAgICB9LCB0cnVlKTtcblxuICAgIGxldCBhZ2UgPSBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiSm9pbmVkICUoam9pbmVkX29uKXNcIiksIHtcbiAgICAgICdqb2luZWRfb24nOiB0aGlzLnByb3BzLnVzZXIuam9pbmVkX29uLmZyb21Ob3coKVxuICAgIH0sIHRydWUpO1xuXG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItam9pbmVkLW9uXCIgdGl0bGU9e3RpdGxlfT5cbiAgICAgIHthZ2V9XG4gICAgPC9zcGFuPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtYmctaW1hZ2VcIj5cbiAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI0MDBcIiBjbGFzc05hbWU9XCJiZy1pbWFnZVwiIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtYmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItZGV0YWlsc1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5hYnNvbHV0ZV91cmx9PlxuICAgICAgICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNDAwXCIgLz5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnVzZXIudXNlcm5hbWV9XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvaDQ+XG5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInVzZXItc3Vic2NyaXB0XCI+XG4gICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAgICAgICAge3RoaXMuZ2V0UmFua05hbWUoKX1cbiAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclRpdGxlKCl9XG4gICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJKb2luZWRPbigpfVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtc3RhdHNcIj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItcG9zdHMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIucG9zdHN9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwicG9zdHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItdGhyZWFkcy1jb3VudFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci50aHJlYWRzfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcInRocmVhZHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItZm9sbG93ZXJzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57dGhpcy5wcm9wcy51c2VyLmZvbGxvd2Vyc308L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJmb2xsb3dlcnNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0ICogYXMgcmFuZG9tIGZyb20gJ21pc2Fnby91dGlscy9yYW5kb20nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dTdGF0dXMpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXN0YXR1c1wiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtaWNvbiB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdHVzLWxhYmVsIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSd1c2VyLWNhcmQgdWktcHJldmlldyc+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZy1pbWFnZVwiPlxuICAgICAgICA8QXZhdGFyIHNpemU9XCI0MDBcIiBjbGFzc05hbWU9XCJiZy1pbWFnZVwiIC8+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtYmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItZGV0YWlsc1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxBdmF0YXIgc2l6ZT1cIjQwMFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCg2MCwgMTUwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidXNlci1zdWJzY3JpcHRcIj5cblxuICAgICAgICAgICAgICB7dGhpcy5nZXRVc2VyU3RhdHVzKCl9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItam9pbmVkLW9uXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1jYXJkLXN0YXRzXCI+XG5cbiAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXBvc3RzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJwb3N0c1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci10aHJlYWRzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJ0aHJlYWRzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9XCJ1c2VyLWZvbGxvd2Vycy1jb3VudFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIj4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiZm9sbG93ZXJzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoXG4gICAgICBnZXR0ZXh0KFwiTm8gdXNlcnMgaGF2ZSBwb3N0ZWQgYW55IG5ldyBtZXNzYWdlcyBkdXJpbmcgbGFzdCAlKGRheXMpcyBkYXlzLlwiKSxcbiAgICAgIHsnZGF5cyc6IHRoaXMucHJvcHMudHJhY2tlZFBlcmlvZH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycy1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMuZ2V0RW1wdHlNZXNzYWdlKCl9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHVzLCB7IFN0YXR1c0ljb24sIFN0YXR1c0xhYmVsIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1zdGF0dXMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJhbmsuY3NzX2NsYXNzKSB7XG4gICAgICByZXR1cm4gXCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1yYW5rLVwiICsgdGhpcy5wcm9wcy5yYW5rLmNzc19jbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibGlzdC1ncm91cC1pdGVtXCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlclN0YXR1cygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy51c2VyLnN0YXR1cykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxTdGF0dXMgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzdGF0dXM9e3RoaXMucHJvcHMudXNlci5zdGF0dXN9PlxuICAgICAgICA8U3RhdHVzSWNvbiB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30gLz5cbiAgICAgICAgPFN0YXR1c0xhYmVsIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbCBoaWRkZW4teHMgaGlkZGVuLXNtXCIgLz5cbiAgICAgIDwvU3RhdHVzPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXN0YXR1c1wiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtaWNvbiB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdHVzLWxhYmVsIHVpLXByZXZpZXcgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICAgICZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRSYW5rTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5yYW5rLmlzX3RhYikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgbGV0IHJhbmtVcmwgPSBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgdGhpcy5wcm9wcy5yYW5rLnNsdWcgKyAnLyc7XG4gICAgICByZXR1cm4gPExpbmsgdG89e3JhbmtVcmx9IGNsYXNzTmFtZT1cIml0ZW0tdGl0bGUgcmFuay1uYW1lXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnJhbmsubmFtZX1cbiAgICAgIDwvTGluaz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZSByYW5rLW5hbWVcIj5cbiAgICAgICAge3RoaXMucHJvcHMucmFuay5uYW1lfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlclRpdGxlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVzZXIudGl0bGUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgICAge3RoaXMucHJvcHMudXNlci50aXRsZX1cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay11c2VyLWF2YXRhclwiPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfT5cbiAgICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gc2l6ZT1cIjUwXCIgLz5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay11c2VyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1uYW1lXCI+XG4gICAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMudXNlci51c2VybmFtZX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5nZXRVc2VyU3RhdHVzKCl9XG4gICAgICAgIHt0aGlzLmdldFJhbmtOYW1lKCl9XG4gICAgICAgIHt0aGlzLmdldFVzZXJUaXRsZSgpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3NpdGlvblwiPlxuICAgICAgICA8c3Ryb25nPiN7dGhpcy5wcm9wcy5jb3VudGVyfTwvc3Ryb25nPlxuICAgICAgICA8c21hbGw+e2dldHRleHQoXCJSYW5rXCIpfTwvc21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc3RzLWNvdW50ZWRcIj5cbiAgICAgICAgPHN0cm9uZz57dGhpcy5wcm9wcy51c2VyLm1ldGEuc2NvcmV9PC9zdHJvbmc+XG4gICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlJhbmtlZCBwb3N0c1wiKX08L3NtYWxsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3N0cy10b3RhbFwiPlxuICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIucG9zdHN9PC9zdHJvbmc+XG4gICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlRvdGFsIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2xpPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgKiBhcyByYW5kb20gZnJvbSAnbWlzYWdvL3V0aWxzL3JhbmRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYWN0aXZlLXBvc3RlcnMtbGlzdFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZCB1aS1wcmV2aWV3LXBhcmFncmFwaFwiPlxuICAgICAgICAgIHtyYW5kb20ucmFuZ2UoMywgNCkubWFwKChpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPHNwYW4ga2V5PXtpfSBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDUwLCAxMjApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgIH0pfVxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycyB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgICAgIHtyYW5kb20ucmFuZ2UoNSwgMTApLm1hcCgoaSwgY291bnRlcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gPGxpIGtleT17aX0gY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXItYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPEF2YXRhciBzaXplPVwiNTBcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA4MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtaWNvbiB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdHVzLWxhYmVsIHVpLXByZXZpZXcgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJyYW5rLW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidXNlci10aXRsZSBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoMzAsIDUwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3NpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogXCIzMHB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlJhbmtcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3N0cy1jb3VudGVkXCI+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiBcIjMwcHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiUmFua2VkIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstcG9zdHMtdG90YWxcIj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IFwiMzBweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJUb3RhbCBwb3N0c1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2xpPjtcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExpc3RJdGVtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL2xpc3QtaXRlbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldExlYWRNZXNzYWdlKCkge1xuICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiJShwb3N0ZXJzKXMgbW9zdCBhY3RpdmUgcG9zdGVyIGZyb20gbGFzdCAlKGRheXMpcyBkYXlzLlwiLFxuICAgICAgICBcIiUocG9zdGVycylzIG1vc3QgYWN0aXZlIHBvc3RlcnMgZnJvbSBsYXN0ICUoZGF5cylzIGRheXMuXCIsXG4gICAgICAgIHRoaXMucHJvcHMuY291bnQpO1xuXG4gICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgIHBvc3RlcnM6IHRoaXMucHJvcHMuY291bnQsXG4gICAgICBkYXlzOiB0aGlzLnByb3BzLnRyYWNrZWRQZXJpb2RcbiAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYWN0aXZlLXBvc3RlcnMtbGlzdFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLmdldExlYWRNZXNzYWdlKCl9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFjdGl2ZS1wb3N0ZXJzIHVpLXJlYWR5XCI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnVzZXJzLm1hcCgodXNlciwgaSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gPExpc3RJdGVtIHVzZXI9e3VzZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuaz17dXNlci5yYW5rfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXI9e2kgKyAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17dXNlci5pZH0gLz47XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMaXN0RW1wdHkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1lbXB0eSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpc3RMb2FkaW5nIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL2xpc3QtbG9hZGluZyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXMoJ1VTRVJTJykpIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhQcmVsb2FkZWREYXRhKG1pc2Fnby5wb3AoJ1VTRVJTJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gIH1cblxuICBpbml0V2l0aFByZWxvYWRlZERhdGEoZGF0YSkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcblxuICAgICAgdHJhY2tlZFBlcmlvZDogZGF0YS50cmFja2VkX3BlcmlvZCxcbiAgICAgIGNvdW50OiBkYXRhLmNvdW50XG4gICAgfTtcblxuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0UG9sbGluZygpIHtcbiAgICBwb2xscy5zdGFydCh7XG4gICAgICBwb2xsOiAnYWN0aXZlLXBvc3RlcnMnLFxuICAgICAgdXJsOiBtaXNhZ28uZ2V0KCdVU0VSU19BUEknKSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbGlzdDogJ2FjdGl2ZSdcbiAgICAgIH0sXG4gICAgICBmcmVxdWVuY3k6IDkwICogMTAwMCxcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdXBkYXRlID0gKGRhdGEpID0+IHtcbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YS5yZXN1bHRzKSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuXG4gICAgICB0cmFja2VkUGVyaW9kOiBkYXRhLnRyYWNrZWRfcGVyaW9kLFxuICAgICAgY291bnQ6IGRhdGEuY291bnRcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IHRoaXMucHJvcHMucm91dGUuZXh0cmEubmFtZSxcbiAgICAgIHBhcmVudDogZ2V0dGV4dChcIlVzZXJzXCIpXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBwb2xscy5zdG9wKCdhY3RpdmUtcG9zdGVycycpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5jb3VudCA+IDApIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPExpc3QgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgICAgICB0cmFja2VkUGVyaW9kPXt0aGlzLnN0YXRlLnRyYWNrZWRQZXJpb2R9XG4gICAgICAgICAgICAgICAgICAgICBjb3VudD17dGhpcy5zdGF0ZS5jb3VudH0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8TGlzdEVtcHR5IHRyYWNrZWRQZXJpb2Q9e3RoaXMuc3RhdGUudHJhY2tlZFBlcmlvZH0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TGlzdExvYWRpbmcgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbGknOyAvL2pzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvL2pzaGludCBpZ25vcmU6bGluZVxuXG4vLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG5sZXQgbGlzdFVybCA9IGZ1bmN0aW9uKGJhc2VVcmwsIGxpc3QpIHtcbiAgbGV0IHVybCA9IGJhc2VVcmw7XG4gIGlmIChsaXN0LmNvbXBvbmVudCA9PT0gJ3JhbmsnKSB7XG4gICAgdXJsICs9IGxpc3Quc2x1ZztcbiAgfSBlbHNlIHtcbiAgICB1cmwgKz0gbGlzdC5jb21wb25lbnQ7XG4gIH1cbiAgcmV0dXJuIHVybCArICcvJztcbn07XG5cbmxldCBuYXZMaW5rcyA9IGZ1bmN0aW9uKGJhc2VVcmwsIGxpc3RzLCBoaWRlTmF2KSB7XG4gICAgcmV0dXJuIGxpc3RzLm1hcChmdW5jdGlvbihsaXN0KSB7XG4gICAgICBsZXQgdXJsID0gbGlzdFVybChiYXNlVXJsLCBsaXN0KTtcbiAgICAgIHJldHVybiA8TGkgcGF0aD17dXJsfVxuICAgICAgICAgICAgICAgICBrZXk9e3VybH0+XG4gICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e2hpZGVOYXZ9PlxuICAgICAgICAgIHtsaXN0Lm5hbWV9XG4gICAgICAgIDwvTGluaz5cbiAgICAgIDwvTGk+O1xuICB9KTtcbn07XG4vLyBqc2hpbnQgaWdub3JlOmVuZFxuXG5leHBvcnQgY2xhc3MgVGFic05hdiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJuYXYgbmF2LXBpbGxzXCI+XG4gICAgICB7bmF2TGlua3ModGhpcy5wcm9wcy5iYXNlVXJsLCB0aGlzLnByb3BzLmxpc3RzKX1cbiAgICA8L3VsPjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0TmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAge25hdkxpbmtzKHRoaXMucHJvcHMuYmFzZVVybCwgdGhpcy5wcm9wcy5saXN0cywgdGhpcy5wcm9wcy5oaWRlTmF2KX1cbiAgICA8L3VsPjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVc2Vyc0xpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC9yb290JyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPFVzZXJzTGlzdCBpc0xvYWRlZD17ZmFsc2V9IGNvbHM9ezN9IHNob3dTdGF0dXM9e3RydWV9IC8+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFnZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvcmFuay9wYWdlcicgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcnNMaXN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzLWxpc3Qvcm9vdCcgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0UGFnZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGFnZXMgPiAxKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPFBhZ2VyIHsuLi50aGlzLnByb3BzfSAvPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdj5cbiAgICAgIDxVc2Vyc0xpc3QgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgIHNob3dTdGF0dXM9e3RydWV9XG4gICAgICAgICAgICAgICAgIGNvbHM9ezN9XG4gICAgICAgICAgICAgICAgIGlzTG9hZGVkPXt0cnVlfSAvPlxuXG4gICAgICB7dGhpcy5nZXRQYWdlcigpfVxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCByZXNldFNjcm9sbCBmcm9tICdtaXNhZ28vdXRpbHMvcmVzZXQtc2Nyb2xsJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0UHJldmlvdXNQYWdlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByZXZpb3VzIHx8IHRoaXMucHJvcHMuZmlyc3QpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIGxldCB1cmwgPSB0aGlzLnByb3BzLmJhc2VVcmw7XG4gICAgICBpZiAodGhpcy5wcm9wcy5wcmV2aW91cykge1xuICAgICAgICB1cmwgKz0gdGhpcy5wcm9wcy5wcmV2aW91cyArICcvJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJwcmV2aW91c1wiPlxuICAgICAgICA8TGluayB0bz17dXJsfSBvbkNsaWNrPXtyZXNldFNjcm9sbH0+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgYXJyb3dfYmFja1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9MaW5rPlxuICAgICAgPC9saT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXROZXh0UGFnZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5uZXh0KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBsZXQgdXJsID0gdGhpcy5wcm9wcy5iYXNlVXJsICsgdGhpcy5wcm9wcy5uZXh0ICsgJy8nO1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJuZXh0XCI+XG4gICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e3Jlc2V0U2Nyb2xsfT5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBhcnJvd19mb3J3YXJkXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L0xpbms+XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFByb2dlc3NCYXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwicGFnZXItcHJvZ3Jlc3MtYmFyXCI+XG4gICAgICB7dGhpcy5wcm9wcy5wYWdlX3JhbmdlLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICBsZXQgY2xhc3NOYW1lID0gcGFnZSA9PT0gdGhpcy5wcm9wcy5wYWdlID8gJ2FjdGl2ZScgOiBudWxsO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5wcm9wcy5iYXNlVXJsO1xuXG4gICAgICAgIGlmIChwYWdlID4gMSkge1xuICAgICAgICAgIHVybCArPSBwYWdlICsgJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxsaSBrZXk9e3BhZ2V9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgICAgICA8TGluayB0bz17dXJsfSBvbkNsaWNrPXtyZXNldFNjcm9sbH0+XG4gICAgICAgICAgICB7cGFnZX1cbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgIDwvbGk+O1xuICAgICAgfSl9XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZXItdW5kZXJjb250ZW50XCI+XG4gICAgICA8bmF2PlxuICAgICAgICA8dWwgY2xhc3NOYW1lPVwicGFnZXJcIj5cbiAgICAgICAgICB7dGhpcy5nZXRQcmV2aW91c1BhZ2UoKX1cbiAgICAgICAgICB7dGhpcy5nZXROZXh0UGFnZSgpfVxuICAgICAgICA8L3VsPlxuICAgICAgICB7dGhpcy5nZXRQcm9nZXNzQmFyKCl9XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTGlzdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9yYW5rL2xpc3QnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpc3RMb2FkaW5nIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC1sb2FkaW5nJyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuaW1wb3J0IHRpdGxlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wYWdlLXRpdGxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGlmIChtaXNhZ28uaGFzKCdVU0VSUycpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKCdVU0VSUycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0V2l0aG91dFByZWxvYWRlZERhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhwcm9wcy5wYXJhbXMucGFnZSB8fCAxKTtcbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShkYXRhKSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgICAgaXNMb2FkZWQ6IHRydWVcbiAgICB9KTtcbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YS5yZXN1bHRzKSk7XG4gIH1cblxuICBpbml0V2l0aG91dFByZWxvYWRlZERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBzdGFydFBvbGxpbmcocGFnZSkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICdyYW5rLXVzZXJzJyxcbiAgICAgIHVybDogbWlzYWdvLmdldCgnVVNFUlNfQVBJJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJhbms6IHRoaXMucHJvcHMucm91dGUucmFuay5pZCxcbiAgICAgICAgcGFnZTogcGFnZVxuICAgICAgfSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcblxuICAgIGRhdGEuaXNMb2FkZWQgPSB0cnVlO1xuICAgIHRoaXMuc2V0U3RhdGUoZGF0YSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiB0aGlzLnByb3BzLnJvdXRlLnJhbmsubmFtZSxcbiAgICAgIHBhZ2U6IHRoaXMucHJvcHMucGFyYW1zLnBhZ2UgfHwgbnVsbCxcbiAgICAgIHBhcmVudDogZ2V0dGV4dChcIlVzZXJzXCIpXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBwb2xscy5zdG9wKCdyYW5rLXVzZXJzJyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGlmICh0aGlzLnByb3BzLnBhcmFtcy5wYWdlICE9PSBuZXh0UHJvcHMucGFyYW1zLnBhZ2UpIHtcbiAgICAgIHRpdGxlLnNldCh7XG4gICAgICAgIHRpdGxlOiB0aGlzLnByb3BzLnJvdXRlLnJhbmsubmFtZSxcbiAgICAgICAgcGFnZTogbmV4dFByb3BzLnBhcmFtcy5wYWdlIHx8IG51bGwsXG4gICAgICAgIHBhcmVudDogZ2V0dGV4dChcIlVzZXJzXCIpXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHBvbGxzLnN0b3AoJ3JhbmstdXNlcnMnKTtcbiAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKG5leHRQcm9wcy5wYXJhbXMucGFnZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJvdXRlLnJhbmsuY3NzX2NsYXNzKSB7XG4gICAgICByZXR1cm4gJ3JhbmstdXNlcnMtbGlzdCByYW5rLXVzZXJzLScgKyB0aGlzLnByb3BzLnJvdXRlLnJhbmsuY3NzX2NsYXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3JhbmstdXNlcnMtbGlzdCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmFua0Rlc2NyaXB0aW9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJvdXRlLnJhbmsuZGVzY3JpcHRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInJhbmstZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICBfX2h0bWw6IHRoaXMucHJvcHMucm91dGUucmFuay5kZXNjcmlwdGlvbi5odG1sXG4gICAgICAgIH19IC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRDb21wb25lbnQoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmNvdW50ID4gMCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIGxldCBiYXNlVXJsID0gbWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKSArIHRoaXMucHJvcHMucm91dGUucmFuay5zbHVnICsgJy8nO1xuICAgICAgICByZXR1cm4gPExpc3QgYmFzZVVybD17YmFzZVVybH1cbiAgICAgICAgICAgICAgICAgICAgIHVzZXJzPXt0aGlzLnByb3BzLnVzZXJzfVxuICAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMuc3RhdGV9IC8+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiVGhlcmUgYXJlIG5vIHVzZXJzIHdpdGggdGhpcyByYW5rIGF0IHRoZSBtb21lbnQuXCIpfVxuICAgICAgICA8L3A+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExpc3RMb2FkaW5nIC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICB7dGhpcy5nZXRSYW5rRGVzY3JpcHRpb24oKX1cbiAgICAgICAge3RoaXMuZ2V0Q29tcG9uZW50KCl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgVGFic05hdiwgQ29tcGFjdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL25hdnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBBY3RpdmVQb3N0ZXJzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL3Jvb3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSYW5rIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3Jhbmsvcm9vdCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdG9nZ2xlTmF2ID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyb3Bkb3duOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgaGlkZU5hdiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyb3Bkb3duOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldFRvZ2dsZU5hdkNsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcm9wZG93bikge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24gb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1pY29uJztcbiAgICB9XG4gIH1cblxuICBnZXRDb21wYWN0TmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2NvbXBhY3QtbmF2IG9wZW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NvbXBhY3QtbmF2JztcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS11c2Vycy1saXN0c1wiPlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UtaGVhZGVyIHRhYmJlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInB1bGwtbGVmdFwiPntnZXR0ZXh0KFwiVXNlcnNcIil9PC9oMT5cblxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1hbGlnbmVkIGJ0bi1pY29uIGJ0bi1kcm9wZG93bi10b2dnbGUgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17dGhpcy5zdGF0ZS5kcm9wZG93biA/ICd0cnVlJyA6ICdmYWxzZSd9PlxuICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBtZW51XG4gICAgICAgICAgICA8L2k+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFnZS10YWJzIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgICAgICA8VGFic05hdiBsaXN0cz17bWlzYWdvLmdldCgnVVNFUlNfTElTVFMnKX1cbiAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJyl9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbXBhY3ROYXZDbGFzc05hbWUoKX0+XG5cbiAgICAgICAgPENvbXBhY3ROYXYgbGlzdHM9e21pc2Fnby5nZXQoJ1VTRVJTX0xJU1RTJyl9XG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJyl9XG4gICAgICAgICAgICAgICAgICAgIGhpZGVOYXY9e3RoaXMuaGlkZU5hdn0gLz5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdG9yZSkge1xuICByZXR1cm4ge1xuICAgICd0aWNrJzogc3RvcmUudGljay50aWNrLFxuICAgICd1c2VyJzogc3RvcmUuYXV0aC51c2VyLFxuICAgICd1c2Vycyc6IHN0b3JlLnVzZXJzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocygpIHtcbiAgbGV0IHBhdGhzID0gW107XG5cbiAgbWlzYWdvLmdldCgnVVNFUlNfTElTVFMnKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICBpZiAoaXRlbS5jb21wb25lbnQgPT09ICdyYW5rJykge1xuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG1pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJykgKyBpdGVtLnNsdWcgKyAnLzpwYWdlLycsXG4gICAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKFJhbmspLFxuICAgICAgICByYW5rOiBpdGVtXG4gICAgICB9KTtcbiAgICAgIHBhdGhzLnB1c2goe1xuICAgICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgaXRlbS5zbHVnICsgJy8nLFxuICAgICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShSYW5rKSxcbiAgICAgICAgcmFuazogaXRlbVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmNvbXBvbmVudCA9PT0gJ2FjdGl2ZS1wb3N0ZXJzJyl7XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKSArIGl0ZW0uY29tcG9uZW50ICsgJy8nLFxuICAgICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShBY3RpdmVQb3N0ZXJzKSxcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICBuYW1lOiBpdGVtLm5hbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGF0aHM7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiYnRuIGJ0bi15ZXMtbm8gYnRuLXllcy1uby1vblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJidG4gYnRuLXllcy1ubyBidG4teWVzLW5vLW9mZlwiO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmljb25PbiB8fCAnY2hlY2tfYm94JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaWNvbk9mZiB8fCAnY2hlY2tfYm94X291dGxpbmVfYmxhbmsnO1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5sYWJlbE9uIHx8IGdldHRleHQoXCJ5ZXNcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmxhYmVsT2ZmIHx8IGdldHRleHQoXCJub1wiKTtcbiAgICB9XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHRvZ2dsZSA9ICgpID0+IHtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHtcbiAgICAgIHRhcmdldDoge1xuICAgICAgICB2YWx1ZTogIXRoaXMucHJvcHMudmFsdWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlfVxuICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICAgICBpZD17dGhpcy5wcm9wcy5pZCB8fCBudWxsfVxuICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RoaXMucHJvcHNbJ2FyaWEtZGVzY3JpYmVkYnknXSB8fCBudWxsfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnByb3BzLmRpc2FibGVkIHx8IGZhbHNlfT5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgICAgPC9zcGFuPlxuICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBPcmRlcmVkTGlzdCBmcm9tICdtaXNhZ28vdXRpbHMvb3JkZXJlZC1saXN0JztcblxuZXhwb3J0IGNsYXNzIE1pc2FnbyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVycyA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSB7fTtcbiAgfVxuXG4gIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZXJzLnB1c2goe1xuICAgICAga2V5OiBpbml0aWFsaXplci5uYW1lLFxuXG4gICAgICBpdGVtOiBpbml0aWFsaXplci5pbml0aWFsaXplcixcblxuICAgICAgYWZ0ZXI6IGluaXRpYWxpemVyLmFmdGVyLFxuICAgICAgYmVmb3JlOiBpbml0aWFsaXplci5iZWZvcmVcbiAgICB9KTtcbiAgfVxuXG4gIGluaXQoY29udGV4dCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdmFyIGluaXRPcmRlciA9IG5ldyBPcmRlcmVkTGlzdCh0aGlzLl9pbml0aWFsaXplcnMpLm9yZGVyZWRWYWx1ZXMoKTtcbiAgICBpbml0T3JkZXIuZm9yRWFjaChpbml0aWFsaXplciA9PiB7XG4gICAgICBpbml0aWFsaXplcih0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbnRleHQgYWNjZXNzb3JzXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gISF0aGlzLl9jb250ZXh0W2tleV07XG4gIH1cblxuICBnZXQoa2V5LCBmYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udGV4dFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2sgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHBvcChrZXkpIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5fY29udGV4dFtrZXldO1xuICAgICAgdGhpcy5fY29udGV4dFtrZXldID0gbnVsbDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gY3JlYXRlICBzaW5nbGV0b25cbnZhciBtaXNhZ28gPSBuZXcgTWlzYWdvKCk7XG5cbi8vIGV4cG9zZSBpdCBnbG9iYWxseVxuZ2xvYmFsLm1pc2FnbyA9IG1pc2FnbztcblxuLy8gYW5kIGV4cG9ydCBpdCBmb3IgdGVzdHMgYW5kIHN0dWZmXG5leHBvcnQgZGVmYXVsdCBtaXNhZ287XG4iLCJpbXBvcnQgeyBVUERBVEVfQVZBVEFSLCBVUERBVEVfVVNFUk5BTUUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnO1xuXG5leHBvcnQgdmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgc2lnbmVkSW46IGZhbHNlLFxuICBzaWduZWRPdXQ6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgUEFUQ0hfVVNFUiA9ICdQQVRDSF9VU0VSJztcbmV4cG9ydCBjb25zdCBTSUdOX0lOID0gJ1NJR05fSU4nO1xuZXhwb3J0IGNvbnN0IFNJR05fT1VUID0gJ1NJR05fT1VUJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoVXNlcihwYXRjaCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFBBVENIX1VTRVIsXG4gICAgcGF0Y2hcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25Jbih1c2VyKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogU0lHTl9JTixcbiAgICB1c2VyXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduT3V0KHNvZnQ9ZmFsc2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBTSUdOX09VVCxcbiAgICBzb2Z0XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1dGgoc3RhdGU9aW5pdGlhbFN0YXRlLCBhY3Rpb249bnVsbCkge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBQQVRDSF9VU0VSOlxuICAgICAgICBsZXQgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSk7XG4gICAgICAgIG5ld1N0YXRlLnVzZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS51c2VyLCBhY3Rpb24ucGF0Y2gpO1xuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG5cbiAgICBjYXNlIFNJR05fSU46XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc2lnbmVkSW46IGFjdGlvbi51c2VyXG4gICAgICB9KTtcblxuICAgIGNhc2UgU0lHTl9PVVQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaXNBbm9ueW1vdXM6IHRydWUsXG4gICAgICAgIHNpZ25lZE91dDogIWFjdGlvbi5zb2Z0XG4gICAgICB9KTtcblxuICAgIGNhc2UgVVBEQVRFX0FWQVRBUjpcbiAgICAgIGlmIChzdGF0ZS5pc0F1dGhlbnRpY2F0ZWQgJiYgc3RhdGUudXNlci5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICBsZXQgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSk7XG4gICAgICAgIG5ld1N0YXRlLnVzZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS51c2VyLCB7XG4gICAgICAgICAgJ2F2YXRhcl9oYXNoJzogYWN0aW9uLmF2YXRhckhhc2hcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGNhc2UgVVBEQVRFX1VTRVJOQU1FOlxuICAgICAgaWYgKHN0YXRlLmlzQXV0aGVudGljYXRlZCAmJiBzdGF0ZS51c2VyLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKTtcbiAgICAgICAgbmV3U3RhdGUudXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnVzZXIsIHtcbiAgICAgICAgICB1c2VybmFtZTogYWN0aW9uLnVzZXJuYW1lLFxuICAgICAgICAgIHNsdWc6IGFjdGlvbi5zbHVnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBVUERBVEVfQVZBVEFSLCBVUERBVEVfVVNFUk5BTUUsIGRlaHlkcmF0ZVN0YXR1cyB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7XG5cbmV4cG9ydCBjb25zdCBERUhZRFJBVEVfUFJPRklMRSA9ICdERUhZRFJBVEVfUFJPRklMRSc7XG5leHBvcnQgY29uc3QgUEFUQ0hfUFJPRklMRSA9ICdQQVRDSF9QUk9GSUxFJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlaHlkcmF0ZShwcm9maWxlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogREVIWURSQVRFX1BST0ZJTEUsXG4gICAgcHJvZmlsZVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hQcm9maWxlKHBhdGNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogUEFUQ0hfUFJPRklMRSxcbiAgICBwYXRjaFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRoKHN0YXRlPXt9LCBhY3Rpb249bnVsbCkge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBERUhZRFJBVEVfUFJPRklMRTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBhY3Rpb24ucHJvZmlsZSwge1xuICAgICAgICBqb2luZWRfb246IG1vbWVudChhY3Rpb24ucHJvZmlsZS5qb2luZWRfb24pLFxuICAgICAgICBzdGF0dXM6IGRlaHlkcmF0ZVN0YXR1cyhhY3Rpb24ucHJvZmlsZS5zdGF0dXMpXG4gICAgICB9KTtcblxuICAgIGNhc2UgUEFUQ0hfUFJPRklMRTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgYWN0aW9uLnBhdGNoKTtcblxuICAgIGNhc2UgVVBEQVRFX0FWQVRBUjpcbiAgICAgIGlmIChzdGF0ZS5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICBhdmF0YXJfaGFzaDogYWN0aW9uLmF2YXRhckhhc2hcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgICBjYXNlIFVQREFURV9VU0VSTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICB1c2VybmFtZTogYWN0aW9uLnVzZXJuYW1lLFxuICAgICAgICAgIHNsdWc6IGFjdGlvbi5zbHVnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBpbml0aWFsU3RhdGUgPSB7XG4gIHR5cGU6ICdpbmZvJyxcbiAgbWVzc2FnZTogJycsXG4gIGlzVmlzaWJsZTogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBTSE9XX1NOQUNLQkFSID0gJ1NIT1dfU05BQ0tCQVInO1xuZXhwb3J0IGNvbnN0IEhJREVfU05BQ0tCQVIgPSAnSElERV9TTkFDS0JBUic7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93U25hY2tiYXIobWVzc2FnZSwgdHlwZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNIT1dfU05BQ0tCQVIsXG4gICAgbWVzc2FnZSxcbiAgICBtZXNzYWdlVHlwZTogdHlwZVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZVNuYWNrYmFyKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEhJREVfU05BQ0tCQVJcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc25hY2tiYXIoc3RhdGU9aW5pdGlhbFN0YXRlLCBhY3Rpb249bnVsbCkge1xuICBpZiAoYWN0aW9uLnR5cGUgPT09IFNIT1dfU05BQ0tCQVIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogYWN0aW9uLm1lc3NhZ2VUeXBlLFxuICAgICAgbWVzc2FnZTogYWN0aW9uLm1lc3NhZ2UsXG4gICAgICBpc1Zpc2libGU6IHRydWVcbiAgICB9O1xuICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBISURFX1NOQUNLQkFSKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsImV4cG9ydCB2YXIgaW5pdGlhbFN0YXRlID0ge1xuICB0aWNrOiAwXG59O1xuXG5leHBvcnQgY29uc3QgVElDSyA9ICdUSUNLJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvVGljaygpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBUSUNLXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpY2soc3RhdGU9aW5pdGlhbFN0YXRlLCBhY3Rpb249bnVsbCkge1xuICBpZiAoYWN0aW9uLnR5cGUgPT09IFRJQ0spIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgdGljazogc3RhdGUudGljayArIDFcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVQREFURV9BVkFUQVIsIFVQREFURV9VU0VSTkFNRSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7XG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNvbnN0IEFERF9OQU1FX0NIQU5HRSA9ICdBRERfTkFNRV9DSEFOR0UnO1xuZXhwb3J0IGNvbnN0IEFQUEVORF9ISVNUT1JZID0gJ0FQUEVORF9ISVNUT1JZJztcbmV4cG9ydCBjb25zdCBERUhZRFJBVEVfSElTVE9SWSA9ICdERUhZRFJBVEVfSElTVE9SWSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROYW1lQ2hhbmdlKGNoYW5nZSwgdXNlciwgY2hhbmdlZEJ5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQUREX05BTUVfQ0hBTkdFLFxuICAgIGNoYW5nZSxcbiAgICB1c2VyLFxuICAgIGNoYW5nZWRCeVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kKGl0ZW1zKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQVBQRU5EX0hJU1RPUlksXG4gICAgaXRlbXM6IGl0ZW1zXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWh5ZHJhdGUoaXRlbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBERUhZRFJBVEVfSElTVE9SWSxcbiAgICBpdGVtczogaXRlbXNcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlcm5hbWUoc3RhdGU9W10sIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEFERF9OQU1FX0NIQU5HRTpcbiAgICAgIGxldCBuZXdTdGF0ZSA9IHN0YXRlLnNsaWNlKCk7XG4gICAgICBuZXdTdGF0ZS51bnNoaWZ0KHtcbiAgICAgICAgaWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLCAvLyBqdXN0IHNtYWxsIGhheCBmb3IgZ2V0dGluZyBpZFxuICAgICAgICBjaGFuZ2VkX2J5OiBhY3Rpb24uY2hhbmdlZEJ5LFxuICAgICAgICBjaGFuZ2VkX2J5X3VzZXJuYW1lOiBhY3Rpb24uY2hhbmdlZEJ5LnVzZXJuYW1lLFxuICAgICAgICBjaGFuZ2VkX29uOiBtb21lbnQoKSxcbiAgICAgICAgbmV3X3VzZXJuYW1lOiBhY3Rpb24uY2hhbmdlLnVzZXJuYW1lLFxuICAgICAgICBvbGRfdXNlcm5hbWU6IGFjdGlvbi51c2VyLnVzZXJuYW1lXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcblxuICAgIGNhc2UgQVBQRU5EX0hJU1RPUlk6XG4gICAgICByZXR1cm4gc3RhdGUuY29uY2F0KGFjdGlvbi5pdGVtcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgICAgIGNoYW5nZWRfb246IG1vbWVudChpdGVtLmNoYW5nZWRfb24pXG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuXG4gICAgY2FzZSBERUhZRFJBVEVfSElTVE9SWTpcbiAgICAgIHJldHVybiBhY3Rpb24uaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHtcbiAgICAgICAgICBjaGFuZ2VkX29uOiBtb21lbnQoaXRlbS5jaGFuZ2VkX29uKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgcmV0dXJuIHN0YXRlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcbiAgICAgICAgaWYgKGl0ZW0uY2hhbmdlZF9ieSAmJiBpdGVtLmNoYW5nZWRfYnkuaWQgPT09IGFjdGlvbi51c2VySWQpIHtcbiAgICAgICAgICBpdGVtLmNoYW5nZWRfYnkgPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtLmNoYW5nZWRfYnksIHtcbiAgICAgICAgICAgICdhdmF0YXJfaGFzaCc6IGFjdGlvbi5hdmF0YXJIYXNoXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfVVNFUk5BTUU6XG4gICAgICByZXR1cm4gc3RhdGUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgICAgICBpZiAoaXRlbS5jaGFuZ2VkX2J5ICYmIGl0ZW0uY2hhbmdlZF9ieS5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICAgIGl0ZW0uY2hhbmdlZF9ieSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uY2hhbmdlZF9ieSwge1xuICAgICAgICAgICAgJ3VzZXJuYW1lJzogYWN0aW9uLnVzZXJuYW1lLFxuICAgICAgICAgICAgJ3NsdWcnOiBhY3Rpb24uc2x1Z1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59IiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY29uc3QgQVBQRU5EX1VTRVJTID0gJ0FQUEVORF9VU0VSUyc7XG5leHBvcnQgY29uc3QgREVIWURSQVRFX1VTRVJTID0gJ0RFSFlEUkFURV9VU0VSUyc7XG5leHBvcnQgY29uc3QgVVBEQVRFX0FWQVRBUiA9ICdVUERBVEVfQVZBVEFSJztcbmV4cG9ydCBjb25zdCBVUERBVEVfVVNFUk5BTUUgPSAnVVBEQVRFX1VTRVJOQU1FJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZChpdGVtcykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFQUEVORF9VU0VSUyxcbiAgICBpdGVtc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVoeWRyYXRlKGl0ZW1zKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogREVIWURSQVRFX1VTRVJTLFxuICAgIGl0ZW1zXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWh5ZHJhdGVTdGF0dXMoc3RhdHVzKSB7XG4gIGlmIChzdGF0dXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdHVzLCB7XG4gICAgICBsYXN0X2NsaWNrOiBzdGF0dXMubGFzdF9jbGljayA/IG1vbWVudChzdGF0dXMubGFzdF9jbGljaykgOiBudWxsLFxuICAgICAgYmFubmVkX3VudGlsOiBzdGF0dXMuYmFubmVkX3VudGlsID8gbW9tZW50KHN0YXR1cy5iYW5uZWRfdW50aWwpIDogbnVsbFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdmF0YXIodXNlciwgYXZhdGFySGFzaCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFVQREFURV9BVkFUQVIsXG4gICAgdXNlcklkOiB1c2VyLmlkLFxuICAgIGF2YXRhckhhc2hcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJuYW1lKHVzZXIsIHVzZXJuYW1lLCBzbHVnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX1VTRVJOQU1FLFxuICAgIHVzZXJJZDogdXNlci5pZCxcbiAgICB1c2VybmFtZSxcbiAgICBzbHVnXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZXIoc3RhdGU9W10sIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEFQUEVORF9VU0VSUzpcbiAgICAgIHJldHVybiBzdGF0ZS5jb25jYXQoYWN0aW9uLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICAgICAgam9pbmVkX29uOiBtb21lbnQoaXRlbS5qb2luZWRfb24pLFxuICAgICAgICAgIHN0YXR1czogZGVoeWRyYXRlU3RhdHVzKGl0ZW0uc3RhdHVzKVxuICAgICAgICB9KTtcbiAgICAgIH0pKTtcblxuICAgIGNhc2UgREVIWURSQVRFX1VTRVJTOlxuICAgICAgcmV0dXJuIGFjdGlvbi5pdGVtcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgICAgIGpvaW5lZF9vbjogbW9tZW50KGl0ZW0uam9pbmVkX29uKSxcbiAgICAgICAgICBzdGF0dXM6IGRlaHlkcmF0ZVN0YXR1cyhpdGVtLnN0YXR1cylcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNhc2UgVVBEQVRFX0FWQVRBUjpcbiAgICAgIHJldHVybiBzdGF0ZS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICAgIGlmIChpdGVtLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgICAgaXRlbS5hdmF0YXJfaGFzaCA9IGFjdGlvbi5hdmF0YXJIYXNoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn0iLCJleHBvcnQgY2xhc3MgQWpheCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2Nvb2tpZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuX2NzcmZUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5fbG9ja3MgPSB7fTtcbiAgfVxuXG4gIGluaXQoY29va2llTmFtZSkge1xuICAgIHRoaXMuX2Nvb2tpZU5hbWUgPSBjb29raWVOYW1lO1xuICAgIHRoaXMuX2NzcmZUb2tlbiA9IHRoaXMuZ2V0Q3NyZlRva2VuKCk7XG4gIH1cblxuICBnZXRDc3JmVG9rZW4oKSB7XG4gICAgaWYgKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKHRoaXMuX2Nvb2tpZU5hbWUpICE9PSAtMSkge1xuICAgICAgbGV0IGNvb2tpZVJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLl9jb29raWVOYW1lICsgJ1xcPShbXjtdKiknKTtcbiAgICAgIGxldCBjb29raWUgPSBkb2N1bWVudC5jb29raWUubWF0Y2goY29va2llUmVnZXgpWzBdO1xuICAgICAgcmV0dXJuIGNvb2tpZSA/IGNvb2tpZS5zcGxpdCgnPScpWzFdIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdChtZXRob2QsIHVybCwgZGF0YSkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQgeGhyID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnWC1DU1JGVG9rZW4nOiBzZWxmLl9jc3JmVG9rZW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiAoZGF0YSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogbnVsbCksXG4gICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcblxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIpIHtcbiAgICAgICAgICBsZXQgcmVqZWN0aW9uID0ganFYSFIucmVzcG9uc2VKU09OIHx8IHt9O1xuXG4gICAgICAgICAgcmVqZWN0aW9uLnN0YXR1cyA9IGpxWEhSLnN0YXR1cztcblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIkxvc3QgY29ubmVjdGlvbiB3aXRoIGFwcGxpY2F0aW9uLlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBpZiAoIXJlamVjdGlvbi5kZXRhaWwgfHwgcmVqZWN0aW9uLmRldGFpbCA9PT0gJ05PVCBGT1VORCcpIHtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uLmRldGFpbCA9IGdldHRleHQoXCJBY3Rpb24gbGluayBpcyBpbnZhbGlkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNTAwICYmICFyZWplY3Rpb24uZGV0YWlsKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlamVjdGlvbi5zdGF0dXNUZXh0ID0ganFYSFIuc3RhdHVzVGV4dDtcblxuICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkLmFqYXgoeGhyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCh1cmwsIHBhcmFtcywgbG9jaykge1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIHVybCArPSAnPycgKyAkLnBhcmFtKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKGxvY2spIHtcbiAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgLy8gdXBkYXRlIHVybCBpbiBleGlzdGluZyBsb2NrP1xuICAgICAgaWYgKHRoaXMuX2xvY2tzW2xvY2tdKSB7XG4gICAgICAgIHRoaXMuX2xvY2tzW2xvY2tdLnVybCA9IHVybDtcbiAgICAgIH1cblxuICAgICAgLy8gaW1tZWRpYXRlbHkgZGVyZWZlcmVuY2UgcHJvbWlzZSBoYW5kbGVycyB3aXRob3V0IGRvaW5nIGFueXRoaW5nXG4gICAgICAvLyB3ZSBhcmUgYWxyZWFkeSB3YWl0aW5nIGZvciBleGlzdGluZyByZXNwb25zZSB0byByZXNvbHZlXG4gICAgICBpZiAodGhpcy5fbG9ja3NbbG9ja10gJiYgdGhpcy5fbG9ja3NbbG9ja10ud2FpdGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAvLyByZXR1cm4gcHJvbWlzZSB0aGF0IHdpbGwgYmVnaW4gd2hlbiBvcmlnaW5hbCBvbmUgcmVzb2x2ZXNcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbG9ja3NbbG9ja10gJiYgdGhpcy5fbG9ja3NbbG9ja10ud2FpdCkge1xuICAgICAgICB0aGlzLl9sb2Nrc1tsb2NrXS53YWl0ZXIgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBsZXQgd2FpdCA9IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAgICAgLy8ga2VlcCB3YWl0aW5nIG9uIHByb21pc2VcbiAgICAgICAgICAgIGlmIChzZWxmLl9sb2Nrc1tsb2NrXS53YWl0KSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHdhaXQodXJsKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcblxuICAgICAgICAgICAgLy8gcG9sbCBmb3IgbmV3IHVybFxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9sb2Nrc1tsb2NrXS51cmwgIT09IHVybCkge1xuICAgICAgICAgICAgICB3YWl0KHNlbGYuX2xvY2tzW2xvY2tdLnVybCk7XG5cbiAgICAgICAgICAgIC8vIGFqYXggYmFja2VuZCBmb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX2xvY2tzW2xvY2tdLndhaXRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICBzZWxmLnJlcXVlc3QoJ0dFVCcsIHNlbGYuX2xvY2tzW2xvY2tdLnVybCkudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLnVybCA9PT0gdXJsKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd2FpdChzZWxmLl9sb2Nrc1tsb2NrXS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24ocmVqZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLnVybCA9PT0gdXJsKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2VsZi5fbG9ja3NbbG9ja10ud2FpdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHdhaXQoc2VsZi5fbG9ja3NbbG9ja10udXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdhaXQodXJsKTtcbiAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gc2V0dXAgbmV3IGxvY2sgd2l0aG91dCB3YWl0ZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvY2tzW2xvY2tdID0ge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICB3YWl0OiB0cnVlLFxuICAgICAgICAgIHdhaXRlcjogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgc2VsZi5yZXF1ZXN0KCdHRVQnLCB1cmwpLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgc2VsZi5fbG9ja3NbbG9ja10ud2FpdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLnVybCA9PT0gdXJsKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24ocmVqZWN0aW9uKSB7XG4gICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KHJlamVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3QodXJsLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIHVybCwgZGF0YSk7XG4gIH1cblxuICBwYXRjaCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQQVRDSCcsIHVybCwgZGF0YSk7XG4gIH1cblxuICBwdXQodXJsLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUFVUJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIGRlbGV0ZSh1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCB1cmwpO1xuICB9XG5cbiAgdXBsb2FkKHVybCwgZGF0YSwgcHJvZ3Jlc3MpIHtcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgbGV0IHhociA9IHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtQ1NSRlRva2VuJzogc2VsZi5fY3NyZlRva2VuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG5cbiAgICAgICAgeGhyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgeGhyID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgIHhoci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcihcInByb2dyZXNzXCIsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICAgICAgaWYgKGV2dC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgICAgICAgIHByb2dyZXNzKE1hdGgucm91bmQoZXZ0LmxvYWRlZCAvIGV2dC50b3RhbCAqIDEwMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICByZXR1cm4geGhyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7XG4gICAgICAgICAgbGV0IHJlamVjdGlvbiA9IGpxWEhSLnJlc3BvbnNlSlNPTiB8fCB7fTtcblxuICAgICAgICAgIHJlamVjdGlvbi5zdGF0dXMgPSBqcVhIUi5zdGF0dXM7XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0aW9uLmRldGFpbCA9IGdldHRleHQoXCJMb3N0IGNvbm5lY3Rpb24gd2l0aCBhcHBsaWNhdGlvbi5cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgaWYgKCFyZWplY3Rpb24uZGV0YWlsIHx8IHJlamVjdGlvbi5kZXRhaWwgPT09ICdOT1QgRk9VTkQnKSB7XG4gICAgICAgICAgICAgIHJlamVjdGlvbi5kZXRhaWwgPSBnZXR0ZXh0KFwiQWN0aW9uIGxpbmsgaXMgaW52YWxpZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDUwMCAmJiAhcmVqZWN0aW9uLmRldGFpbCkge1xuICAgICAgICAgICAgcmVqZWN0aW9uLmRldGFpbCA9IGdldHRleHQoXCJVbmtub3duIGVycm9yIGhhcyBvY2N1cmVkLlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWplY3Rpb24uc3RhdHVzVGV4dCA9IGpxWEhSLnN0YXR1c1RleHQ7XG5cbiAgICAgICAgICByZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJC5hamF4KHhocik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEFqYXgoKTtcbiIsImltcG9ydCB7IHNpZ25Jbiwgc2lnbk91dCB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBBdXRoIHtcbiAgaW5pdChzdG9yZSwgbG9jYWwsIG1vZGFsKSB7XG4gICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLl9sb2NhbCA9IGxvY2FsO1xuICAgIHRoaXMuX21vZGFsID0gbW9kYWw7XG5cbiAgICAvLyB0ZWxsIG90aGVyIHRhYnMgd2hhdCBhdXRoIHN0YXRlIGlzIGJlY2F1c2Ugd2UgYXJlIG1vc3QgY3VycmVudCB3aXRoIGl0XG4gICAgdGhpcy5zeW5jU2Vzc2lvbigpO1xuXG4gICAgLy8gbGlzdGVuIGZvciBvdGhlciB0YWJzIHRvIHRlbGwgdXMgdGhhdCBzdGF0ZSBjaGFuZ2VkXG4gICAgdGhpcy53YXRjaFN0YXRlKCk7XG4gIH1cblxuICBzeW5jU2Vzc2lvbigpIHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpLmF1dGg7XG4gICAgaWYgKHN0YXRlLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICAgIHVzZXJuYW1lOiBzdGF0ZS51c2VyLnVzZXJuYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3YXRjaFN0YXRlKCkge1xuICAgIHRoaXMuX2xvY2FsLndhdGNoKCdhdXRoJywgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25Jbih7XG4gICAgICAgICAgdXNlcm5hbWU6IG5ld1N0YXRlLnVzZXJuYW1lXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgc2lnbkluKHVzZXIpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduSW4odXNlcikpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lXG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgc2lnbk91dCgpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduT3V0KCkpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzb2Z0U2lnbk91dCgpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduT3V0KHRydWUpKTtcbiAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBBdXRoKCk7IiwiLyogZ2xvYmFsIGdyZWNhcHRjaGEgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBCYXNlQ2FwdGNoYSB7XG4gIGluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9hamF4ID0gYWpheDtcbiAgICB0aGlzLl9pbmNsdWRlID0gaW5jbHVkZTtcbiAgICB0aGlzLl9zbmFja2JhciA9IHNuYWNrYmFyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0NhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHJlc29sdmUgYXMgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB2YWxpZGF0ZVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29tcG9uZW50KCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRQUNhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZWxmLl9hamF4LmdldChzZWxmLl9jb250ZXh0LmdldCgnQ0FQVENIQV9BUElfVVJMJykpLnRoZW4oXG4gICAgICBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHNlbGYucXVlc3Rpb24gPSBkYXRhLnF1ZXN0aW9uO1xuICAgICAgICBzZWxmLmhlbHBUZXh0ID0gZGF0YS5oZWxwX3RleHQ7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLl9zbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRmFpbGVkIHRvIGxvYWQgQ0FQVENIQS5cIikpO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiA8Rm9ybUdyb3VwIGxhYmVsPXt0aGlzLnF1ZXN0aW9ufSBmb3I9XCJpZF9jYXB0Y2hhXCJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPXtrd2FyZ3MubGFiZWxDbGFzcyB8fCBcImNvbC1zbS00XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbENsYXNzPXtrd2FyZ3MuY29udHJvbENsYXNzIHx8IFwiY29sLXNtLThcIn1cbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uPXtrd2FyZ3MuZm9ybS5zdGF0ZS5lcnJvcnMuY2FwdGNoYX1cbiAgICAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17dGhpcy5oZWxwVGV4dCB8fCBudWxsfT5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaWRfY2FwdGNoYVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX2NhcHRjaGFfc3RhdHVzXCJcbiAgICAgICAgICAgICBkaXNhYmxlZD17a3dhcmdzLmZvcm0uc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgIG9uQ2hhbmdlPXtrd2FyZ3MuZm9ybS5iaW5kSW5wdXQoJ2NhcHRjaGEnKX1cbiAgICAgICAgICAgICB2YWx1ZT17a3dhcmdzLmZvcm0uc3RhdGUuY2FwdGNoYX0gLz5cbiAgICA8L0Zvcm1Hcm91cD47XG4gIH1cbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn1cblxuXG5leHBvcnQgY2xhc3MgUmVDYXB0Y2hhQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgZ3JlY2FwdGNoYS5yZW5kZXIoJ3JlY2FwdGNoYScsIHtcbiAgICAgICdzaXRla2V5JzogdGhpcy5wcm9wcy5zaXRlS2V5LFxuICAgICAgJ2NhbGxiYWNrJzogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIGZpcmUgZmFrZXkgZXZlbnQgdG8gYmluZGluZ1xuICAgICAgICB0aGlzLnByb3BzLmJpbmRpbmcoe1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgaWQ9XCJyZWNhcHRjaGFcIiAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgdGhpcy5faW5jbHVkZS5pbmNsdWRlKCdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanMnLCB0cnVlKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICB2YXIgd2FpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGdyZWNhcHRjaGEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdhaXQoKTtcbiAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdhaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRvcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBvbmVudChrd2FyZ3MpIHtcbiAgICByZXR1cm4gPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIkNhcHRjaGFcIil9IGZvcj1cImlkX2NhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9e2t3YXJncy5sYWJlbENsYXNzIHx8IFwiY29sLXNtLTRcIn1cbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sQ2xhc3M9e2t3YXJncy5jb250cm9sQ2xhc3MgfHwgXCJjb2wtc20tOFwifVxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e2t3YXJncy5mb3JtLnN0YXRlLmVycm9ycy5jYXB0Y2hhfVxuICAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiUGxlYXNlIHNvbHZlIHRoZSBxdWljayB0ZXN0LlwiKX0+XG4gICAgICA8UmVDYXB0Y2hhQ29tcG9uZW50IHNpdGVLZXk9e3RoaXMuX2NvbnRleHQuZ2V0KCdTRVRUSU5HUycpLnJlY2FwdGNoYV9zaXRlX2tleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZz17a3dhcmdzLmZvcm0uYmluZElucHV0KCdjYXB0Y2hhJyl9IC8+XG4gICAgPC9Gb3JtR3JvdXA+O1xuICB9XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG59XG5cbmV4cG9ydCBjbGFzcyBDYXB0Y2hhIHtcbiAgaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcikge1xuICAgIHN3aXRjaChjb250ZXh0LmdldCgnU0VUVElOR1MnKS5jYXB0Y2hhX3R5cGUpIHtcbiAgICAgIGNhc2UgJ25vJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBOb0NhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3FhJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBRQUNhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBSZUNhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FwdGNoYS5pbml0KGNvbnRleHQsIGFqYXgsIGluY2x1ZGUsIHNuYWNrYmFyKTtcbiAgfVxuXG4gIC8vIGFjY2Vzc29ycyBmb3IgdW5kZXJseWluZyBzdHJhdGVneVxuXG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEubG9hZCgpO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0Y2hhLnZhbGlkYXRvcigpO1xuICB9XG5cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiB0aGlzLl9jYXB0Y2hhLmNvbXBvbmVudChrd2FyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBDYXB0Y2hhKCk7IiwiZXhwb3J0IGNsYXNzIEluY2x1ZGUge1xuICBpbml0KHN0YXRpY1VybCkge1xuICAgIHRoaXMuX3N0YXRpY1VybCA9IHN0YXRpY1VybDtcbiAgICB0aGlzLl9pbmNsdWRlZCA9IFtdO1xuICB9XG5cbiAgaW5jbHVkZShzY3JpcHQsIHJlbW90ZT1mYWxzZSkge1xuICAgIGlmICh0aGlzLl9pbmNsdWRlZC5pbmRleE9mKHNjcmlwdCkgPT09IC0xKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlZC5wdXNoKHNjcmlwdCk7XG4gICAgICB0aGlzLl9pbmNsdWRlKHNjcmlwdCwgcmVtb3RlKTtcbiAgICB9XG4gIH1cblxuICBfaW5jbHVkZShzY3JpcHQsIHJlbW90ZSkge1xuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICghcmVtb3RlID8gdGhpcy5fc3RhdGljVXJsIDogJycpICsgc2NyaXB0LFxuICAgICAgY2FjaGU6IHRydWUsXG4gICAgICBkYXRhVHlwZTogJ3NjcmlwdCdcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgSW5jbHVkZSgpOyIsImxldCBzdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcblxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZSB7XG4gIGluaXQocHJlZml4KSB7XG4gICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xuICAgIHRoaXMuX3dhdGNoZXJzID0gW107XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIChlKSA9PiB7XG4gICAgICBsZXQgbmV3VmFsdWVKc29uID0gSlNPTi5wYXJzZShlLm5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLmZvckVhY2goZnVuY3Rpb24od2F0Y2hlcikge1xuICAgICAgICBpZiAod2F0Y2hlci5rZXkgPT09IGUua2V5ICYmIGUub2xkVmFsdWUgIT09IGUubmV3VmFsdWUpIHtcbiAgICAgICAgICB3YXRjaGVyLmNhbGxiYWNrKG5ld1ZhbHVlSnNvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBzdG9yYWdlLnNldEl0ZW0odGhpcy5fcHJlZml4ICsga2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGxldCBpdGVtU3RyaW5nID0gc3RvcmFnZS5nZXRJdGVtKHRoaXMuX3ByZWZpeCArIGtleSk7XG4gICAgaWYgKGl0ZW1TdHJpbmcpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGl0ZW1TdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3YXRjaChrZXksIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fd2F0Y2hlcnMucHVzaCh7XG4gICAgICBrZXk6IHRoaXMuX3ByZWZpeCArIGtleSxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBMb2NhbFN0b3JhZ2UoKTsiLCJpbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNb2JpbGVOYXZiYXJEcm9wZG93biB7XG4gIGluaXQoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBzaG93KGNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnQgPT09IGNvbXBvbmVudCkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKCdvcGVuJyk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0Nvbm5lY3RlZChuYW1lLCBjb21wb25lbnQpIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50ID09PSBuYW1lKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcG9uZW50ID0gbmFtZTtcbiAgICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCwgdHJ1ZSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKCdvcGVuJyk7XG4gICAgfVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKCdvcGVuJyk7XG4gICAgdGhpcy5fY29tcG9uZW50ID0gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTW9iaWxlTmF2YmFyRHJvcGRvd24oKTtcbiIsImltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuICBpbml0KGVsZW1lbnQpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIHRoaXMuX21vZGFsID0gJChlbGVtZW50KS5tb2RhbCh7c2hvdzogZmFsc2V9KTtcblxuICAgIHRoaXMuX21vZGFsLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAoKSA9PiB7XG4gICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuX2VsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvdyhjb21wb25lbnQpIHtcbiAgICBtb3VudChjb21wb25lbnQsIHRoaXMuX2VsZW1lbnQuaWQpO1xuICAgIHRoaXMuX21vZGFsLm1vZGFsKCdzaG93Jyk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuX21vZGFsLm1vZGFsKCdoaWRlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IE1vZGFsKCk7XG4iLCJleHBvcnQgY2xhc3MgUGFnZVRpdGxlIHtcbiAgaW5pdChmb3J1bU5hbWUpIHtcbiAgICB0aGlzLl9mb3J1bU5hbWUgPSBmb3J1bU5hbWU7XG4gIH1cblxuICBzZXQodGl0bGUpIHtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJykge1xuICAgICAgdGl0bGUgPSB7dGl0bGU6IHRpdGxlfTtcbiAgICB9XG5cbiAgICBsZXQgZmluYWxUaXRsZSA9IHRpdGxlLnRpdGxlO1xuXG4gICAgaWYgKHRpdGxlLnBhZ2UpIHtcbiAgICAgIGxldCBwYWdlTGFiZWwgPSBpbnRlcnBvbGF0ZShnZXR0ZXh0KCdwYWdlOiAlKHBhZ2UpcycpLCB7XG4gICAgICAgIHBhZ2U6IHRpdGxlLnBhZ2VcbiAgICAgIH0sIHRydWUpO1xuXG4gICAgICBmaW5hbFRpdGxlICs9ICcgKCcgKyBwYWdlTGFiZWwgKyAnKSc7XG4gICAgfVxuXG4gICAgaWYgKHRpdGxlLnBhcmVudCkge1xuICAgICAgZmluYWxUaXRsZSArPSAnIHwgJyArIHRpdGxlLnBhcmVudDtcbiAgICB9XG5cbiAgICBkb2N1bWVudC50aXRsZSA9IGZpbmFsVGl0bGUgKyAnIHwgJyArIHRoaXMuX2ZvcnVtTmFtZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGFnZVRpdGxlKCk7XG4iLCJleHBvcnQgY2xhc3MgUG9sbHMge1xuICBpbml0KGFqYXgsIHNuYWNrYmFyKSB7XG4gICAgdGhpcy5fYWpheCA9IGFqYXg7XG4gICAgdGhpcy5fc25hY2tiYXIgPSBzbmFja2JhcjtcblxuICAgIHRoaXMuX3BvbGxzID0ge307XG4gIH1cblxuICBzdGFydChrd2FyZ3MpIHtcbiAgICBsZXQgcG9vbFNlcnZlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3BvbGxzW2t3YXJncy5wb2xsXSA9IGt3YXJncztcblxuICAgICAgdGhpcy5fYWpheC5nZXQoa3dhcmdzLnVybCwga3dhcmdzLmRhdGEgfHwgbnVsbCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBrd2FyZ3MudXBkYXRlKGRhdGEpO1xuXG4gICAgICAgIHRoaXMuX3BvbGxzW2t3YXJncy5wb2xsXS50aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgcG9vbFNlcnZlciwga3dhcmdzLmZyZXF1ZW5jeSk7XG4gICAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChrd2FyZ3MuZXJyb3IpIHtcbiAgICAgICAgICBrd2FyZ3MuZXJyb3IocmVqZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcG9vbFNlcnZlcigpO1xuICB9XG5cbiAgc3RvcChwb2xsSWQpIHtcbiAgICBpZiAodGhpcy5fcG9sbHNbcG9sbElkXSkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9wb2xsc1twb2xsSWRdLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgUG9sbHMoKTtcbiIsImltcG9ydCB7IHNob3dTbmFja2JhciwgaGlkZVNuYWNrYmFyIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3NuYWNrYmFyJztcblxuY29uc3QgSElERV9BTklNQVRJT05fTEVOR1RIID0gMzAwO1xuY29uc3QgTUVTU0FHRV9TSE9XX0xFTkdUSCA9IDUwMDA7XG5cbmV4cG9ydCBjbGFzcyBTbmFja2JhciB7XG4gIGluaXQoc3RvcmUpIHtcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgYWxlcnQobWVzc2FnZSwgdHlwZSkge1xuICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goaGlkZVNuYWNrYmFyKCkpO1xuXG4gICAgICB0aGlzLl90aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbGVydChtZXNzYWdlLCB0eXBlKTtcbiAgICAgIH0sIEhJREVfQU5JTUFUSU9OX0xFTkdUSCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNob3dTbmFja2JhcihtZXNzYWdlLCB0eXBlKSk7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChoaWRlU25hY2tiYXIoKSk7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgfSwgTUVTU0FHRV9TSE9XX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLy8gc2hvcnRoYW5kcyBmb3IgbWVzc2FnZSB0eXBlc1xuXG4gIGluZm8obWVzc2FnZSkge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgJ2luZm8nKTtcbiAgfVxuXG4gIHN1Y2Nlc3MobWVzc2FnZSkge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgJ3N1Y2Nlc3MnKTtcbiAgfVxuXG4gIHdhcm5pbmcobWVzc2FnZSkge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgJ3dhcm5pbmcnKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsICdlcnJvcicpO1xuICB9XG5cbiAgLy8gc2hvcnRoYW5kIGZvciBhcGkgZXJyb3JzXG5cbiAgYXBpRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSByZWplY3Rpb24uZGV0YWlsO1xuXG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiQWN0aW9uIGxpbmsgaXMgaW52YWxpZC5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlID0gZ2V0dGV4dChcIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgbWVzc2FnZSA9PT0gXCJQZXJtaXNzaW9uIGRlbmllZFwiKSB7XG4gICAgICBtZXNzYWdlID0gZ2V0dGV4dChcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgU25hY2tiYXIoKTtcbiIsImltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycywgY3JlYXRlU3RvcmUgfSBmcm9tICdyZWR1eCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVdyYXBwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zdG9yZSA9IG51bGw7XG4gICAgdGhpcy5fcmVkdWNlcnMgPSB7fTtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSB7fTtcbiAgfVxuXG4gIGFkZFJlZHVjZXIobmFtZSwgcmVkdWNlciwgaW5pdGlhbFN0YXRlKSB7XG4gICAgdGhpcy5fcmVkdWNlcnNbbmFtZV0gPSByZWR1Y2VyO1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZVtuYW1lXSA9IGluaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5fc3RvcmUgPSBjcmVhdGVTdG9yZShcbiAgICAgIGNvbWJpbmVSZWR1Y2Vycyh0aGlzLl9yZWR1Y2VycyksIHRoaXMuX2luaXRpYWxTdGF0ZSk7XG4gIH1cblxuICBnZXRTdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmU7XG4gIH1cblxuICAvLyBTdG9yZSBBUElcblxuICBnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBTdG9yZVdyYXBwZXIoKTtcbiIsIi8qIGdsb2JhbCB6eGN2Ym4gKi9cbmV4cG9ydCBjbGFzcyBaeGN2Ym4ge1xuICBpbml0KGluY2x1ZGUpIHtcbiAgICB0aGlzLl9pbmNsdWRlID0gaW5jbHVkZTtcbiAgfVxuXG4gIHNjb3JlUGFzc3dvcmQocGFzc3dvcmQsIGlucHV0cykge1xuICAgIC8vIDAtNCBzY29yZSwgdGhlIG1vcmUgdGhlIHN0cm9uZ2VyIHBhc3N3b3JkXG4gICAgcmV0dXJuIHp4Y3ZibihwYXNzd29yZCwgaW5wdXRzKS5zY29yZTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgaWYgKHR5cGVvZiB6eGN2Ym4gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGUuaW5jbHVkZSgnbWlzYWdvL2pzL3p4Y3Zibi5qcycpO1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdQcm9taXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRQcm9taXNlKCk7XG4gICAgfVxuICB9XG5cbiAgX2xvYWRpbmdQcm9taXNlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICB2YXIgd2FpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHp4Y3ZibiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2FpdCgpO1xuICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgd2FpdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2xvYWRlZFByb21pc2UoKSB7XG4gICAgLy8gd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB6eGN2Ym4uanMsIHJlc29sdmUgYXdheSFcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBaeGN2Ym4oKTsiLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFByb3ZpZGVyLCBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Jhbm5lZC1wYWdlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbi8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbmxldCBzZWxlY3QgPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUudGljaztcbn07XG5cbmxldCBSZWRyYXdlZEJhbm5lZFBhZ2UgPSBjb25uZWN0KHNlbGVjdCkoQmFubmVkUGFnZSk7XG4vKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihiYW4sIGNoYW5nZVN0YXRlKSB7XG4gIFJlYWN0RE9NLnJlbmRlcihcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZS5nZXRTdG9yZSgpfT5cbiAgICAgIDxSZWRyYXdlZEJhbm5lZFBhZ2UgbWVzc2FnZT17YmFuLm1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM9e2Jhbi5leHBpcmVzX29uID8gbW9tZW50KGJhbi5leHBpcmVzX29uKSA6IG51bGx9IC8+XG4gICAgPC9Qcm92aWRlcj4sXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tb3VudCcpXG4gICk7XG5cbiAgaWYgKHR5cGVvZiBjaGFuZ2VTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgY2hhbmdlU3RhdGUpIHtcbiAgICBsZXQgZm9ydW1OYW1lID0gbWlzYWdvLmdldCgnU0VUVElOR1MnKS5mb3J1bV9uYW1lO1xuICAgIGRvY3VtZW50LnRpdGxlID0gZ2V0dGV4dChcIllvdSBhcmUgYmFubmVkXCIpICsgJyB8ICcgKyBmb3J1bU5hbWU7XG4gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHt9LCBcIlwiLCBtaXNhZ28uZ2V0KCdCQU5ORURfVVJMJykpO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obGlzdCwgcm93V2lkdGgsIHBhZGRpbmc9ZmFsc2UpIHtcbiAgbGV0IHJvd3MgPSBbXTtcbiAgbGV0IHJvdyA9IFtdO1xuXG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgcm93LnB1c2goZWxlbWVudCk7XG4gICAgaWYgKHJvdy5sZW5ndGggPT09IHJvd1dpZHRoKSB7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgIHJvdyA9IFtdO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcGFkIHJvdyB0byByZXF1aXJlZCBsZW5ndGg/XG4gIGlmIChwYWRkaW5nICE9PSBmYWxzZSAmJiByb3cubGVuZ3RoID4gMCAmJiByb3cubGVuZ3RoIDwgcm93V2lkdGgpIHtcbiAgICBmb3IgKGxldCBpID0gcm93Lmxlbmd0aDsgaSA8IHJvd1dpZHRoOyBpICsrKSB7XG4gICAgICByb3cucHVzaChwYWRkaW5nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocm93Lmxlbmd0aCkge1xuICAgIHJvd3MucHVzaChyb3cpO1xuICB9XG5cbiAgcmV0dXJuIHJvd3M7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYnl0ZXMpIHtcbiAgaWYgKGJ5dGVzID4gMTAwMCAqIDEwMDAgKiAxMDAwKSB7XG4gICAgcmV0dXJuIChNYXRoLnJvdW5kKGJ5dGVzICogMTAwIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpIC8gMTAwKSArICcgR0InO1xuICB9IGVsc2UgaWYgKGJ5dGVzID4gMTAwMCAqIDEwMDApIHtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoYnl0ZXMgKiAxMDAgLyAoMTAwMCAqIDEwMDApKSAvIDEwMCkgKyAnIE1CJztcbiAgfSBlbHNlIGlmIChieXRlcyA+IDEwMDApIHtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoYnl0ZXMgKiAxMDAgLyAxMDAwKSAvIDEwMCkgKyAnIEtCJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoYnl0ZXMgKiAxMDApIC8gMTAwKSArICcgQic7XG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihDb21wb25lbnQsIHJvb3RFbGVtZW50SWQsIGNvbm5lY3RlZD10cnVlKSB7XG4gIGxldCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHJvb3RFbGVtZW50SWQpO1xuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgbGV0IGZpbmFsQ29tcG9uZW50ID0gQ29tcG9uZW50LnByb3BzID8gQ29tcG9uZW50IDogPENvbXBvbmVudCAvPjtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBpZiAocm9vdEVsZW1lbnQpIHtcbiAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICBSZWFjdERPTS5yZW5kZXIoXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZS5nZXRTdG9yZSgpfT5cbiAgICAgICAgICB7ZmluYWxDb21wb25lbnR9XG4gICAgICAgIDwvUHJvdmlkZXI+LFxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgICByb290RWxlbWVudFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgUmVhY3RET00ucmVuZGVyKGZpbmFsQ29tcG9uZW50LCByb290RWxlbWVudCk7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3JkZXJlZExpc3Qge1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1zKSB7XG4gICAgICB0aGlzLmlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5faXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICB9XG5cbiAgICBhZGQoa2V5LCBpdGVtLCBvcmRlcikge1xuICAgICAgdGhpcy5faXRlbXMucHVzaCh7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBpdGVtOiBpdGVtLFxuXG4gICAgICAgIGFmdGVyOiBvcmRlciA/IG9yZGVyLmFmdGVyIHx8IG51bGwgOiBudWxsLFxuICAgICAgICBiZWZvcmU6IG9yZGVyID8gb3JkZXIuYmVmb3JlIHx8IG51bGwgOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5faXRlbXNbaV0ua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNbaV0uaXRlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KGtleSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YWx1ZXMoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuX2l0ZW1zW2ldLml0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBvcmRlcih2YWx1ZXNfb25seSkge1xuICAgICAgaWYgKCF0aGlzLmlzT3JkZXJlZCkge1xuICAgICAgICB0aGlzLl9pdGVtcyA9IHRoaXMuX29yZGVyKHRoaXMuX2l0ZW1zKTtcbiAgICAgICAgdGhpcy5pc09yZGVyZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWVzX29ubHkgfHwgdHlwZW9mIHZhbHVlc19vbmx5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvcmRlcmVkVmFsdWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3JkZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgX29yZGVyKHVub3JkZXJlZCkge1xuICAgICAgLy8gSW5kZXggb2YgdW5vcmRlcmVkIGl0ZW1zXG4gICAgICB2YXIgaW5kZXggPSBbXTtcbiAgICAgIHVub3JkZXJlZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGluZGV4LnB1c2goaXRlbS5rZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE9yZGVyZWQgaXRlbXNcbiAgICAgIHZhciBvcmRlcmVkID0gW107XG4gICAgICB2YXIgb3JkZXJpbmcgPSBbXTtcblxuICAgICAgLy8gRmlyc3QgcGFzczogcmVnaXN0ZXIgaXRlbXMgdGhhdFxuICAgICAgLy8gZG9uJ3Qgc3BlY2lmeSB0aGVpciBvcmRlclxuICAgICAgdW5vcmRlcmVkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKCFpdGVtLmFmdGVyICYmICFpdGVtLmJlZm9yZSkge1xuICAgICAgICAgIG9yZGVyZWQucHVzaChpdGVtKTtcbiAgICAgICAgICBvcmRlcmluZy5wdXNoKGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlY29uZCBwYXNzOiByZWdpc3RlciBpdGVtcyB0aGF0XG4gICAgICAvLyBzcGVjaWZ5IHRoZWlyIGJlZm9yZSB0byBcIl9lbmRcIlxuICAgICAgdW5vcmRlcmVkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0uYmVmb3JlID09PSBcIl9lbmRcIikge1xuICAgICAgICAgIG9yZGVyZWQucHVzaChpdGVtKTtcbiAgICAgICAgICBvcmRlcmluZy5wdXNoKGl0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoaXJkIHBhc3M6IGtlZXAgaXRlcmF0aW5nIGl0ZW1zXG4gICAgICAvLyB1bnRpbCB3ZSBoaXQgaXRlcmF0aW9ucyBsaW1pdCBvciBmaW5pc2hcbiAgICAgIC8vIG9yZGVyaW5nIGxpc3RcbiAgICAgIGZ1bmN0aW9uIGluc2VydEl0ZW0oaXRlbSkge1xuICAgICAgICB2YXIgaW5zZXJ0QXQgPSAtMTtcbiAgICAgICAgaWYgKG9yZGVyaW5nLmluZGV4T2YoaXRlbS5rZXkpID09PSAtMSkge1xuICAgICAgICAgIGlmIChpdGVtLmFmdGVyKSB7XG4gICAgICAgICAgICBpbnNlcnRBdCA9IG9yZGVyaW5nLmluZGV4T2YoaXRlbS5hZnRlcik7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QXQgIT09IC0xKSB7XG4gICAgICAgICAgICAgIGluc2VydEF0ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmJlZm9yZSkge1xuICAgICAgICAgICAgaW5zZXJ0QXQgPSBvcmRlcmluZy5pbmRleE9mKGl0ZW0uYmVmb3JlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW5zZXJ0QXQgIT09IC0xKSB7XG4gICAgICAgICAgICBvcmRlcmVkLnNwbGljZShpbnNlcnRBdCwgMCwgaXRlbSk7XG4gICAgICAgICAgICBvcmRlcmluZy5zcGxpY2UoaW5zZXJ0QXQsIDAsIGl0ZW0ua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAyMDA7XG4gICAgICB3aGlsZSAoaXRlcmF0aW9ucyA+IDAgJiYgaW5kZXgubGVuZ3RoICE9PSBvcmRlcmluZy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0aW9ucyAtPSAxO1xuICAgICAgICB1bm9yZGVyZWQuZm9yRWFjaChpbnNlcnRJdGVtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yZGVyZWQ7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgT3JkZXJlZExpc3Q7XG4iLCJleHBvcnQgZnVuY3Rpb24gaW50KG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSkgKyBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5nZShtaW4sIG1heCkge1xuICBsZXQgYXJyYXkgPSBuZXcgQXJyYXkoaW50KG1pbiwgbWF4KSk7XG4gIGZvcihsZXQgaT0wOyBpPGFycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICBhcnJheVtpXSA9IGk7XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbn0iLCIvLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5pbXBvcnQgY3JlYXRlSGlzdG9yeSBmcm9tICdoaXN0b3J5L2xpYi9jcmVhdGVCcm93c2VySGlzdG9yeSc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tb3VudCcpO1xuY29uc3QgaGlzdG9yeSA9IG5ldyBjcmVhdGVIaXN0b3J5KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgbGV0IHJvdXRlcyA9IHtcbiAgICBjb21wb25lbnQ6IG9wdGlvbnMuY29tcG9uZW50LFxuICAgIGNoaWxkUm91dGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6IG9wdGlvbnMucm9vdCxcbiAgICAgICAgb25FbnRlcjogZnVuY3Rpb24obmV4dFN0YXRlLCByZXBsYWNlU3RhdGUpIHtcbiAgICAgICAgICByZXBsYWNlU3RhdGUobnVsbCwgb3B0aW9ucy5wYXRoc1swXS5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF0uY29uY2F0KG9wdGlvbnMucGF0aHMubWFwKGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0pKVxuICB9O1xuXG4gIFJlYWN0RE9NLnJlbmRlcihcbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlLmdldFN0b3JlKCl9PlxuICAgICAgPFJvdXRlciByb3V0ZXM9e3JvdXRlc30gaGlzdG9yeT17aGlzdG9yeX0gLz5cbiAgICA8L1Byb3ZpZGVyPixcbiAgICByb290RWxlbWVudFxuICApO1xufVxuIiwiY29uc3QgRU1BSUwgPSAvXigoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG5jb25zdCBVU0VSTkFNRSA9IG5ldyBSZWdFeHAoJ15bMC05YS16XSskJywgJ2knKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKCkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoJC50cmltKHZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cIik7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1haWwobWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoIUVNQUlMLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZSB8fCBnZXR0ZXh0KFwiRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW5MZW5ndGgobGltaXRWYWx1ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmV0dXJuTWVzc2FnZSA9ICcnO1xuICAgIHZhciBsZW5ndGggPSAkLnRyaW0odmFsdWUpLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPCBsaW1pdFZhbHVlKSB7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbWVzc2FnZShsaW1pdFZhbHVlLCBsZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlcnMgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgbGltaXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUocmV0dXJuTWVzc2FnZSwge1xuICAgICAgICBsaW1pdF92YWx1ZTogbGltaXRWYWx1ZSxcbiAgICAgICAgc2hvd192YWx1ZTogbGVuZ3RoXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGgobGltaXRWYWx1ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmV0dXJuTWVzc2FnZSA9ICcnO1xuICAgIHZhciBsZW5ndGggPSAkLnRyaW0odmFsdWUpLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPiBsaW1pdFZhbHVlKSB7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbWVzc2FnZShsaW1pdFZhbHVlLCBsZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IG1vc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBcIkVuc3VyZSB0aGlzIHZhbHVlIGhhcyBhdCBtb3N0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIChpdCBoYXMgJShzaG93X3ZhbHVlKXMpLlwiLFxuICAgICAgICAgIGxpbWl0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKHJldHVybk1lc3NhZ2UsIHtcbiAgICAgICAgbGltaXRfdmFsdWU6IGxpbWl0VmFsdWUsXG4gICAgICAgIHNob3dfdmFsdWU6IGxlbmd0aFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlcm5hbWVNaW5MZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJVc2VybmFtZSBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgbG9uZy5cIixcbiAgICAgIFwiVXNlcm5hbWUgbXVzdCBiZSBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyBsb25nLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1pbkxlbmd0aChzZXR0aW5ncy51c2VybmFtZV9sZW5ndGhfbWluLCBtZXNzYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lTWF4TGVuZ3RoKHNldHRpbmdzKSB7XG4gIHZhciBtZXNzYWdlID0gZnVuY3Rpb24obGltaXRWYWx1ZSkge1xuICAgIHJldHVybiBuZ2V0dGV4dChcbiAgICAgIFwiVXNlcm5hbWUgY2Fubm90IGJlIGxvbmdlciB0aGFuICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIuXCIsXG4gICAgICBcIlVzZXJuYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycy5cIixcbiAgICAgIGxpbWl0VmFsdWUpO1xuICB9O1xuICByZXR1cm4gdGhpcy5tYXhMZW5ndGgoc2V0dGluZ3MudXNlcm5hbWVfbGVuZ3RoX21heCwgbWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VybmFtZUNvbnRlbnQoKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICghVVNFUk5BTUUudGVzdCgkLnRyaW0odmFsdWUpKSkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJVc2VybmFtZSBjYW4gb25seSBjb250YWluIGxhdGluIGFscGhhYmV0IGxldHRlcnMgYW5kIGRpZ2l0cy5cIik7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmRNaW5MZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJWYWxpZCBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgbG9uZy5cIixcbiAgICAgIFwiVmFsaWQgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyBsb25nLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1pbkxlbmd0aChzZXR0aW5ncy5wYXNzd29yZF9sZW5ndGhfbWluLCBtZXNzYWdlKTtcbn0iXX0=

+ 4 - 2
misago/templates/misago/categories/category.html

@@ -12,15 +12,17 @@
       {% include "misago/categories/last_activity.html" with category=category %}
     </div>
   </div>
+
   {% if category.description %}
   <div class="panel-body category-description">
     {{ category.description|escape|urlize|linebreaks }}
   </div>
   {% endif %}
-  {% if category.subcategories%}
+
+  {% if category.subcategories %}
   <ul class="list-group category-subcategories">
     {% for subcategory in category.subcategories %}
-    <li class="list-group-item category-subcategory">
+    <li class="list-group-item category-subcategory {% if subcategory.css_class %}subcategory-{{ subcategory.css_class }}{% endif %}">
       <div class="title-row">
         <h4>
           {% include "misago/categories/read_icon.html" with category=subcategory %}

+ 1 - 1
misago/templates/misago/categories/read_icon.html

@@ -6,7 +6,7 @@
     </span>
   {% else %}
     <span class="material-icon read-status item-new" title="{% trans "This category has new posts. (closed)" %}">
-      lock_outline
+      lock
     </span>
   {% endif %}
 {% else %}