Current File : /var/www/pediatribu/wp-content/plugins/wpforms-lite/assets/js/admin/education/edit-post.es5.js
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
"use strict";

function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
/* global wpforms_edit_post_education */

// noinspection ES6ConvertVarToLetConst
/**
 * WPForms Edit Post Education function.
 *
 * @since 1.8.1
 */

// eslint-disable-next-line no-var, no-unused-vars
var WPFormsEditPostEducation = window.WPFormsEditPostEducation || function (document, window, $) {
  // The identifiers for the Redux stores.
  var coreEditSite = 'core/edit-site',
    coreEditor = 'core/editor',
    coreBlockEditor = 'core/block-editor',
    coreNotices = 'core/notices',
    // Heading block name.
    coreHeading = 'core/heading';

  /**
   * Public functions and properties.
   *
   * @since 1.8.1
   *
   * @type {Object}
   */
  var app = {
    /**
     * Determine if the notice was shown before.
     *
     * @since 1.8.1
     */
    isNoticeVisible: false,
    /**
     * Identifier for the plugin and notice.
     *
     * @since 1.9.5
     */
    pluginId: 'wpforms-edit-post-product-education-guide',
    /**
     * Start the engine.
     *
     * @since 1.8.1
     */
    init: function init() {
      $(window).on('load', function () {
        // In the case of jQuery 3.+, we need to wait for a ready event first.
        if (typeof $.ready.then === 'function') {
          $.ready.then(app.load);
        } else {
          app.load();
        }
      });
    },
    /**
     * Page load.
     *
     * @since 1.8.1
     * @since 1.9.5 Added compatibility for the Site Editor.
     */
    load: function load() {
      if (!app.isGutenbergEditor()) {
        app.maybeShowClassicNotice();
        app.bindClassicEvents();
        return;
      }
      app.maybeShowGutenbergNotice();

      // "core/edit-site" store available only in the Site Editor.
      if (!!wp.data.select(coreEditSite)) {
        app.subscribeForSiteEditor();
        return;
      }
      app.subscribeForBlockEditor();
    },
    /**
     * This method listens for changes in the WordPress data store and performs the following actions:
     * - Monitors the editor title and focus mode to detect changes.
     * - Dismisses a custom notice if the focus mode is disabled and the notice is visible.
     * - Shows a custom Gutenberg notice if the title or focus mode changes.
     *
     * @since 1.9.5
     */
    subscribeForSiteEditor: function subscribeForSiteEditor() {
      // Store the initial editor title and focus mode state.
      var prevTitle = app.getEditorTitle();
      var prevFocusMode = null;
      var _wp$data = wp.data,
        subscribe = _wp$data.subscribe,
        select = _wp$data.select,
        dispatch = _wp$data.dispatch;

      // Listen for changes in the WordPress data store.
      subscribe(function () {
        // Fetch the current editor mode setting.
        // If true - Site Editor canvas is opened, and you can edit something.
        // If false - you should see the sidebar with navigation and preview
        // with selected template or page.
        var _select$getEditorSett = select(coreEditor).getEditorSettings(),
          focusMode = _select$getEditorSett.focusMode;

        // If focus mode is disabled and a notice is visible, remove the notice.
        // This is essential because user can switch pages / templates
        // without a page-reload.
        if (!focusMode && app.isNoticeVisible) {
          app.isNoticeVisible = false;
          prevFocusMode = focusMode;
          dispatch(coreNotices).removeNotice(app.pluginId);
        }
        var title = app.getEditorTitle();

        // If neither the title nor the focus mode has changed, do nothing.
        if (prevTitle === title && prevFocusMode === focusMode) {
          return;
        }

        // Update the previous title and focus mode values for the next subscription cycle.
        prevTitle = title;
        prevFocusMode = focusMode;

        // Show a custom Gutenberg notice if conditions are met.
        app.maybeShowGutenbergNotice();
      });
    },
    /**
     * Subscribes to changes in the WordPress block editor and monitors the editor's title.
     * When the title changes, it triggers a process to potentially display a Gutenberg notice.
     * The subscription is automatically stopped if the notice becomes visible.
     *
     * @since 1.9.5
     */
    subscribeForBlockEditor: function subscribeForBlockEditor() {
      var prevTitle = app.getEditorTitle();
      var subscribe = wp.data.subscribe;

      // Subscribe to WordPress data changes.
      var unsubscribe = subscribe(function () {
        var title = app.getEditorTitle();

        // Check if the title has changed since the previous value.
        if (prevTitle === title) {
          return;
        }

        // Update the previous title to the current title.
        prevTitle = title;
        app.maybeShowGutenbergNotice();

        // If the notice is visible, stop the WordPress data subscription.
        if (app.isNoticeVisible) {
          unsubscribe();
        }
      });
    },
    /**
     * Retrieves the title of the post currently being edited. If in the Site Editor,
     * it attempts to fetch the title from the topmost heading block. Otherwise, it
     * retrieves the title attribute of the edited post.
     *
     * @since 1.9.5
     *
     * @return {string} The post title or an empty string if no title is found.
     */
    getEditorTitle: function getEditorTitle() {
      var select = wp.data.select;

      // Retrieve the title for Post Editor.
      if (!select(coreEditSite)) {
        return select(coreEditor).getEditedPostAttribute('title');
      }
      if (app.isEditPostFSE()) {
        return app.getPostTitle();
      }
      return app.getTopmostHeadingTitle();
    },
    /**
     * Retrieves the content of the first heading block.
     *
     * @since 1.9.5
     *
     * @return {string} The topmost heading content or null if not found.
     */
    getTopmostHeadingTitle: function getTopmostHeadingTitle() {
      var _headingBlock$attribu, _headingBlock$attribu2;
      var select = wp.data.select;
      var headings = select(coreBlockEditor).getBlocksByName(coreHeading);
      if (!headings.length) {
        return '';
      }
      var headingBlock = select(coreBlockEditor).getBlock(headings[0]);
      return (_headingBlock$attribu = headingBlock === null || headingBlock === void 0 || (_headingBlock$attribu2 = headingBlock.attributes) === null || _headingBlock$attribu2 === void 0 || (_headingBlock$attribu2 = _headingBlock$attribu2.content) === null || _headingBlock$attribu2 === void 0 ? void 0 : _headingBlock$attribu2.text) !== null && _headingBlock$attribu !== void 0 ? _headingBlock$attribu : '';
    },
    /**
     * Determines if the current editing context is for a post type in the Full Site Editor (FSE).
     *
     * @since 1.9.5
     *
     * @return {boolean} True if the current context represents a post type in the FSE, otherwise false.
     */
    isEditPostFSE: function isEditPostFSE() {
      var select = wp.data.select;
      var _select$getPage = select(coreEditSite).getPage(),
        context = _select$getPage.context;
      return !!(context !== null && context !== void 0 && context.postType);
    },
    /**
     * Retrieves the title of a post based on its type and ID from the current editing context.
     *
     * @since 1.9.5
     *
     * @return {string} The title of the post.
     */
    getPostTitle: function getPostTitle() {
      var select = wp.data.select;
      var _select$getPage2 = select(coreEditSite).getPage(),
        context = _select$getPage2.context;

      // Use `getEditedEntityRecord` instead of `getEntityRecord`
      // to fetch the live, updated data for the post being edited.
      var _ref = select('core').getEditedEntityRecord('postType', context.postType, context.postId) || {},
        _ref$title = _ref.title,
        title = _ref$title === void 0 ? '' : _ref$title;
      return title;
    },
    /**
     * Bind events for Classic Editor.
     *
     * @since 1.8.1
     */
    bindClassicEvents: function bindClassicEvents() {
      var $document = $(document);
      if (!app.isNoticeVisible) {
        $document.on('input', '#title', _.debounce(app.maybeShowClassicNotice, 1000));
      }
      $document.on('click', '.wpforms-edit-post-education-notice-close', app.closeNotice);
    },
    /**
     * Determine if the editor is Gutenberg.
     *
     * @since 1.8.1
     *
     * @return {boolean} True if the editor is Gutenberg.
     */
    isGutenbergEditor: function isGutenbergEditor() {
      return typeof wp !== 'undefined' && typeof wp.blocks !== 'undefined';
    },
    /**
     * Create a notice for Gutenberg.
     *
     * @since 1.8.1
     */
    showGutenbergNotice: function showGutenbergNotice() {
      wp.data.dispatch(coreNotices).createInfoNotice(wpforms_edit_post_education.gutenberg_notice.template, app.getGutenbergNoticeSettings());

      // The notice component doesn't have a way to add HTML id or class to the notice.
      // Also, the notice became visible with a delay on old Gutenberg versions.
      var hasNotice = setInterval(function () {
        var noticeBody = $('.wpforms-edit-post-education-notice-body');
        if (!noticeBody.length) {
          return;
        }
        var $notice = noticeBody.closest('.components-notice');
        $notice.addClass('wpforms-edit-post-education-notice');
        $notice.find('.is-secondary, .is-link').removeClass('is-secondary').removeClass('is-link').addClass('is-primary');

        // We can't use onDismiss callback as it was introduced in WordPress 6.0 only.
        var dismissButton = $notice.find('.components-notice__dismiss');
        if (dismissButton) {
          dismissButton.on('click', function () {
            app.updateUserMeta();
          });
        }
        clearInterval(hasNotice);
      }, 100);
    },
    /**
     * Get settings for the Gutenberg notice.
     *
     * @since 1.8.1
     *
     * @return {Object} Notice settings.
     */
    getGutenbergNoticeSettings: function getGutenbergNoticeSettings() {
      var noticeSettings = {
        id: app.pluginId,
        isDismissible: true,
        HTML: true,
        __unstableHTML: true,
        actions: [{
          className: 'wpforms-edit-post-education-notice-guide-button',
          variant: 'primary',
          label: wpforms_edit_post_education.gutenberg_notice.button
        }]
      };
      if (!wpforms_edit_post_education.gutenberg_guide) {
        noticeSettings.actions[0].url = wpforms_edit_post_education.gutenberg_notice.url;
        return noticeSettings;
      }
      var Guide = wp.components.Guide,
        useState = wp.element.useState,
        _wp$plugins = wp.plugins,
        registerPlugin = _wp$plugins.registerPlugin,
        unregisterPlugin = _wp$plugins.unregisterPlugin;
      var GutenbergTutorial = function GutenbergTutorial() {
        var _useState = useState(true),
          _useState2 = _slicedToArray(_useState, 2),
          isOpen = _useState2[0],
          setIsOpen = _useState2[1];
        if (!isOpen) {
          return null;
        }
        return (
          /*#__PURE__*/
          // eslint-disable-next-line react/react-in-jsx-scope
          React.createElement(Guide, {
            className: "edit-post-welcome-guide",
            onFinish: function onFinish() {
              unregisterPlugin(app.pluginId);
              setIsOpen(false);
            },
            pages: app.getGuidePages()
          })
        );
      };
      noticeSettings.actions[0].onClick = function () {
        return registerPlugin(app.pluginId, {
          render: GutenbergTutorial
        });
      };
      return noticeSettings;
    },
    /**
     * Get Guide pages in proper format.
     *
     * @since 1.8.1
     *
     * @return {Array} Guide Pages.
     */
    getGuidePages: function getGuidePages() {
      var pages = [];
      wpforms_edit_post_education.gutenberg_guide.forEach(function (page) {
        pages.push({
          /* eslint-disable react/react-in-jsx-scope */
          content: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h1", {
            className: "edit-post-welcome-guide__heading"
          }, page.title), /*#__PURE__*/React.createElement("p", {
            className: "edit-post-welcome-guide__text"
          }, page.content)),
          image: /*#__PURE__*/React.createElement("img", {
            className: "edit-post-welcome-guide__image",
            src: page.image,
            alt: page.title
          })
          /* eslint-enable react/react-in-jsx-scope */
        });
      });
      return pages;
    },
    /**
     * Show notice if the page title matches some keywords for Classic Editor.
     *
     * @since 1.8.1
     */
    maybeShowClassicNotice: function maybeShowClassicNotice() {
      if (app.isNoticeVisible) {
        return;
      }
      if (app.isTitleMatchKeywords($('#title').val())) {
        app.isNoticeVisible = true;
        $('.wpforms-edit-post-education-notice').removeClass('wpforms-hidden');
      }
    },
    /**
     * Show notice if the page title matches some keywords for Gutenberg Editor.
     *
     * @since 1.8.1
     */
    maybeShowGutenbergNotice: function maybeShowGutenbergNotice() {
      if (app.isNoticeVisible) {
        return;
      }
      var title = app.getEditorTitle();
      if (app.isTitleMatchKeywords(title)) {
        app.isNoticeVisible = true;
        app.showGutenbergNotice();
      }
    },
    /**
     * Determine if the title matches keywords.
     *
     * @since 1.8.1
     *
     * @param {string} titleValue Page title value.
     *
     * @return {boolean} True if the title matches some keywords.
     */
    isTitleMatchKeywords: function isTitleMatchKeywords(titleValue) {
      var expectedTitleRegex = new RegExp(/\b(contact|form)\b/i);
      return expectedTitleRegex.test(titleValue);
    },
    /**
     * Close a notice.
     *
     * @since 1.8.1
     */
    closeNotice: function closeNotice() {
      $(this).closest('.wpforms-edit-post-education-notice').remove();
      app.updateUserMeta();
    },
    /**
     * Update user meta and don't show the notice next time.
     *
     * @since 1.8.1
     */
    updateUserMeta: function updateUserMeta() {
      $.post(wpforms_edit_post_education.ajax_url, {
        action: 'wpforms_education_dismiss',
        nonce: wpforms_edit_post_education.education_nonce,
        section: 'edit-post-notice'
      });
    }
  };
  return app;
}(document, window, jQuery);
WPFormsEditPostEducation.init();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXUEZvcm1zRWRpdFBvc3RFZHVjYXRpb24iLCJ3aW5kb3ciLCJkb2N1bWVudCIsIiQiLCJjb3JlRWRpdFNpdGUiLCJjb3JlRWRpdG9yIiwiY29yZUJsb2NrRWRpdG9yIiwiY29yZU5vdGljZXMiLCJjb3JlSGVhZGluZyIsImFwcCIsImlzTm90aWNlVmlzaWJsZSIsInBsdWdpbklkIiwiaW5pdCIsIm9uIiwicmVhZHkiLCJ0aGVuIiwibG9hZCIsImlzR3V0ZW5iZXJnRWRpdG9yIiwibWF5YmVTaG93Q2xhc3NpY05vdGljZSIsImJpbmRDbGFzc2ljRXZlbnRzIiwibWF5YmVTaG93R3V0ZW5iZXJnTm90aWNlIiwid3AiLCJkYXRhIiwic2VsZWN0Iiwic3Vic2NyaWJlRm9yU2l0ZUVkaXRvciIsInN1YnNjcmliZUZvckJsb2NrRWRpdG9yIiwicHJldlRpdGxlIiwiZ2V0RWRpdG9yVGl0bGUiLCJwcmV2Rm9jdXNNb2RlIiwiX3dwJGRhdGEiLCJzdWJzY3JpYmUiLCJkaXNwYXRjaCIsIl9zZWxlY3QkZ2V0RWRpdG9yU2V0dCIsImdldEVkaXRvclNldHRpbmdzIiwiZm9jdXNNb2RlIiwicmVtb3ZlTm90aWNlIiwidGl0bGUiLCJ1bnN1YnNjcmliZSIsImdldEVkaXRlZFBvc3RBdHRyaWJ1dGUiLCJpc0VkaXRQb3N0RlNFIiwiZ2V0UG9zdFRpdGxlIiwiZ2V0VG9wbW9zdEhlYWRpbmdUaXRsZSIsIl9oZWFkaW5nQmxvY2skYXR0cmlidSIsIl9oZWFkaW5nQmxvY2skYXR0cmlidTIiLCJoZWFkaW5ncyIsImdldEJsb2Nrc0J5TmFtZSIsImxlbmd0aCIsImhlYWRpbmdCbG9jayIsImdldEJsb2NrIiwiYXR0cmlidXRlcyIsImNvbnRlbnQiLCJ0ZXh0IiwiX3NlbGVjdCRnZXRQYWdlIiwiZ2V0UGFnZSIsImNvbnRleHQiLCJwb3N0VHlwZSIsIl9zZWxlY3QkZ2V0UGFnZTIiLCJfcmVmIiwiZ2V0RWRpdGVkRW50aXR5UmVjb3JkIiwicG9zdElkIiwiX3JlZiR0aXRsZSIsIiRkb2N1bWVudCIsIl8iLCJkZWJvdW5jZSIsImNsb3NlTm90aWNlIiwiYmxvY2tzIiwic2hvd0d1dGVuYmVyZ05vdGljZSIsImNyZWF0ZUluZm9Ob3RpY2UiLCJ3cGZvcm1zX2VkaXRfcG9zdF9lZHVjYXRpb24iLCJndXRlbmJlcmdfbm90aWNlIiwidGVtcGxhdGUiLCJnZXRHdXRlbmJlcmdOb3RpY2VTZXR0aW5ncyIsImhhc05vdGljZSIsInNldEludGVydmFsIiwibm90aWNlQm9keSIsIiRub3RpY2UiLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJmaW5kIiwicmVtb3ZlQ2xhc3MiLCJkaXNtaXNzQnV0dG9uIiwidXBkYXRlVXNlck1ldGEiLCJjbGVhckludGVydmFsIiwibm90aWNlU2V0dGluZ3MiLCJpZCIsImlzRGlzbWlzc2libGUiLCJIVE1MIiwiX191bnN0YWJsZUhUTUwiLCJhY3Rpb25zIiwiY2xhc3NOYW1lIiwidmFyaWFudCIsImxhYmVsIiwiYnV0dG9uIiwiZ3V0ZW5iZXJnX2d1aWRlIiwidXJsIiwiR3VpZGUiLCJjb21wb25lbnRzIiwidXNlU3RhdGUiLCJlbGVtZW50IiwiX3dwJHBsdWdpbnMiLCJwbHVnaW5zIiwicmVnaXN0ZXJQbHVnaW4iLCJ1bnJlZ2lzdGVyUGx1Z2luIiwiR3V0ZW5iZXJnVHV0b3JpYWwiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc09wZW4iLCJzZXRJc09wZW4iLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJvbkZpbmlzaCIsInBhZ2VzIiwiZ2V0R3VpZGVQYWdlcyIsIm9uQ2xpY2siLCJyZW5kZXIiLCJmb3JFYWNoIiwicGFnZSIsInB1c2giLCJGcmFnbWVudCIsImltYWdlIiwic3JjIiwiYWx0IiwiaXNUaXRsZU1hdGNoS2V5d29yZHMiLCJ2YWwiLCJ0aXRsZVZhbHVlIiwiZXhwZWN0ZWRUaXRsZVJlZ2V4IiwiUmVnRXhwIiwidGVzdCIsInJlbW92ZSIsInBvc3QiLCJhamF4X3VybCIsImFjdGlvbiIsIm5vbmNlIiwiZWR1Y2F0aW9uX25vbmNlIiwic2VjdGlvbiIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImZha2VfMmQwOTI0OTAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdwZm9ybXNfZWRpdF9wb3N0X2VkdWNhdGlvbiAqL1xuXG4vLyBub2luc3BlY3Rpb24gRVM2Q29udmVydFZhclRvTGV0Q29uc3Rcbi8qKlxuICogV1BGb3JtcyBFZGl0IFBvc3QgRWR1Y2F0aW9uIGZ1bmN0aW9uLlxuICpcbiAqIEBzaW5jZSAxLjguMVxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12YXIsIG5vLXVudXNlZC12YXJzXG52YXIgV1BGb3Jtc0VkaXRQb3N0RWR1Y2F0aW9uID0gd2luZG93LldQRm9ybXNFZGl0UG9zdEVkdWNhdGlvbiB8fCAoIGZ1bmN0aW9uKCBkb2N1bWVudCwgd2luZG93LCAkICkge1xuXHQvLyBUaGUgaWRlbnRpZmllcnMgZm9yIHRoZSBSZWR1eCBzdG9yZXMuXG5cdGNvbnN0IGNvcmVFZGl0U2l0ZSA9ICdjb3JlL2VkaXQtc2l0ZScsXG5cdFx0Y29yZUVkaXRvciA9ICdjb3JlL2VkaXRvcicsXG5cdFx0Y29yZUJsb2NrRWRpdG9yID0gJ2NvcmUvYmxvY2stZWRpdG9yJyxcblx0XHRjb3JlTm90aWNlcyA9ICdjb3JlL25vdGljZXMnLFxuXG5cdFx0Ly8gSGVhZGluZyBibG9jayBuYW1lLlxuXHRcdGNvcmVIZWFkaW5nID0gJ2NvcmUvaGVhZGluZyc7XG5cblx0LyoqXG5cdCAqIFB1YmxpYyBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBzaW5jZSAxLjguMVxuXHQgKlxuXHQgKiBAdHlwZSB7T2JqZWN0fVxuXHQgKi9cblx0Y29uc3QgYXBwID0ge1xuXG5cdFx0LyoqXG5cdFx0ICogRGV0ZXJtaW5lIGlmIHRoZSBub3RpY2Ugd2FzIHNob3duIGJlZm9yZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguMVxuXHRcdCAqL1xuXHRcdGlzTm90aWNlVmlzaWJsZTogZmFsc2UsXG5cblx0XHQvKipcblx0XHQgKiBJZGVudGlmaWVyIGZvciB0aGUgcGx1Z2luIGFuZCBub3RpY2UuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS45LjVcblx0XHQgKi9cblx0XHRwbHVnaW5JZDogJ3dwZm9ybXMtZWRpdC1wb3N0LXByb2R1Y3QtZWR1Y2F0aW9uLWd1aWRlJyxcblxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0IHRoZSBlbmdpbmUuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjFcblx0XHQgKi9cblx0XHRpbml0KCkge1xuXHRcdFx0JCggd2luZG93ICkub24oICdsb2FkJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIEluIHRoZSBjYXNlIG9mIGpRdWVyeSAzLissIHdlIG5lZWQgdG8gd2FpdCBmb3IgYSByZWFkeSBldmVudCBmaXJzdC5cblx0XHRcdFx0aWYgKCB0eXBlb2YgJC5yZWFkeS50aGVuID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0XHRcdCQucmVhZHkudGhlbiggYXBwLmxvYWQgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcHAubG9hZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFBhZ2UgbG9hZC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguMVxuXHRcdCAqIEBzaW5jZSAxLjkuNSBBZGRlZCBjb21wYXRpYmlsaXR5IGZvciB0aGUgU2l0ZSBFZGl0b3IuXG5cdFx0ICovXG5cdFx0bG9hZCgpIHtcblx0XHRcdGlmICggISBhcHAuaXNHdXRlbmJlcmdFZGl0b3IoKSApIHtcblx0XHRcdFx0YXBwLm1heWJlU2hvd0NsYXNzaWNOb3RpY2UoKTtcblx0XHRcdFx0YXBwLmJpbmRDbGFzc2ljRXZlbnRzKCk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRhcHAubWF5YmVTaG93R3V0ZW5iZXJnTm90aWNlKCk7XG5cblx0XHRcdC8vIFwiY29yZS9lZGl0LXNpdGVcIiBzdG9yZSBhdmFpbGFibGUgb25seSBpbiB0aGUgU2l0ZSBFZGl0b3IuXG5cdFx0XHRpZiAoICEhIHdwLmRhdGEuc2VsZWN0KCBjb3JlRWRpdFNpdGUgKSApIHtcblx0XHRcdFx0YXBwLnN1YnNjcmliZUZvclNpdGVFZGl0b3IoKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGFwcC5zdWJzY3JpYmVGb3JCbG9ja0VkaXRvcigpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBUaGlzIG1ldGhvZCBsaXN0ZW5zIGZvciBjaGFuZ2VzIGluIHRoZSBXb3JkUHJlc3MgZGF0YSBzdG9yZSBhbmQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOlxuXHRcdCAqIC0gTW9uaXRvcnMgdGhlIGVkaXRvciB0aXRsZSBhbmQgZm9jdXMgbW9kZSB0byBkZXRlY3QgY2hhbmdlcy5cblx0XHQgKiAtIERpc21pc3NlcyBhIGN1c3RvbSBub3RpY2UgaWYgdGhlIGZvY3VzIG1vZGUgaXMgZGlzYWJsZWQgYW5kIHRoZSBub3RpY2UgaXMgdmlzaWJsZS5cblx0XHQgKiAtIFNob3dzIGEgY3VzdG9tIEd1dGVuYmVyZyBub3RpY2UgaWYgdGhlIHRpdGxlIG9yIGZvY3VzIG1vZGUgY2hhbmdlcy5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjkuNVxuXHRcdCAqL1xuXHRcdHN1YnNjcmliZUZvclNpdGVFZGl0b3IoKSB7XG5cdFx0XHQvLyBTdG9yZSB0aGUgaW5pdGlhbCBlZGl0b3IgdGl0bGUgYW5kIGZvY3VzIG1vZGUgc3RhdGUuXG5cdFx0XHRsZXQgcHJldlRpdGxlID0gYXBwLmdldEVkaXRvclRpdGxlKCk7XG5cdFx0XHRsZXQgcHJldkZvY3VzTW9kZSA9IG51bGw7XG5cdFx0XHRjb25zdCB7IHN1YnNjcmliZSwgc2VsZWN0LCBkaXNwYXRjaCB9ID0gd3AuZGF0YTtcblxuXHRcdFx0Ly8gTGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBXb3JkUHJlc3MgZGF0YSBzdG9yZS5cblx0XHRcdHN1YnNjcmliZSggKCkgPT4ge1xuXHRcdFx0XHQvLyBGZXRjaCB0aGUgY3VycmVudCBlZGl0b3IgbW9kZSBzZXR0aW5nLlxuXHRcdFx0XHQvLyBJZiB0cnVlIC0gU2l0ZSBFZGl0b3IgY2FudmFzIGlzIG9wZW5lZCwgYW5kIHlvdSBjYW4gZWRpdCBzb21ldGhpbmcuXG5cdFx0XHRcdC8vIElmIGZhbHNlIC0geW91IHNob3VsZCBzZWUgdGhlIHNpZGViYXIgd2l0aCBuYXZpZ2F0aW9uIGFuZCBwcmV2aWV3XG5cdFx0XHRcdC8vIHdpdGggc2VsZWN0ZWQgdGVtcGxhdGUgb3IgcGFnZS5cblx0XHRcdFx0Y29uc3QgeyBmb2N1c01vZGUgfSA9IHNlbGVjdCggY29yZUVkaXRvciApLmdldEVkaXRvclNldHRpbmdzKCk7XG5cblx0XHRcdFx0Ly8gSWYgZm9jdXMgbW9kZSBpcyBkaXNhYmxlZCBhbmQgYSBub3RpY2UgaXMgdmlzaWJsZSwgcmVtb3ZlIHRoZSBub3RpY2UuXG5cdFx0XHRcdC8vIFRoaXMgaXMgZXNzZW50aWFsIGJlY2F1c2UgdXNlciBjYW4gc3dpdGNoIHBhZ2VzIC8gdGVtcGxhdGVzXG5cdFx0XHRcdC8vIHdpdGhvdXQgYSBwYWdlLXJlbG9hZC5cblx0XHRcdFx0aWYgKCAhIGZvY3VzTW9kZSAmJiBhcHAuaXNOb3RpY2VWaXNpYmxlICkge1xuXHRcdFx0XHRcdGFwcC5pc05vdGljZVZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRwcmV2Rm9jdXNNb2RlID0gZm9jdXNNb2RlO1xuXG5cdFx0XHRcdFx0ZGlzcGF0Y2goIGNvcmVOb3RpY2VzICkucmVtb3ZlTm90aWNlKCBhcHAucGx1Z2luSWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRpdGxlID0gYXBwLmdldEVkaXRvclRpdGxlKCk7XG5cblx0XHRcdFx0Ly8gSWYgbmVpdGhlciB0aGUgdGl0bGUgbm9yIHRoZSBmb2N1cyBtb2RlIGhhcyBjaGFuZ2VkLCBkbyBub3RoaW5nLlxuXHRcdFx0XHRpZiAoIHByZXZUaXRsZSA9PT0gdGl0bGUgJiYgcHJldkZvY3VzTW9kZSA9PT0gZm9jdXNNb2RlICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgdGl0bGUgYW5kIGZvY3VzIG1vZGUgdmFsdWVzIGZvciB0aGUgbmV4dCBzdWJzY3JpcHRpb24gY3ljbGUuXG5cdFx0XHRcdHByZXZUaXRsZSA9IHRpdGxlO1xuXHRcdFx0XHRwcmV2Rm9jdXNNb2RlID0gZm9jdXNNb2RlO1xuXG5cdFx0XHRcdC8vIFNob3cgYSBjdXN0b20gR3V0ZW5iZXJnIG5vdGljZSBpZiBjb25kaXRpb25zIGFyZSBtZXQuXG5cdFx0XHRcdGFwcC5tYXliZVNob3dHdXRlbmJlcmdOb3RpY2UoKTtcblx0XHRcdH0gKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogU3Vic2NyaWJlcyB0byBjaGFuZ2VzIGluIHRoZSBXb3JkUHJlc3MgYmxvY2sgZWRpdG9yIGFuZCBtb25pdG9ycyB0aGUgZWRpdG9yJ3MgdGl0bGUuXG5cdFx0ICogV2hlbiB0aGUgdGl0bGUgY2hhbmdlcywgaXQgdHJpZ2dlcnMgYSBwcm9jZXNzIHRvIHBvdGVudGlhbGx5IGRpc3BsYXkgYSBHdXRlbmJlcmcgbm90aWNlLlxuXHRcdCAqIFRoZSBzdWJzY3JpcHRpb24gaXMgYXV0b21hdGljYWxseSBzdG9wcGVkIGlmIHRoZSBub3RpY2UgYmVjb21lcyB2aXNpYmxlLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOS41XG5cdFx0ICovXG5cdFx0c3Vic2NyaWJlRm9yQmxvY2tFZGl0b3IoKSB7XG5cdFx0XHRsZXQgcHJldlRpdGxlID0gYXBwLmdldEVkaXRvclRpdGxlKCk7XG5cdFx0XHRjb25zdCB7IHN1YnNjcmliZSB9ID0gd3AuZGF0YTtcblxuXHRcdFx0Ly8gU3Vic2NyaWJlIHRvIFdvcmRQcmVzcyBkYXRhIGNoYW5nZXMuXG5cdFx0XHRjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSggKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0aXRsZSA9IGFwcC5nZXRFZGl0b3JUaXRsZSgpO1xuXG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSB0aXRsZSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgdmFsdWUuXG5cdFx0XHRcdGlmICggcHJldlRpdGxlID09PSB0aXRsZSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIHByZXZpb3VzIHRpdGxlIHRvIHRoZSBjdXJyZW50IHRpdGxlLlxuXHRcdFx0XHRwcmV2VGl0bGUgPSB0aXRsZTtcblxuXHRcdFx0XHRhcHAubWF5YmVTaG93R3V0ZW5iZXJnTm90aWNlKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIG5vdGljZSBpcyB2aXNpYmxlLCBzdG9wIHRoZSBXb3JkUHJlc3MgZGF0YSBzdWJzY3JpcHRpb24uXG5cdFx0XHRcdGlmICggYXBwLmlzTm90aWNlVmlzaWJsZSApIHtcblx0XHRcdFx0XHR1bnN1YnNjcmliZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHJpZXZlcyB0aGUgdGl0bGUgb2YgdGhlIHBvc3QgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4gSWYgaW4gdGhlIFNpdGUgRWRpdG9yLFxuXHRcdCAqIGl0IGF0dGVtcHRzIHRvIGZldGNoIHRoZSB0aXRsZSBmcm9tIHRoZSB0b3Btb3N0IGhlYWRpbmcgYmxvY2suIE90aGVyd2lzZSwgaXRcblx0XHQgKiByZXRyaWV2ZXMgdGhlIHRpdGxlIGF0dHJpYnV0ZSBvZiB0aGUgZWRpdGVkIHBvc3QuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS45LjVcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBvc3QgdGl0bGUgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHRpdGxlIGlzIGZvdW5kLlxuXHRcdCAqL1xuXHRcdGdldEVkaXRvclRpdGxlKCkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3QgfSA9IHdwLmRhdGE7XG5cblx0XHRcdC8vIFJldHJpZXZlIHRoZSB0aXRsZSBmb3IgUG9zdCBFZGl0b3IuXG5cdFx0XHRpZiAoICEgc2VsZWN0KCBjb3JlRWRpdFNpdGUgKSApIHtcblx0XHRcdFx0cmV0dXJuIHNlbGVjdCggY29yZUVkaXRvciApLmdldEVkaXRlZFBvc3RBdHRyaWJ1dGUoICd0aXRsZScgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhcHAuaXNFZGl0UG9zdEZTRSgpICkge1xuXHRcdFx0XHRyZXR1cm4gYXBwLmdldFBvc3RUaXRsZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXBwLmdldFRvcG1vc3RIZWFkaW5nVGl0bGUoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmV0cmlldmVzIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBoZWFkaW5nIGJsb2NrLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOS41XG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0b3Btb3N0IGhlYWRpbmcgY29udGVudCBvciBudWxsIGlmIG5vdCBmb3VuZC5cblx0XHQgKi9cblx0XHRnZXRUb3Btb3N0SGVhZGluZ1RpdGxlKCkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3QgfSA9IHdwLmRhdGE7XG5cblx0XHRcdGNvbnN0IGhlYWRpbmdzID0gc2VsZWN0KCBjb3JlQmxvY2tFZGl0b3IgKS5nZXRCbG9ja3NCeU5hbWUoIGNvcmVIZWFkaW5nICk7XG5cblx0XHRcdGlmICggISBoZWFkaW5ncy5sZW5ndGggKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaGVhZGluZ0Jsb2NrID0gc2VsZWN0KCBjb3JlQmxvY2tFZGl0b3IgKS5nZXRCbG9jayggaGVhZGluZ3NbIDAgXSApO1xuXG5cdFx0XHRyZXR1cm4gaGVhZGluZ0Jsb2NrPy5hdHRyaWJ1dGVzPy5jb250ZW50Py50ZXh0ID8/ICcnO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IGVkaXRpbmcgY29udGV4dCBpcyBmb3IgYSBwb3N0IHR5cGUgaW4gdGhlIEZ1bGwgU2l0ZSBFZGl0b3IgKEZTRSkuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS45LjVcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGN1cnJlbnQgY29udGV4dCByZXByZXNlbnRzIGEgcG9zdCB0eXBlIGluIHRoZSBGU0UsIG90aGVyd2lzZSBmYWxzZS5cblx0XHQgKi9cblx0XHRpc0VkaXRQb3N0RlNFKCkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3QgfSA9IHdwLmRhdGE7XG5cdFx0XHRjb25zdCB7IGNvbnRleHQgfSA9IHNlbGVjdCggY29yZUVkaXRTaXRlICkuZ2V0UGFnZSgpO1xuXG5cdFx0XHRyZXR1cm4gISEgY29udGV4dD8ucG9zdFR5cGU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHJpZXZlcyB0aGUgdGl0bGUgb2YgYSBwb3N0IGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBJRCBmcm9tIHRoZSBjdXJyZW50IGVkaXRpbmcgY29udGV4dC5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjkuNVxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGl0bGUgb2YgdGhlIHBvc3QuXG5cdFx0ICovXG5cdFx0Z2V0UG9zdFRpdGxlKCkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3QgfSA9IHdwLmRhdGE7XG5cdFx0XHRjb25zdCB7IGNvbnRleHQgfSA9IHNlbGVjdCggY29yZUVkaXRTaXRlICkuZ2V0UGFnZSgpO1xuXG5cdFx0XHQvLyBVc2UgYGdldEVkaXRlZEVudGl0eVJlY29yZGAgaW5zdGVhZCBvZiBgZ2V0RW50aXR5UmVjb3JkYFxuXHRcdFx0Ly8gdG8gZmV0Y2ggdGhlIGxpdmUsIHVwZGF0ZWQgZGF0YSBmb3IgdGhlIHBvc3QgYmVpbmcgZWRpdGVkLlxuXHRcdFx0Y29uc3QgeyB0aXRsZSA9ICcnIH0gPSBzZWxlY3QoICdjb3JlJyApLmdldEVkaXRlZEVudGl0eVJlY29yZChcblx0XHRcdFx0J3Bvc3RUeXBlJyxcblx0XHRcdFx0Y29udGV4dC5wb3N0VHlwZSxcblx0XHRcdFx0Y29udGV4dC5wb3N0SWRcblx0XHRcdCkgfHwge307XG5cblx0XHRcdHJldHVybiB0aXRsZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQmluZCBldmVudHMgZm9yIENsYXNzaWMgRWRpdG9yLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC4xXG5cdFx0ICovXG5cdFx0YmluZENsYXNzaWNFdmVudHMoKSB7XG5cdFx0XHRjb25zdCAkZG9jdW1lbnQgPSAkKCBkb2N1bWVudCApO1xuXG5cdFx0XHRpZiAoICEgYXBwLmlzTm90aWNlVmlzaWJsZSApIHtcblx0XHRcdFx0JGRvY3VtZW50Lm9uKCAnaW5wdXQnLCAnI3RpdGxlJywgXy5kZWJvdW5jZSggYXBwLm1heWJlU2hvd0NsYXNzaWNOb3RpY2UsIDEwMDAgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHQkZG9jdW1lbnQub24oICdjbGljaycsICcud3Bmb3Jtcy1lZGl0LXBvc3QtZWR1Y2F0aW9uLW5vdGljZS1jbG9zZScsIGFwcC5jbG9zZU5vdGljZSApO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBEZXRlcm1pbmUgaWYgdGhlIGVkaXRvciBpcyBHdXRlbmJlcmcuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjFcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGVkaXRvciBpcyBHdXRlbmJlcmcuXG5cdFx0ICovXG5cdFx0aXNHdXRlbmJlcmdFZGl0b3IoKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHdwICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd3AuYmxvY2tzICE9PSAndW5kZWZpbmVkJztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQ3JlYXRlIGEgbm90aWNlIGZvciBHdXRlbmJlcmcuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjFcblx0XHQgKi9cblx0XHRzaG93R3V0ZW5iZXJnTm90aWNlKCkge1xuXHRcdFx0d3AuZGF0YS5kaXNwYXRjaCggY29yZU5vdGljZXMgKS5jcmVhdGVJbmZvTm90aWNlKFxuXHRcdFx0XHR3cGZvcm1zX2VkaXRfcG9zdF9lZHVjYXRpb24uZ3V0ZW5iZXJnX25vdGljZS50ZW1wbGF0ZSxcblx0XHRcdFx0YXBwLmdldEd1dGVuYmVyZ05vdGljZVNldHRpbmdzKClcblx0XHRcdCk7XG5cblx0XHRcdC8vIFRoZSBub3RpY2UgY29tcG9uZW50IGRvZXNuJ3QgaGF2ZSBhIHdheSB0byBhZGQgSFRNTCBpZCBvciBjbGFzcyB0byB0aGUgbm90aWNlLlxuXHRcdFx0Ly8gQWxzbywgdGhlIG5vdGljZSBiZWNhbWUgdmlzaWJsZSB3aXRoIGEgZGVsYXkgb24gb2xkIEd1dGVuYmVyZyB2ZXJzaW9ucy5cblx0XHRcdGNvbnN0IGhhc05vdGljZSA9IHNldEludGVydmFsKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgbm90aWNlQm9keSA9ICQoICcud3Bmb3Jtcy1lZGl0LXBvc3QtZWR1Y2F0aW9uLW5vdGljZS1ib2R5JyApO1xuXHRcdFx0XHRpZiAoICEgbm90aWNlQm9keS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgJG5vdGljZSA9IG5vdGljZUJvZHkuY2xvc2VzdCggJy5jb21wb25lbnRzLW5vdGljZScgKTtcblx0XHRcdFx0JG5vdGljZS5hZGRDbGFzcyggJ3dwZm9ybXMtZWRpdC1wb3N0LWVkdWNhdGlvbi1ub3RpY2UnICk7XG5cdFx0XHRcdCRub3RpY2UuZmluZCggJy5pcy1zZWNvbmRhcnksIC5pcy1saW5rJyApLnJlbW92ZUNsYXNzKCAnaXMtc2Vjb25kYXJ5JyApLnJlbW92ZUNsYXNzKCAnaXMtbGluaycgKS5hZGRDbGFzcyggJ2lzLXByaW1hcnknICk7XG5cblx0XHRcdFx0Ly8gV2UgY2FuJ3QgdXNlIG9uRGlzbWlzcyBjYWxsYmFjayBhcyBpdCB3YXMgaW50cm9kdWNlZCBpbiBXb3JkUHJlc3MgNi4wIG9ubHkuXG5cdFx0XHRcdGNvbnN0IGRpc21pc3NCdXR0b24gPSAkbm90aWNlLmZpbmQoICcuY29tcG9uZW50cy1ub3RpY2VfX2Rpc21pc3MnICk7XG5cdFx0XHRcdGlmICggZGlzbWlzc0J1dHRvbiApIHtcblx0XHRcdFx0XHRkaXNtaXNzQnV0dG9uLm9uKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGFwcC51cGRhdGVVc2VyTWV0YSgpO1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwoIGhhc05vdGljZSApO1xuXHRcdFx0fSwgMTAwICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEdldCBzZXR0aW5ncyBmb3IgdGhlIEd1dGVuYmVyZyBub3RpY2UuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjFcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gTm90aWNlIHNldHRpbmdzLlxuXHRcdCAqL1xuXHRcdGdldEd1dGVuYmVyZ05vdGljZVNldHRpbmdzKCkge1xuXHRcdFx0Y29uc3Qgbm90aWNlU2V0dGluZ3MgPSB7XG5cdFx0XHRcdGlkOiBhcHAucGx1Z2luSWQsXG5cdFx0XHRcdGlzRGlzbWlzc2libGU6IHRydWUsXG5cdFx0XHRcdEhUTUw6IHRydWUsXG5cdFx0XHRcdF9fdW5zdGFibGVIVE1MOiB0cnVlLFxuXHRcdFx0XHRhY3Rpb25zOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3Bmb3Jtcy1lZGl0LXBvc3QtZWR1Y2F0aW9uLW5vdGljZS1ndWlkZS1idXR0b24nLFxuXHRcdFx0XHRcdFx0dmFyaWFudDogJ3ByaW1hcnknLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdwZm9ybXNfZWRpdF9wb3N0X2VkdWNhdGlvbi5ndXRlbmJlcmdfbm90aWNlLmJ1dHRvbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKCAhIHdwZm9ybXNfZWRpdF9wb3N0X2VkdWNhdGlvbi5ndXRlbmJlcmdfZ3VpZGUgKSB7XG5cdFx0XHRcdG5vdGljZVNldHRpbmdzLmFjdGlvbnNbIDAgXS51cmwgPSB3cGZvcm1zX2VkaXRfcG9zdF9lZHVjYXRpb24uZ3V0ZW5iZXJnX25vdGljZS51cmw7XG5cblx0XHRcdFx0cmV0dXJuIG5vdGljZVNldHRpbmdzO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB7IEd1aWRlIH0gPSB3cC5jb21wb25lbnRzLFxuXHRcdFx0XHR7IHVzZVN0YXRlIH0gPSB3cC5lbGVtZW50LFxuXHRcdFx0XHR7IHJlZ2lzdGVyUGx1Z2luLCB1bnJlZ2lzdGVyUGx1Z2luIH0gPSB3cC5wbHVnaW5zO1xuXG5cdFx0XHRjb25zdCBHdXRlbmJlcmdUdXRvcmlhbCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBbIGlzT3Blbiwgc2V0SXNPcGVuIF0gPSB1c2VTdGF0ZSggdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggISBpc09wZW4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGVcblx0XHRcdFx0XHQ8R3VpZGVcblx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cImVkaXQtcG9zdC13ZWxjb21lLWd1aWRlXCJcblx0XHRcdFx0XHRcdG9uRmluaXNoPXsgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR1bnJlZ2lzdGVyUGx1Z2luKCBhcHAucGx1Z2luSWQgKTtcblx0XHRcdFx0XHRcdFx0c2V0SXNPcGVuKCBmYWxzZSApO1xuXHRcdFx0XHRcdFx0fSB9XG5cdFx0XHRcdFx0XHRwYWdlcz17IGFwcC5nZXRHdWlkZVBhZ2VzKCkgfVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRub3RpY2VTZXR0aW5ncy5hY3Rpb25zWyAwIF0ub25DbGljayA9ICgpID0+IHJlZ2lzdGVyUGx1Z2luKCBhcHAucGx1Z2luSWQsIHsgcmVuZGVyOiBHdXRlbmJlcmdUdXRvcmlhbCB9ICk7XG5cblx0XHRcdHJldHVybiBub3RpY2VTZXR0aW5ncztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogR2V0IEd1aWRlIHBhZ2VzIGluIHByb3BlciBmb3JtYXQuXG5cdFx0ICpcblx0XHQgKiBAc2luY2UgMS44LjFcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge0FycmF5fSBHdWlkZSBQYWdlcy5cblx0XHQgKi9cblx0XHRnZXRHdWlkZVBhZ2VzKCkge1xuXHRcdFx0Y29uc3QgcGFnZXMgPSBbXTtcblxuXHRcdFx0d3Bmb3Jtc19lZGl0X3Bvc3RfZWR1Y2F0aW9uLmd1dGVuYmVyZ19ndWlkZS5mb3JFYWNoKCBmdW5jdGlvbiggcGFnZSApIHtcblx0XHRcdFx0cGFnZXMucHVzaChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGUgKi9cblx0XHRcdFx0XHRcdGNvbnRlbnQ6IChcblx0XHRcdFx0XHRcdFx0PD5cblx0XHRcdFx0XHRcdFx0XHQ8aDEgY2xhc3NOYW1lPVwiZWRpdC1wb3N0LXdlbGNvbWUtZ3VpZGVfX2hlYWRpbmdcIj57IHBhZ2UudGl0bGUgfTwvaDE+XG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwiZWRpdC1wb3N0LXdlbGNvbWUtZ3VpZGVfX3RleHRcIj57IHBhZ2UuY29udGVudCB9PC9wPlxuXHRcdFx0XHRcdFx0XHQ8Lz5cblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRpbWFnZTogPGltZyBjbGFzc05hbWU9XCJlZGl0LXBvc3Qtd2VsY29tZS1ndWlkZV9faW1hZ2VcIiBzcmM9eyBwYWdlLmltYWdlIH0gYWx0PXsgcGFnZS50aXRsZSB9IC8+LFxuXHRcdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSByZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGUgKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBwYWdlcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogU2hvdyBub3RpY2UgaWYgdGhlIHBhZ2UgdGl0bGUgbWF0Y2hlcyBzb21lIGtleXdvcmRzIGZvciBDbGFzc2ljIEVkaXRvci5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguMVxuXHRcdCAqL1xuXHRcdG1heWJlU2hvd0NsYXNzaWNOb3RpY2UoKSB7XG5cdFx0XHRpZiAoIGFwcC5pc05vdGljZVZpc2libGUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhcHAuaXNUaXRsZU1hdGNoS2V5d29yZHMoICQoICcjdGl0bGUnICkudmFsKCkgKSApIHtcblx0XHRcdFx0YXBwLmlzTm90aWNlVmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0JCggJy53cGZvcm1zLWVkaXQtcG9zdC1lZHVjYXRpb24tbm90aWNlJyApLnJlbW92ZUNsYXNzKCAnd3Bmb3Jtcy1oaWRkZW4nICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNob3cgbm90aWNlIGlmIHRoZSBwYWdlIHRpdGxlIG1hdGNoZXMgc29tZSBrZXl3b3JkcyBmb3IgR3V0ZW5iZXJnIEVkaXRvci5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguMVxuXHRcdCAqL1xuXHRcdG1heWJlU2hvd0d1dGVuYmVyZ05vdGljZSgpIHtcblx0XHRcdGlmICggYXBwLmlzTm90aWNlVmlzaWJsZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB0aXRsZSA9IGFwcC5nZXRFZGl0b3JUaXRsZSgpO1xuXG5cdFx0XHRpZiAoIGFwcC5pc1RpdGxlTWF0Y2hLZXl3b3JkcyggdGl0bGUgKSApIHtcblx0XHRcdFx0YXBwLmlzTm90aWNlVmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0YXBwLnNob3dHdXRlbmJlcmdOb3RpY2UoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRGV0ZXJtaW5lIGlmIHRoZSB0aXRsZSBtYXRjaGVzIGtleXdvcmRzLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC4xXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVWYWx1ZSBQYWdlIHRpdGxlIHZhbHVlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGl0bGUgbWF0Y2hlcyBzb21lIGtleXdvcmRzLlxuXHRcdCAqL1xuXHRcdGlzVGl0bGVNYXRjaEtleXdvcmRzKCB0aXRsZVZhbHVlICkge1xuXHRcdFx0Y29uc3QgZXhwZWN0ZWRUaXRsZVJlZ2V4ID0gbmV3IFJlZ0V4cCggL1xcYihjb250YWN0fGZvcm0pXFxiL2kgKTtcblxuXHRcdFx0cmV0dXJuIGV4cGVjdGVkVGl0bGVSZWdleC50ZXN0KCB0aXRsZVZhbHVlICk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIENsb3NlIGEgbm90aWNlLlxuXHRcdCAqXG5cdFx0ICogQHNpbmNlIDEuOC4xXG5cdFx0ICovXG5cdFx0Y2xvc2VOb3RpY2UoKSB7XG5cdFx0XHQkKCB0aGlzICkuY2xvc2VzdCggJy53cGZvcm1zLWVkaXQtcG9zdC1lZHVjYXRpb24tbm90aWNlJyApLnJlbW92ZSgpO1xuXG5cdFx0XHRhcHAudXBkYXRlVXNlck1ldGEoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlIHVzZXIgbWV0YSBhbmQgZG9uJ3Qgc2hvdyB0aGUgbm90aWNlIG5leHQgdGltZS5cblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjguMVxuXHRcdCAqL1xuXHRcdHVwZGF0ZVVzZXJNZXRhKCkge1xuXHRcdFx0JC5wb3N0KFxuXHRcdFx0XHR3cGZvcm1zX2VkaXRfcG9zdF9lZHVjYXRpb24uYWpheF91cmwsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhY3Rpb246ICd3cGZvcm1zX2VkdWNhdGlvbl9kaXNtaXNzJyxcblx0XHRcdFx0XHRub25jZTogd3Bmb3Jtc19lZGl0X3Bvc3RfZWR1Y2F0aW9uLmVkdWNhdGlvbl9ub25jZSxcblx0XHRcdFx0XHRzZWN0aW9uOiAnZWRpdC1wb3N0LW5vdGljZScsXG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fSxcblx0fTtcblxuXHRyZXR1cm4gYXBwO1xufSggZG9jdW1lbnQsIHdpbmRvdywgalF1ZXJ5ICkgKTtcblxuV1BGb3Jtc0VkaXRQb3N0RWR1Y2F0aW9uLmluaXQoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJQSx3QkFBd0IsR0FBR0MsTUFBTSxDQUFDRCx3QkFBd0IsSUFBTSxVQUFVRSxRQUFRLEVBQUVELE1BQU0sRUFBRUUsQ0FBQyxFQUFHO0VBQ25HO0VBQ0EsSUFBTUMsWUFBWSxHQUFHLGdCQUFnQjtJQUNwQ0MsVUFBVSxHQUFHLGFBQWE7SUFDMUJDLGVBQWUsR0FBRyxtQkFBbUI7SUFDckNDLFdBQVcsR0FBRyxjQUFjO0lBRTVCO0lBQ0FDLFdBQVcsR0FBRyxjQUFjOztFQUU3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLElBQU1DLEdBQUcsR0FBRztJQUVYO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7SUFDRUMsZUFBZSxFQUFFLEtBQUs7SUFFdEI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtJQUNFQyxRQUFRLEVBQUUsMkNBQTJDO0lBRXJEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7SUFDRUMsSUFBSSxXQUFKQSxJQUFJQSxDQUFBLEVBQUc7TUFDTlQsQ0FBQyxDQUFFRixNQUFPLENBQUMsQ0FBQ1ksRUFBRSxDQUFFLE1BQU0sRUFBRSxZQUFXO1FBQ2xDO1FBQ0EsSUFBSyxPQUFPVixDQUFDLENBQUNXLEtBQUssQ0FBQ0MsSUFBSSxLQUFLLFVBQVUsRUFBRztVQUN6Q1osQ0FBQyxDQUFDVyxLQUFLLENBQUNDLElBQUksQ0FBRU4sR0FBRyxDQUFDTyxJQUFLLENBQUM7UUFDekIs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
},{}]},{},[1])