Changeset 2310336
- Timestamp:
- 05/22/2020 05:20:44 PM (6 years ago)
- Location:
- iframely/trunk
- Files:
-
- 3 edited
-
iframely.php (modified) (1 diff)
-
readme.txt (modified) (3 diffs)
-
ui/iframely.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
iframely/trunk/iframely.php
r2166542 r2310336 5 5 Description: Iframely for WordPress. Embed anything, with responsive widgets. 6 6 Author: Itteco Corp. 7 Version: 0.7. 17 Version: 0.7.2 8 8 Author URI: https://iframely.com/?from=wp 9 9 */ -
iframely/trunk/readme.txt
r2166542 r2310336 3 3 Tags: iframely, oembed, embed, embed code, responsive, video, amp, youtube, vimeo, instagram, gist, gif, giphy, google maps, facebook, mu, streamable, gfycat, vidme, Reddit, Tableau, spotify, prezi, apester, qzzr, tidal, mlb, media 4 4 Requires at least: 3.5.1 5 Tested up to: 5. 2.35 Tested up to: 5.4.1 6 6 Stable tag: trunk 7 7 License: MIT … … 166 166 == Changelog == 167 167 168 = 0.7.2 = 169 170 Fix scripting errors in Gutenberg editor in latest WordPress 5.4+. 171 168 172 = 0.7.0 = 169 173 … … 250 254 == Upgrade Notice == 251 255 256 = 0.7.2 = 257 258 Fix scripting errors in Gutenberg editor in latest WordPress 5.4+. 259 252 260 = 0.7.1 = 253 261 -
iframely/trunk/ui/iframely.js
r2166542 r2310336 68 68 /***/ (function(module, exports) { 69 69 70 eval("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; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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; }\n\nfunction _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; }\n\n/**\n * Iframely URL options form scripts\n */\nvar createHigherOrderComponent = wp.compose.createHigherOrderComponent;\nvar _wp$element = wp.element,\n Fragment = _wp$element.Fragment,\n RawHTML = _wp$element.RawHTML,\n renderToString = _wp$element.renderToString;\nvar InspectorControls = wp.blockEditor.InspectorControls;\n\nvar iEvent = new RegExp(\"setIframelyEmbedOptions\");\nvar PanelBody = wp.components.PanelBody;\n\nvar admHtml = 'If your <a href=\"https://iframely.com/plans\" target=\"_blank\">plan</a> supports it and config allows, Iframely will show <a href=\"https://iframely.com/docs/options\" target=\"_blank\">edit options</a> for selected URL here, whenever available.';\nvar usrHtml = 'Iframely will show edit options for selected URL here, whenever available.';\n\nfunction findIframeByContentWindow(iframes, contentWindow) {\n var foundIframe = void 0;\n for (var i = 0; i < iframes.length && !foundIframe; i++) {\n var iframe = iframes[i];\n if (iframe.contentWindow === contentWindow) {\n foundIframe = iframe;\n }\n }\n return foundIframe;\n}\n\nfunction getSelectedBlockID() {\n return wp.data.select('core/editor').getBlockSelectionStart();\n}\n\nfunction addIframelyString(url, query) {\n var newUrl = url.replace(/(?:&|\\?|&)?iframely=(.+)$/, '');\n newUrl += Object.keys(query).length === 0 ? '' : (/\\?/.test(newUrl) ? '&' : '?') + 'iframely=' + encodeURIComponent(window.btoa(JSON.stringify(query)));\n\n return newUrl;\n}\n\nfunction loadIframelyEmbedJs($w) {\n if ($w && !$w.iframely) {\n // already loaded\n var ifs = $w.document.createElement('script');ifs.type = 'text/javascript';ifs.async = true;\n ifs.src = ('https:' == document.location.protocol ? 'https:' : 'http:') + '//if-cdn.com/embed.js';\n var s = $w.document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ifs, s);\n }\n}\n\nif (iframely) {\n // Failsafe in case of iframely name space not accessible.\n // E.g. no internet connection\n iframely.on('options-changed', function (id, formContainer, query) {\n\n var selector = 'div#block-' + getSelectedBlockID();\n var iframe = document.querySelector(selector + ' iframe').contentDocument.querySelector('iframe');\n\n var preview = $(selector).find('iframe');\n\n if (preview && preview.data() && preview.data().data && preview.data().context) {\n var data = preview.data();\n\n var src = data.context;\n\n // wipe out old query completely\n if (data.data.query && data.data.query.length > 0) {\n data.data.query.forEach(function (key) {\n if (src.indexOf(key) > -1) {\n src = src.replace(new RegExp('&?' + key.replace('-', '\\\\-') + '=[^\\\\?\\\\&]+'), ''); // delete old key\n };\n });\n }\n // and add entire new query instead\n Object.keys(query).forEach(function (key) {\n src += (src.indexOf('?') > -1 ? '&' : '?') + key + '=' + query[key];\n });\n\n // load embed.js if it was missing to catch chaning sizes\n loadIframelyEmbedJs(document.querySelector(selector + ' iframe').contentWindow);\n\n iframe.src = src;\n\n wp.data.dispatch('core/block-editor').updateBlockAttributes(getSelectedBlockID(), { iquery: query });\n }\n });\n}\n\nfunction updateForm() {\n // always single instance of form for all blocks...\n var selector = 'div#block-' + getSelectedBlockID();\n var preview = $(selector).find('iframe');\n\n if (preview && $(preview).data()) {\n\n iframely.buildOptionsForm(getSelectedBlockID(), $('div#ifopts').get(0), $(preview).data().data);\n }\n}\n\nwindow.addEventListener(\"message\", function (e) {\n // Listen for messages from iframe proxy script\n if (iEvent.test(e.data)) {\n\n var frames = document.getElementsByTagName(\"iframe\"),\n iframe = findIframeByContentWindow(frames, e.source);\n\n var data = JSON.parse(e.data);\n $(iframe).data(data); // Store current state of options form in the iframe\n\n // update only if the form is open. If not, it will be built on render\n var block = wp.data.select('core/editor').getBlock(getSelectedBlockID());\n if (block && /^core\\-?\\/?embed/i.test(block.name)) {\n updateForm();\n }\n }\n}, false);\n\nfunction addAttributes(settings) {\n\n if (/^embed$/i.test(settings.category) && typeof settings.attributes !== 'undefined' && !settings.attributes.iquery) {\n settings.attributes = Object.assign(settings.attributes, {\n iquery: {\n type: 'string',\n default: ''\n }\n });\n }\n\n return settings;\n}\nwp.hooks.addFilter('blocks.registerBlockType', 'iframely/add-attributes', addAttributes);\n\nfunction saveQueryURL(element, blockType, attributes) {\n\n if (/^embed$/i.test(blockType.category), attributes.iquery && attributes.url) {\n var url = attributes.url;\n var newUrl = addIframelyString(attributes.url, attributes.iquery);\n attributes.url = newUrl; // this is to pass blocks validation\n\n // Cache busting doesn't seem to be needed\n /* \n // bust the cache preview, so it re-renders when returning to previous options\n // also warms up cache if URL is new, as the next time getEmbedPreview will return cached value\n if (wp.data.select( 'core' ).getEmbedPreview(newUrl)) {\n wp.data.dispatch('core/data').invalidateResolution( 'core', 'getEmbedPreview', [ newUrl ] );\n }\n */\n\n var s = renderToString(element).replace(/&/g, '&');\n\n var elAsString = s.replace(url, newUrl);\n\n return wp.element.createElement(\n RawHTML,\n null,\n elAsString\n );\n } else {\n return element;\n }\n}\nwp.hooks.addFilter('blocks.getSaveElement', 'iframely/save-query', saveQueryURL);\n\nvar IframelyOptions = function (_React$Component) {\n _inherits(IframelyOptions, _React$Component);\n\n function IframelyOptions() {\n _classCallCheck(this, IframelyOptions);\n\n return _possibleConstructorReturn(this, (IframelyOptions.__proto__ || Object.getPrototypeOf(IframelyOptions)).apply(this, arguments));\n }\n\n _createClass(IframelyOptions, [{\n key: 'updateEmptyPlaceholder',\n value: function updateEmptyPlaceholder() {\n // Placeholder text in case of no options exist.\n var formPlaceholder = $('div#ifopts');\n if (!formPlaceholder.html()) {\n if (wp.data.select('core').canUser('create', 'users')) {\n formPlaceholder.html(admHtml);\n } else {\n formPlaceholder.html(usrHtml);\n }\n }\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n updateForm();\n this.updateEmptyPlaceholder();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this.updateEmptyPlaceholder();\n }\n }, {\n key: 'render',\n value: function render() {\n return wp.element.createElement('div', { id: 'ifopts' });\n }\n }]);\n\n return IframelyOptions;\n}(React.Component);\n\nvar withInspectorControls = createHigherOrderComponent(function (BlockEdit) {\n return function (props) {\n if (props.isSelected === true && /^core\\-?\\/?embed/i.test(props.name)) {\n return wp.element.createElement(\n Fragment,\n null,\n wp.element.createElement(BlockEdit, props),\n wp.element.createElement(\n InspectorControls,\n null,\n wp.element.createElement(\n PanelBody,\n { title: 'Iframely options' },\n wp.element.createElement(IframelyOptions, null)\n )\n )\n );\n } else {\n return wp.element.createElement(\n Fragment,\n null,\n wp.element.createElement(BlockEdit, props)\n );\n }\n };\n}, \"withInspectorControl\");\n\nwp.hooks.addFilter('editor.BlockEdit', 'iframely/with-inspector-controls', withInspectorControls);\n// Preload to cache User Admin permission\nwp.data.select('core').canUser('create', 'users');\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanM/OTU1MiJdLCJuYW1lcyI6WyJjcmVhdGVIaWdoZXJPcmRlckNvbXBvbmVudCIsIndwIiwiY29tcG9zZSIsImVsZW1lbnQiLCJGcmFnbWVudCIsIlJhd0hUTUwiLCJyZW5kZXJUb1N0cmluZyIsIkluc3BlY3RvckNvbnRyb2xzIiwiYmxvY2tFZGl0b3IiLCJpRXZlbnQiLCJSZWdFeHAiLCJQYW5lbEJvZHkiLCJjb21wb25lbnRzIiwiYWRtSHRtbCIsInVzckh0bWwiLCJmaW5kSWZyYW1lQnlDb250ZW50V2luZG93IiwiaWZyYW1lcyIsImNvbnRlbnRXaW5kb3ciLCJmb3VuZElmcmFtZSIsImkiLCJsZW5ndGgiLCJpZnJhbWUiLCJnZXRTZWxlY3RlZEJsb2NrSUQiLCJkYXRhIiwic2VsZWN0IiwiZ2V0QmxvY2tTZWxlY3Rpb25TdGFydCIsImFkZElmcmFtZWx5U3RyaW5nIiwidXJsIiwicXVlcnkiLCJuZXdVcmwiLCJyZXBsYWNlIiwiT2JqZWN0Iiwia2V5cyIsInRlc3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ3aW5kb3ciLCJidG9hIiwiSlNPTiIsInN0cmluZ2lmeSIsImxvYWRJZnJhbWVseUVtYmVkSnMiLCIkdyIsImlmcmFtZWx5IiwiaWZzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsImFzeW5jIiwic3JjIiwibG9jYXRpb24iLCJwcm90b2NvbCIsInMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJvbiIsImlkIiwiZm9ybUNvbnRhaW5lciIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsImNvbnRlbnREb2N1bWVudCIsInByZXZpZXciLCIkIiwiZmluZCIsImNvbnRleHQiLCJmb3JFYWNoIiwia2V5IiwiaW5kZXhPZiIsImRpc3BhdGNoIiwidXBkYXRlQmxvY2tBdHRyaWJ1dGVzIiwiaXF1ZXJ5IiwidXBkYXRlRm9ybSIsImJ1aWxkT3B0aW9uc0Zvcm0iLCJnZXQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsImZyYW1lcyIsInNvdXJjZSIsInBhcnNlIiwiYmxvY2siLCJnZXRCbG9jayIsIm5hbWUiLCJhZGRBdHRyaWJ1dGVzIiwic2V0dGluZ3MiLCJjYXRlZ29yeSIsImF0dHJpYnV0ZXMiLCJhc3NpZ24iLCJkZWZhdWx0IiwiaG9va3MiLCJhZGRGaWx0ZXIiLCJzYXZlUXVlcnlVUkwiLCJibG9ja1R5cGUiLCJlbEFzU3RyaW5nIiwiSWZyYW1lbHlPcHRpb25zIiwiZm9ybVBsYWNlaG9sZGVyIiwiaHRtbCIsImNhblVzZXIiLCJ1cGRhdGVFbXB0eVBsYWNlaG9sZGVyIiwiUmVhY3QiLCJDb21wb25lbnQiLCJ3aXRoSW5zcGVjdG9yQ29udHJvbHMiLCJCbG9ja0VkaXQiLCJwcm9wcyIsImlzU2VsZWN0ZWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7OztJQUdRQSwwQixHQUErQkMsR0FBR0MsTyxDQUFsQ0YsMEI7a0JBQ3FDQyxHQUFHRSxPO0lBQXhDQyxRLGVBQUFBLFE7SUFBVUMsTyxlQUFBQSxPO0lBQVNDLGMsZUFBQUEsYztJQUNuQkMsaUIsR0FBc0JOLEdBQUdPLFcsQ0FBekJELGlCOztBQUNSLElBQU1FLFNBQVMsSUFBSUMsTUFBSixDQUFXLHlCQUFYLENBQWY7SUFDUUMsUyxHQUFjVixHQUFHVyxVLENBQWpCRCxTOztBQUNSLElBQU1FLFVBQVUsa1BBQWhCO0FBQ0EsSUFBTUMsVUFBVSw2RUFBaEI7O0FBRUEsU0FBU0MseUJBQVQsQ0FBbUNDLE9BQW5DLEVBQTRDQyxhQUE1QyxFQUEyRDtBQUN2RCxRQUFJQyxvQkFBSjtBQUNBLFNBQUksSUFBSUMsSUFBSSxDQUFaLEVBQWVBLElBQUlILFFBQVFJLE1BQVosSUFBc0IsQ0FBQ0YsV0FBdEMsRUFBbURDLEdBQW5ELEVBQXdEO0FBQ3BELFlBQUlFLFNBQVNMLFFBQVFHLENBQVIsQ0FBYjtBQUNBLFlBQUlFLE9BQU9KLGFBQVAsS0FBeUJBLGFBQTdCLEVBQTRDO0FBQ3hDQyww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Q3JFLFdBQU8sVUFBQ0MsS0FBRCxFQUFXO0FBQ2QsWUFBSUEsTUFBTUMsVUFBTixLQUFxQixJQUFyQixJQUE2QixvQkFBb0JyRSxJQUFwQixDQUF5Qm9FLE1BQU1yQixJQUEvQixDQUFqQyxFQUF1RTtBQUNuRSxtQkFDSTtBQUFDLHdCQUFEO0FBQUE7QUFDSSx5Q0FBQyxTQUFELEVBQWdCcUIsS0FBaEIsQ0FESjtBQUVJO0FBQUMscUNBQUQ7QUFBQTtBQUNRO0FBQUMsaUNBQUQ7QUFBQSwwQkFBVyxPQUFNLGtCQUFqQjtBQUNJLGlEQUFDLGVBQUQ7QUFESjtBQURSO0FBRkosYUFESjtBQVVILFNBWEQsTUFXTztBQUNILG1CQUFRO0FBQUMsd0JBQUQ7QUFBQTtBQUFVLHlDQUFDLFNBQUQsRUFBZ0JBLEtBQWhCO0FBQVYsYUFBUjtBQUNIO0FBQ0osS0FmRDtBQWdCSCxDQWpCNkIsRUFpQjNCLHNCQWpCMkIsQ0FBOUI7O0FBbUJBcEcsR0FBR3NGLEtBQUgsQ0FBU0MsU0FBVCxDQUFvQixrQkFBcEIsRUFBd0Msa0NBQXhDLEVBQTRFVyxxQkFBNUU7QUFDQTtBQUNBbEcsR0FBR3NCLElBQUgsQ0FBUUMsTUFBUixDQUFnQixNQUFoQixFQUF5QnVFLE9BQXpCLENBQWtDLFFBQWxDLEVBQTRDLE9BQTVDIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElmcmFtZWx5IFVSTCBvcHRpb25zIGZvcm0gc2NyaXB0c1xuICovXG5jb25zdCB7IGNyZWF0ZUhpZ2hlck9yZGVyQ29tcG9uZW50IH0gPSB3cC5jb21wb3NlO1xuY29uc3QgeyBGcmFnbWVudCwgUmF3SFRNTCwgcmVuZGVyVG9TdHJpbmd9ID0gd3AuZWxlbWVudDtcbmNvbnN0IHsgSW5zcGVjdG9yQ29udHJvbHMgfSA9IHdwLmJsb2NrRWRpdG9yO1xuY29uc3QgaUV2ZW50ID0gbmV3IFJlZ0V4cChcInNldElmcmFtZWx5RW1iZWRPcHRpb25zXCIpO1xuY29uc3QgeyBQYW5lbEJvZHkgfSA9IHdwLmNvbXBvbmVudHM7XG5jb25zdCBhZG1IdG1sID0gJ0lmIHlvdXIgPGEgaHJlZj1cImh0dHBzOi8vaWZyYW1lbHkuY29tL3BsYW5zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+cGxhbjwvYT4gc3VwcG9ydHMgaXQgYW5kIGNvbmZpZyBhbGxvd3MsIElmcmFtZWx5IHdpbGwgc2hvdyA8YSBocmVmPVwiaHR0cHM6Ly9pZnJhbWVseS5jb20vZG9jcy9vcHRpb25zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+ZWRpdCBvcHRpb25zPC9hPiBmb3Igc2VsZWN0ZWQgVVJMIGhlcmUsIHdoZW5ldmVyICBhdmFpbGFibGUuJztcbmNvbnN0IHVzckh0bWwgPSAnSWZyYW1lbHkgd2lsbCBzaG93IGVkaXQgb3B0aW9ucyBmb3Igc2VsZWN0ZWQgVVJMIGhlcmUsIHdoZW5ldmVyICBhdmFpbGFibGUuJztcblxuZnVuY3Rpb24gZmluZElmcmFtZUJ5Q29udGVudFdpbmRvdyhpZnJhbWVzLCBjb250ZW50V2luZG93KSB7XG4gICAgbGV0IGZvdW5kSWZyYW1lO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpZnJhbWVzLmxlbmd0aCAmJiAhZm91bmRJZnJhbWU7IGkrKykge1xuICAgICAgICBsZXQgaWZyYW1lID0gaWZyYW1lc1tpXTtcbiAgICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93ID09PSBjb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICBmb3VuZElmcmFtZSA9IGlmcmFtZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRJZnJhbWU7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGVkQmxvY2tJRCgpIHtcbiAgICByZXR1cm4gd3AuZGF0YS5zZWxlY3QoJ2NvcmUvZWRpdG9yJykuZ2V0QmxvY2tTZWxlY3Rpb25TdGFydCgpO1xufVxuXG5mdW5jdGlvbiBhZGRJZnJhbWVseVN0cmluZyh1cmwsIHF1ZXJ5KSB7XG4gICAgbGV0IG5ld1VybCA9IHVybC5yZXBsYWNlKC8oPzomYW1wO3xcXD98Jik/aWZyYW1lbHk9KC4rKSQvLCAnJyk7XG4gICAgbmV3VXJsICs9IE9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGggPT09IDAgPyAnJyA6ICgoL1xcPy8udGVzdChuZXdVcmwpID8gJyYnOiAnPycpICsgJ2lmcmFtZWx5PScgKyBlbmNvZGVVUklDb21wb25lbnQod2luZG93LmJ0b2EoSlNPTi5zdHJpbmdpZnkocXVlcnkpKSkpO1xuXG4gICAgcmV0dXJuIG5ld1VybDtcbn1cblxuZnVuY3Rpb24gbG9hZElmcmFtZWx5RW1iZWRKcygkdykge1xuICAgIGlmICgkdyAmJiAhJHcuaWZyYW1lbHkpIHsgLy8gYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdmFyIGlmcyA9ICR3LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBpZnMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOyBpZnMuYXN5bmMgPSB0cnVlO1xuICAgICAgICBpZnMuc3JjID0gKCdodHRwczonID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sID8gJ2h0dHBzOicgOiAnaHR0cDonKSArICcvL2lmLWNkbi5jb20vZW1iZWQuanMnO1xuICAgICAgICB2YXIgcyA9ICR3LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpZnMsIHMpO1xuICAgIH1cbn1cblxuaWYgKGlmcmFtZWx5KSB7XG4gICAgLy8gRmFpbHNhZmUgaW4gY2FzZSBvZiBpZnJhbWVseSBuYW1lIHNwYWNlIG5vdCBhY2Nlc3NpYmxlLlxuICAgIC8vIEUuZy4gbm8gaW50ZXJuZXQgY29ubmVjdGlvblxuICAgIGlmcmFtZWx5Lm9uKCdvcHRpb25zLWNoYW5nZWQnLCBmdW5jdGlvbihpZCwgZm9ybUNvbnRhaW5lciwgcXVlcnkpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICdkaXYjYmxvY2stJyArIGdldFNlbGVjdGVkQmxvY2tJRCgpO1xuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yICsgJyBpZnJhbWUnKS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG5cbiAgICAgICAgY29uc3QgcHJldmlldyA9ICQoc2VsZWN0b3IpLmZpbmQoJ2lmcmFtZScpO1xuXG4gICAgICAgIGlmIChwcmV2aWV3ICYmIHByZXZpZXcuZGF0YSgpICYmIHByZXZpZXcuZGF0YSgpLmRhdGEgJiYgcHJldmlldy5kYXRhKCkuY29udGV4dCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHByZXZpZXcuZGF0YSgpO1xuXG4gICAgICAgICAgICBsZXQgc3JjID0gZGF0YS5jb250ZXh0O1xuXG4gICAgICAgICAgICAvLyB3aXBlIG91dCBvbGQgcXVlcnkgY29tcGxldGVseVxuICAgICAgICAgICAgaWYgKGRhdGEuZGF0YS5xdWVyeSAmJiBkYXRhLmRhdGEucXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRhdGEuZGF0YS5xdWVyeS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmMucmVwbGFjZSAobmV3IFJlZ0V4cCAoJyY/JyArIGtleS5yZXBsYWNlKCctJywgJ1xcXFwtJykgKyAnPVteXFxcXD9cXFxcJl0rJyksICcnKTsgLy8gZGVsZXRlIG9sZCBrZXlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFuZCBhZGQgZW50aXJlIG5ldyBxdWVyeSBpbnN0ZWFkXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICBzcmMgKz0gKHNyYy5pbmRleE9mKCc/JykgPiAtMSA/ICcmJyA6ICc/JykgKyBrZXkgKyAnPScgKyBxdWVyeVtrZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGxvYWQgZW1iZWQuanMgaWYgaXQgd2FzIG1pc3NpbmcgdG8gY2F0Y2ggY2hhbmluZyBzaXplc1xuICAgICAgICAgICAgbG9hZElmcmFtZWx5RW1iZWRKcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yICsgJyBpZnJhbWUnKS5jb250ZW50V2luZG93KTtcblxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IHNyYztcblxuICAgICAgICAgICAgd3AuZGF0YS5kaXNwYXRjaCgnY29yZS9ibG9jay1lZGl0b3InKS51cGRhdGVCbG9ja0F0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRCbG9ja0lEKCksXG4gICAgICAgICAgICAgICAge2lxdWVyeTogcXVlcnl9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcm0gKCkgeyAvLyBhbHdheXMgc2luZ2xlIGluc3RhbmNlIG9mIGZvcm0gZm9yIGFsbCBibG9ja3MuLi5cbiAgICBsZXQgc2VsZWN0b3IgPSAnZGl2I2Jsb2NrLScgKyBnZXRTZWxlY3RlZEJsb2NrSUQoKTtcbiAgICBsZXQgcHJldmlldyA9ICQoc2VsZWN0b3IpLmZpbmQoJ2lmcmFtZScpO1xuXG4gICAgaWYgKHByZXZpZXcgJiYgJChwcmV2aWV3KS5kYXRhKCkpIHtcblxuICAgICAgICBpZnJhbWVseS5idWlsZE9wdGlvbnNGb3JtKFxuICAgICAgICAgICAgZ2V0U2VsZWN0ZWRCbG9ja0lEKCksXG4gICAgICAgICAgICAkKCdkaXYjaWZvcHRzJykuZ2V0KDApLCBcbiAgICAgICAgICAgICQocHJldmlldykuZGF0YSgpLmRhdGFcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihlKSB7XG4gICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIGlmcmFtZSBwcm94eSBzY3JpcHRcbiAgICBpZihpRXZlbnQudGVzdChlLmRhdGEpKSB7XG5cbiAgICAgICAgbGV0IGZyYW1lcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaWZyYW1lXCIpLFxuICAgICAgICAgICAgaWZyYW1lID0gZmluZElmcmFtZUJ5Q29udGVudFdpbmRvdyhmcmFtZXMsIGUuc291cmNlKTtcblxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgJChpZnJhbWUpLmRhdGEoZGF0YSk7IC8vIFN0b3JlIGN1cnJlbnQgc3RhdGUgb2Ygb3B0aW9ucyBmb3JtIGluIHRoZSBpZnJhbWVcblxuICAgICAgICAvLyB1cGRhdGUgb25seSBpZiB0aGUgZm9ybSBpcyBvcGVuLiBJZiBub3QsIGl0IHdpbGwgYmUgYnVpbHQgb24gcmVuZGVyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gd3AuZGF0YS5zZWxlY3QoJ2NvcmUvZWRpdG9yJykuZ2V0QmxvY2soZ2V0U2VsZWN0ZWRCbG9ja0lEKCkpO1xuICAgICAgICBpZiAoYmxvY2sgJiYgL15jb3JlXFwtP1xcLz9lbWJlZC9pLnRlc3QoYmxvY2submFtZSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZUZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbn0sZmFsc2UpO1xuXG5mdW5jdGlvbiBhZGRBdHRyaWJ1dGVzIChzZXR0aW5ncykge1xuXG4gICAgaWYgKC9eZW1iZWQkL2kudGVzdChzZXR0aW5ncy5jYXRlZ29yeSkgJiYgdHlwZW9mIHNldHRpbmdzLmF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmICFzZXR0aW5ncy5hdHRyaWJ1dGVzLmlxdWVyeSkge1xuICAgICAgICBzZXR0aW5ncy5hdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbihzZXR0aW5ncy5hdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBpcXVlcnk6eyBcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTsgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xufVxud3AuaG9va3MuYWRkRmlsdGVyICgnYmxvY2tzLnJlZ2lzdGVyQmxvY2tUeXBlJywgJ2lmcmFtZWx5L2FkZC1hdHRyaWJ1dGVzJywgYWRkQXR0cmlidXRlcyk7XG5cblxuZnVuY3Rpb24gc2F2ZVF1ZXJ5VVJMIChlbGVtZW50LCBibG9ja1R5cGUsIGF0dHJpYnV0ZXMpIHtcblxuICAgIGlmICgvXmVtYmVkJC9pLnRlc3QoYmxvY2tUeXBlLmNhdGVnb3J5KSwgYXR0cmlidXRlcy5pcXVlcnkgJiYgYXR0cmlidXRlcy51cmwpIHtcbiAgICAgICAgbGV0IHVybCA9IGF0dHJpYnV0ZXMudXJsO1xuICAgICAgICBsZXQgbmV3VXJsID0gYWRkSWZyYW1lbHlTdHJpbmcoYXR0cmlidXRlcy51cmwsIGF0dHJpYnV0ZXMuaXF1ZXJ5KTtcbiAgICAgICAgYXR0cmlidXRlcy51cmwgPSBuZXdVcmw7IC8vIHRoaXMgaXMgdG8gcGFzcyBibG9ja3MgdmFsaWRhdGlvblxuXG4vLyBDYWNoZSBidXN0aW5nIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWVkZWRcbi8qIFxuICAgIC8vIGJ1c3QgdGhlIGNhY2hlIHByZXZpZXcsIHNvIGl0IHJlLXJlbmRlcnMgd2hlbiByZXR1cm5pbmcgdG8gcHJldmlvdXMgb3B0aW9uc1xuICAgIC8vIGFsc28gd2FybXMgdXAgY2FjaGUgaWYgVVJMIGlzIG5ldywgYXMgdGhlIG5leHQgdGltZSBnZXRFbWJlZFByZXZpZXcgd2lsbCByZXR1cm4gY2FjaGVkIHZhbHVlXG4gICAgaWYgKHdwLmRhdGEuc2VsZWN0KCAnY29yZScgKS5nZXRFbWJlZFByZXZpZXcobmV3VXJsKSkge1xuICAgICAgICB3cC5kYXRhLmRpc3BhdGNoKCdjb3JlL2RhdGEnKS5pbnZhbGlkYXRlUmVzb2x1dGlvbiggJ2NvcmUnLCAnZ2V0RW1iZWRQcmV2aWV3JywgWyBuZXdVcmwgXSApO1xuICAgIH1cbiovICAgICAgICBcblxuICAgICAgICBsZXQgcyA9IHJlbmRlclRvU3RyaW5nKGVsZW1lbnQpLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG5cbiAgICAgICAgbGV0IGVsQXNTdHJpbmcgPSBzLnJlcGxhY2UodXJsLCBuZXdVcmwpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8UmF3SFRNTD57ZWxBc1N0cmluZ308L1Jhd0hUTUw+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxufVxud3AuaG9va3MuYWRkRmlsdGVyICgnYmxvY2tzLmdldFNhdmVFbGVtZW50JywgJ2lmcmFtZWx5L3NhdmUtcXVlcnknLCBzYXZlUXVlcnlVUkwpO1xuXG5cbmNsYXNzIElmcmFtZWx5T3B0aW9ucyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG5cbiAgICB1cGRhdGVFbXB0eVBsYWNlaG9sZGVyKCkge1xuICAgICAgICAvLyBQbGFjZWhvbGRlciB0ZXh0IGluIGNhc2Ugb2Ygbm8gb3B0aW9ucyBleGlzdC5cbiAgICAgICAgbGV0IGZvcm1QbGFjZWhvbGRlciA9ICQoJ2RpdiNpZm9wdHMnKTtcbiAgICAgICAgaWYgKCFmb3JtUGxhY2Vob2xkZXIuaHRtbCgpKSB7XG4gICAgICAgICAgICBpZiAod3AuZGF0YS5zZWxlY3QoICdjb3JlJyApLmNhblVzZXIoICdjcmVhdGUnLCAndXNlcnMnICkpIHtcbiAgICAgICAgICAgICAgICBmb3JtUGxhY2Vob2xkZXIuaHRtbChhZG1IdG1sKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybVBsYWNlaG9sZGVyLmh0bWwodXNySHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdXBkYXRlRm9ybSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUVtcHR5UGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRW1wdHlQbGFjZWhvbGRlcigpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgaWQ9XCJpZm9wdHNcIj48L2Rpdj47XG4gICAgfVxufVxuXG5jb25zdCB3aXRoSW5zcGVjdG9yQ29udHJvbHMgPSBjcmVhdGVIaWdoZXJPcmRlckNvbXBvbmVudCggKEJsb2NrRWRpdCkgPT4ge1xuICAgIHJldHVybiAocHJvcHMpID0+IHsgICAgICAgIFxuICAgICAgICBpZiAocHJvcHMuaXNTZWxlY3RlZCA9PT0gdHJ1ZSAmJiAvXmNvcmVcXC0/XFwvP2VtYmVkL2kudGVzdChwcm9wcy5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxCbG9ja0VkaXQgeyAuLi5wcm9wcyB9IC8+XG4gICAgICAgICAgICAgICAgICAgIDxJbnNwZWN0b3JDb250cm9scz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGFuZWxCb2R5IHRpdGxlPVwiSWZyYW1lbHkgb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWZyYW1lbHlPcHRpb25zLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1BhbmVsQm9keT5cbiAgICAgICAgICAgICAgICAgICAgPC9JbnNwZWN0b3JDb250cm9scz5cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoPEZyYWdtZW50PjxCbG9ja0VkaXQgeyAuLi5wcm9wcyB9IC8+PC9GcmFnbWVudD4pO1xuICAgICAgICB9XG4gICAgfTtcbn0sIFwid2l0aEluc3BlY3RvckNvbnRyb2xcIiApO1xuXG53cC5ob29rcy5hZGRGaWx0ZXIoICdlZGl0b3IuQmxvY2tFZGl0JywgJ2lmcmFtZWx5L3dpdGgtaW5zcGVjdG9yLWNvbnRyb2xzJywgd2l0aEluc3BlY3RvckNvbnRyb2xzICk7XG4vLyBQcmVsb2FkIHRvIGNhY2hlIFVzZXIgQWRtaW4gcGVybWlzc2lvblxud3AuZGF0YS5zZWxlY3QoICdjb3JlJyApLmNhblVzZXIoICdjcmVhdGUnLCAndXNlcnMnICk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n");70 eval("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; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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; }\n\nfunction _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; }\n\n/**\n * Iframely URL options form scripts\n */\nvar createHigherOrderComponent = wp.compose.createHigherOrderComponent;\nvar _wp$element = wp.element,\n Fragment = _wp$element.Fragment,\n RawHTML = _wp$element.RawHTML,\n renderToString = _wp$element.renderToString;\nvar InspectorControls = wp.blockEditor.InspectorControls;\n\nvar iEvent = new RegExp(\"setIframelyEmbedOptions\");\nvar PanelBody = wp.components.PanelBody;\n\nvar admHtml = 'If your <a href=\"https://iframely.com/plans\" target=\"_blank\">plan</a> supports it and config allows, Iframely will show <a href=\"https://iframely.com/docs/options\" target=\"_blank\">edit options</a> for selected URL here, whenever available.';\nvar usrHtml = 'Iframely will show edit options for selected URL here, whenever available.';\n\nfunction findIframeByContentWindow(iframes, contentWindow) {\n var foundIframe = void 0;\n for (var i = 0; i < iframes.length && !foundIframe; i++) {\n var iframe = iframes[i];\n if (iframe.contentWindow === contentWindow) {\n foundIframe = iframe;\n }\n }\n return foundIframe;\n}\n\nfunction getSelectedBlockID() {\n return wp.data.select('core/editor').getBlockSelectionStart();\n}\n\nfunction addIframelyString(url, query) {\n var newUrl = url.replace(/(?:&|\\?|&)?iframely=(.+)$/, '');\n newUrl += Object.keys(query).length === 0 ? '' : (/\\?/.test(newUrl) ? '&' : '?') + 'iframely=' + encodeURIComponent(window.btoa(JSON.stringify(query)));\n\n return newUrl;\n}\n\nfunction loadIframelyEmbedJs($w) {\n if ($w && !$w.iframely) {\n // already loaded\n var ifs = $w.document.createElement('script');ifs.type = 'text/javascript';ifs.async = true;\n ifs.src = ('https:' == document.location.protocol ? 'https:' : 'http:') + '//if-cdn.com/embed.js';\n var s = $w.document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ifs, s);\n }\n}\n\nif (iframely) {\n // Failsafe in case of iframely name space not accessible.\n // E.g. no internet connection\n iframely.on('options-changed', function (id, formContainer, query) {\n\n var selector = 'div#block-' + getSelectedBlockID();\n var iframe = document.querySelector(selector + ' iframe').contentDocument.querySelector('iframe');\n\n var preview = jQuery(selector).find('iframe');\n\n if (preview && preview.data() && preview.data().data && preview.data().context) {\n var data = preview.data();\n\n var src = data.context;\n\n // wipe out old query completely\n if (data.data.query && data.data.query.length > 0) {\n data.data.query.forEach(function (key) {\n if (src.indexOf(key) > -1) {\n src = src.replace(new RegExp('&?' + key.replace('-', '\\\\-') + '=[^\\\\?\\\\&]+'), ''); // delete old key\n };\n });\n }\n // and add entire new query instead\n Object.keys(query).forEach(function (key) {\n src += (src.indexOf('?') > -1 ? '&' : '?') + key + '=' + query[key];\n });\n\n // load embed.js if it was missing to catch chaning sizes\n loadIframelyEmbedJs(document.querySelector(selector + ' iframe').contentWindow);\n\n iframe.src = src;\n\n wp.data.dispatch('core/block-editor').updateBlockAttributes(getSelectedBlockID(), { iquery: query });\n }\n });\n}\n\nfunction updateForm() {\n // always single instance of form for all blocks...\n var selector = 'div#block-' + getSelectedBlockID();\n var preview = jQuery(selector).find('iframe');\n\n if (preview && jQuery(preview).data()) {\n\n iframely.buildOptionsForm(getSelectedBlockID(), jQuery('div#ifopts').get(0), jQuery(preview).data().data);\n }\n}\n\nwindow.addEventListener(\"message\", function (e) {\n // Listen for messages from iframe proxy script\n if (iEvent.test(e.data)) {\n\n var frames = document.getElementsByTagName(\"iframe\"),\n iframe = findIframeByContentWindow(frames, e.source);\n\n var data = JSON.parse(e.data);\n jQuery(iframe).data(data); // Store current state of options form in the iframe\n\n // update only if the form is open. If not, it will be built on render\n var block = wp.data.select('core/editor').getBlock(getSelectedBlockID());\n if (block && /^core\\-?\\/?embed/i.test(block.name)) {\n updateForm();\n }\n }\n}, false);\n\nfunction addAttributes(settings) {\n\n if (/^embed$/i.test(settings.category) && typeof settings.attributes !== 'undefined' && !settings.attributes.iquery) {\n settings.attributes = Object.assign(settings.attributes, {\n iquery: {\n type: 'string',\n default: ''\n }\n });\n }\n\n return settings;\n}\nwp.hooks.addFilter('blocks.registerBlockType', 'iframely/add-attributes', addAttributes);\n\nfunction saveQueryURL(element, blockType, attributes) {\n\n if (/^embed$/i.test(blockType.category), attributes.iquery && attributes.url) {\n var url = attributes.url;\n var newUrl = addIframelyString(attributes.url, attributes.iquery);\n attributes.url = newUrl; // this is to pass blocks validation\n\n // Cache busting doesn't seem to be needed\n /* \n // bust the cache preview, so it re-renders when returning to previous options\n // also warms up cache if URL is new, as the next time getEmbedPreview will return cached value\n if (wp.data.select( 'core' ).getEmbedPreview(newUrl)) {\n wp.data.dispatch('core/data').invalidateResolution( 'core', 'getEmbedPreview', [ newUrl ] );\n }\n */\n\n var s = renderToString(element).replace(/&/g, '&');\n\n var elAsString = s.replace(url, newUrl);\n\n return wp.element.createElement(\n RawHTML,\n null,\n elAsString\n );\n } else {\n return element;\n }\n}\nwp.hooks.addFilter('blocks.getSaveElement', 'iframely/save-query', saveQueryURL);\n\nvar IframelyOptions = function (_React$Component) {\n _inherits(IframelyOptions, _React$Component);\n\n function IframelyOptions() {\n _classCallCheck(this, IframelyOptions);\n\n return _possibleConstructorReturn(this, (IframelyOptions.__proto__ || Object.getPrototypeOf(IframelyOptions)).apply(this, arguments));\n }\n\n _createClass(IframelyOptions, [{\n key: 'updateEmptyPlaceholder',\n value: function updateEmptyPlaceholder() {\n // Placeholder text in case of no options exist.\n var formPlaceholder = jQuery('div#ifopts');\n if (!formPlaceholder.html()) {\n if (wp.data.select('core').canUser('create', 'users')) {\n formPlaceholder.html(admHtml);\n } else {\n formPlaceholder.html(usrHtml);\n }\n }\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n updateForm();\n this.updateEmptyPlaceholder();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this.updateEmptyPlaceholder();\n }\n }, {\n key: 'render',\n value: function render() {\n return wp.element.createElement('div', { id: 'ifopts' });\n }\n }]);\n\n return IframelyOptions;\n}(React.Component);\n\nvar withInspectorControls = createHigherOrderComponent(function (BlockEdit) {\n return function (props) {\n if (props.isSelected === true && /^core\\-?\\/?embed/i.test(props.name)) {\n return wp.element.createElement(\n Fragment,\n null,\n wp.element.createElement(BlockEdit, props),\n wp.element.createElement(\n InspectorControls,\n null,\n wp.element.createElement(\n PanelBody,\n { title: 'Iframely options' },\n wp.element.createElement(IframelyOptions, null)\n )\n )\n );\n } else {\n return wp.element.createElement(\n Fragment,\n null,\n wp.element.createElement(BlockEdit, props)\n );\n }\n };\n}, \"withInspectorControl\");\n\nwp.hooks.addFilter('editor.BlockEdit', 'iframely/with-inspector-controls', withInspectorControls);\n// Preload to cache User Admin permission\nwp.data.select('core').canUser('create', 'users');\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanM/OTU1MiJdLCJuYW1lcyI6WyJjcmVhdGVIaWdoZXJPcmRlckNvbXBvbmVudCIsIndwIiwiY29tcG9zZSIsImVsZW1lbnQiLCJGcmFnbWVudCIsIlJhd0hUTUwiLCJyZW5kZXJUb1N0cmluZyIsIkluc3BlY3RvckNvbnRyb2xzIiwiYmxvY2tFZGl0b3IiLCJpRXZlbnQiLCJSZWdFeHAiLCJQYW5lbEJvZHkiLCJjb21wb25lbnRzIiwiYWRtSHRtbCIsInVzckh0bWwiLCJmaW5kSWZyYW1lQnlDb250ZW50V2luZG93IiwiaWZyYW1lcyIsImNvbnRlbnRXaW5kb3ciLCJmb3VuZElmcmFtZSIsImkiLCJsZW5ndGgiLCJpZnJhbWUiLCJnZXRTZWxlY3RlZEJsb2NrSUQiLCJkYXRhIiwic2VsZWN0IiwiZ2V0QmxvY2tTZWxlY3Rpb25TdGFydCIsImFkZElmcmFtZWx5U3RyaW5nIiwidXJsIiwicXVlcnkiLCJuZXdVcmwiLCJyZXBsYWNlIiwiT2JqZWN0Iiwia2V5cyIsInRlc3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ3aW5kb3ciLCJidG9hIiwiSlNPTiIsInN0cmluZ2lmeSIsImxvYWRJZnJhbWVseUVtYmVkSnMiLCIkdyIsImlmcmFtZWx5IiwiaWZzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsImFzeW5jIiwic3JjIiwibG9jYXRpb24iLCJwcm90b2NvbCIsInMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJvbiIsImlkIiwiZm9ybUNvbnRhaW5lciIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsImNvbnRlbnREb2N1bWVudCIsInByZXZpZXciLCJqUXVlcnkiLCJmaW5kIiwiY29udGV4dCIsImZvckVhY2giLCJrZXkiLCJpbmRleE9mIiwiZGlzcGF0Y2giLCJ1cGRhdGVCbG9ja0F0dHJpYnV0ZXMiLCJpcXVlcnkiLCJ1cGRhdGVGb3JtIiwiYnVpbGRPcHRpb25zRm9ybSIsImdldCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwiZnJhbWVzIiwic291cmNlIiwicGFyc2UiLCJibG9jayIsImdldEJsb2NrIiwibmFtZSIsImFkZEF0dHJpYnV0ZXMiLCJzZXR0aW5ncyIsImNhdGVnb3J5IiwiYXR0cmlidXRlcyIsImFzc2lnbiIsImRlZmF1bHQiLCJob29rcyIsImFkZEZpbHRlciIsInNhdmVRdWVyeVVSTCIsImJsb2NrVHlwZSIsImVsQXNTdHJpbmciLCJJZnJhbWVseU9wdGlvbnMiLCJmb3JtUGxhY2Vob2xkZXIiLCJodG1sIiwiY2FuVXNlciIsInVwZGF0ZUVtcHR5UGxhY2Vob2xkZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsIndpdGhJbnNwZWN0b3JDb250cm9scyIsIkJsb2NrRWRpdCIsInByb3BzIiwiaXNTZWxlY3RlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7O0lBR1FBLDBCLEdBQStCQyxHQUFHQyxPLENBQWxDRiwwQjtrQkFDcUNDLEdBQUdFLE87SUFBeENDLFEsZUFBQUEsUTtJQUFVQyxPLGVBQUFBLE87SUFBU0MsYyxlQUFBQSxjO0lBQ25CQyxpQixHQUFzQk4sR0FBR08sVyxDQUF6QkQsaUI7O0FBQ1IsSUFBTUUsU0FBUyxJQUFJQyxNQUFKLENBQVcseUJBQVgsQ0FBZjtJQUNRQyxTLEdBQWNWLEdBQUdXLFUsQ0FBakJELFM7O0FBQ1IsSUFBTUUsVUFBVSxrUEFBaEI7QUFDQSxJQUFNQyxVQUFVLDZFQUFoQjs7QUFFQSxTQUFTQyx5QkFBVCxDQUFtQ0MsT0FBbkMsRUFBNENDLGFBQTVDLEVBQTJEO0FBQ3ZELFFBQUlDLG9CQUFKO0FBQ0EsU0FBSSxJQUFJQyxJQUFJLENBQVosRUFBZUEsSUFBSUgsUUFBUUksTUFBWixJQUFzQixDQUFDRixXQUF0QyxFQUFtREMsR0FBbkQsRUFBd0Q7QUFDcEQsWUFBSUUsU0FBU0wsUUFBUUcsQ0FBUixDQUFiO0FBQ0EsWUFBSUUsT0FBT0osYUFBUCxLQUF5QkEsYUFBN0IsRUFBNEM7QUFD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b0csU0FBRCxFQUFlO0FBQ3JFLFdBQU8sVUFBQ0MsS0FBRCxFQUFXO0FBQ2QsWUFBSUEsTUFBTUMsVUFBTixLQUFxQixJQUFyQixJQUE2QixvQkFBb0JyRSxJQUFwQixDQUF5Qm9FLE1BQU1yQixJQUEvQixDQUFqQyxFQUF1RTtBQUNuRSxtQkFDSTtBQUFDLHdCQUFEO0FBQUE7QUFDSSx5Q0FBQyxTQUFELEVBQWdCcUIsS0FBaEIsQ0FESjtBQUVJO0FBQUMscUNBQUQ7QUFBQTtBQUNRO0FBQUMsaUNBQUQ7QUFBQSwwQkFBVyxPQUFNLGtCQUFqQjtBQUNJLGlEQUFDLGVBQUQ7QUFESjtBQURSO0FBRkosYUFESjtBQVVILFNBWEQsTUFXTztBQUNILG1CQUFRO0FBQUMsd0JBQUQ7QUFBQTtBQUFVLHlDQUFDLFNBQUQsRUFBZ0JBLEtBQWhCO0FBQVYsYUFBUjtBQUNIO0FBQ0osS0FmRDtBQWdCSCxDQWpCNkIsRUFpQjNCLHNCQWpCMkIsQ0FBOUI7O0FBbUJBcEcsR0FBR3NGLEtBQUgsQ0FBU0MsU0FBVCxDQUFvQixrQkFBcEIsRUFBd0Msa0NBQXhDLEVBQTRFVyxxQkFBNUU7QUFDQTtBQUNBbEcsR0FBR3NCLElBQUgsQ0FBUUMsTUFBUixDQUFnQixNQUFoQixFQUF5QnVFLE9BQXpCLENBQWtDLFFBQWxDLEVBQTRDLE9BQTVDIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElmcmFtZWx5IFVSTCBvcHRpb25zIGZvcm0gc2NyaXB0c1xuICovXG5jb25zdCB7IGNyZWF0ZUhpZ2hlck9yZGVyQ29tcG9uZW50IH0gPSB3cC5jb21wb3NlO1xuY29uc3QgeyBGcmFnbWVudCwgUmF3SFRNTCwgcmVuZGVyVG9TdHJpbmd9ID0gd3AuZWxlbWVudDtcbmNvbnN0IHsgSW5zcGVjdG9yQ29udHJvbHMgfSA9IHdwLmJsb2NrRWRpdG9yO1xuY29uc3QgaUV2ZW50ID0gbmV3IFJlZ0V4cChcInNldElmcmFtZWx5RW1iZWRPcHRpb25zXCIpO1xuY29uc3QgeyBQYW5lbEJvZHkgfSA9IHdwLmNvbXBvbmVudHM7XG5jb25zdCBhZG1IdG1sID0gJ0lmIHlvdXIgPGEgaHJlZj1cImh0dHBzOi8vaWZyYW1lbHkuY29tL3BsYW5zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+cGxhbjwvYT4gc3VwcG9ydHMgaXQgYW5kIGNvbmZpZyBhbGxvd3MsIElmcmFtZWx5IHdpbGwgc2hvdyA8YSBocmVmPVwiaHR0cHM6Ly9pZnJhbWVseS5jb20vZG9jcy9vcHRpb25zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+ZWRpdCBvcHRpb25zPC9hPiBmb3Igc2VsZWN0ZWQgVVJMIGhlcmUsIHdoZW5ldmVyICBhdmFpbGFibGUuJztcbmNvbnN0IHVzckh0bWwgPSAnSWZyYW1lbHkgd2lsbCBzaG93IGVkaXQgb3B0aW9ucyBmb3Igc2VsZWN0ZWQgVVJMIGhlcmUsIHdoZW5ldmVyICBhdmFpbGFibGUuJztcblxuZnVuY3Rpb24gZmluZElmcmFtZUJ5Q29udGVudFdpbmRvdyhpZnJhbWVzLCBjb250ZW50V2luZG93KSB7XG4gICAgbGV0IGZvdW5kSWZyYW1lO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpZnJhbWVzLmxlbmd0aCAmJiAhZm91bmRJZnJhbWU7IGkrKykge1xuICAgICAgICBsZXQgaWZyYW1lID0gaWZyYW1lc1tpXTtcbiAgICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93ID09PSBjb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICBmb3VuZElmcmFtZSA9IGlmcmFtZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRJZnJhbWU7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGVkQmxvY2tJRCgpIHtcbiAgICByZXR1cm4gd3AuZGF0YS5zZWxlY3QoJ2NvcmUvZWRpdG9yJykuZ2V0QmxvY2tTZWxlY3Rpb25TdGFydCgpO1xufVxuXG5mdW5jdGlvbiBhZGRJZnJhbWVseVN0cmluZyh1cmwsIHF1ZXJ5KSB7XG4gICAgbGV0IG5ld1VybCA9IHVybC5yZXBsYWNlKC8oPzomYW1wO3xcXD98Jik/aWZyYW1lbHk9KC4rKSQvLCAnJyk7XG4gICAgbmV3VXJsICs9IE9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGggPT09IDAgPyAnJyA6ICgoL1xcPy8udGVzdChuZXdVcmwpID8gJyYnOiAnPycpICsgJ2lmcmFtZWx5PScgKyBlbmNvZGVVUklDb21wb25lbnQod2luZG93LmJ0b2EoSlNPTi5zdHJpbmdpZnkocXVlcnkpKSkpO1xuXG4gICAgcmV0dXJuIG5ld1VybDtcbn1cblxuZnVuY3Rpb24gbG9hZElmcmFtZWx5RW1iZWRKcygkdykge1xuICAgIGlmICgkdyAmJiAhJHcuaWZyYW1lbHkpIHsgLy8gYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdmFyIGlmcyA9ICR3LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBpZnMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOyBpZnMuYXN5bmMgPSB0cnVlO1xuICAgICAgICBpZnMuc3JjID0gKCdodHRwczonID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sID8gJ2h0dHBzOicgOiAnaHR0cDonKSArICcvL2lmLWNkbi5jb20vZW1iZWQuanMnO1xuICAgICAgICB2YXIgcyA9ICR3LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpZnMsIHMpO1xuICAgIH1cbn1cblxuaWYgKGlmcmFtZWx5KSB7XG4gICAgLy8gRmFpbHNhZmUgaW4gY2FzZSBvZiBpZnJhbWVseSBuYW1lIHNwYWNlIG5vdCBhY2Nlc3NpYmxlLlxuICAgIC8vIEUuZy4gbm8gaW50ZXJuZXQgY29ubmVjdGlvblxuICAgIGlmcmFtZWx5Lm9uKCdvcHRpb25zLWNoYW5nZWQnLCBmdW5jdGlvbihpZCwgZm9ybUNvbnRhaW5lciwgcXVlcnkpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICdkaXYjYmxvY2stJyArIGdldFNlbGVjdGVkQmxvY2tJRCgpO1xuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yICsgJyBpZnJhbWUnKS5jb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG5cbiAgICAgICAgY29uc3QgcHJldmlldyA9IGpRdWVyeShzZWxlY3RvcikuZmluZCgnaWZyYW1lJyk7XG5cbiAgICAgICAgaWYgKHByZXZpZXcgJiYgcHJldmlldy5kYXRhKCkgJiYgcHJldmlldy5kYXRhKCkuZGF0YSAmJiBwcmV2aWV3LmRhdGEoKS5jb250ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcHJldmlldy5kYXRhKCk7XG5cbiAgICAgICAgICAgIGxldCBzcmMgPSBkYXRhLmNvbnRleHQ7XG5cbiAgICAgICAgICAgIC8vIHdpcGUgb3V0IG9sZCBxdWVyeSBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoZGF0YS5kYXRhLnF1ZXJ5ICYmIGRhdGEuZGF0YS5xdWVyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5kYXRhLnF1ZXJ5LmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5yZXBsYWNlIChuZXcgUmVnRXhwICgnJj8nICsga2V5LnJlcGxhY2UoJy0nLCAnXFxcXC0nKSArICc9W15cXFxcP1xcXFwmXSsnKSwgJycpOyAvLyBkZWxldGUgb2xkIGtleVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYW5kIGFkZCBlbnRpcmUgbmV3IHF1ZXJ5IGluc3RlYWRcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgICAgIHNyYyArPSAoc3JjLmluZGV4T2YoJz8nKSA+IC0xID8gJyYnIDogJz8nKSArIGtleSArICc9JyArIHF1ZXJ5W2tleV07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gbG9hZCBlbWJlZC5qcyBpZiBpdCB3YXMgbWlzc2luZyB0byBjYXRjaCBjaGFuaW5nIHNpemVzXG4gICAgICAgICAgICBsb2FkSWZyYW1lbHlFbWJlZEpzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IgKyAnIGlmcmFtZScpLmNvbnRlbnRXaW5kb3cpO1xuXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gc3JjO1xuXG4gICAgICAgICAgICB3cC5kYXRhLmRpc3BhdGNoKCdjb3JlL2Jsb2NrLWVkaXRvcicpLnVwZGF0ZUJsb2NrQXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZEJsb2NrSUQoKSxcbiAgICAgICAgICAgICAgICB7aXF1ZXJ5OiBxdWVyeX1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9ybSAoKSB7IC8vIGFsd2F5cyBzaW5nbGUgaW5zdGFuY2Ugb2YgZm9ybSBmb3IgYWxsIGJsb2Nrcy4uLlxuICAgIGxldCBzZWxlY3RvciA9ICdkaXYjYmxvY2stJyArIGdldFNlbGVjdGVkQmxvY2tJRCgpO1xuICAgIGxldCBwcmV2aWV3ID0galF1ZXJ5KHNlbGVjdG9yKS5maW5kKCdpZnJhbWUnKTtcblxuICAgIGlmIChwcmV2aWV3ICYmIGpRdWVyeShwcmV2aWV3KS5kYXRhKCkpIHtcblxuICAgICAgICBpZnJhbWVseS5idWlsZE9wdGlvbnNGb3JtKFxuICAgICAgICAgICAgZ2V0U2VsZWN0ZWRCbG9ja0lEKCksXG4gICAgICAgICAgICBqUXVlcnkoJ2RpdiNpZm9wdHMnKS5nZXQoMCksXG4gICAgICAgICAgICBqUXVlcnkocHJldmlldykuZGF0YSgpLmRhdGFcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihlKSB7XG4gICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIGlmcmFtZSBwcm94eSBzY3JpcHRcbiAgICBpZihpRXZlbnQudGVzdChlLmRhdGEpKSB7XG5cbiAgICAgICAgbGV0IGZyYW1lcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaWZyYW1lXCIpLFxuICAgICAgICAgICAgaWZyYW1lID0gZmluZElmcmFtZUJ5Q29udGVudFdpbmRvdyhmcmFtZXMsIGUuc291cmNlKTtcblxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgalF1ZXJ5KGlmcmFtZSkuZGF0YShkYXRhKTsgLy8gU3RvcmUgY3VycmVudCBzdGF0ZSBvZiBvcHRpb25zIGZvcm0gaW4gdGhlIGlmcmFtZVxuXG4gICAgICAgIC8vIHVwZGF0ZSBvbmx5IGlmIHRoZSBmb3JtIGlzIG9wZW4uIElmIG5vdCwgaXQgd2lsbCBiZSBidWlsdCBvbiByZW5kZXJcbiAgICAgICAgY29uc3QgYmxvY2sgPSB3cC5kYXRhLnNlbGVjdCgnY29yZS9lZGl0b3InKS5nZXRCbG9jayhnZXRTZWxlY3RlZEJsb2NrSUQoKSk7XG4gICAgICAgIGlmIChibG9jayAmJiAvXmNvcmVcXC0/XFwvP2VtYmVkL2kudGVzdChibG9jay5uYW1lKSkge1xuICAgICAgICAgICAgdXBkYXRlRm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxufSxmYWxzZSk7XG5cbmZ1bmN0aW9uIGFkZEF0dHJpYnV0ZXMgKHNldHRpbmdzKSB7XG5cbiAgICBpZiAoL15lbWJlZCQvaS50ZXN0KHNldHRpbmdzLmNhdGVnb3J5KSAmJiB0eXBlb2Ygc2V0dGluZ3MuYXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgIXNldHRpbmdzLmF0dHJpYnV0ZXMuaXF1ZXJ5KSB7XG4gICAgICAgIHNldHRpbmdzLmF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHNldHRpbmdzLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGlxdWVyeTp7IFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pOyAgICBcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG59XG53cC5ob29rcy5hZGRGaWx0ZXIgKCdibG9ja3MucmVnaXN0ZXJCbG9ja1R5cGUnLCAnaWZyYW1lbHkvYWRkLWF0dHJpYnV0ZXMnLCBhZGRBdHRyaWJ1dGVzKTtcblxuXG5mdW5jdGlvbiBzYXZlUXVlcnlVUkwgKGVsZW1lbnQsIGJsb2NrVHlwZSwgYXR0cmlidXRlcykge1xuXG4gICAgaWYgKC9eZW1iZWQkL2kudGVzdChibG9ja1R5cGUuY2F0ZWdvcnkpLCBhdHRyaWJ1dGVzLmlxdWVyeSAmJiBhdHRyaWJ1dGVzLnVybCkge1xuICAgICAgICBsZXQgdXJsID0gYXR0cmlidXRlcy51cmw7XG4gICAgICAgIGxldCBuZXdVcmwgPSBhZGRJZnJhbWVseVN0cmluZyhhdHRyaWJ1dGVzLnVybCwgYXR0cmlidXRlcy5pcXVlcnkpO1xuICAgICAgICBhdHRyaWJ1dGVzLnVybCA9IG5ld1VybDsgLy8gdGhpcyBpcyB0byBwYXNzIGJsb2NrcyB2YWxpZGF0aW9uXG5cbi8vIENhY2hlIGJ1c3RpbmcgZG9lc24ndCBzZWVtIHRvIGJlIG5lZWRlZFxuLyogXG4gICAgLy8gYnVzdCB0aGUgY2FjaGUgcHJldmlldywgc28gaXQgcmUtcmVuZGVycyB3aGVuIHJldHVybmluZyB0byBwcmV2aW91cyBvcHRpb25zXG4gICAgLy8gYWxzbyB3YXJtcyB1cCBjYWNoZSBpZiBVUkwgaXMgbmV3LCBhcyB0aGUgbmV4dCB0aW1lIGdldEVtYmVkUHJldmlldyB3aWxsIHJldHVybiBjYWNoZWQgdmFsdWVcbiAgICBpZiAod3AuZGF0YS5zZWxlY3QoICdjb3JlJyApLmdldEVtYmVkUHJldmlldyhuZXdVcmwpKSB7XG4gICAgICAgIHdwLmRhdGEuZGlzcGF0Y2goJ2NvcmUvZGF0YScpLmludmFsaWRhdGVSZXNvbHV0aW9uKCAnY29yZScsICdnZXRFbWJlZFByZXZpZXcnLCBbIG5ld1VybCBdICk7XG4gICAgfVxuKi8gICAgICAgIFxuXG4gICAgICAgIGxldCBzID0gcmVuZGVyVG9TdHJpbmcoZWxlbWVudCkucmVwbGFjZSgvJmFtcDsvZywgJyYnKTtcblxuICAgICAgICBsZXQgZWxBc1N0cmluZyA9IHMucmVwbGFjZSh1cmwsIG5ld1VybCk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSYXdIVE1MPntlbEFzU3RyaW5nfTwvUmF3SFRNTD5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG59XG53cC5ob29rcy5hZGRGaWx0ZXIgKCdibG9ja3MuZ2V0U2F2ZUVsZW1lbnQnLCAnaWZyYW1lbHkvc2F2ZS1xdWVyeScsIHNhdmVRdWVyeVVSTCk7XG5cblxuY2xhc3MgSWZyYW1lbHlPcHRpb25zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIHVwZGF0ZUVtcHR5UGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyIHRleHQgaW4gY2FzZSBvZiBubyBvcHRpb25zIGV4aXN0LlxuICAgICAgICBsZXQgZm9ybVBsYWNlaG9sZGVyID0galF1ZXJ5KCdkaXYjaWZvcHRzJyk7XG4gICAgICAgIGlmICghZm9ybVBsYWNlaG9sZGVyLmh0bWwoKSkge1xuICAgICAgICAgICAgaWYgKHdwLmRhdGEuc2VsZWN0KCAnY29yZScgKS5jYW5Vc2VyKCAnY3JlYXRlJywgJ3VzZXJzJyApKSB7XG4gICAgICAgICAgICAgICAgZm9ybVBsYWNlaG9sZGVyLmh0bWwoYWRtSHRtbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1QbGFjZWhvbGRlci5odG1sKHVzckh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHVwZGF0ZUZvcm0oKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbXB0eVBsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUVtcHR5UGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiA8ZGl2IGlkPVwiaWZvcHRzXCI+PC9kaXY+O1xuICAgIH1cbn1cblxuY29uc3Qgd2l0aEluc3BlY3RvckNvbnRyb2xzID0gY3JlYXRlSGlnaGVyT3JkZXJDb21wb25lbnQoIChCbG9ja0VkaXQpID0+IHtcbiAgICByZXR1cm4gKHByb3BzKSA9PiB7ICAgICAgICBcbiAgICAgICAgaWYgKHByb3BzLmlzU2VsZWN0ZWQgPT09IHRydWUgJiYgL15jb3JlXFwtP1xcLz9lbWJlZC9pLnRlc3QocHJvcHMubmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICA8QmxvY2tFZGl0IHsgLi4ucHJvcHMgfSAvPlxuICAgICAgICAgICAgICAgICAgICA8SW5zcGVjdG9yQ29udHJvbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBhbmVsQm9keSB0aXRsZT1cIklmcmFtZWx5IG9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElmcmFtZWx5T3B0aW9ucy8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9QYW5lbEJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvSW5zcGVjdG9yQ29udHJvbHM+XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKDxGcmFnbWVudD48QmxvY2tFZGl0IHsgLi4ucHJvcHMgfSAvPjwvRnJhZ21lbnQ+KTtcbiAgICAgICAgfVxuICAgIH07XG59LCBcIndpdGhJbnNwZWN0b3JDb250cm9sXCIgKTtcblxud3AuaG9va3MuYWRkRmlsdGVyKCAnZWRpdG9yLkJsb2NrRWRpdCcsICdpZnJhbWVseS93aXRoLWluc3BlY3Rvci1jb250cm9scycsIHdpdGhJbnNwZWN0b3JDb250cm9scyApO1xuLy8gUHJlbG9hZCB0byBjYWNoZSBVc2VyIEFkbWluIHBlcm1pc3Npb25cbndwLmRhdGEuc2VsZWN0KCAnY29yZScgKS5jYW5Vc2VyKCAnY3JlYXRlJywgJ3VzZXJzJyApO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n"); 71 71 72 72 /***/ })
Note: See TracChangeset
for help on using the changeset viewer.