@nota/nativescript-webview-ext
Version:
Extended WebView for NativeScript which adds 'x-local' scheme for local-files. events between WebView and native-layer, javascript execution, injecting CSS and JS-files.
290 lines • 40.6 kB
JavaScript
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
var platform = require("tns-core-modules/platform");
var profiling_1 = require("tns-core-modules/profiling");
var view_1 = require("tns-core-modules/ui/core/view");
var webview_ext_common_1 = require("./webview-ext-common");
var webview_ext_uiwebview_1 = require("./webview-ext.uiwebview");
var webview_ext_wkwebview_1 = require("./webview-ext.wkwebview");
__export(require("./webview-ext-common"));
var registeredCustomNSURLProtocol = false;
var WebViewExt = (function (_super) {
__extends(WebViewExt, _super);
function WebViewExt() {
var _this = _super.call(this) || this;
if (Number(platform.device.sdkVersion) >= 11) {
_this.isUIWebView = false;
_this.isWKWebView = true;
var configuration = _this._wkWebViewConfiguration = WKWebViewConfiguration.new();
_this._wkNavigationDelegate = webview_ext_wkwebview_1.WKNavigationDelegateImpl.initWithOwner(new WeakRef(_this));
var jScript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'initial-scale=1.0'); document.getElementsByTagName('head')[0].appendChild(meta);";
var wkUScript = WKUserScript.alloc().initWithSourceInjectionTimeForMainFrameOnly(jScript, 1, true);
var messageHandler = webview_ext_wkwebview_1.WKScriptMessageHandlerImpl.initWithOwner(new WeakRef(_this));
var wkUController = WKUserContentController.new();
wkUController.addUserScript(wkUScript);
wkUController.addScriptMessageHandlerName(messageHandler, 'nsBridge');
configuration.userContentController = wkUController;
configuration.preferences.setValueForKey(true, 'allowFileAccessFromFileURLs');
_this._wkCustomUrlSchemeHandler = new CustomUrlSchemeHandler();
_this._wkWebViewConfiguration.setURLSchemeHandlerForURLScheme(_this._wkCustomUrlSchemeHandler, _this.interceptScheme);
_this.nativeViewProtected = _this._ios = new WKWebView({
frame: CGRectZero,
configuration: configuration
});
}
else {
_this.isUIWebView = true;
_this.isWKWebView = false;
if (!registeredCustomNSURLProtocol) {
NSURLProtocol.registerClass(CustomNSURLProtocol);
registeredCustomNSURLProtocol = true;
}
var uiWebView = UIWebView.new();
_this.nativeViewProtected = _this._ios = uiWebView;
_this._uiWebViewDelegate = webview_ext_uiwebview_1.UIWebViewDelegateImpl.initWithOwner(new WeakRef(_this));
uiWebView.scrollView.bounces = false;
uiWebView.scrollView.scrollEnabled = false;
uiWebView.scalesPageToFit = false;
}
return _this;
}
Object.defineProperty(WebViewExt.prototype, "ios", {
get: function () {
return this._ios;
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebViewExt.prototype, "_uiWebView", {
get: function () {
if (this.isUIWebView) {
return this._ios;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebViewExt.prototype, "_wkWebView", {
get: function () {
if (this.isWKWebView) {
return this._ios;
}
},
enumerable: true,
configurable: true
});
WebViewExt.prototype.executeJavaScript = function (scriptCode, stringifyResult) {
var _this = this;
if (stringifyResult === void 0) { stringifyResult = true; }
if (stringifyResult) {
scriptCode = "\n var result = " + scriptCode.trim() + ";\n\n try {\n JSON.stringify(result);\n } catch (err) {\n result;\n }\n ";
}
return new Promise(function (resolve, reject) {
var result;
if (_this._wkWebView) {
_this._wkWebView.evaluateJavaScriptCompletionHandler(scriptCode, function (data, error) {
if (error) {
reject(error);
return;
}
resolve(_this.parseWebViewJavascriptResult(data));
});
}
else if (_this._uiWebView) {
var resStr = _this._uiWebView.stringByEvaluatingJavaScriptFromString(scriptCode);
resolve(_this.parseWebViewJavascriptResult(resStr));
}
});
};
WebViewExt.prototype.onLoaded = function () {
_super.prototype.onLoaded.call(this);
if (this._wkWebView) {
this._wkWebView.navigationDelegate = this._wkNavigationDelegate;
}
else if (this._uiWebView) {
this._uiWebView.delegate = this._uiWebViewDelegate;
}
};
WebViewExt.prototype.onUnloaded = function () {
if (this._wkWebView) {
this._wkWebView.navigationDelegate = null;
}
else if (this._uiWebView) {
this._uiWebView.delegate = null;
}
_super.prototype.onUnloaded.call(this);
};
WebViewExt.prototype.stopLoading = function () {
if (this._wkWebView) {
this._wkWebView.stopLoading();
}
else if (this._uiWebView) {
this._uiWebView.stopLoading();
}
};
WebViewExt.prototype._loadUrl = function (src) {
var nsURL = NSURL.URLWithString(src);
if (this._wkWebView) {
if (src.startsWith('file:///')) {
var nsReadAccessUrl = NSURL.URLWithString(src);
this.writeTrace("WebViewExt<ios>._loadUrl(" + src + ") -> this._wkWebView.loadFileURLAllowingReadAccessToURL(" + nsURL + ", " + nsReadAccessUrl + ")");
this._wkWebView.loadFileURLAllowingReadAccessToURL(nsURL, nsReadAccessUrl);
}
else {
var nsRequestWithUrl = NSURLRequest.requestWithURL(nsURL);
this.writeTrace("WebViewExt<ios>._loadUrl(" + src + ") -> this._wkWebView.loadRequest(" + nsRequestWithUrl + ")");
this._wkWebView.loadRequest(nsRequestWithUrl);
}
}
else if (this._uiWebView) {
var nsRequestWithUrl = NSURLRequest.requestWithURL(nsURL);
this.writeTrace("WebViewExt<ios>._loadUrl(" + src + ") -> this._uiWebView.loadRequest(" + nsRequestWithUrl + ")");
this._uiWebView.loadRequest(nsRequestWithUrl);
}
};
WebViewExt.prototype._loadData = function (content) {
var nsURL = NSURL.alloc().initWithString("file:///" + webview_ext_common_1.knownFolders.currentApp().path + "/");
if (this._wkWebView) {
this.writeTrace("WebViewExt<ios>._loadUrl(content) -> this._wkWebView.loadHTMLStringBaseURL(" + nsURL + ")");
this._wkWebView.loadHTMLStringBaseURL(content, nsURL);
}
else if (this._uiWebView) {
this.writeTrace("WebViewExt<ios>._loadUrl(content) -> this._uiWebView.loadHTMLStringBaseURL(" + nsURL + ")");
this._uiWebView.loadHTMLStringBaseURL(content, nsURL);
}
};
Object.defineProperty(WebViewExt.prototype, "canGoBack", {
get: function () {
if (this._wkWebView) {
return this._wkWebView.canGoBack;
}
else if (this._uiWebView) {
return this._uiWebView.canGoBack;
}
else {
return false;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebViewExt.prototype, "canGoForward", {
get: function () {
if (this._wkWebView) {
return this._wkWebView.canGoForward;
}
else if (this._uiWebView) {
return this._uiWebView.canGoForward;
}
else {
return false;
}
},
enumerable: true,
configurable: true
});
WebViewExt.prototype.goBack = function () {
if (this._wkWebView) {
this._wkWebView.goBack();
}
else if (this._uiWebView) {
this._uiWebView.goBack();
}
};
WebViewExt.prototype.goForward = function () {
if (this._wkWebView) {
this._wkWebView.goForward();
}
else if (this._uiWebView) {
this._uiWebView.goForward();
}
};
WebViewExt.prototype.reload = function () {
if (this._wkWebView) {
this._wkWebView.reload();
}
else if (this._uiWebView) {
this._uiWebView.reload();
}
};
WebViewExt.prototype.registerLocalResource = function (resourceName, path) {
resourceName = this.fixLocalResourceName(resourceName);
var filepath = this.resolveLocalResourceFilePath(path);
if (!filepath) {
this.writeTrace("WebViewExt<ios>.registerLocalResource(" + resourceName + ", " + path + ") -> file doesn't exist", view_1.traceMessageType.error);
return;
}
this.writeTrace("WebViewExt<ios>.registerLocalResource(" + resourceName + ", " + path + ") -> file: " + filepath);
if (this._wkWebView) {
this._wkCustomUrlSchemeHandler.registerLocalResourceForKeyFilepath(resourceName, filepath);
}
else if (this._uiWebView) {
CustomNSURLProtocol.registerLocalResourceForKeyFilepath(resourceName, filepath);
}
};
WebViewExt.prototype.unregisterLocalResource = function (resourceName) {
this.writeTrace("WebViewExt<ios>.unregisterLocalResource(" + resourceName + ")");
resourceName = this.fixLocalResourceName(resourceName);
if (this._wkWebView) {
this._wkCustomUrlSchemeHandler.unregisterLocalResourceForKey(resourceName);
}
else if (this._uiWebView) {
CustomNSURLProtocol.unregisterLocalResourceForKey(resourceName);
}
};
WebViewExt.prototype.getRegistretLocalResource = function (resourceName) {
resourceName = this.fixLocalResourceName(resourceName);
var result;
if (this._wkWebView) {
result = this._wkCustomUrlSchemeHandler.getRegisteredLocalResourceForKey(resourceName);
}
else if (this._uiWebView) {
result = CustomNSURLProtocol.getRegisteredLocalResourceForKey(resourceName);
}
else {
throw new Error('Not implemented for UIWebView');
}
this.writeTrace("WebViewExt<android>.getRegistretLocalResource(" + resourceName + ") -> " + result);
return result;
};
WebViewExt.prototype.onUIWebViewEvent = function (url) {
var _this = this;
if (!this.isUIWebView) {
this.writeTrace("WebViewExt.onUIWebViewEvent(" + url + ") - only works for UIWebView", view_1.traceMessageType.error);
return;
}
if (!url.startsWith('js2ios')) {
this.writeTrace("WebViewExt.onUIWebViewEvent(" + url + ") - only supports js2ios-scheme", view_1.traceMessageType.error);
return;
}
try {
var message = decodeURIComponent(url.replace(/^js2ios:/, ''));
var _a = JSON.parse(message), eventName_1 = _a.eventName, resId = _a.resId;
this.executeJavaScript("window.nsWebViewBridge.getUIWebViewResponse(" + JSON.stringify(resId) + ")")
.then(function (data) {
_this.onWebViewEvent(eventName_1, data);
})
.catch(function (err) {
_this.writeTrace("WebViewExt.onUIWebViewEvent(" + url + ") - getUIWebViewResponse - " + err, view_1.traceMessageType.error);
});
}
catch (err) {
this.writeTrace("WebViewExt.onUIWebViewEvent(" + url + ") - " + err, view_1.traceMessageType.error);
}
};
WebViewExt.prototype.getTitle = function () {
return this.executeJavaScript('document.title');
};
__decorate([
profiling_1.profile,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], WebViewExt.prototype, "onLoaded", null);
return WebViewExt;
}(webview_ext_common_1.WebViewExtBase));
exports.WebViewExt = WebViewExt;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vidmlldy1leHQuaW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2Vidmlldy1leHQuaW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esb0RBQXNEO0FBQ3RELHdEQUFxRDtBQUNyRCxzREFBeUU7QUFDekUsMkRBQStIO0FBQy9ILGlFQUFnRTtBQUNoRSxpRUFBK0Y7QUFFL0YsMENBQXFDO0FBRXJDLElBQUksNkJBQTZCLEdBQUcsS0FBSyxDQUFDO0FBRTFDO0lBQWdDLDhCQUFjO0lBeUIxQztRQUFBLFlBQ0ksaUJBQU8sU0E0Q1Y7UUExQ0csRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQyxLQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUV4QixJQUFNLGFBQWEsR0FBRyxLQUFJLENBQUMsdUJBQXVCLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEYsS0FBSSxDQUFDLHFCQUFxQixHQUFHLGdEQUF3QixDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQU0sT0FBTyxHQUFHLGtNQUFrTSxDQUFDO1lBQ25OLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxPQUFPLEtBQTJDLElBQUksQ0FBQyxDQUFDO1lBQzNJLElBQU0sY0FBYyxHQUFHLGtEQUEwQixDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25GLElBQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BELGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsYUFBYSxDQUFD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QUcsQ0FBQyxDQUFDLENBQUM7WUFDWCxJQUFJLENBQUMsVUFBVSxDQUFDLGlDQUErQixHQUFHLFlBQU8sR0FBSyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVGLENBQUM7SUFDTCxDQUFDO0lBRU0sNkJBQVEsR0FBZjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQVMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBOUtEO1FBREMsbUJBQU87Ozs7OENBUVA7SUF3S0wsaUJBQUM7Q0FBQSxBQXZSRCxDQUFnQyxtQ0FBYyxHQXVSN0M7QUF2UlksZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9ub2RlX21vZHVsZXMvdG5zLXBsYXRmb3JtLWRlY2xhcmF0aW9ucy9pb3MuZC50c1wiIC8+XG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ3Rucy1jb3JlLW1vZHVsZXMvZmlsZS1zeXN0ZW0nO1xuaW1wb3J0ICogYXMgcGxhdGZvcm0gZnJvbSBcInRucy1jb3JlLW1vZHVsZXMvcGxhdGZvcm1cIjtcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tIFwidG5zLWNvcmUtbW9kdWxlcy9wcm9maWxpbmdcIjtcbmltcG9ydCB7IGxheW91dCwgdHJhY2VNZXNzYWdlVHlwZSB9IGZyb20gXCJ0bnMtY29yZS1tb2R1bGVzL3VpL2NvcmUvdmlld1wiO1xuaW1wb3J0IHsga25vd25Gb2xkZXJzLCBOYXZpZ2F0aW9uVHlwZSwgdHJhY2VDYXRlZ29yaWVzLCB0cmFjZUVuYWJsZWQsIHRyYWNlV3JpdGUsIFdlYlZpZXdFeHRCYXNlIH0gZnJvbSBcIi4vd2Vidmlldy1leHQtY29tbW9uXCI7XG5pbXBvcnQgeyBVSVdlYlZpZXdEZWxlZ2F0ZUltcGwgfSBmcm9tICcuL3dlYnZpZXctZXh0LnVpd2Vidmlldyc7XG5pbXBvcnQgeyBXS05hdmlnYXRpb25EZWxlZ2F0ZUltcGwsIFdLU2NyaXB0TWVzc2FnZUhhbmRsZXJJbXBsIH0gZnJvbSAnLi93ZWJ2aWV3LWV4dC53a3dlYnZpZXcnO1xuXG5leHBvcnQgKiBmcm9tIFwiLi93ZWJ2aWV3LWV4dC1jb21tb25cIjtcblxubGV0IHJlZ2lzdGVyZWRDdXN0b21OU1VSTFByb3RvY29sID0gZmFsc2U7XG5cbmV4cG9ydCBjbGFzcyBXZWJWaWV3RXh0IGV4dGVuZHMgV2ViVmlld0V4dEJhc2Uge1xuICAgIHB1YmxpYyBnZXQgaW9zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lvczogV0tXZWJWaWV3IHwgVUlXZWJWaWV3O1xuXG4gICAgcHJpdmF0ZSBfd2tXZWJWaWV3Q29uZmlndXJhdGlvbjogV0tXZWJWaWV3Q29uZmlndXJhdGlvbjtcbiAgICBwcml2YXRlIF93a05hdmlnYXRpb25EZWxlZ2F0ZTogV0tOYXZpZ2F0aW9uRGVsZWdhdGVJbXBsO1xuICAgIHByaXZhdGUgX3drQ3VzdG9tVXJsU2NoZW1lSGFuZGxlcjogQ3VzdG9tVXJsU2NoZW1lSGFuZGxlcjtcblxuICAgIHByaXZhdGUgX3VpV2ViVmlld0RlbGVnYXRlOiBVSVdlYlZpZXdEZWxlZ2F0ZUltcGw7XG5cbiAgICBwcml2YXRlIGdldCBfdWlXZWJWaWV3KCk6IFVJV2ViVmlldyB8IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1VJV2ViVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lvcyBhcyBVSVdlYlZpZXc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBfd2tXZWJWaWV3KCk6IFdLV2ViVmlldyB8IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1dLV2ViVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lvcyBhcyBXS1dlYlZpZXc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoTnVtYmVyKHBsYXRmb3JtLmRldmljZS5zZGtWZXJzaW9uKSA+PSAxMSkge1xuICAgICAgICAgICAgdGhpcy5pc1VJV2ViVmlldyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1dLV2ViVmlldyA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl93a1dlYlZpZXdDb25maWd1cmF0aW9uID0gV0tXZWJWaWV3Q29uZmlndXJhdGlvbi5uZXcoKTtcbiAgICAgICAgICAgIHRoaXMuX3drTmF2aWdhdGlvbkRlbGVnYXRlID0gV0tOYXZpZ2F0aW9uRGVsZWdhdGVJbXBsLmluaXRXaXRoT3duZXIobmV3IFdlYWtSZWYodGhpcykpO1xuICAgICAgICAgICAgY29uc3QgalNjcmlwdCA9IFwidmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJyk7IG1ldGEuc2V0QXR0cmlidXRlKCduYW1lJywgJ3ZpZXdwb3J0Jyk7IG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgJ2luaXRpYWwtc2NhbGU9MS4wJyk7IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQobWV0YSk7XCI7XG4gICAgICAgICAgICBjb25zdCB3a1VTY3JpcHQgPSBXS1VzZXJTY3JpcHQuYWxsb2MoKS5pbml0V2l0aFNvdXJjZUluamVjdGlvblRpbWVGb3JNYWluRnJhbWVPbmx5KGpTY3JpcHQsIFdLVXNlclNjcmlwdEluamVjdGlvblRpbWUuQXREb2N1bWVudEVuZCwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IFdLU2NyaXB0TWVzc2FnZUhhbmRsZXJJbXBsLmluaXRXaXRoT3duZXIobmV3IFdlYWtSZWYodGhpcykpO1xuICAgICAgICAgICAgY29uc3Qgd2tVQ29udHJvbGxlciA9IFdLVXNlckNvbnRlbnRDb250cm9sbGVyLm5ldygpO1xuICAgICAgICAgICAgd2tVQ29udHJvbGxlci5hZGRVc2VyU2NyaXB0KHdrVVNjcmlwdCk7XG4gICAgICAgICAgICB3a1VDb250cm9sbGVyLmFkZFNjcmlwdE1lc3NhZ2VIYW5kbGVyTmFtZShtZXNzYWdlSGFuZGxlciwgJ25zQnJpZGdlJyk7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnVzZXJDb250ZW50Q29udHJvbGxlciA9IHdrVUNvbnRyb2xsZXI7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnByZWZlcmVuY2VzLnNldFZhbHVlRm9yS2V5KFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgJ2FsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcydcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuX3drQ3VzdG9tVXJsU2NoZW1lSGFuZGxlciA9IG5ldyBDdXN0b21VcmxTY2hlbWVIYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXdDb25maWd1cmF0aW9uLnNldFVSTFNjaGVtZUhhbmRsZXJGb3JVUkxTY2hlbWUodGhpcy5fd2tDdXN0b21VcmxTY2hlbWVIYW5kbGVyLCB0aGlzLmludGVyY2VwdFNjaGVtZSk7XG5cbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmlld1Byb3RlY3RlZCA9IHRoaXMuX2lvcyA9IG5ldyBXS1dlYlZpZXcoe1xuICAgICAgICAgICAgICAgIGZyYW1lOiBDR1JlY3RaZXJvLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc1VJV2ViVmlldyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzV0tXZWJWaWV3ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICghcmVnaXN0ZXJlZEN1c3RvbU5TVVJMUHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICBOU1VSTFByb3RvY29sLnJlZ2lzdGVyQ2xhc3MoQ3VzdG9tTlNVUkxQcm90b2NvbCBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRDdXN0b21OU1VSTFByb3RvY29sID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdWlXZWJWaWV3ID0gVUlXZWJWaWV3Lm5ldygpO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkID0gdGhpcy5faW9zID0gdWlXZWJWaWV3O1xuICAgICAgICAgICAgdGhpcy5fdWlXZWJWaWV3RGVsZWdhdGUgPSBVSVdlYlZpZXdEZWxlZ2F0ZUltcGwuaW5pdFdpdGhPd25lcihuZXcgV2Vha1JlZih0aGlzKSk7XG5cbiAgICAgICAgICAgIHVpV2ViVmlldy5zY3JvbGxWaWV3LmJvdW5jZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHVpV2ViVmlldy5zY3JvbGxWaWV3LnNjcm9sbEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHVpV2ViVmlldy5zY2FsZXNQYWdlVG9GaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleGVjdXRlSmF2YVNjcmlwdDxUPihzY3JpcHRDb2RlOiBzdHJpbmcsIHN0cmluZ2lmeVJlc3VsdCA9IHRydWUpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHN0cmluZ2lmeVJlc3VsdCkge1xuICAgICAgICAgICAgc2NyaXB0Q29kZSA9IGBcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAke3NjcmlwdENvZGUudHJpbSgpfTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZXN1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMud3JpdGVUcmFjZSgnRXhlY3V0aW5nIEphdmFzY3JpcHQ6ICcgKyBzY3JpcHRDb2RlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcuZXZhbHVhdGVKYXZhU2NyaXB0Q29tcGxldGlvbkhhbmRsZXIoc2NyaXB0Q29kZSwgKGRhdGEsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGFyc2VXZWJWaWV3SmF2YXNjcmlwdFJlc3VsdChkYXRhKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VpV2ViVmlldykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc1N0ciA9IHRoaXMuX3VpV2ViVmlldy5zdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0RnJvbVN0cmluZyhzY3JpcHRDb2RlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGFyc2VXZWJWaWV3SmF2YXNjcmlwdFJlc3VsdChyZXNTdHIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQHByb2ZpbGVcbiAgICBwdWJsaWMgb25Mb2FkZWQoKSB7XG4gICAgICAgIHN1cGVyLm9uTG9hZGVkKCk7XG4gICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3drV2ViVmlldy5uYXZpZ2F0aW9uRGVsZWdhdGUgPSB0aGlzLl93a05hdmlnYXRpb25EZWxlZ2F0ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl91aVdlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VpV2ViVmlldy5kZWxlZ2F0ZSA9IHRoaXMuX3VpV2ViVmlld0RlbGVnYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVW5sb2FkZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3drV2ViVmlldy5uYXZpZ2F0aW9uRGVsZWdhdGUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VpV2ViVmlldykge1xuICAgICAgICAgICAgdGhpcy5fdWlXZWJWaWV3LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5vblVubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3BMb2FkaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcuc3RvcExvYWRpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl91aVdlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VpV2ViVmlldy5zdG9wTG9hZGluZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIF9sb2FkVXJsKHNyYzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG5zVVJMID0gTlNVUkwuVVJMV2l0aFN0cmluZyhzcmMpO1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8vJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuc1JlYWRBY2Nlc3NVcmwgPSBOU1VSTC5VUkxXaXRoU3RyaW5nKHNyYyk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0PGlvcz4uX2xvYWRVcmwoJHtzcmN9KSAtPiB0aGlzLl93a1dlYlZpZXcubG9hZEZpbGVVUkxBbGxvd2luZ1JlYWRBY2Nlc3NUb1VSTCgke25zVVJMfSwgJHtuc1JlYWRBY2Nlc3NVcmx9KWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3drV2ViVmlldy5sb2FkRmlsZVVSTEFsbG93aW5nUmVhZEFjY2Vzc1RvVVJMKG5zVVJMLCBuc1JlYWRBY2Nlc3NVcmwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuc1JlcXVlc3RXaXRoVXJsID0gTlNVUkxSZXF1ZXN0LnJlcXVlc3RXaXRoVVJMKG5zVVJMKTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8aW9zPi5fbG9hZFVybCgke3NyY30pIC0+IHRoaXMuX3drV2ViVmlldy5sb2FkUmVxdWVzdCgke25zUmVxdWVzdFdpdGhVcmx9KWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3drV2ViVmlldy5sb2FkUmVxdWVzdChuc1JlcXVlc3RXaXRoVXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl91aVdlYlZpZXcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5zUmVxdWVzdFdpdGhVcmwgPSBOU1VSTFJlcXVlc3QucmVxdWVzdFdpdGhVUkwobnNVUkwpO1xuICAgICAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0PGlvcz4uX2xvYWRVcmwoJHtzcmN9KSAtPiB0aGlzLl91aVdlYlZpZXcubG9hZFJlcXVlc3QoJHtuc1JlcXVlc3RXaXRoVXJsfSlgKTtcbiAgICAgICAgICAgIHRoaXMuX3VpV2ViVmlldy5sb2FkUmVxdWVzdChuc1JlcXVlc3RXaXRoVXJsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBfbG9hZERhdGEoY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG5zVVJMID0gTlNVUkwuYWxsb2MoKS5pbml0V2l0aFN0cmluZyhgZmlsZTovLy8ke2tub3duRm9sZGVycy5jdXJyZW50QXBwKCkucGF0aH0vYCk7XG4gICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxpb3M+Ll9sb2FkVXJsKGNvbnRlbnQpIC0+IHRoaXMuX3drV2ViVmlldy5sb2FkSFRNTFN0cmluZ0Jhc2VVUkwoJHtuc1VSTH0pYCk7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcubG9hZEhUTUxTdHJpbmdCYXNlVVJMKGNvbnRlbnQsIG5zVVJMKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl91aVdlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxpb3M+Ll9sb2FkVXJsKGNvbnRlbnQpIC0+IHRoaXMuX3VpV2ViVmlldy5sb2FkSFRNTFN0cmluZ0Jhc2VVUkwoJHtuc1VSTH0pYCk7XG4gICAgICAgICAgICB0aGlzLl91aVdlYlZpZXcubG9hZEhUTUxTdHJpbmdCYXNlVVJMKGNvbnRlbnQsIG5zVVJMKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2FuR29CYWNrKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2tXZWJWaWV3LmNhbkdvQmFjaztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl91aVdlYlZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91aVdlYlZpZXcuY2FuR29CYWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjYW5Hb0ZvcndhcmQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93a1dlYlZpZXcuY2FuR29Gb3J3YXJkO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VpV2ViVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VpV2ViVmlldy5jYW5Hb0ZvcndhcmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ29CYWNrKCkge1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcuZ29CYWNrKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdWlXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl91aVdlYlZpZXcuZ29CYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ29Gb3J3YXJkKCkge1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcuZ29Gb3J3YXJkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdWlXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl91aVdlYlZpZXcuZ29Gb3J3YXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5fd2tXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl93a1dlYlZpZXcucmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdWlXZWJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl91aVdlYlZpZXcucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJMb2NhbFJlc291cmNlKHJlc291cmNlTmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5yZXNvbHZlTG9jYWxSZXNvdXJjZUZpbGVQYXRoKHBhdGgpO1xuICAgICAgICBpZiAoIWZpbGVwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8aW9zPi5yZWdpc3RlckxvY2FsUmVzb3VyY2UoJHtyZXNvdXJjZU5hbWV9LCAke3BhdGh9KSAtPiBmaWxlIGRvZXNuJ3QgZXhpc3RgLCB0cmFjZU1lc3NhZ2VUeXBlLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxpb3M+LnJlZ2lzdGVyTG9jYWxSZXNvdXJjZSgke3Jlc291cmNlTmFtZX0sICR7cGF0aH0pIC0+IGZpbGU6ICR7ZmlsZXBhdGh9YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3drV2ViVmlldykge1xuICAgICAgICAgICAgdGhpcy5fd2tDdXN0b21VcmxTY2hlbWVIYW5kbGVyLnJlZ2lzdGVyTG9jYWxSZXNvdXJjZUZvcktleUZpbGVwYXRoKHJlc291cmNlTmFtZSwgZmlsZXBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VpV2ViVmlldykge1xuICAgICAgICAgICAgQ3VzdG9tTlNVUkxQcm90b2NvbC5yZWdpc3RlckxvY2FsUmVzb3VyY2VGb3JLZXlGaWxlcGF0aChyZXNvdXJjZU5hbWUsIGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8aW9zPi51bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZSgke3Jlc291cmNlTmFtZX0pYCk7XG5cbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLl93a1dlYlZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX3drQ3VzdG9tVXJsU2NoZW1lSGFuZGxlci51bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZUZvcktleShyZXNvdXJjZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VpV2ViVmlldykge1xuICAgICAgICAgICAgQ3VzdG9tTlNVUkxQcm90b2NvbC51bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZUZvcktleShyZXNvdXJjZU5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlZ2lzdHJldExvY2FsUmVzb3VyY2UocmVzb3VyY2VOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuX3drV2ViVmlldykge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fd2tDdXN0b21VcmxTY2hlbWVIYW5kbGVyLmdldFJlZ2lzdGVyZWRMb2NhbFJlc291cmNlRm9yS2V5KHJlc291cmNlTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdWlXZWJWaWV3KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBDdXN0b21OU1VSTFByb3RvY29sLmdldFJlZ2lzdGVyZWRMb2NhbFJlc291cmNlRm9yS2V5KHJlc291cmNlTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCBmb3IgVUlXZWJWaWV3Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8YW5kcm9pZD4uZ2V0UmVnaXN0cmV0TG9jYWxSZXNvdXJjZSgke3Jlc291cmNlTmFtZX0pIC0+ICR7cmVzdWx0fWApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVJV2ViVmlld0V2ZW50KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1VJV2ViVmlldykge1xuICAgICAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0Lm9uVUlXZWJWaWV3RXZlbnQoJHt1cmx9KSAtIG9ubHkgd29ya3MgZm9yIFVJV2ViVmlld2AsIHRyYWNlTWVzc2FnZVR5cGUuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnanMyaW9zJykpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dC5vblVJV2ViVmlld0V2ZW50KCR7dXJsfSkgLSBvbmx5IHN1cHBvcnRzIGpzMmlvcy1zY2hlbWVgLCB0cmFjZU1lc3NhZ2VUeXBlLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5yZXBsYWNlKC9eanMyaW9zOi8sICcnKSk7XG4gICAgICAgICAgICBjb25zdCB7IGV2ZW50TmFtZSwgcmVzSWQgfSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVKYXZhU2NyaXB0KGB3aW5kb3cubnNXZWJWaWV3QnJpZGdlLmdldFVJV2ViVmlld1Jlc3BvbnNlKCR7SlNPTi5zdHJpbmdpZnkocmVzSWQpfSlgKVxuICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25XZWJWaWV3RXZlbnQoZXZlbnROYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dC5vblVJV2ViVmlld0V2ZW50KCR7dXJsfSkgLSBnZXRVSVdlYlZpZXdSZXNwb25zZSAtICR7ZXJyfWAsIHRyYWNlTWVzc2FnZVR5cGUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dC5vblVJV2ViVmlld0V2ZW50KCR7dXJsfSkgLSAke2Vycn1gLCB0cmFjZU1lc3NhZ2VUeXBlLmVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUphdmFTY3JpcHQ8c3RyaW5nPignZG9jdW1lbnQudGl0bGUnKTtcbiAgICB9XG59XG4iXX0=