2025-11-04 12:16:48 +01:00

137 lines
21 KiB
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.
*****************************************************************************/
import { AtlasAttachmentLoader, SkeletonBinary, SkeletonJson, TextureAtlas } from "@esotericsoftware/spine-core";
import { C3Texture, C3TextureEditor } from "./C3Texture";
export class AssetLoader {
async loadSkeletonEditor(sid, textureAtlas, scale = 1, instance) {
const projectFile = instance.GetProject().GetProjectFileBySID(sid);
if (!projectFile)
return null;
const blob = projectFile.GetBlob();
const atlasLoader = new AtlasAttachmentLoader(textureAtlas);
const isBinary = projectFile.GetName().endsWith(".skel");
if (isBinary) {
const skeletonFile = await blob.arrayBuffer();
const skeletonLoader = new SkeletonBinary(atlasLoader);
skeletonLoader.scale = scale;
return skeletonLoader.readSkeletonData(skeletonFile);
}
const skeletonFile = await blob.text();
const skeletonLoader = new SkeletonJson(atlasLoader);
skeletonLoader.scale = scale;
return skeletonLoader.readSkeletonData(skeletonFile);
}
async loadAtlasEditor(sid, instance, renderer) {
const projectFile = instance.GetProject().GetProjectFileBySID(sid);
if (!projectFile)
return null;
const blob = projectFile.GetBlob();
const content = await blob.text();
const path = projectFile.GetPath();
const basePath = path.substring(0, path.lastIndexOf("/") + 1);
const textureAtlas = new TextureAtlas(content);
await Promise.all(textureAtlas.pages.map(async (page) => {
const texture = await this.loadSpineTextureEditor(basePath + page.name, page.pma, instance);
if (texture) {
const spineTexture = new C3TextureEditor(texture, renderer, page);
page.setTexture(spineTexture);
}
return texture;
}));
return textureAtlas;
}
async loadSpineTextureEditor(pageName, pma = false, instance) {
const projectFile = instance.GetProject().GetProjectFileByExportPath(pageName);
if (!projectFile) {
throw new Error(`An error occured while loading the texture: ${pageName}`);
}
const content = projectFile.GetBlob();
return AssetLoader.createImageBitmapFromBlob(content, pma);
}
async loadSkeletonRuntime(path, textureAtlas, scale = 1, instance) {
const fullPath = await instance.assets.getProjectFileUrl(path);
if (!fullPath)
return null;
const atlasLoader = new AtlasAttachmentLoader(textureAtlas);
const isBinary = path.endsWith(".skel");
if (isBinary) {
const content = await instance.assets.fetchArrayBuffer(fullPath);
if (!content)
return null;
const skeletonLoader = new SkeletonBinary(atlasLoader);
skeletonLoader.scale = scale;
return skeletonLoader.readSkeletonData(content);
}
const content = await instance.assets.fetchJson(fullPath);
if (!content)
return null;
const skeletonLoader = new SkeletonJson(atlasLoader);
skeletonLoader.scale = scale;
return skeletonLoader.readSkeletonData(content);
}
async loadAtlasRuntime(path, instance, renderer) {
const fullPath = await instance.assets.getProjectFileUrl(path);
if (!fullPath)
return null;
const content = await instance.assets.fetchText(fullPath);
if (!content)
return null;
const basePath = path.substring(0, path.lastIndexOf("/") + 1);
const textureAtlas = new TextureAtlas(content);
await Promise.all(textureAtlas.pages.map(async (page) => {
const texture = await this.loadSpineTextureRuntime(basePath + page.name, page.pma, instance);
if (texture) {
const spineTexture = new C3Texture(texture, renderer, page);
page.setTexture(spineTexture);
}
return texture;
}));
return textureAtlas;
}
async loadSpineTextureRuntime(pageName, pma = false, instance) {
const fullPath = await instance.assets.getProjectFileUrl(pageName);
if (!fullPath)
return null;
const content = await instance.assets.fetchBlob(fullPath);
if (!content)
return null;
return AssetLoader.createImageBitmapFromBlob(content, pma);
}
static async createImageBitmapFromBlob(blob, pma) {
try {
// pma parameters seems to do not matter here. It matters in C3 Texture creation
return createImageBitmap(blob, { premultiplyAlpha: pma ? "none" : "premultiply" });
}
catch (e) {
console.error("Failed to create ImageBitmap from blob:", e);
return null;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNzZXRMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQXNzZXRMb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pILE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pELE1BQU0sT0FBTyxXQUFXO0lBRWhCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRSxHQUFXLEVBQUUsWUFBMEIsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQTRCO1FBQ2hILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTVELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzdCLE9BQU8sY0FBYyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxN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Q0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7SUFDRixDQUFDO0NBRUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEF0bGFzQXR0YWNobWVudExvYWRlciwgU2tlbGV0b25CaW5hcnksIFNrZWxldG9uSnNvbiwgVGV4dHVyZUF0bGFzIH0gZnJvbSBcIkBlc290ZXJpY3NvZnR3YXJlL3NwaW5lLWNvcmVcIjtcbmltcG9ydCB7IEMzVGV4dHVyZSwgQzNUZXh0dXJlRWRpdG9yIH0gZnJvbSBcIi4vQzNUZXh0dXJlXCI7XG5cblxuZXhwb3J0IGNsYXNzIEFzc2V0TG9hZGVyIHtcblxuXHRwdWJsaWMgYXN5bmMgbG9hZFNrZWxldG9uRWRpdG9yIChzaWQ6IG51bWJlciwgdGV4dHVyZUF0bGFzOiBUZXh0dXJlQXRsYXMsIHNjYWxlID0gMSwgaW5zdGFuY2U6IFNESy5JV29ybGRJbnN0YW5jZSkge1xuXHRcdGNvbnN0IHByb2plY3RGaWxlID0gaW5zdGFuY2UuR2V0UHJvamVjdCgpLkdldFByb2plY3RGaWxlQnlTSUQoc2lkKTtcblx0XHRpZiAoIXByb2plY3RGaWxlKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGJsb2IgPSBwcm9qZWN0RmlsZS5HZXRCbG9iKCk7XG5cdFx0Y29uc3QgYXRsYXNMb2FkZXIgPSBuZXcgQXRsYXNBdHRhY2htZW50TG9hZGVyKHRleHR1cmVBdGxhcyk7XG5cblx0XHRjb25zdCBpc0JpbmFyeSA9IHByb2plY3RGaWxlLkdldE5hbWUoKS5lbmRzV2l0aChcIi5za2VsXCIpO1xuXHRcdGlmIChpc0JpbmFyeSkge1xuXHRcdFx0Y29uc3Qgc2tlbGV0b25GaWxlID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuXHRcdFx0Y29uc3Qgc2tlbGV0b25Mb2FkZXIgPSBuZXcgU2tlbGV0b25CaW5hcnkoYXRsYXNMb2FkZXIpO1xuXHRcdFx0c2tlbGV0b25Mb2FkZXIuc2NhbGUgPSBzY2FsZTtcblx0XHRcdHJldHVybiBza2VsZXRvbkxvYWRlci5yZWFkU2tlbGV0b25EYXRhKHNrZWxldG9uRmlsZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2tlbGV0b25GaWxlID0gYXdhaXQgYmxvYi50ZXh0KCk7XG5cdFx0Y29uc3Qgc2tlbGV0b25Mb2FkZXIgPSBuZXcgU2tlbGV0b25Kc29uKGF0bGFzTG9hZGVyKTtcblx0XHRza2VsZXRvbkxvYWRlci5zY2FsZSA9IHNjYWxlO1xuXHRcdHJldHVybiBza2VsZXRvbkxvYWRlci5yZWFkU2tlbGV0b25EYXRhKHNrZWxldG9uRmlsZSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9hZEF0bGFzRWRpdG9yIChzaWQ6IG51bWJlciwgaW5zdGFuY2U6IFNESy5JV29ybGRJbnN0YW5jZSwgcmVuZGVyZXI6IFNESy5HZnguSVdlYkdMUmVuZGVyZXIpIHtcblx0XHRjb25zdCBwcm9qZWN0RmlsZSA9IGluc3RhbmNlLkdldFByb2plY3QoKS5HZXRQcm9qZWN0RmlsZUJ5U0lEKHNpZCk7XG5cdFx0aWYgKCFwcm9qZWN0RmlsZSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBibG9iID0gcHJvamVjdEZpbGUuR2V0QmxvYigpO1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBibG9iLnRleHQoKTtcblxuXHRcdGNvbnN0IHBhdGggPSBwcm9qZWN0RmlsZS5HZXRQYXRoKCk7XG5cdFx0Y29uc3QgYmFzZVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdGNvbnN0IHRleHR1cmVBdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoY29udGVudCk7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dHVyZUF0bGFzLnBhZ2VzLm1hcChhc3luYyBwYWdlID0+IHtcblx0XHRcdGNvbnN0IHRleHR1cmUgPSBhd2FpdCB0aGlzLmxvYWRTcGluZVRleHR1cmVFZGl0b3IoYmFzZVBhdGggKyBwYWdlLm5hbWUsIHBhZ2UucG1hLCBpbnN0YW5jZSk7XG5cdFx0XHRpZiAodGV4dHVyZSkge1xuXHRcdFx0XHRjb25zdCBzcGluZVRleHR1cmUgPSBuZXcgQzNUZXh0dXJlRWRpdG9yKHRleHR1cmUsIHJlbmRlcmVyLCBwYWdlKTtcblx0XHRcdFx0cGFnZS5zZXRUZXh0dXJlKHNwaW5lVGV4dHVyZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGV4dHVyZTtcblx0XHR9KSk7XG5cblx0XHRyZXR1cm4gdGV4dHVyZUF0bGFzO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGxvYWRTcGluZVRleHR1cmVFZGl0b3IgKHBhZ2VOYW1lOiBzdHJpbmcsIHBtYSA9IGZhbHNlLCBpbnN0YW5jZTogU0RLLklXb3JsZEluc3RhbmNlKSB7XG5cdFx0Y29uc3QgcHJvamVjdEZpbGUgPSBpbnN0YW5jZS5HZXRQcm9qZWN0KCkuR2V0UHJvamVjdEZpbGVCeUV4cG9ydFBhdGgocGFnZU5hbWUpO1xuXHRcdGlmICghcHJvamVjdEZpbGUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIHRoZSB0ZXh0dXJlOiAke3BhZ2VOYW1lfWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRlbnQgPSBwcm9qZWN0RmlsZS5HZXRCbG9iKCk7XG5cdFx0cmV0dXJuIEFzc2V0TG9hZGVyLmNyZWF0ZUltYWdlQml0bWFwRnJvbUJsb2IoY29udGVudCwgcG1hKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBsb2FkU2tlbGV0b25SdW50aW1lIChwYXRoOiBzdHJpbmcsIHRleHR1cmVBdGxhczogVGV4dHVyZUF0bGFzLCBzY2FsZSA9IDEsIGluc3RhbmNlOiBJUnVudGltZSkge1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgaW5zdGFuY2UuYXNzZXRzLmdldFByb2plY3RGaWxlVXJsKHBhdGgpO1xuXHRcdGlmICghZnVsbFBhdGgpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgYXRsYXNMb2FkZXIgPSBuZXcgQXRsYXNBdHRhY2htZW50TG9hZGVyKHRleHR1cmVBdGxhcyk7XG5cblx0XHRjb25zdCBpc0JpbmFyeSA9IHBhdGguZW5kc1dpdGgoXCIuc2tlbFwiKTtcblx0XHRpZiAoaXNCaW5hcnkpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBpbnN0YW5jZS5hc3NldHMuZmV0Y2hBcnJheUJ1ZmZlcihmdWxsUGF0aCk7XG5cdFx0XHRpZiAoIWNvbnRlbnQpIHJldHVybiBudWxsO1xuXHRcdFx0Y29uc3Qgc2tlbGV0b25Mb2FkZXIgPSBuZXcgU2tlbGV0b25CaW5hcnkoYXRsYXNMb2FkZXIpO1xuXHRcdFx0c2tlbGV0b25Mb2FkZXIuc2NhbGUgPSBzY2FsZTtcblx0XHRcdHJldHVybiBza2VsZXRvbkxvYWRlci5yZWFkU2tlbGV0b25EYXRhKGNvbnRlbnQpO1xuXHRcdH1cblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgaW5zdGFuY2UuYXNzZXRzLmZldGNoSnNvbihmdWxsUGF0aCk7XG5cdFx0aWYgKCFjb250ZW50KSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCBza2VsZXRvbkxvYWRlciA9IG5ldyBTa2VsZXRvbkpzb24oYXRsYXNMb2FkZXIpO1xuXHRcdHNrZWxldG9uTG9hZGVyLnNjYWxlID0gc2NhbGU7XG5cdFx0cmV0dXJuIHNrZWxldG9uTG9hZGVyLnJlYWRTa2VsZXRvbkRhdGEoY29udGVudCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9hZEF0bGFzUnVudGltZSAocGF0aDogc3RyaW5nLCBpbnN0YW5jZTogSVJ1bnRpbWUsIHJlbmRlcmVyOiBJUmVuZGVyZXIpIHtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGF3YWl0IGluc3RhbmNlLmFzc2V0cy5nZXRQcm9qZWN0RmlsZVVybChwYXRoKTtcblx0XHRpZiAoIWZ1bGxQYXRoKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBpbnN0YW5jZS5hc3NldHMuZmV0Y2hUZXh0KGZ1bGxQYXRoKTtcblx0XHRpZiAoIWNvbnRlbnQpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgYmFzZVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdGNvbnN0IHRleHR1cmVBdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoY29udGVudCk7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dHVyZUF0bGFzLnBhZ2VzLm1hcChhc3luYyBwYWdlID0+IHtcblx0XHRcdGNvbnN0IHRleHR1cmUgPSBhd2FpdCB0aGlzLmxvYWRTcGluZVRleHR1cmVSdW50aW1lKGJhc2VQYXRoICsgcGFnZS5uYW1lLCBwYWdlLnBtYSwgaW5zdGFuY2UpO1xuXHRcdFx0aWYgKHRleHR1cmUpIHtcblx0XHRcdFx0Y29uc3Qgc3BpbmVUZXh0dXJlID0gbmV3IEMzVGV4dHVyZSh0ZXh0dXJlLCByZW5kZXJlciwgcGFnZSk7XG5cdFx0XHRcdHBhZ2Uuc2V0VGV4dHVyZShzcGluZVRleHR1cmUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRleHR1cmU7XG5cdFx0fSkpO1xuXHRcdHJldHVybiB0ZXh0dXJlQXRsYXM7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9hZFNwaW5lVGV4dHVyZVJ1bnRpbWUgKHBhZ2VOYW1lOiBzdHJpbmcsIHBtYSA9IGZhbHNlLCBpbnN0YW5jZTogSVJ1bnRpbWUpIHtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGF3YWl0IGluc3RhbmNlLmFzc2V0cy5nZXRQcm9qZWN0RmlsZVVybChwYWdlTmFtZSk7XG5cdFx0aWYgKCFmdWxsUGF0aCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgaW5zdGFuY2UuYXNzZXRzLmZldGNoQmxvYihmdWxsUGF0aCk7XG5cdFx0aWYgKCFjb250ZW50KSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBBc3NldExvYWRlci5jcmVhdGVJbWFnZUJpdG1hcEZyb21CbG9iKGNvbnRlbnQsIHBtYSk7XG5cdH1cblxuXHRzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXBGcm9tQmxvYiAoYmxvYjogQmxvYiwgcG1hOiBib29sZWFuKTogUHJvbWlzZTxJbWFnZUJpdG1hcCB8IG51bGw+IHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gcG1hIHBhcmFtZXRlcnMgc2VlbXMgdG8gZG8gbm90IG1hdHRlciBoZXJlLiBJdCBtYXR0ZXJzIGluIEMzIFRleHR1cmUgY3JlYXRpb25cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChibG9iLCB7IHByZW11bHRpcGx5QWxwaGE6IHBtYSA/IFwibm9uZVwiIDogXCJwcmVtdWx0aXBseVwiIH0pO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIEltYWdlQml0bWFwIGZyb20gYmxvYjpcIiwgZSk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdH1cblxufVxuXG5cbiJdfQ==