@decorators/server
Version:
node decorators - decorators for express library
144 lines (135 loc) • 14.3 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SwaggerResolver = void 0;
const di_1 = require("@decorators/di");
const fs_1 = require("fs");
const path_1 = require("path");
const swagger_ui_dist_1 = require("swagger-ui-dist");
const core_1 = require("../../../../core");
const http_1 = require("../../../http");
const constants_1 = require("../constants");
const swagger_document_1 = require("./swagger-document");
let SwaggerResolver = exports.SwaggerResolver = class SwaggerResolver {
constructor(adapter, config, document) {
this.adapter = adapter;
this.config = config;
this.document = document;
}
resolve() {
const swaggerPath = (0, core_1.addLeadingSlash)(this.config.path);
const swaggerFilePath = (0, core_1.addLeadingSlash)((0, core_1.buildUrl)(this.config.path, 'swagger.json'));
this.adapter.routes([
{
handler: this.handler(JSON.stringify(this.document.generate()), { 'content-type': 'application/json' }),
type: 'get',
url: swaggerFilePath,
},
{
handler: this.handler(indexStyles(this.config.theme), { 'content-type': 'text/css' }),
type: 'get',
url: `${swaggerPath}/index.css`,
},
{
handler: this.handler(initializerScriptContent(swaggerFilePath), { 'content-type': 'text/javascript' }),
type: 'get',
url: `${swaggerPath}/swagger-initializer.js`,
},
]);
this.adapter.serveStatic(swaggerPath, (0, swagger_ui_dist_1.absolutePath)());
}
handler(response, headers = {}) {
return async (...args) => {
const res = await this.adapter.getParam(http_1.ParameterType.RESPONSE, null, ...args);
Object.entries(headers).forEach(([name, value]) => this.adapter.setHeader(res(), name, value));
this.adapter.reply(res(), response);
};
}
};
exports.SwaggerResolver = SwaggerResolver = __decorate([
(0, di_1.Injectable)(),
__param(0, (0, di_1.Inject)(http_1.HTTP_ADAPTER)),
__param(1, (0, di_1.Inject)(constants_1.SWAGGER_CONFIG)),
__metadata("design:paramtypes", [http_1.HttpApplicationAdapter, Object, swagger_document_1.SwaggerDocument])
], SwaggerResolver);
function initializerScriptContent(jsonPath) {
return `
window.onload = function() {
window.ui = SwaggerUIBundle({
url: "${jsonPath}",
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset.slice(1) // slice removes top-bar plugin
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
});
onSwaggerUIReady(disableSocketsTryItOut);
};
function onSwaggerUIReady(fn) {
const interval = setInterval(() => {
if (document.getElementById('swagger-ui')) {
clearInterval(interval);
fn();
}
}, 100);
}
function disableSocketsTryItOut() {
const socketEvents = [...document.querySelectorAll('[data-tag^="sockets" i]')];
for (const el of socketEvents) {
el.parentElement.classList.add('server-swagger-sockets');
}
}
`;
}
function indexStyles(theme) {
const styles = (0, fs_1.readFileSync)((0, path_1.resolve)((0, swagger_ui_dist_1.absolutePath)(), 'index.css'), 'utf-8');
const darkStyles = (0, fs_1.readFileSync)((0, path_1.resolve)(__dirname, 'swagger-dark.css'), 'utf-8');
const styleOverrides = `
${styles}
.server-swagger-sockets .try-out {
display: none;
}
.server-swagger-sockets .opblock-summary-method {
overflow: hidden;
position: relative;
}
.server-swagger-sockets .opblock-summary-method::after {
align-items: center;
background-color: #a748cb;
bottom: 0;
content: 'SOCKETS';
display: flex;
justify-content: center;
left: 0;
position: absolute;
right: 0;
top: 0;
}
`;
if (theme === 'light') {
return styleOverrides;
}
return `
${styleOverrides}
${theme === 'auto' ? '@media only screen and (prefers-color-scheme: dark) {' : ''}
${darkStyles}
${theme === 'auto' ? '}' : ''}
`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci1yZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybXMvc3dhZ2dlci9oZWxwZXJzL3N3YWdnZXItdWkvc3dhZ2dlci1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBb0Q7QUFDcEQsMkJBQWtDO0FBQ2xDLCtCQUErQjtBQUMvQixxREFBK0M7QUFFL0MsMkNBQTZEO0FBQzdELHdDQUFvRjtBQUVwRiw0Q0FBOEM7QUFDOUMseURBQXFEO0FBRzlDLElBQU0sZUFBZSw2QkFBckIsTUFBTSxlQUFlO0lBQzFCLFlBQ2dDLE9BQStCLEVBQzdCLE1BQXFCLEVBQzdDLFFBQXlCO1FBRkgsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUM3QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtJQUMvQixDQUFDO0lBRUwsT0FBTztRQUNMLE1BQU0sV0FBVyxHQUFHLElBQUEsc0JBQWUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sZUFBZSxHQUFHLElBQUEsc0JBQWUsRUFBQyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRXBGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2xCO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDeEMsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FDdkM7Z0JBQ0QsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsR0FBRyxFQUFFLGVBQWU7YUFDckI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FDbkIsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQzlCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUMvQjtnQkFDRCxJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsR0FBRyxXQUFXLFlBQVk7YUFDaEM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FDbkIsd0JBQXdCLENBQUMsZUFBZSxDQUFDLEVBQ3pDLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQ3RDO2dCQUNELElBQUksRUFBRSxLQUFLO2dCQUNYLEdBQUcsRUFBRSxHQUFHLFdBQVcseUJBQXlCO2FBQzdDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUEsOEJBQVksR0FBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLE9BQU8sQ0FBQyxRQUFpQixFQUFFLFVBQWtDLEVBQUU7UUFDckUsT0FBTyxLQUFLLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRS9FLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQzNDLENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQTswQkFwRFksZUFBZTtJQUQzQixJQUFBLGVBQVUsR0FBRTtJQUdSLFdBQUEsSUFBQSxXQUFNLEVBQUMsbUJBQVksQ0FBQyxDQUFBO0lBQ3BCLFdBQUEsSUFBQSxXQUFNLEVBQUMsMEJBQWMsQ0FBQyxDQUFBO3FDQURnQiw2QkFBc0IsVUFFM0Msa0NBQWU7R0FKeEIsZUFBZSxDQW9EM0I7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFFBQWdCO0lBQ2hELE9BQU87OztnQkFHTyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBNkI7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxpQkFBWSxFQUFDLElBQUEsY0FBTyxFQUFDLElBQUEsOEJBQVksR0FBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFBLGNBQU8sRUFBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixNQUFNLGNBQWMsR0FBRztNQUNuQixNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVCxDQUFDO0lBRUYsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQ3JCLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0lBRUQsT0FBTztNQUNILGNBQWM7O01BRWQsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDN0UsVUFBVTtNQUNaLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtHQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0BkZWNvcmF0b3JzL2RpJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGFic29sdXRlUGF0aCB9IGZyb20gJ3N3YWdnZXItdWktZGlzdCc7XG5cbmltcG9ydCB7IGFkZExlYWRpbmdTbGFzaCwgYnVpbGRVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEhUVFBfQURBUFRFUiwgSHR0cEFwcGxpY2F0aW9uQWRhcHRlciwgUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uLy4uLy4uL2h0dHAnO1xuaW1wb3J0IHsgU3dhZ2dlckNvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNXQUdHRVJfQ09ORklHIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFN3YWdnZXJEb2N1bWVudCB9IGZyb20gJy4vc3dhZ2dlci1kb2N1bWVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTd2FnZ2VyUmVzb2x2ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEhUVFBfQURBUFRFUikgcHJpdmF0ZSBhZGFwdGVyOiBIdHRwQXBwbGljYXRpb25BZGFwdGVyLFxuICAgIEBJbmplY3QoU1dBR0dFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBTd2FnZ2VyQ29uZmlnLFxuICAgIHByaXZhdGUgZG9jdW1lbnQ6IFN3YWdnZXJEb2N1bWVudCxcbiAgKSB7IH1cblxuICByZXNvbHZlKCkge1xuICAgIGNvbnN0IHN3YWdnZXJQYXRoID0gYWRkTGVhZGluZ1NsYXNoKHRoaXMuY29uZmlnLnBhdGgpO1xuICAgIGNvbnN0IHN3YWdnZXJGaWxlUGF0aCA9IGFkZExlYWRpbmdTbGFzaChidWlsZFVybCh0aGlzLmNvbmZpZy5wYXRoLCAnc3dhZ2dlci5qc29uJykpO1xuXG4gICAgdGhpcy5hZGFwdGVyLnJvdXRlcyhbXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcihcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmRvY3VtZW50LmdlbmVyYXRlKCkpLFxuICAgICAgICAgIHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICApLFxuICAgICAgICB0eXBlOiAnZ2V0JyxcbiAgICAgICAgdXJsOiBzd2FnZ2VyRmlsZVBhdGgsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiB0aGlzLmhhbmRsZXIoXG4gICAgICAgICAgaW5kZXhTdHlsZXModGhpcy5jb25maWcudGhlbWUpLFxuICAgICAgICAgIHsgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2NzcycgfSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogJ2dldCcsXG4gICAgICAgIHVybDogYCR7c3dhZ2dlclBhdGh9L2luZGV4LmNzc2AsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiB0aGlzLmhhbmRsZXIoXG4gICAgICAgICAgaW5pdGlhbGl6ZXJTY3JpcHRDb250ZW50KHN3YWdnZXJGaWxlUGF0aCksXG4gICAgICAgICAgeyAnY29udGVudC10eXBlJzogJ3RleHQvamF2YXNjcmlwdCcgfSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogJ2dldCcsXG4gICAgICAgIHVybDogYCR7c3dhZ2dlclBhdGh9L3N3YWdnZXItaW5pdGlhbGl6ZXIuanNgLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHRoaXMuYWRhcHRlci5zZXJ2ZVN0YXRpYyhzd2FnZ2VyUGF0aCwgYWJzb2x1dGVQYXRoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyKHJlc3BvbnNlOiB1bmtub3duLCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30pIHtcbiAgICByZXR1cm4gYXN5bmMgKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0UGFyYW0oUGFyYW1ldGVyVHlwZS5SRVNQT05TRSwgbnVsbCwgLi4uYXJncyk7XG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZXRIZWFkZXIocmVzKCksIG5hbWUsIHZhbHVlKSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXBseShyZXMoKSwgcmVzcG9uc2UpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZXJTY3JpcHRDb250ZW50KGpzb25QYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGBcbiAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cudWkgPSBTd2FnZ2VyVUlCdW5kbGUoe1xuICAgICAgICB1cmw6IFwiJHtqc29uUGF0aH1cIixcbiAgICAgICAgZG9tX2lkOiAnI3N3YWdnZXItdWknLFxuICAgICAgICBkZWVwTGlua2luZzogdHJ1ZSxcbiAgICAgICAgcHJlc2V0czogW1xuICAgICAgICAgIFN3YWdnZXJVSUJ1bmRsZS5wcmVzZXRzLmFwaXMsXG4gICAgICAgICAgU3dhZ2dlclVJU3RhbmRhbG9uZVByZXNldC5zbGljZSgxKSAvLyBzbGljZSByZW1vdmVzIHRvcC1iYXIgcGx1Z2luXG4gICAgICAgIF0sXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICBTd2FnZ2VyVUlCdW5kbGUucGx1Z2lucy5Eb3dubG9hZFVybFxuICAgICAgICBdLFxuICAgICAgICBsYXlvdXQ6IFwiU3RhbmRhbG9uZUxheW91dFwiXG4gICAgICB9KTtcblxuICAgICAgb25Td2FnZ2VyVUlSZWFkeShkaXNhYmxlU29ja2V0c1RyeUl0T3V0KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gb25Td2FnZ2VyVUlSZWFkeShmbikge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3dhZ2dlci11aScpKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc2FibGVTb2NrZXRzVHJ5SXRPdXQoKSB7XG4gICAgICBjb25zdCBzb2NrZXRFdmVudHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGFnXj1cInNvY2tldHNcIiBpXScpXTtcblxuICAgICAgZm9yIChjb25zdCBlbCBvZiBzb2NrZXRFdmVudHMpIHtcbiAgICAgICAgZWwucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXJ2ZXItc3dhZ2dlci1zb2NrZXRzJyk7XG4gICAgICB9XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBpbmRleFN0eWxlcyh0aGVtZTogU3dhZ2dlckNvbmZpZ1sndGhlbWUnXSkge1xuICBjb25zdCBzdHlsZXMgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShhYnNvbHV0ZVBhdGgoKSwgJ2luZGV4LmNzcycpLCAndXRmLTgnKTtcbiAgY29uc3QgZGFya1N0eWxlcyA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKF9fZGlybmFtZSwgJ3N3YWdnZXItZGFyay5jc3MnKSwgJ3V0Zi04Jyk7XG5cbiAgY29uc3Qgc3R5bGVPdmVycmlkZXMgPSBgXG4gICAgJHtzdHlsZXN9XG5cbiAgICAuc2VydmVyLXN3YWdnZXItc29ja2V0cyAudHJ5LW91dCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5zZXJ2ZXItc3dhZ2dlci1zb2NrZXRzIC5vcGJsb2NrLXN1bW1hcnktbWV0aG9kIHtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLnNlcnZlci1zd2FnZ2VyLXNvY2tldHMgLm9wYmxvY2stc3VtbWFyeS1tZXRob2Q6OmFmdGVyIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTc0OGNiO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgY29udGVudDogJ1NPQ0tFVFMnO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgdG9wOiAwO1xuICAgIH1cbiAgYDtcblxuICBpZiAodGhlbWUgPT09ICdsaWdodCcpIHtcbiAgICByZXR1cm4gc3R5bGVPdmVycmlkZXM7XG4gIH1cblxuICByZXR1cm4gYFxuICAgICR7c3R5bGVPdmVycmlkZXN9XG5cbiAgICAke3RoZW1lID09PSAnYXV0bycgPyAnQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsnIDogJyd9XG4gICAgICAke2RhcmtTdHlsZXN9XG4gICAgJHt0aGVtZSA9PT0gJ2F1dG8nID8gJ30nIDogJyd9XG4gIGA7XG59XG4iXX0=