ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
306 lines • 30.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, 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.
*
* THIS SOFTWARE IS 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 THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Texture, TextureWrap, TextureRegion } from "./Texture";
export class TextureAtlas {
/**
* @param {?} atlasText
* @param {?} textureLoader
*/
constructor(atlasText, textureLoader) {
this.pages = new Array();
this.regions = new Array();
this.load(atlasText, textureLoader);
}
/**
* @private
* @param {?} atlasText
* @param {?} textureLoader
* @return {?}
*/
load(atlasText, textureLoader) {
if (textureLoader == null)
throw new Error("textureLoader cannot be null.");
/** @type {?} */
let reader = new TextureAtlasReader(atlasText);
/** @type {?} */
let tuple = new Array(4);
/** @type {?} */
let page = null;
while (true) {
/** @type {?} */
let line = reader.readLine();
if (line == null)
break;
line = line.trim();
if (line.length == 0)
page = null;
else if (!page) {
page = new TextureAtlasPage();
page.name = line;
if (reader.readTuple(tuple) == 2) {
// size is only optional for an atlas packed with an old TexturePacker.
page.width = parseInt(tuple[0]);
page.height = parseInt(tuple[1]);
reader.readTuple(tuple);
}
// page.format = Format[tuple[0]]; we don't need format in WebGL
reader.readTuple(tuple);
page.minFilter = Texture.filterFromString(tuple[0]);
page.magFilter = Texture.filterFromString(tuple[1]);
/** @type {?} */
let direction = reader.readValue();
page.uWrap = TextureWrap.ClampToEdge;
page.vWrap = TextureWrap.ClampToEdge;
if (direction == "x")
page.uWrap = TextureWrap.Repeat;
else if (direction == "y")
page.vWrap = TextureWrap.Repeat;
else if (direction == "xy")
page.uWrap = page.vWrap = TextureWrap.Repeat;
page.texture = textureLoader(line);
page.texture.setFilters(page.minFilter, page.magFilter);
page.texture.setWraps(page.uWrap, page.vWrap);
page.width = page.texture.getImage().width;
page.height = page.texture.getImage().height;
this.pages.push(page);
}
else {
/** @type {?} */
let region = new TextureAtlasRegion();
region.name = line;
region.page = page;
/** @type {?} */
let rotateValue = reader.readValue();
if (rotateValue.toLocaleLowerCase() == "true") {
region.degrees = 90;
}
else if (rotateValue.toLocaleLowerCase() == "false") {
region.degrees = 0;
}
else {
region.degrees = parseFloat(rotateValue);
}
region.rotate = region.degrees == 90;
reader.readTuple(tuple);
/** @type {?} */
let x = parseInt(tuple[0]);
/** @type {?} */
let y = parseInt(tuple[1]);
reader.readTuple(tuple);
/** @type {?} */
let width = parseInt(tuple[0]);
/** @type {?} */
let height = parseInt(tuple[1]);
region.u = x / page.width;
region.v = y / page.height;
if (region.rotate) {
region.u2 = (x + height) / page.width;
region.v2 = (y + width) / page.height;
}
else {
region.u2 = (x + width) / page.width;
region.v2 = (y + height) / page.height;
}
region.x = x;
region.y = y;
region.width = Math.abs(width);
region.height = Math.abs(height);
if (reader.readTuple(tuple) == 4) {
// split is optional
// region.splits = new Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
if (reader.readTuple(tuple) == 4) {
// pad is optional, but only present with splits
//region.pads = Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
reader.readTuple(tuple);
}
}
region.originalWidth = parseInt(tuple[0]);
region.originalHeight = parseInt(tuple[1]);
reader.readTuple(tuple);
region.offsetX = parseInt(tuple[0]);
region.offsetY = parseInt(tuple[1]);
region.index = parseInt(reader.readValue());
region.texture = page.texture;
this.regions.push(region);
}
}
}
/**
* @param {?} name
* @return {?}
*/
findRegion(name) {
for (let i = 0; i < this.regions.length; i++) {
if (this.regions[i].name == name) {
return this.regions[i];
}
}
return null;
}
/**
* @return {?}
*/
dispose() {
for (let i = 0; i < this.pages.length; i++) {
this.pages[i].texture.dispose();
}
}
}
if (false) {
/** @type {?} */
TextureAtlas.prototype.pages;
/** @type {?} */
TextureAtlas.prototype.regions;
}
class TextureAtlasReader {
/**
* @param {?} text
*/
constructor(text) {
this.index = 0;
this.lines = text.split(/\r\n|\r|\n/);
}
/**
* @return {?}
*/
readLine() {
if (this.index >= this.lines.length)
return null;
return this.lines[this.index++];
}
/**
* @return {?}
*/
readValue() {
/** @type {?} */
let line = this.readLine();
/** @type {?} */
let colon = line.indexOf(":");
if (colon == -1)
throw new Error("Invalid line: " + line);
return line.substring(colon + 1).trim();
}
/**
* @param {?} tuple
* @return {?}
*/
readTuple(tuple) {
/** @type {?} */
let line = this.readLine();
/** @type {?} */
let colon = line.indexOf(":");
if (colon == -1)
throw new Error("Invalid line: " + line);
/** @type {?} */
let i = 0;
/** @type {?} */
let lastMatch = colon + 1;
for (; i < 3; i++) {
/** @type {?} */
let comma = line.indexOf(",", lastMatch);
if (comma == -1)
break;
tuple[i] = line.substr(lastMatch, comma - lastMatch).trim();
lastMatch = comma + 1;
}
tuple[i] = line.substring(lastMatch).trim();
return i + 1;
}
}
if (false) {
/** @type {?} */
TextureAtlasReader.prototype.lines;
/** @type {?} */
TextureAtlasReader.prototype.index;
}
export class TextureAtlasPage {
}
if (false) {
/** @type {?} */
TextureAtlasPage.prototype.name;
/** @type {?} */
TextureAtlasPage.prototype.minFilter;
/** @type {?} */
TextureAtlasPage.prototype.magFilter;
/** @type {?} */
TextureAtlasPage.prototype.uWrap;
/** @type {?} */
TextureAtlasPage.prototype.vWrap;
/** @type {?} */
TextureAtlasPage.prototype.texture;
/** @type {?} */
TextureAtlasPage.prototype.width;
/** @type {?} */
TextureAtlasPage.prototype.height;
}
export class TextureAtlasRegion extends TextureRegion {
}
if (false) {
/** @type {?} */
TextureAtlasRegion.prototype.page;
/** @type {?} */
TextureAtlasRegion.prototype.name;
/** @type {?} */
TextureAtlasRegion.prototype.x;
/** @type {?} */
TextureAtlasRegion.prototype.y;
/** @type {?} */
TextureAtlasRegion.prototype.index;
/** @type {?} */
TextureAtlasRegion.prototype.rotate;
/** @type {?} */
TextureAtlasRegion.prototype.degrees;
/** @type {?} */
TextureAtlasRegion.prototype.texture;
/** @type {?} */
TextureAtlasRegion.prototype.u;
/** @type {?} */
TextureAtlasRegion.prototype.v;
/** @type {?} */
TextureAtlasRegion.prototype.u2;
/** @type {?} */
TextureAtlasRegion.prototype.v2;
/** @type {?} */
TextureAtlasRegion.prototype.width;
/** @type {?} */
TextureAtlasRegion.prototype.height;
/** @type {?} */
TextureAtlasRegion.prototype.originalWidth;
/** @type {?} */
TextureAtlasRegion.prototype.originalHeight;
/** @type {?} */
TextureAtlasRegion.prototype.offsetX;
/** @type {?} */
TextureAtlasRegion.prototype.offsetY;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dHVyZUF0bGFzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvVGV4dHVyZUF0bGFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJBLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFpQixhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFL0UsTUFBTSxPQUFPLFlBQVk7Ozs7O0lBR3ZCLFlBQVksU0FBaUIsRUFBRSxhQUFvQztRQUZuRSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFzQixDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7Ozs7SUFDTyxJQUFJLENBQUMsU0FBaUIsRUFBRSxhQUFvQztRQUNsRSxJQUFJLGFBQWEsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDOztZQUN4RSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7O1lBQzFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUM7O1lBQzVCLElBQUksR0FBcUIsSUFBSTtRQUNqQyxPQUFPLElBQUksRUFBRTs7Z0JBQ1AsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDNUIsSUFBSSxJQUFJLElBQUksSUFBSTtnQkFBRSxNQUFNO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQUUsSUFBSSxHQUFHLElBQUksQ0FBQztpQkFDN0IsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDZCxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFD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VTs7SUFDVixtQ0FBYzs7SUFDZCxvQ0FBZ0I7O0lBQ2hCLHFDQUFnQjs7SUFDaEIscUNBQWlCOztJQUNqQiwrQkFBVTs7SUFDViwrQkFBVTs7SUFDVixnQ0FBVzs7SUFDWCxnQ0FBVzs7SUFDWCxtQ0FBYzs7SUFDZCxvQ0FBZTs7SUFDZiwyQ0FBc0I7O0lBQ3RCLDRDQUF1Qjs7SUFDdkIscUNBQWdCOztJQUNoQixxQ0FBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG5pbXBvcnQgeyBUZXh0dXJlLCBUZXh0dXJlV3JhcCwgVGV4dHVyZUZpbHRlciwgVGV4dHVyZVJlZ2lvbiB9IGZyb20gXCIuL1RleHR1cmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0dXJlQXRsYXMgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBwYWdlcyA9IG5ldyBBcnJheTxUZXh0dXJlQXRsYXNQYWdlPigpO1xyXG4gIHJlZ2lvbnMgPSBuZXcgQXJyYXk8VGV4dHVyZUF0bGFzUmVnaW9uPigpO1xyXG4gIGNvbnN0cnVjdG9yKGF0bGFzVGV4dDogc3RyaW5nLCB0ZXh0dXJlTG9hZGVyOiAocGF0aDogc3RyaW5nKSA9PiBhbnkpIHtcclxuICAgIHRoaXMubG9hZChhdGxhc1RleHQsIHRleHR1cmVMb2FkZXIpO1xyXG4gIH1cclxuICBwcml2YXRlIGxvYWQoYXRsYXNUZXh0OiBzdHJpbmcsIHRleHR1cmVMb2FkZXI6IChwYXRoOiBzdHJpbmcpID0+IGFueSkge1xyXG4gICAgaWYgKHRleHR1cmVMb2FkZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwidGV4dHVyZUxvYWRlciBjYW5ub3QgYmUgbnVsbC5cIik7XHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IFRleHR1cmVBdGxhc1JlYWRlcihhdGxhc1RleHQpO1xyXG4gICAgbGV0IHR1cGxlID0gbmV3IEFycmF5PHN0cmluZz4oNCk7XHJcbiAgICBsZXQgcGFnZTogVGV4dHVyZUF0bGFzUGFnZSA9IG51bGw7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICBsZXQgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpO1xyXG4gICAgICBpZiAobGluZSA9PSBudWxsKSBicmVhaztcclxuICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xyXG4gICAgICBpZiAobGluZS5sZW5ndGggPT0gMCkgcGFnZSA9IG51bGw7XHJcbiAgICAgIGVsc2UgaWYgKCFwYWdlKSB7XHJcbiAgICAgICAgcGFnZSA9IG5ldyBUZXh0dXJlQXRsYXNQYWdlKCk7XHJcbiAgICAgICAgcGFnZS5uYW1lID0gbGluZTtcclxuICAgICAgICBpZiAocmVhZGVyLnJlYWRUdXBsZSh0dXBsZSkgPT0gMikge1xyXG4gICAgICAgICAgLy8gc2l6ZSBpcyBvbmx5IG9wdGlvbmFsIGZvciBhbiBhdGxhcyBwYWNrZWQgd2l0aCBhbiBvbGQgVGV4dHVyZVBhY2tlci5cclxuICAgICAgICAgIHBhZ2Uud2lkdGggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgICBwYWdlLmhlaWdodCA9IHBhcnNlSW50KHR1cGxlWzFdKTtcclxuICAgICAgICAgIHJlYWRlci5yZWFkVHVwbGUodHVwbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBwYWdlLmZvcm1hdCA9IEZvcm1hdFt0dXBsZVswXV07IHdlIGRvbid0IG5lZWQgZm9ybWF0IGluIFdlYkdMXHJcbiAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgcGFnZS5taW5GaWx0ZXIgPSBUZXh0dXJlLmZpbHRlckZyb21TdHJpbmcodHVwbGVbMF0pO1xyXG4gICAgICAgIHBhZ2UubWFnRmlsdGVyID0gVGV4dHVyZS5maWx0ZXJGcm9tU3RyaW5nKHR1cGxlWzFdKTtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uID0gcmVhZGVyLnJlYWRWYWx1ZSgpO1xyXG4gICAgICAgIHBhZ2UudVdyYXAgPSBUZXh0dXJlV3JhcC5DbGFtcFRvRWRnZTtcclxuICAgICAgICBwYWdlLnZXcmFwID0gVGV4dHVyZVdyYXAuQ2xhbXBUb0VkZ2U7XHJcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcInhcIikgcGFnZS51V3JhcCA9IFRleHR1cmVXcmFwLlJlcGVhdDtcclxuICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gXCJ5XCIpIHBhZ2UudldyYXAgPSBUZXh0dXJlV3JhcC5SZXBlYXQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFwieHlcIilcclxuICAgICAgICAgIHBhZ2UudVdyYXAgPSBwYWdlLnZXcmFwID0gVGV4dHVyZVdyYXAuUmVwZWF0O1xyXG4gICAgICAgIHBhZ2UudGV4dHVyZSA9IHRleHR1cmVMb2FkZXIobGluZSk7XHJcbiAgICAgICAgcGFnZS50ZXh0dXJlLnNldEZpbHRlcnMocGFnZS5taW5GaWx0ZXIsIHBhZ2UubWFnRmlsdGVyKTtcclxuICAgICAgICBwYWdlLnRleHR1cmUuc2V0V3JhcHMocGFnZS51V3JhcCwgcGFnZS52V3JhcCk7XHJcbiAgICAgICAgcGFnZS53aWR0aCA9IHBhZ2UudGV4dHVyZS5nZXRJbWFnZSgpLndpZHRoO1xyXG4gICAgICAgIHBhZ2UuaGVpZ2h0ID0gcGFnZS50ZXh0dXJlLmdldEltYWdlKCkuaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb24gPSBuZXcgVGV4dHVyZUF0bGFzUmVnaW9uKCk7XHJcbiAgICAgICAgcmVnaW9uLm5hbWUgPSBsaW5lO1xyXG4gICAgICAgIHJlZ2lvbi5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgcm90YXRlVmFsdWUgPSByZWFkZXIucmVhZFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHJvdGF0ZVZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgIHJlZ2lvbi5kZWdyZWVzID0gOTA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyb3RhdGVWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09IFwiZmFsc2VcIikge1xyXG4gICAgICAgICAgcmVnaW9uLmRlZ3JlZXMgPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWdpb24uZGVncmVlcyA9IHBhcnNlRmxvYXQocm90YXRlVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZWdpb24ucm90YXRlID0gcmVnaW9uLmRlZ3JlZXMgPT0gOTA7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgbGV0IHggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgbGV0IHkgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQodHVwbGVbMF0pO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVnaW9uLnUgPSB4IC8gcGFnZS53aWR0aDtcclxuICAgICAgICByZWdpb24udiA9IHkgLyBwYWdlLmhlaWdodDtcclxuICAgICAgICBpZiAocmVnaW9uLnJvdGF0ZSkge1xyXG4gICAgICAgICAgcmVnaW9uLnUyID0gKHggKyBoZWlnaHQpIC8gcGFnZS53aWR0aDtcclxuICAgICAgICAgIHJlZ2lvbi52MiA9ICh5ICsgd2lkdGgpIC8gcGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlZ2lvbi51MiA9ICh4ICsgd2lkdGgpIC8gcGFnZS53aWR0aDtcclxuICAgICAgICAgIHJlZ2lvbi52MiA9ICh5ICsgaGVpZ2h0KSAvIHBhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZWdpb24ueCA9IHg7XHJcbiAgICAgICAgcmVnaW9uLnkgPSB5O1xyXG4gICAgICAgIHJlZ2lvbi53aWR0aCA9IE1hdGguYWJzKHdpZHRoKTtcclxuICAgICAgICByZWdpb24uaGVpZ2h0ID0gTWF0aC5hYnMoaGVpZ2h0KTtcclxuICAgICAgICBpZiAocmVhZGVyLnJlYWRUdXBsZSh0dXBsZSkgPT0gNCkge1xyXG4gICAgICAgICAgLy8gc3BsaXQgaXMgb3B0aW9uYWxcclxuICAgICAgICAgIC8vIHJlZ2lvbi5zcGxpdHMgPSBuZXcgVmVjdG9yLjxpbnQ+KHBhcnNlSW50KHR1cGxlWzBdKSwgcGFyc2VJbnQodHVwbGVbMV0pLCBwYXJzZUludCh0dXBsZVsyXSksIHBhcnNlSW50KHR1cGxlWzNdKSk7XHJcbiAgICAgICAgICBpZiAocmVhZGVyLnJlYWRUdXBsZSh0dXBsZSkgPT0gNCkge1xyXG4gICAgICAgICAgICAvLyBwYWQgaXMgb3B0aW9uYWwsIGJ1dCBvbmx5IHByZXNlbnQgd2l0aCBzcGxpdHNcclxuICAgICAgICAgICAgLy9yZWdpb24ucGFkcyA9IFZlY3Rvci48aW50PihwYXJzZUludCh0dXBsZVswXSksIHBhcnNlSW50KHR1cGxlWzFdKSwgcGFyc2VJbnQodHVwbGVbMl0pLCBwYXJzZUludCh0dXBsZVszXSkpO1xyXG4gICAgICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVnaW9uLm9yaWdpbmFsV2lkdGggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgcmVnaW9uLm9yaWdpbmFsSGVpZ2h0ID0gcGFyc2VJbnQodHVwbGVbMV0pO1xyXG4gICAgICAgIHJlYWRlci5yZWFkVHVwbGUodHVwbGUpO1xyXG4gICAgICAgIHJlZ2lvbi5vZmZzZXRYID0gcGFyc2VJbnQodHVwbGVbMF0pO1xyXG4gICAgICAgIHJlZ2lvbi5vZmZzZXRZID0gcGFyc2VJbnQodHVwbGVbMV0pO1xyXG4gICAgICAgIHJlZ2lvbi5pbmRleCA9IHBhcnNlSW50KHJlYWRlci5yZWFkVmFsdWUoKSk7XHJcbiAgICAgICAgcmVnaW9uLnRleHR1cmUgPSBwYWdlLnRleHR1cmU7XHJcbiAgICAgICAgdGhpcy5yZWdpb25zLnB1c2gocmVnaW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBmaW5kUmVnaW9uKG5hbWU6IHN0cmluZyk6IFRleHR1cmVBdGxhc1JlZ2lvbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVnaW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5yZWdpb25zW2ldLm5hbWUgPT0gbmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbnNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMucGFnZXNbaV0udGV4dHVyZS5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbmNsYXNzIFRleHR1cmVBdGxhc1JlYWRlciB7XHJcbiAgbGluZXM6IEFycmF5PHN0cmluZz47XHJcbiAgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcclxuICB9XHJcbiAgcmVhZExpbmUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmxpbmVzW3RoaXMuaW5kZXgrK107XHJcbiAgfVxyXG4gIHJlYWRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGxpbmUgPSB0aGlzLnJlYWRMaW5lKCk7XHJcbiAgICBsZXQgY29sb24gPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xyXG4gICAgaWYgKGNvbG9uID09IC0xKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxpbmU6IFwiICsgbGluZSk7XHJcbiAgICByZXR1cm4gbGluZS5zdWJzdHJpbmcoY29sb24gKyAxKS50cmltKCk7XHJcbiAgfVxyXG4gIHJlYWRUdXBsZSh0dXBsZTogQXJyYXk8c3RyaW5nPik6IG51bWJlciB7XHJcbiAgICBsZXQgbGluZSA9IHRoaXMucmVhZExpbmUoKTtcclxuICAgIGxldCBjb2xvbiA9IGxpbmUuaW5kZXhPZihcIjpcIik7XHJcbiAgICBpZiAoY29sb24gPT0gLTEpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGluZTogXCIgKyBsaW5lKTtcclxuICAgIGxldCBpID0gMCxcclxuICAgICAgbGFzdE1hdGNoID0gY29sb24gKyAxO1xyXG4gICAgZm9yICg7IGkgPCAzOyBpKyspIHtcclxuICAgICAgbGV0IGNvbW1hID0gbGluZS5pbmRleE9mKFwiLFwiLCBsYXN0TWF0Y2gpO1xyXG4gICAgICBpZiAoY29tbWEgPT0gLTEpIGJyZWFrO1xyXG4gICAgICB0dXBsZVtpXSA9IGxpbmUuc3Vic3RyKGxhc3RNYXRjaCwgY29tbWEgLSBsYXN0TWF0Y2gpLnRyaW0oKTtcclxuICAgICAgbGFzdE1hdGNoID0gY29tbWEgKyAxO1xyXG4gICAgfVxyXG4gICAgdHVwbGVbaV0gPSBsaW5lLnN1YnN0cmluZyhsYXN0TWF0Y2gpLnRyaW0oKTtcclxuICAgIHJldHVybiBpICsgMTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhc1BhZ2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBtaW5GaWx0ZXI6IFRleHR1cmVGaWx0ZXI7XHJcbiAgbWFnRmlsdGVyOiBUZXh0dXJlRmlsdGVyO1xyXG4gIHVXcmFwOiBUZXh0dXJlV3JhcDtcclxuICB2V3JhcDogVGV4dHVyZVdyYXA7XHJcbiAgdGV4dHVyZTogVGV4dHVyZTtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBjbGFzcyBUZXh0dXJlQXRsYXNSZWdpb24gZXh0ZW5kcyBUZXh0dXJlUmVnaW9uIHtcclxuICBwYWdlOiBUZXh0dXJlQXRsYXNQYWdlO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB4OiBudW1iZXI7XHJcbiAgeTogbnVtYmVyO1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgcm90YXRlOiBib29sZWFuO1xyXG4gIGRlZ3JlZXM6IG51bWJlcjtcclxuICB0ZXh0dXJlOiBUZXh0dXJlO1xyXG4gIHU6IG51bWJlcjtcclxuICB2OiBudW1iZXI7XHJcbiAgdTI6IG51bWJlcjtcclxuICB2MjogbnVtYmVyO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyO1xyXG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXI7XHJcbiAgb2Zmc2V0WDogbnVtYmVyO1xyXG4gIG9mZnNldFk6IG51bWJlcjtcclxufVxyXG4iXX0=