@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 January 1, 2020. Replaces all prior versions.
*
* Copyright (c) 2013-2020, 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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QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEphbnVhcnkgMSwgMjAyMC4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIwLCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZGVjbGFyZSBmdW5jdGlvbiBDb2RlTWlycm9yIChlbDogRWxlbWVudCwgY29uZmlnOiBhbnkpOiB2b2lkO1xuXG5mdW5jdGlvbiBsb2FkU2NyaXB0ICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdFx0c2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcblx0XHRzY3JpcHQub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFNjcmlwdCBsb2FkIGVycm9yIGZvciAke3VybH1gKSk7XG5cdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gbG9hZENzcyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuXHRcdGxpbmsuaHJlZiA9IHVybDtcblx0XHRsaW5rLnJlbCA9ICdzdHlsZXNoZWV0Jztcblx0XHRsaW5rLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcblx0XHRsaW5rLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBDU1MgbG9hZCBlcnJvciBmb3IgJHt1cmx9YCkpO1xuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgU3BpbmVQbGF5ZXJFZGl0b3Ige1xuXHRwcml2YXRlIHN0YXRpYyBERUZBVUxUX0NPREUgPVxuXHRcdGBcbjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9maWxlcy9zcGluZS1wbGF5ZXIvNC4xL3NwaW5lLXBsYXllci5qc1wiPjwvc2NyaXB0PlxuPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL2ZpbGVzL3NwaW5lLXBsYXllci80LjEvc3BpbmUtcGxheWVyLmNzc1wiPlxuXG48ZGl2IGlkPVwicGxheWVyLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMHZ3OyBoZWlnaHQ6IDEwMHZoO1wiPjwvZGl2PlxuXG48c2NyaXB0PlxubmV3IHNwaW5lLlNwaW5lUGxheWVyKFwicGxheWVyLWNvbnRhaW5lclwiLCB7XG5cdGpzb25Vcmw6IFwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9maWxlcy9leGFtcGxlcy80LjEvc3BpbmVib3kvZXhwb3J0L3NwaW5lYm95LXByby5qc29uXCIsXG5cdGF0bGFzVXJsOiBcImh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZmlsZXMvZXhhbXBsZXMvNC4xL3NwaW5lYm95L2V4cG9ydC9zcGluZWJveS1wbWEuYXRsYXNcIlxufSk7XG48L3NjcmlwdD5cblx0XHRgLnRyaW0oKTtcblxuXHRwcml2YXRlIHByZWZpeDogc3RyaW5nID1cblx0XHRgPGh0bWw+XG48aGVhZD5cbjxzdHlsZT5cbmJvZHkgeyBtYXJnaW46IDBweDsgfVxuPC9zdHlsZT5cbjwvaGVhZD5cbjxib2R5PmAudHJpbSgpXG5cdHByaXZhdGUgcG9zdGZpeDogc3RyaW5nID0gYDwvYm9keT5gO1xuXHRwcml2YXRlIGNvZGU6IGFueTtcblx0cHJpdmF0ZSBwbGF5ZXI/OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG5cdFx0dGhpcy5sb2FkKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGxvYWQgKCkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtsb2FkU2NyaXB0KFwiaHR0cHM6Ly93d3cudW5wa2cuY29tL2NvZGVtaXJyb3JANS41MS4wL2xpYi9jb2RlbWlycm9yLmpzXCIpLCBsb2FkQ3NzKFwiaHR0cHM6Ly93d3cudW5wa2cuY29tL2NvZGVtaXJyb3JANS41MS4wL2xpYi9jb2RlbWlycm9yLmNzc1wiKV0pO1xuXHRcdHRoaXMucmVuZGVyKHRoaXMucGFyZW50KTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyIChwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG5cdFx0bGV0IGRvbSA9IC8qaHRtbCovYFxuXHRcdFx0XHQ8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cblx0XHRcdFx0XHQ8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogNTAlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGlmcmFtZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwJTsgb3V0bGluZTogbm9uZTsgYm9yZGVyOiBub25lO1wiPjwvaWZyYW1lPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGA7XG5cdFx0cGFyZW50LmlubmVySFRNTCA9IGRvbTtcblx0XHRsZXQgY29kZUVsZW1lbnQgPSBwYXJlbnQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF07XG5cdFx0dGhpcy5wbGF5ZXIgPSBwYXJlbnQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV0gYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0dGhpcy5jb2RlID0gQ29kZU1pcnJvcihjb2RlRWxlbWVudCwge1xuXHRcdFx0XHRsaW5lTnVtYmVyczogdHJ1ZSxcblx0XHRcdFx0dGFiU2l6ZTogMyxcblx0XHRcdFx0aW5kZW50VW5pdDogMyxcblx0XHRcdFx0aW5kZW50V2l0aFRhYnM6IHRydWUsXG5cdFx0XHRcdHNjcm9sbEJhclN0eWxlOiBcIm5hdGl2ZVwiLFxuXHRcdFx0XHRtb2RlOiBcImh0bWxtaXhlZFwiLFxuXHRcdFx0XHR0aGVtZTogXCJtb25va2FpXCJcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5jb2RlLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zdGFydFBsYXllcigpO1xuXHRcdFx0fSk7XG5cblx0XHRcdChjb2RlRWxlbWVudC5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG5cdFx0XHR0aGlzLnNldENvZGUoU3BpbmVQbGF5ZXJFZGl0b3IuREVGQVVMVF9DT0RFKTtcblx0XHR9KVxuXHR9XG5cblx0c2V0UHJlQW5kUG9zdGZpeCAocHJlZml4OiBzdHJpbmcsIHBvc3RmaXg6IHN0cmluZykge1xuXHRcdHRoaXMucHJlZml4ID0gcHJlZml4O1xuXHRcdHRoaXMucG9zdGZpeCA9IHBvc3RmaXg7XG5cdFx0dGhpcy5zdGFydFBsYXllcigpXG5cdH1cblxuXHRzZXRDb2RlIChjb2RlOiBzdHJpbmcpIHtcblx0XHR0aGlzLmNvZGUuc2V0VmFsdWUoY29kZSk7XG5cdFx0dGhpcy5zdGFydFBsYXllcigpO1xuXHR9XG5cblx0cHJpdmF0ZSB0aW1lcklkOiBhbnkgPSAwO1xuXHRzdGFydFBsYXllciAoKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG5cdFx0dGhpcy50aW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRsZXQgY29kZSA9IHRoaXMuY29kZS5nZXREb2MoKS5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29kZSA9IHRoaXMucHJlZml4ICsgY29kZSArIHRoaXMucG9zdGZpeDtcblx0XHRcdGNvZGUgPSB3aW5kb3cuYnRvYShjb2RlKTtcblx0XHRcdHRoaXMucGxheWVyIS5zcmMgPSBcIlwiO1xuXHRcdFx0dGhpcy5wbGF5ZXIhLnNyYyA9IFwiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LFwiICsgY29kZTtcblx0XHR9LCA1MDApO1xuXHR9XG59XG4iXX0=