@esotericsoftware/spine-player
Version:
The official Spine Runtimes for the web.
129 lines (127 loc) • 16.1 kB
JavaScript
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated April 5, 2025. Replaces all prior versions.
*
* Copyright (c) 2013-2025, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
function loadScript(url) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.onload = () => resolve();
script.onerror = () => reject(new Error(`Script load error for ${url}`));
document.head.appendChild(script);
});
}
function loadCss(url) {
return new Promise((resolve, reject) => {
const link = document.createElement('link');
link.href = url;
link.rel = 'stylesheet';
link.onload = () => resolve();
link.onerror = () => reject(new Error(`CSS load error for ${url}`));
document.head.appendChild(link);
});
}
export class SpinePlayerEditor {
parent;
static DEFAULT_CODE = `
<script src="https://esotericsoftware.com/files/spine-player/4.1/spine-player.js"></script>
<link rel="stylesheet" href="https://esotericsoftware.com/files/spine-player/4.1/spine-player.css">
<div id="player-container" style="width: 100vw; height: 100vh;"></div>
<script>
new spine.SpinePlayer("player-container", {
jsonUrl: "https://esotericsoftware.com/files/examples/4.1/spineboy/export/spineboy-pro.json",
atlasUrl: "https://esotericsoftware.com/files/examples/4.1/spineboy/export/spineboy-pma.atlas"
});
</script>
`.trim();
prefix = `<html>
<head>
<style>
body { margin: 0px; }
</style>
</head>
<body>`.trim();
postfix = `</body>`;
code;
player;
constructor(parent) {
this.parent = parent;
this.load();
}
async load() {
await Promise.all([loadScript("https://www.unpkg.com/codemirror@5.51.0/lib/codemirror.js"), loadCss("https://www.unpkg.com/codemirror@5.51.0/lib/codemirror.css")]);
this.render(this.parent);
}
render(parent) {
let dom = /*html*/ `
<div style="display: flex; flex-direction: column; width: 100%; height: 100%;">
<div style="width: 100%; height: 50%"></div>
<iframe style="width: 100%; height: 50%; outline: none; border: none;"></iframe>
</div>
`;
parent.innerHTML = dom;
let codeElement = parent.children[0].children[0];
this.player = parent.children[0].children[1];
requestAnimationFrame(() => {
this.code = CodeMirror(codeElement, {
lineNumbers: true,
tabSize: 3,
indentUnit: 3,
indentWithTabs: true,
scrollBarStyle: "native",
mode: "htmlmixed",
theme: "monokai"
});
this.code.on("change", () => {
this.startPlayer();
});
codeElement.children[0].style.height = "100%";
this.setCode(SpinePlayerEditor.DEFAULT_CODE);
});
}
setPreAndPostfix(prefix, postfix) {
this.prefix = prefix;
this.postfix = postfix;
this.startPlayer();
}
setCode(code) {
this.code.setValue(code);
this.startPlayer();
}
timerId = 0;
startPlayer() {
clearTimeout(this.timerId);
this.timerId = setTimeout(() => {
let code = this.code.getDoc().getValue();
code = this.prefix + code + this.postfix;
code = window.btoa(code);
this.player.src = "";
this.player.src = "data:text/html;base64," + code;
}, 500);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxheWVyRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BsYXllckVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFJL0UsU0FBUyxVQUFVLENBQUUsR0FBVztJQUMvQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFFLEdBQVc7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNC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QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmRlY2xhcmUgZnVuY3Rpb24gQ29kZU1pcnJvciAoZWw6IEVsZW1lbnQsIGNvbmZpZzogYW55KTogdm9pZDtcblxuZnVuY3Rpb24gbG9hZFNjcmlwdCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0XHRzY3JpcHQuc3JjID0gdXJsO1xuXHRcdHNjcmlwdC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG5cdFx0c2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBTY3JpcHQgbG9hZCBlcnJvciBmb3IgJHt1cmx9YCkpO1xuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGxvYWRDc3MgKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcblx0XHRsaW5rLmhyZWYgPSB1cmw7XG5cdFx0bGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG5cdFx0bGluay5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG5cdFx0bGluay5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgQ1NTIGxvYWQgZXJyb3IgZm9yICR7dXJsfWApKTtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIFNwaW5lUGxheWVyRWRpdG9yIHtcblx0cHJpdmF0ZSBzdGF0aWMgREVGQVVMVF9DT0RFID1cblx0XHRgXG48c2NyaXB0IHNyYz1cImh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZmlsZXMvc3BpbmUtcGxheWVyLzQuMS9zcGluZS1wbGF5ZXIuanNcIj48L3NjcmlwdD5cbjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9maWxlcy9zcGluZS1wbGF5ZXIvNC4xL3NwaW5lLXBsYXllci5jc3NcIj5cblxuPGRpdiBpZD1cInBsYXllci1jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiAxMDB2dzsgaGVpZ2h0OiAxMDB2aDtcIj48L2Rpdj5cblxuPHNjcmlwdD5cbm5ldyBzcGluZS5TcGluZVBsYXllcihcInBsYXllci1jb250YWluZXJcIiwge1xuXHRqc29uVXJsOiBcImh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZmlsZXMvZXhhbXBsZXMvNC4xL3NwaW5lYm95L2V4cG9ydC9zcGluZWJveS1wcm8uanNvblwiLFxuXHRhdGxhc1VybDogXCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL2ZpbGVzL2V4YW1wbGVzLzQuMS9zcGluZWJveS9leHBvcnQvc3BpbmVib3ktcG1hLmF0bGFzXCJcbn0pO1xuPC9zY3JpcHQ+XG5cdFx0YC50cmltKCk7XG5cblx0cHJpdmF0ZSBwcmVmaXg6IHN0cmluZyA9XG5cdFx0YDxodG1sPlxuPGhlYWQ+XG48c3R5bGU+XG5ib2R5IHsgbWFyZ2luOiAwcHg7IH1cbjwvc3R5bGU+XG48L2hlYWQ+XG48Ym9keT5gLnRyaW0oKVxuXHRwcml2YXRlIHBvc3RmaXg6IHN0cmluZyA9IGA8L2JvZHk+YDtcblx0cHJpdmF0ZSBjb2RlOiBhbnk7XG5cdHByaXZhdGUgcGxheWVyPzogSFRNTElGcmFtZUVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IgKHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBIVE1MRWxlbWVudCkge1xuXHRcdHRoaXMubG9hZCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBsb2FkICgpIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChbbG9hZFNjcmlwdChcImh0dHBzOi8vd3d3LnVucGtnLmNvbS9jb2RlbWlycm9yQDUuNTEuMC9saWIvY29kZW1pcnJvci5qc1wiKSwgbG9hZENzcyhcImh0dHBzOi8vd3d3LnVucGtnLmNvbS9jb2RlbWlycm9yQDUuNTEuMC9saWIvY29kZW1pcnJvci5jc3NcIildKTtcblx0XHR0aGlzLnJlbmRlcih0aGlzLnBhcmVudCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlciAocGFyZW50OiBIVE1MRWxlbWVudCkge1xuXHRcdGxldCBkb20gPSAvKmh0bWwqL2Bcblx0XHRcdFx0PGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCI+XG5cdFx0XHRcdFx0PGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwJVwiPjwvZGl2PlxuXHRcdFx0XHRcdDxpZnJhbWUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA1MCU7IG91dGxpbmU6IG5vbmU7IGJvcmRlcjogbm9uZTtcIj48L2lmcmFtZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgO1xuXHRcdHBhcmVudC5pbm5lckhUTUwgPSBkb207XG5cdFx0bGV0IGNvZGVFbGVtZW50ID0gcGFyZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdO1xuXHRcdHRoaXMucGxheWVyID0gcGFyZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdHRoaXMuY29kZSA9IENvZGVNaXJyb3IoY29kZUVsZW1lbnQsIHtcblx0XHRcdFx0bGluZU51bWJlcnM6IHRydWUsXG5cdFx0XHRcdHRhYlNpemU6IDMsXG5cdFx0XHRcdGluZGVudFVuaXQ6IDMsXG5cdFx0XHRcdGluZGVudFdpdGhUYWJzOiB0cnVlLFxuXHRcdFx0XHRzY3JvbGxCYXJTdHlsZTogXCJuYXRpdmVcIixcblx0XHRcdFx0bW9kZTogXCJodG1sbWl4ZWRcIixcblx0XHRcdFx0dGhlbWU6IFwibW9ub2thaVwiXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuY29kZS5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RhcnRQbGF5ZXIoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQoY29kZUVsZW1lbnQuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuXHRcdFx0dGhpcy5zZXRDb2RlKFNwaW5lUGxheWVyRWRpdG9yLkRFRkFVTFRfQ09ERSk7XG5cdFx0fSlcblx0fVxuXG5cdHNldFByZUFuZFBvc3RmaXggKHByZWZpeDogc3RyaW5nLCBwb3N0Zml4OiBzdHJpbmcpIHtcblx0XHR0aGlzLnByZWZpeCA9IHByZWZpeDtcblx0XHR0aGlzLnBvc3RmaXggPSBwb3N0Zml4O1xuXHRcdHRoaXMuc3RhcnRQbGF5ZXIoKVxuXHR9XG5cblx0c2V0Q29kZSAoY29kZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5jb2RlLnNldFZhbHVlKGNvZGUpO1xuXHRcdHRoaXMuc3RhcnRQbGF5ZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgdGltZXJJZDogYW55ID0gMDtcblx0c3RhcnRQbGF5ZXIgKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO1xuXHRcdHRoaXMudGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0bGV0IGNvZGUgPSB0aGlzLmNvZGUuZ2V0RG9jKCkuZ2V0VmFsdWUoKTtcblx0XHRcdGNvZGUgPSB0aGlzLnByZWZpeCArIGNvZGUgKyB0aGlzLnBvc3RmaXg7XG5cdFx0XHRjb2RlID0gd2luZG93LmJ0b2EoY29kZSk7XG5cdFx0XHR0aGlzLnBsYXllciEuc3JjID0gXCJcIjtcblx0XHRcdHRoaXMucGxheWVyIS5zcmMgPSBcImRhdGE6dGV4dC9odG1sO2Jhc2U2NCxcIiArIGNvZGU7XG5cdFx0fSwgNTAwKTtcblx0fVxufVxuIl19