ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
791 lines • 55.3 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.
*****************************************************************************/
/**
* @record
* @template T
*/
export function Map() { }
export class IntSet {
constructor() {
this.array = new Array();
}
/**
* @param {?} value
* @return {?}
*/
add(value) {
/** @type {?} */
let contains = this.contains(value);
this.array[value | 0] = value | 0;
return !contains;
}
/**
* @param {?} value
* @return {?}
*/
contains(value) {
return this.array[value | 0] != undefined;
}
/**
* @param {?} value
* @return {?}
*/
remove(value) {
this.array[value | 0] = undefined;
}
/**
* @return {?}
*/
clear() {
this.array.length = 0;
}
}
if (false) {
/** @type {?} */
IntSet.prototype.array;
}
/**
* @record
*/
export function Disposable() { }
if (false) {
/**
* @return {?}
*/
Disposable.prototype.dispose = function () { };
}
/**
* @record
*/
export function Restorable() { }
if (false) {
/**
* @return {?}
*/
Restorable.prototype.restore = function () { };
}
export class Color {
/**
* @param {?=} r
* @param {?=} g
* @param {?=} b
* @param {?=} a
*/
constructor(r = 0, g = 0, b = 0, a = 0) {
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
/**
* @template THIS
* @this {THIS}
* @param {?} r
* @param {?} g
* @param {?} b
* @param {?} a
* @return {THIS}
*/
set(r, g, b, a) {
(/** @type {?} */ (this)).r = r;
(/** @type {?} */ (this)).g = g;
(/** @type {?} */ (this)).b = b;
(/** @type {?} */ (this)).a = a;
(/** @type {?} */ (this)).clamp();
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} c
* @return {THIS}
*/
setFromColor(c) {
(/** @type {?} */ (this)).r = c.r;
(/** @type {?} */ (this)).g = c.g;
(/** @type {?} */ (this)).b = c.b;
(/** @type {?} */ (this)).a = c.a;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} hex
* @return {THIS}
*/
setFromString(hex) {
hex = hex.charAt(0) == "#" ? hex.substr(1) : hex;
(/** @type {?} */ (this)).r = parseInt(hex.substr(0, 2), 16) / 255.0;
(/** @type {?} */ (this)).g = parseInt(hex.substr(2, 2), 16) / 255.0;
(/** @type {?} */ (this)).b = parseInt(hex.substr(4, 2), 16) / 255.0;
(/** @type {?} */ (this)).a = (hex.length != 8 ? 255 : parseInt(hex.substr(6, 2), 16)) / 255.0;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} r
* @param {?} g
* @param {?} b
* @param {?} a
* @return {THIS}
*/
add(r, g, b, a) {
(/** @type {?} */ (this)).r += r;
(/** @type {?} */ (this)).g += g;
(/** @type {?} */ (this)).b += b;
(/** @type {?} */ (this)).a += a;
(/** @type {?} */ (this)).clamp();
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
clamp() {
if ((/** @type {?} */ (this)).r < 0)
(/** @type {?} */ (this)).r = 0;
else if ((/** @type {?} */ (this)).r > 1)
(/** @type {?} */ (this)).r = 1;
if ((/** @type {?} */ (this)).g < 0)
(/** @type {?} */ (this)).g = 0;
else if ((/** @type {?} */ (this)).g > 1)
(/** @type {?} */ (this)).g = 1;
if ((/** @type {?} */ (this)).b < 0)
(/** @type {?} */ (this)).b = 0;
else if ((/** @type {?} */ (this)).b > 1)
(/** @type {?} */ (this)).b = 1;
if ((/** @type {?} */ (this)).a < 0)
(/** @type {?} */ (this)).a = 0;
else if ((/** @type {?} */ (this)).a > 1)
(/** @type {?} */ (this)).a = 1;
return (/** @type {?} */ (this));
}
/**
* @param {?} color
* @param {?} value
* @return {?}
*/
static rgba8888ToColor(color, value) {
color.r = ((value & 0xff000000) >>> 24) / 255;
color.g = ((value & 0x00ff0000) >>> 16) / 255;
color.b = ((value & 0x0000ff00) >>> 8) / 255;
color.a = (value & 0x000000ff) / 255;
}
/**
* @param {?} color
* @param {?} value
* @return {?}
*/
static rgb888ToColor(color, value) {
color.r = ((value & 0x00ff0000) >>> 16) / 255;
color.g = ((value & 0x0000ff00) >>> 8) / 255;
color.b = (value & 0x000000ff) / 255;
}
}
Color.WHITE = new Color(1, 1, 1, 1);
Color.RED = new Color(1, 0, 0, 1);
Color.GREEN = new Color(0, 1, 0, 1);
Color.BLUE = new Color(0, 0, 1, 1);
Color.MAGENTA = new Color(1, 0, 1, 1);
if (false) {
/** @type {?} */
Color.WHITE;
/** @type {?} */
Color.RED;
/** @type {?} */
Color.GREEN;
/** @type {?} */
Color.BLUE;
/** @type {?} */
Color.MAGENTA;
/** @type {?} */
Color.prototype.r;
/** @type {?} */
Color.prototype.g;
/** @type {?} */
Color.prototype.b;
/** @type {?} */
Color.prototype.a;
}
export class MathUtils {
/**
* @param {?} value
* @param {?} min
* @param {?} max
* @return {?}
*/
static clamp(value, min, max) {
if (value < min)
return min;
if (value > max)
return max;
return value;
}
/**
* @param {?} degrees
* @return {?}
*/
static cosDeg(degrees) {
return Math.cos(degrees * MathUtils.degRad);
}
/**
* @param {?} degrees
* @return {?}
*/
static sinDeg(degrees) {
return Math.sin(degrees * MathUtils.degRad);
}
/**
* @param {?} value
* @return {?}
*/
static signum(value) {
return value > 0 ? 1 : value < 0 ? -1 : 0;
}
/**
* @param {?} x
* @return {?}
*/
static toInt(x) {
return x > 0 ? Math.floor(x) : Math.ceil(x);
}
/**
* @param {?} x
* @return {?}
*/
static cbrt(x) {
/** @type {?} */
let y = Math.pow(Math.abs(x), 1 / 3);
return x < 0 ? -y : y;
}
/**
* @param {?} min
* @param {?} max
* @return {?}
*/
static randomTriangular(min, max) {
return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5);
}
/**
* @param {?} min
* @param {?} max
* @param {?} mode
* @return {?}
*/
static randomTriangularWith(min, max, mode) {
/** @type {?} */
let u = Math.random();
/** @type {?} */
let d = max - min;
if (u <= (mode - min) / d)
return min + Math.sqrt(u * d * (mode - min));
return max - Math.sqrt((1 - u) * d * (max - mode));
}
}
MathUtils.PI = 3.1415927;
MathUtils.PI2 = MathUtils.PI * 2;
MathUtils.radiansToDegrees = 180 / MathUtils.PI;
MathUtils.radDeg = MathUtils.radiansToDegrees;
MathUtils.degreesToRadians = MathUtils.PI / 180;
MathUtils.degRad = MathUtils.degreesToRadians;
if (false) {
/** @type {?} */
MathUtils.PI;
/** @type {?} */
MathUtils.PI2;
/** @type {?} */
MathUtils.radiansToDegrees;
/** @type {?} */
MathUtils.radDeg;
/** @type {?} */
MathUtils.degreesToRadians;
/** @type {?} */
MathUtils.degRad;
}
/**
* @abstract
*/
export class Interpolation {
/**
* @param {?} start
* @param {?} end
* @param {?} a
* @return {?}
*/
apply(start, end, a) {
return start + (end - start) * this.applyInternal(a);
}
}
if (false) {
/**
* @abstract
* @protected
* @param {?} a
* @return {?}
*/
Interpolation.prototype.applyInternal = function (a) { };
}
export class Pow extends Interpolation {
/**
* @param {?} power
*/
constructor(power) {
super();
this.power = 2;
this.power = power;
}
/**
* @param {?} a
* @return {?}
*/
applyInternal(a) {
if (a <= 0.5)
return Math.pow(a * 2, this.power) / 2;
return (Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1);
}
}
if (false) {
/**
* @type {?}
* @protected
*/
Pow.prototype.power;
}
export class PowOut extends Pow {
/**
* @param {?} power
*/
constructor(power) {
super(power);
}
/**
* @param {?} a
* @return {?}
*/
applyInternal(a) {
return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1;
}
}
export class Utils {
/**
* @template T
* @param {?} source
* @param {?} sourceStart
* @param {?} dest
* @param {?} destStart
* @param {?} numElements
* @return {?}
*/
static arrayCopy(source, sourceStart, dest, destStart, numElements) {
for (let i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) {
dest[j] = source[i];
}
}
/**
* @template T
* @param {?} array
* @param {?} size
* @param {?=} value
* @return {?}
*/
static setArraySize(array, size, value = 0) {
/** @type {?} */
let oldSize = array.length;
if (oldSize == size)
return array;
array.length = size;
if (oldSize < size) {
for (let i = oldSize; i < size; i++)
array[i] = value;
}
return array;
}
/**
* @template T
* @param {?} array
* @param {?} size
* @param {?=} value
* @return {?}
*/
static ensureArrayCapacity(array, size, value = 0) {
if (array.length >= size)
return array;
return Utils.setArraySize(array, size, value);
}
/**
* @template T
* @param {?} size
* @param {?} defaultValue
* @return {?}
*/
static newArray(size, defaultValue) {
/** @type {?} */
let array = new Array(size);
for (let i = 0; i < size; i++)
array[i] = defaultValue;
return array;
}
/**
* @param {?} size
* @return {?}
*/
static newFloatArray(size) {
if (Utils.SUPPORTS_TYPED_ARRAYS) {
return new Float32Array(size);
}
else {
/** @type {?} */
let array = new Array(size);
for (let i = 0; i < array.length; i++)
array[i] = 0;
return array;
}
}
/**
* @param {?} size
* @return {?}
*/
static newShortArray(size) {
if (Utils.SUPPORTS_TYPED_ARRAYS) {
return new Int16Array(size);
}
else {
/** @type {?} */
let array = new Array(size);
for (let i = 0; i < array.length; i++)
array[i] = 0;
return array;
}
}
/**
* @param {?} array
* @return {?}
*/
static toFloatArray(array) {
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
}
/**
* @param {?} value
* @return {?}
*/
static toSinglePrecision(value) {
return Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value;
}
// This function is used to fix WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
/**
* @param {?} alpha
* @param {?} blend
* @return {?}
*/
static webkit602BugfixHelper(alpha, blend) { }
/**
* @template T
* @param {?} array
* @param {?} element
* @param {?=} identity
* @return {?}
*/
static contains(array, element, identity = true) {
for (var i = 0; i < array.length; i++) {
if (array[i] == element)
return true;
}
return false;
}
}
Utils.SUPPORTS_TYPED_ARRAYS = typeof Float32Array !== "undefined";
if (false) {
/** @type {?} */
Utils.SUPPORTS_TYPED_ARRAYS;
}
export class DebugUtils {
/**
* @param {?} skeleton
* @return {?}
*/
static logBones(skeleton) {
for (let i = 0; i < skeleton.bones.length; i++) {
/** @type {?} */
let bone = skeleton.bones[i];
console.log(bone.data.name +
", " +
bone.a +
", " +
bone.b +
", " +
bone.c +
", " +
bone.d +
", " +
bone.worldX +
", " +
bone.worldY);
}
}
}
/**
* @template T
*/
export class Pool {
/**
* @param {?} instantiator
*/
constructor(instantiator) {
this.items = new Array();
this.instantiator = instantiator;
}
/**
* @return {?}
*/
obtain() {
return this.items.length > 0 ? this.items.pop() : this.instantiator();
}
/**
* @param {?} item
* @return {?}
*/
free(item) {
if (((/** @type {?} */ (item))).reset)
((/** @type {?} */ (item))).reset();
this.items.push(item);
}
/**
* @param {?} items
* @return {?}
*/
freeAll(items) {
for (let i = 0; i < items.length; i++) {
if (((/** @type {?} */ (items[i]))).reset)
((/** @type {?} */ (items[i]))).reset();
this.items[i] = items[i];
}
}
/**
* @return {?}
*/
clear() {
this.items.length = 0;
}
}
if (false) {
/**
* @type {?}
* @private
*/
Pool.prototype.items;
/**
* @type {?}
* @private
*/
Pool.prototype.instantiator;
}
export class Vector2 {
/**
* @param {?=} x
* @param {?=} y
*/
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
set(x, y) {
this.x = x;
this.y = y;
return this;
}
/**
* @return {?}
*/
length() {
/** @type {?} */
let x = this.x;
/** @type {?} */
let y = this.y;
return Math.sqrt(x * x + y * y);
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
normalize() {
/** @type {?} */
let len = (/** @type {?} */ (this)).length();
if (len != 0) {
(/** @type {?} */ (this)).x /= len;
(/** @type {?} */ (this)).y /= len;
}
return (/** @type {?} */ (this));
}
}
if (false) {
/** @type {?} */
Vector2.prototype.x;
/** @type {?} */
Vector2.prototype.y;
}
export class TimeKeeper {
constructor() {
this.maxDelta = 0.064;
this.framesPerSecond = 0;
this.delta = 0;
this.totalTime = 0;
this.lastTime = Date.now() / 1000;
this.frameCount = 0;
this.frameTime = 0;
}
/**
* @return {?}
*/
update() {
/** @type {?} */
let now = Date.now() / 1000;
this.delta = now - this.lastTime;
this.frameTime += this.delta;
this.totalTime += this.delta;
if (this.delta > this.maxDelta)
this.delta = this.maxDelta;
this.lastTime = now;
this.frameCount++;
if (this.frameTime > 1) {
this.framesPerSecond = this.frameCount / this.frameTime;
this.frameTime = 0;
this.frameCount = 0;
}
}
}
if (false) {
/** @type {?} */
TimeKeeper.prototype.maxDelta;
/** @type {?} */
TimeKeeper.prototype.framesPerSecond;
/** @type {?} */
TimeKeeper.prototype.delta;
/** @type {?} */
TimeKeeper.prototype.totalTime;
/**
* @type {?}
* @private
*/
TimeKeeper.prototype.lastTime;
/**
* @type {?}
* @private
*/
TimeKeeper.prototype.frameCount;
/**
* @type {?}
* @private
*/
TimeKeeper.prototype.frameTime;
}
/**
* @record
* @template T
*/
export function ArrayLike() { }
if (false) {
/** @type {?} */
ArrayLike.prototype.length;
/* Skipping unhandled member: [n: number]: T;*/
}
export class WindowedMean {
/**
* @param {?=} windowSize
*/
constructor(windowSize = 32) {
this.addedValues = 0;
this.lastValue = 0;
this.mean = 0;
this.dirty = true;
this.values = new Array(windowSize);
}
/**
* @return {?}
*/
hasEnoughData() {
return this.addedValues >= this.values.length;
}
/**
* @param {?} value
* @return {?}
*/
addValue(value) {
if (this.addedValues < this.values.length)
this.addedValues++;
this.values[this.lastValue++] = value;
if (this.lastValue > this.values.length - 1)
this.lastValue = 0;
this.dirty = true;
}
/**
* @return {?}
*/
getMean() {
if (this.hasEnoughData()) {
if (this.dirty) {
/** @type {?} */
let mean = 0;
for (let i = 0; i < this.values.length; i++) {
mean += this.values[i];
}
this.mean = mean / this.values.length;
this.dirty = false;
}
return this.mean;
}
else {
return 0;
}
}
}
if (false) {
/** @type {?} */
WindowedMean.prototype.values;
/** @type {?} */
WindowedMean.prototype.addedValues;
/** @type {?} */
WindowedMean.prototype.lastValue;
/** @type {?} */
WindowedMean.prototype.mean;
/** @type {?} */
WindowedMean.prototype.dirty;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9VdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EseUJBRUM7QUFDRCxNQUFNLE9BQU8sTUFBTTtJQUFuQjtRQUNFLFVBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBZTlCLENBQUM7Ozs7O0lBZEMsR0FBRyxDQUFDLEtBQWE7O1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNuQixDQUFDOzs7OztJQUNELFFBQVEsQ0FBQyxLQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBQ0QsTUFBTSxDQUFDLEtBQWE7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7Ozs7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjs7O0lBZkMsdUJBQTRCOzs7OztBQWdCOUIsZ0NBRUM7Ozs7O0lBREMsK0NBQWdCOzs7OztBQUVsQixnQ0FFQzs7Ozs7SUFEQywrQ0FBZ0I7O0FBRWxCLE1BQU0sT0FBTyxLQUFLOzs7Ozs7O0lBTWhCLFlBQ1MsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDO1FBSGIsTUFBQyxHQUFELENBQUMsQ0FBWTtRQUNiLE1B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LENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBQ0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUNoRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN2QyxDQUFDOzs7Ozs7SUFDRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQVksRUFBRSxLQUFhO1FBQzlDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN2QyxDQUFDOztBQS9EYSxXQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsU0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFdBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixVQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0IsYUFBTyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7SUFKOUMsWUFBNEM7O0lBQzVDLFVBQTBDOztJQUMxQyxZQUE0Qzs7SUFDNUMsV0FBMkM7O0lBQzNDLGNBQThDOztJQUU1QyxrQkFBb0I7O0lBQ3BCLGtCQUFvQjs7SUFDcEIsa0JBQW9COztJQUNwQixrQkFBb0I7O0FBd0R4QixNQUFNLE9BQU8sU0FBUzs7Ozs7OztJQU9wQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUNsRCxJQUFJLEtBQUssR0FBRyxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDNUIsSUFBSSxLQUFLLEdBQUcsR0FBRztZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQzVCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQWE7UUFDekIsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQVM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7O0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFTOztZQUNmLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQzs7Ozs7O0lBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxHQUFXO1FBQzlDLE9BQU8sU0FBUyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDckUsQ0FBQzs7Ozs7OztJQUNELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLElBQVk7O1lBQzVELENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFOztZQUNqQixDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQzs7QUFuQ00sWUFBRSxHQUFHLFNBQVMsQ0FBQztBQUNmLGFBQUcsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2QiwwQkFBZ0IsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztBQUN0QyxnQkFBTSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztBQUNwQywwQkFBZ0IsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0QyxnQkFBTSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzs7O0lBTDNDLGFBQXNCOztJQUN0QixjQUE4Qjs7SUFDOUIsMkJBQTZDOztJQUM3QyxpQkFBMkM7O0lBQzNDLDJCQUE2Qzs7SUFDN0MsaUJBQTJDOzs7OztBQWdDN0MsTUFBTSxPQUFnQixhQUFhOzs7Ozs7O0lBRWpDLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLENBQVM7UUFDekMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7Ozs7Ozs7O0lBSkMseURBQW9EOztBQUt0RCxNQUFNLE9BQU8sR0FBSSxTQUFRLGFBQWE7Ozs7SUFFcEMsWUFBWSxLQUFhO1FBQ3ZCLEtBQUssRUFBRSxDQUFDO1FBRkEsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUdsQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDOzs7OztJQUNELGFBQWEsQ0FBQyxDQUFTO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FDTCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ3ZFLENBQUM7SUFDSixDQUFDO0NBQ0Y7Ozs7OztJQVhDLG9CQUFvQjs7QUFZdEIsTUFBTSxPQUFPLE1BQU8sU0FBUSxHQUFHOzs7O0lBQzdCLFlBQVksS0FBYTtRQUN2QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDZixDQUFDOzs7OztJQUNELGFBQWEsQ0FBQyxDQUFTO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0Y7QUFDRCxNQUFNLE9BQU8sS0FBSzs7Ozs7Ozs7OztJQUVoQixNQUFNLENBQUMsU0FBUyxDQUNkLE1BQW9CLEVBQ3BCLFdBQW1CLEVBQ25CLElBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLFdBQW1CO1FBRW5CLEtBQ0UsSUFBSSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQ2xDLENBQUMsR0FBRyxXQUFXLEdBQUcsV0FBVyxFQUM3QixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFDUjtZQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7SUFDSCxDQUFDOzs7Ozs7OztJQUNELE1BQU0sQ0FBQyxZQUFZLENBQ2pCLEtBQWUsRUFDZixJQUFZLEVBQ1osUUFBYSxDQUFDOztZQUVWLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTTtRQUMxQixJQUFJLE9BQU8sSUFBSSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxFQUFFO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDdkQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7Ozs7O0lBQ0QsTUFBTSxDQUFDLG1CQUFtQixDQUN4QixLQUFlLEVBQ2YsSUFBWSxFQUNaLFFBQWEsQ0FBQztRQUVkLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7Ozs7OztJQUNELE1BQU0sQ0FBQyxRQUFRLENBQUksSUFBWSxFQUFFLFlBQWU7O1lBQzFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBSSxJQUFJLENBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7WUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3ZELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQVk7UUFDL0IsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjthQUFNOztnQkFDRCxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQVMsSUFBSSxDQUFDO1lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtnQkFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDOzs7OztJQUNELE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBWTtRQUMvQixJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO2FBQU07O2dCQUNELEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUM7WUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7Ozs7O0lBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFvQjtRQUN0QyxPQUFPLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2RSxDQUFDOzs7OztJQUNELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbEUsQ0FBQzs7Ozs7OztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsS0FBZSxJQUFHLENBQUM7Ozs7Ozs7O0lBQy9ELE1BQU0sQ0FBQyxRQUFRLENBQUksS0FBZSxFQUFFLE9BQVUsRUFBRSxRQUFRLEdBQUcsSUFBSTtRQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztBQXpFTSwyQkFBcUIsR0FBRyxPQUFPLFlBQVksS0FBSyxXQUFXLENBQUM7OztJQUFuRSw0QkFBbUU7O0FBMkVyRSxNQUFNLE9BQU8sVUFBVTs7Ozs7SUFDckIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFrQjtRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUMxQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ1osSUFBSTtnQkFDSixJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJO2dCQUNKLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUk7Z0JBQ0osSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSTtnQkFDSixJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJO2dCQUNKLElBQUksQ0FBQyxNQUFNO2dCQUNYLElBQUk7Z0JBQ0osSUFBSSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0Y7Ozs7QUFDRCxNQUFNLE9BQU8sSUFBSTs7OztJQUdmLFlBQVksWUFBcUI7UUFGekIsVUFBSyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7UUFHN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQzs7OztJQUNELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hFLENBQUM7Ozs7O0lBQ0QsSUFBSSxDQUFDLElBQU87UUFDVixJQUFJLENBQUMsbUJBQUEsSUFBSSxFQUFPLENBQUMsQ0FBQyxLQUFLO1lBQUUsQ0FBQyxtQkFBQSxJQUFJLEVBQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBQ0QsT0FBTyxDQUFDLEtBQW1CO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxtQkFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQU8sQ0FBQyxDQUFDLEtBQUs7Z0JBQUUsQ0FBQyxtQkFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7OztJQUNELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGOzs7Ozs7SUFyQkMscUJBQStCOzs7OztJQUMvQiw0QkFBOEI7O0FBcUJoQyxNQUFNLE9BQU8sT0FBTzs7Ozs7SUFDbEIsWUFBbUIsSUFBSSxDQUFDLEVBQVMsSUFBSSxDQUFDO1FBQW5CLE1BQUMsR0FBRCxDQUFDLENBQUk7UUFBUyxNQUFDLEdBQUQsQ0FBQyxDQUFJO0lBQUcsQ0FBQzs7Ozs7O0lBQzFDLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUN0QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7O0lBQ0QsTUFBTTs7WUFDQSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7O1lBQ1YsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Ozs7OztJQUNELFNBQVM7O1lBQ0gsR0FBRyxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sRUFBRTtRQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDWixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ2QsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztTQUNmO1FBQ0QsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Q0FDRjs7O0lBbkJhLG9CQUFZOztJQUFFLG9CQUFZOztBQW9CeEMsTUFBTSxPQUFPLFVBQVU7SUFBdkI7UUFDRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ04sYUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDN0IsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxDQUFDLENBQUM7SUFleEIsQ0FBQzs7OztJQWRDLE1BQU07O1lBQ0EsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDckI7SUFDSCxDQUFDO0NBQ0Y7OztJQXJCQyw4QkFBaUI7O0lBQ2pCLHFDQUFvQjs7SUFDcEIsMkJBQVU7O0lBQ1YsK0JBQWM7Ozs7O0lBQ2QsOEJBQXFDOzs7OztJQUNyQyxnQ0FBdUI7Ozs7O0lBQ3ZCLCtCQUFzQjs7Ozs7O0FBZ0J4QiwrQkFHQzs7O0lBRkMsMkJBQWU7OztBQUdqQixNQUFNLE9BQU8sWUFBWTs7OztJQU12QixZQUFZLGFBQXFCLEVBQUU7UUFKbkMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBRVgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBUyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7O0lBQ0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoRCxDQUFDOzs7OztJQUNELFFBQVEsQ0FBQyxLQUFhO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDOzs7O0lBQ0QsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTs7b0JBQ1YsSUFBSSxHQUFHLENBQUM7Z0JBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztDQUNGOzs7SUFoQ0MsOEJBQXNCOztJQUN0QixtQ0FBZ0I7O0lBQ2hCLGlDQUFjOztJQUNkLDRCQUFTOztJQUNULDZCQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uXCI7XHJcbmltcG9ydCB7IE1peEJsZW5kIH0gZnJvbSBcIi4vQW5pbWF0aW9uXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hcDxUPiB7XHJcbiAgW2tleTogc3RyaW5nXTogVDtcclxufVxyXG5leHBvcnQgY2xhc3MgSW50U2V0IHtcclxuICBhcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgYWRkKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjb250YWlucyA9IHRoaXMuY29udGFpbnModmFsdWUpO1xyXG4gICAgdGhpcy5hcnJheVt2YWx1ZSB8IDBdID0gdmFsdWUgfCAwO1xyXG4gICAgcmV0dXJuICFjb250YWlucztcclxuICB9XHJcbiAgY29udGFpbnModmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuYXJyYXlbdmFsdWUgfCAwXSAhPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHJlbW92ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFycmF5W3ZhbHVlIHwgMF0gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5hcnJheS5sZW5ndGggPSAwO1xyXG4gIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2FibGUge1xyXG4gIGRpc3Bvc2UoKTogdm9pZDtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RvcmFibGUge1xyXG4gIHJlc3RvcmUoKTogdm9pZDtcclxufVxyXG5leHBvcnQgY2xhc3MgQ29sb3Ige1xyXG4gIHB1YmxpYyBzdGF0aWMgV0hJVEUgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBSRUQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBHUkVFTiA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcclxuICBwdWJsaWMgc3RhdGljIEJMVUUgPSBuZXcgQ29sb3IoMCwgMCwgMSwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBNQUdFTlRBID0gbmV3IENvbG9yKDEsIDAsIDEsIDEpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHI6IG51bWJlciA9IDAsXHJcbiAgICBwdWJsaWMgZzogbnVtYmVyID0gMCxcclxuICAgIHB1YmxpYyBiOiBudW1iZXIgPSAwLFxyXG4gICAgcHVibGljIGE6IG51bWJlciA9IDBcclxuICApIHt9XHJcbiAgc2V0KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5yID0gcjtcclxuICAgIHRoaXMuZyA9IGc7XHJcbiAgICB0aGlzLmIgPSBiO1xyXG4gICAgdGhpcy5hID0gYTtcclxuICAgIHRoaXMuY2xhbXAoKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICBzZXRGcm9tQ29sb3IoYzogQ29sb3IpIHtcclxuICAgIHRoaXMuciA9IGMucjtcclxuICAgIHRoaXMuZyA9IGMuZztcclxuICAgIHRoaXMuYiA9IGMuYjtcclxuICAgIHRoaXMuYSA9IGMuYTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICBzZXRGcm9tU3RyaW5nKGhleDogc3RyaW5nKSB7XHJcbiAgICBoZXggPSBoZXguY2hhckF0KDApID09IFwiI1wiID8gaGV4LnN1YnN0cigxKSA6IGhleDtcclxuICAgIHRoaXMuciA9IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSAvIDI1NS4wO1xyXG4gICAgdGhpcy5nID0gcGFyc2VJbnQoaGV4LnN1YnN0cigyLCAyKSwgMTYpIC8gMjU1LjA7XHJcbiAgICB0aGlzLmIgPSBwYXJzZUludChoZXguc3Vic3RyKDQsIDIpLCAxNikgLyAyNTUuMDtcclxuICAgIHRoaXMuYSA9IChoZXgubGVuZ3RoICE9IDggPyAyNTUgOiBwYXJzZUludChoZXguc3Vic3RyKDYsIDIpLCAxNikpIC8gMjU1LjA7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgYWRkKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5yICs9IHI7XHJcbiAgICB0aGlzLmcgKz0gZztcclxuICAgIHRoaXMuYiArPSBiO1xyXG4gICAgdGhpcy5hICs9IGE7XHJcbiAgICB0aGlzLmNsYW1wKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgY2xhbXAoKSB7XHJcbiAgICBpZiAodGhpcy5yIDwgMCkgdGhpcy5yID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuciA+IDEpIHRoaXMuciA9IDE7XHJcbiAgICBpZiAodGhpcy5nIDwgMCkgdGhpcy5nID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuZyA+IDEpIHRoaXMuZyA9IDE7XHJcbiAgICBpZiAodGhpcy5iIDwgMCkgdGhpcy5iID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuYiA+IDEpIHRoaXMuYiA9IDE7XHJcbiAgICBpZiAodGhpcy5hIDwgMCkgdGhpcy5hID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuYSA+IDEpIHRoaXMuYSA9IDE7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgc3RhdGljIHJnYmE4ODg4VG9Db2xvcihjb2xvcjogQ29sb3IsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGNvbG9yLnIgPSAoKHZhbHVlICYgMHhmZjAwMDAwMCkgPj4+IDI0KSAvIDI1NTtcclxuICAgIGNvbG9yLmcgPSAoKHZhbHVlICYgMHgwMGZmMDAwMCkgPj4+IDE2KSAvIDI1NTtcclxuICAgIGNvbG9yLmIgPSAoKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4+IDgpIC8gMjU1O1xyXG4gICAgY29sb3IuYSA9ICh2YWx1ZSAmIDB4MDAwMDAwZmYpIC8gMjU1O1xyXG4gIH1cclxuICBzdGF0aWMgcmdiODg4VG9Db2xvcihjb2xvcjogQ29sb3IsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGNvbG9yLnIgPSAoKHZhbHVlICYgMHgwMGZmMDAwMCkgPj4+IDE2KSAvIDI1NTtcclxuICAgIGNvbG9yLmcgPSAoKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4+IDgpIC8gMjU1O1xyXG4gICAgY29sb3IuYiA9ICh2YWx1ZSAmIDB4MDAwMDAwZmYpIC8gMjU1O1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgTWF0aFV0aWxzIHtcclxuICBzdGF0aWMgUEkgPSAzLjE0MTU5Mjc7XHJcbiAgc3RhdGljIFBJMiA9IE1hdGhVdGlscy5QSSAqIDI7XHJcbiAgc3RhdGljIHJhZGlhbnNUb0RlZ3JlZXMgPSAxODAgLyBNYXRoVXRpbHMuUEk7XHJcbiAgc3RhdGljIHJhZERlZyA9IE1hdGhVdGlscy5yYWRpYW5zVG9EZWdyZWVzO1xyXG4gIHN0YXRpYyBkZWdyZWVzVG9SYWRpYW5zID0gTWF0aFV0aWxzLlBJIC8gMTgwO1xyXG4gIHN0YXRpYyBkZWdSYWQgPSBNYXRoVXRpbHMuZGVncmVlc1RvUmFkaWFucztcclxuICBzdGF0aWMgY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsdWUgPCBtaW4pIHJldHVybiBtaW47XHJcbiAgICBpZiAodmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG4gIHN0YXRpYyBjb3NEZWcoZGVncmVlczogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5jb3MoZGVncmVlcyAqIE1hdGhVdGlscy5kZWdSYWQpO1xyXG4gIH1cclxuICBzdGF0aWMgc2luRGVnKGRlZ3JlZXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGguc2luKGRlZ3JlZXMgKiBNYXRoVXRpbHMuZGVnUmFkKTtcclxuICB9XHJcbiAgc3RhdGljIHNpZ251bSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB2YWx1ZSA+IDAgPyAxIDogdmFsdWUgPCAwID8gLTEgOiAwO1xyXG4gIH1cclxuICBzdGF0aWMgdG9JbnQoeDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4geCA+IDAgPyBNYXRoLmZsb29yKHgpIDogTWF0aC5jZWlsKHgpO1xyXG4gIH1cclxuICBzdGF0aWMgY2JydCh4OiBudW1iZXIpIHtcclxuICAgIGxldCB5ID0gTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcclxuICAgIHJldHVybiB4IDwgMCA/IC15IDogeTtcclxuICB9XHJcbiAgc3RhdGljIHJhbmRvbVRyaWFuZ3VsYXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoVXRpbHMucmFuZG9tVHJpYW5ndWxhcldpdGgobWluLCBtYXgsIChtaW4gKyBtYXgpICogMC41KTtcclxuICB9XHJcbiAgc3RhdGljIHJhbmRvbVRyaWFuZ3VsYXJXaXRoKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbW9kZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB1ID0gTWF0aC5yYW5kb20oKTtcclxuICAgIGxldCBkID0gbWF4IC0gbWluO1xyXG4gICAgaWYgKHUgPD0gKG1vZGUgLSBtaW4pIC8gZCkgcmV0dXJuIG1pbiArIE1hdGguc3FydCh1ICogZCAqIChtb2RlIC0gbWluKSk7XHJcbiAgICByZXR1cm4gbWF4IC0gTWF0aC5zcXJ0KCgxIC0gdSkgKiBkICogKG1heCAtIG1vZGUpKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVycG9sYXRpb24ge1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhcHBseUludGVybmFsKGE6IG51bWJlcik6IG51bWJlcjtcclxuICBhcHBseShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiB0aGlzLmFwcGx5SW50ZXJuYWwoYSk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3cgZXh0ZW5kcyBJbnRlcnBvbGF0aW9uIHtcclxuICBwcm90ZWN0ZWQgcG93ZXIgPSAyO1xyXG4gIGNvbnN0cnVjdG9yKHBvd2VyOiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnBvd2VyID0gcG93ZXI7XHJcbiAgfVxyXG4gIGFwcGx5SW50ZXJuYWwoYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhIDw9IDAuNSkgcmV0dXJuIE1hdGgucG93KGEgKiAyLCB0aGlzLnBvd2VyKSAvIDI7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBNYXRoLnBvdygoYSAtIDEpICogMiwgdGhpcy5wb3dlcikgLyAodGhpcy5wb3dlciAlIDIgPT0gMCA/IC0yIDogMikgKyAxXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgUG93T3V0IGV4dGVuZHMgUG93IHtcclxuICBjb25zdHJ1Y3Rvcihwb3dlcjogbnVtYmVyKSB7XHJcbiAgICBzdXBlcihwb3dlcik7XHJcbiAgfVxyXG4gIGFwcGx5SW50ZXJuYWwoYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnBvdyhhIC0gMSwgdGhpcy5wb3dlcikgKiAodGhpcy5wb3dlciAlIDIgPT0gMCA/IC0xIDogMSkgKyAxO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gIHN0YXRpYyBTVVBQT1JUU19UWVBFRF9BUlJBWVMgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xyXG4gIHN0YXRpYyBhcnJheUNvcHk8VD4oXHJcbiAgICBzb3VyY2U6IEFycmF5TGlrZTxUPixcclxuICAgIHNvdXJjZVN0YXJ0OiBudW1iZXIsXHJcbiAgICBkZXN0OiBBcnJheUxpa2U8VD4sXHJcbiAgICBkZXN0U3RhcnQ6IG51bWJlcixcclxuICAgIG51bUVsZW1lbnRzOiBudW1iZXJcclxuICApIHtcclxuICAgIGZvciAoXHJcbiAgICAgIGxldCBpID0gc291cmNlU3RhcnQsIGogPSBkZXN0U3RhcnQ7XHJcbiAgICAgIGkgPCBzb3VyY2VTdGFydCArIG51bUVsZW1lbnRzO1xyXG4gICAgICBpKyssIGorK1xyXG4gICAgKSB7XHJcbiAgICAgIGRlc3Rbal0gPSBzb3VyY2VbaV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXRBcnJheVNpemU8VD4oXHJcbiAgICBhcnJheTogQXJyYXk8VD4sXHJcbiAgICBzaXplOiBudW1iZXIsXHJcbiAgICB2YWx1ZTogYW55ID0gMFxyXG4gICk6IEFycmF5PFQ+IHtcclxuICAgIGxldCBvbGRTaXplID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgaWYgKG9sZFNpemUgPT0gc2l6ZSkgcmV0dXJuIGFycmF5O1xyXG4gICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcclxuICAgIGlmIChvbGRTaXplIDwgc2l6ZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gb2xkU2l6ZTsgaSA8IHNpemU7IGkrKykgYXJyYXlbaV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcbiAgc3RhdGljIGVuc3VyZUFycmF5Q2FwYWNpdHk8VD4oXHJcbiAgICBhcnJheTogQXJyYXk8VD4sXHJcbiAgICBzaXplOiBudW1iZXIsXHJcbiAgICB2YWx1ZTogYW55ID0gMFxyXG4gICk6IEFycmF5PFQ+IHtcclxuICAgIGlmIChhcnJheS5sZW5ndGggPj0gc2l6ZSkgcmV0dXJuIGFycmF5O1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldEFycmF5U2l6ZShhcnJheSwgc2l6ZSwgdmFsdWUpO1xyXG4gIH1cclxuICBzdGF0aWMgbmV3QXJyYXk8VD4oc2l6ZTogbnVtYmVyLCBkZWZhdWx0VmFsdWU6IFQpOiBBcnJheTxUPiB7XHJcbiAgICBsZXQgYXJyYXkgPSBuZXcgQXJyYXk8VD4oc2l6ZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJyYXlbaV0gPSBkZWZhdWx0VmFsdWU7XHJcbiAgICByZXR1cm4gYXJyYXk7XHJcbiAgfVxyXG4gIHN0YXRpYyBuZXdGbG9hdEFycmF5KHNpemU6IG51bWJlcik6IEFycmF5TGlrZTxudW1iZXI+IHtcclxuICAgIGlmIChVdGlscy5TVVBQT1JUU19UWVBFRF9BUlJBWVMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyYXkgPSBuZXcgQXJyYXk8bnVtYmVyPihzaXplKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgYXJyYXlbaV0gPSAwO1xyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBuZXdTaG9ydEFycmF5KHNpemU6IG51bWJlcik6IEFycmF5TGlrZTxudW1iZXI+IHtcclxuICAgIGlmIChVdGlscy5TVVBQT1JUU19UWVBFRF9BUlJBWVMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KHNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oc2l6ZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGFycmF5W2ldID0gMDtcclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgdG9GbG9hdEFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICByZXR1