ngx-mat-lib
Version:
A bunch of utilities and components to use in your Angular 7+ apps!
787 lines (786 loc) • 64.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from "@angular/core";
import { convertToParamMap } from "@angular/router";
import { MatDialog, MatDialogConfig, MatSnackBar, MatSnackBarConfig } from "@angular/material";
import { XmatConfirmDialogComponent, XmatAlertDialogComponent } from "../components/xmat-dialog/index";
import { XmatAlertTypes, XmatSnackBarDataTypes } from "../models/index";
import { XmatConstantsService, XMAT_CONSTANT_LABELS } from "./xmat-constants.service";
import { XmatSnackBarComponent } from "../components/xmat-snack-bar/index";
import { Observable, forkJoin } from "rxjs";
import { map } from "rxjs/operators";
import { each, includes, extend } from "lodash";
import { parseZone as moment } from "moment";
/** @typedef {?} */
var XmatObservablesMap;
/** @type {?} */
var colorParams = {
center: 128,
diversity: 10,
width: 127
};
/** @type {?} */
var hexValues = "0123456789ABCDEF";
/** @type {?} */
var byte2Hex = function (n) {
// tslint:disable-next-line:no-bitwise
return String(hexValues.substr((n >> 4) & 0x0F, 1)) + hexValues.substr(n & 0x0F, 1);
};
var ɵ0 = byte2Hex;
/** @type {?} */
var rgb2Hex = function (r, g, b) {
return "#" + byte2Hex(r) + byte2Hex(g) + byte2Hex(b);
};
var ɵ1 = rgb2Hex;
/** @type {?} */
var eachEnum = function (srcEnum, iteratee) {
/** @type {?} */
var target = [];
each(srcEnum, function (key) {
// Continue if key is not a number
if (typeof srcEnum[key] !== typeof 0) {
return true;
}
target.push(srcEnum[key]);
});
return each(target, iteratee);
};
var ɵ2 = eachEnum;
/**
* THIS SERVICE REQUIRES 3 DEPENDENCIES:
* XmatConstantsService, XmatSnackBarModule and XmatDialogModule
*/
var XmatFunctionsService = /** @class */ (function () {
function XmatFunctionsService(_dialog, _snackBar, _xmatConstants) {
this._dialog = _dialog;
this._snackBar = _snackBar;
this._xmatConstants = _xmatConstants;
this._confirmDialogDefaults = {
confirmText: XMAT_CONSTANT_LABELS.confirm,
cancelText: XMAT_CONSTANT_LABELS.cancel,
dialogContent: XMAT_CONSTANT_LABELS.proceed,
hideCancelButton: false,
confirmColor: "warn",
title: XMAT_CONSTANT_LABELS.warningTitle
};
this._colorDb = {
factor: colorParams.width + colorParams.center,
frequency: Math.PI * 2 / colorParams.diversity,
generated: []
};
this._defaultAlertData = {
type: XmatAlertTypes.warning,
title: XMAT_CONSTANT_LABELS.warningTitle,
confirmText: XMAT_CONSTANT_LABELS.confirm,
cancelText: XMAT_CONSTANT_LABELS.cancel
};
}
/**
* PUBLIC FUNCTIONS
*/
/**
* PUBLIC FUNCTIONS
* @param {?} n
* @return {?}
*/
XmatFunctionsService.prototype.addLeadingZeroes = /**
* PUBLIC FUNCTIONS
* @param {?} n
* @return {?}
*/
function (n) {
return ("0" + n).slice(-2);
};
/**
* @param {?} source
* @param {?=} level
* @return {?}
*/
XmatFunctionsService.prototype.createReflectionModel = /**
* @param {?} source
* @param {?=} level
* @return {?}
*/
function (source, level) {
if (level === void 0) { level = 0; }
// For both arrays and objects
if (!!source && typeof source === typeof {}) {
/** @type {?} */
var target = Array.isArray(source) ? [] : {};
/** @type {?} */
var sourceKeys = Object.keys(source); // new Object();
for (var i = 0; i < sourceKeys.length; i++) {
/** @type {?} */
var key = sourceKeys[i];
// Always create new key on the target, it will eventually be converted to object
// For both arrays and objects
return target[key] = this.createReflectionModel(source[key], level + 1);
}
return target;
}
else {
return void 0;
}
};
/**
* @param {?=} date
* @param {?=} months
* @return {?}
*/
XmatFunctionsService.prototype.dateAddMonths = /**
* @param {?=} date
* @param {?=} months
* @return {?}
*/
function (date, months) {
if (date === void 0) { date = new Date(); }
if (months === void 0) { months = 0; }
/** @type {?} */
var day = date.getDate();
date.setMonth(date.getMonth() + +months);
if (date.getDate() !== day) {
date.setDate(0);
}
return date;
};
/**
* @param {?} srcEnum
* @param {?} iteratee
* @return {?}
*/
XmatFunctionsService.prototype.eachEnum = /**
* @param {?} srcEnum
* @param {?} iteratee
* @return {?}
*/
function (srcEnum, iteratee) {
return eachEnum(srcEnum, iteratee);
};
/**
* @template T
* @param {?} array
* @param {?} index
* @param {?} iteratee
* @return {?}
*/
XmatFunctionsService.prototype.eachFrom = /**
* @template T
* @param {?} array
* @param {?} index
* @param {?} iteratee
* @return {?}
*/
function (array, index, iteratee) {
if (!Array.isArray(array)) {
console.error("eachFrom only accept arrays as source, found instead " + typeof array);
return array;
}
/** @type {?} */
var _index = index == null ? -1 : index;
/** @type {?} */
var length = array == null ? 0 : array.length;
while (++_index < length) {
if (iteratee(array[_index], _index, array) === false) {
break;
}
}
return array;
};
/**
* @param {?=} queryString
* @return {?}
*/
XmatFunctionsService.prototype.extractQueryParams = /**
* @param {?=} queryString
* @return {?}
*/
function (queryString) {
if (queryString === void 0) { queryString = location.search; }
/** @type {?} */
var query = {};
/** @type {?} */
var pairs = (queryString[0] === "?" ? queryString.substr(1) : queryString).split("&");
each(pairs, function (pair) {
/** @type {?} */
var key = decodeURIComponent(pair.split("=")[0]);
if (!!key) {
query[key] = decodeURIComponent(pair.split("=")[1] || "");
}
});
return convertToParamMap(query);
};
/**
* @param {?} original
* @param {?=} exclude
* @return {?}
*/
XmatFunctionsService.prototype.filterProps = /**
* @param {?} original
* @param {?=} exclude
* @return {?}
*/
function (original, exclude) {
if (exclude === void 0) { exclude = []; }
if (original !== Object(original)) {
console.error("TidUtils => Argument was not valid object", original);
return;
}
if (Array.isArray(exclude) && exclude.length) {
return Object.keys(original).reduce(function (obj, key) {
if (!includes(exclude, key)) {
obj[key] = original[key];
}
return obj;
}, {});
}
return original;
};
/**
* This function generates vibrant, "evenly spaced" colours (i.e. no clustering).
* This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
* */
/**
* This function generates vibrant, "evenly spaced" colours (i.e. no clustering).
* This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
*
* @param {?=} steps
* @param {?=} step
* @return {?}
*/
XmatFunctionsService.prototype.getRainbow = /**
* This function generates vibrant, "evenly spaced" colours (i.e. no clustering).
* This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
*
* @param {?=} steps
* @param {?=} step
* @return {?}
*/
function (steps, step) {
if (steps === void 0) { steps = 10; }
if (step === void 0) { step = 0; }
/** @type {?} */
var r;
/** @type {?} */
var g;
/** @type {?} */
var b;
/** @type {?} */
var h = step / steps;
/** @type {?} */
var i = ~~(h * 6);
/** @type {?} */
var f = h * 6 - i;
/** @type {?} */
var q = 1 - f;
switch (i % 6) {
case 0:
r = 1, g = f, b = 0;
break;
case 1:
r = q, g = 1, b = 0;
break;
case 2:
r = 0, g = 1, b = f;
break;
case 3:
r = 0, g = q, b = 1;
break;
case 4:
r = f, g = 0, b = 1;
break;
case 5:
r = 1, g = 0, b = q;
break;
}
/** @type {?} */
var red = ("00" + (~~(r * 255)).toString(16)).slice(-2);
/** @type {?} */
var green = ("00" + (~~(g * 255)).toString(16)).slice(-2);
/** @type {?} */
var blue = ("00" + (~~(b * 255)).toString(16)).slice(-2);
return ("#" + red + green + blue);
};
/**
* @param {?=} phase
* @return {?}
*/
XmatFunctionsService.prototype.getRandomNonConsecutiveHex = /**
* @param {?=} phase
* @return {?}
*/
function (phase) {
if (phase === void 0) { phase = 10; }
/** @type {?} */
var index = this._colorDb.generated.length + 1;
/** @type {?} */
var red = Math.sin(this._colorDb.frequency * index + 2 + phase) * this._colorDb.factor;
/** @type {?} */
var green = Math.sin(this._colorDb.frequency * index + phase) * this._colorDb.factor;
/** @type {?} */
var blue = Math.sin(this._colorDb.frequency * index + 4 + phase) * this._colorDb.factor;
/** @type {?} */
var result = rgb2Hex(red, green, blue);
this._colorDb.generated.push(result);
return result;
};
/**
* @param {?} value
* @return {?}
*/
XmatFunctionsService.prototype.isNumeric = /**
* @param {?} value
* @return {?}
*/
function (value) {
return !isNaN(parseInt(value, 10));
};
/**
* @param {?} value
* @return {?}
*/
XmatFunctionsService.prototype.isValidLength = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.isNumeric(value) && value >= 0;
};
/**
* @param {?} title
* @param {?} msg
* @param {?} color
* @param {?} content
* @return {?}
*/
XmatFunctionsService.prototype.logWithStyle = /**
* @param {?} title
* @param {?} msg
* @param {?} color
* @param {?} content
* @return {?}
*/
function (title, msg, color, content) {
console.group(title || "");
console.log("%c" + msg, "color: " + color, content);
console.groupEnd();
};
/**
*
* @param source the source object
* @param keys allows to order the result and/or include only certain props
*/
/**
*
* @template T
* @param {?} source the source object
* @param {?=} keys allows to order the result and/or include only certain props
* @param {?=} keepVoid
* @return {?}
*/
XmatFunctionsService.prototype.objectToArray = /**
*
* @template T
* @param {?} source the source object
* @param {?=} keys allows to order the result and/or include only certain props
* @param {?=} keepVoid
* @return {?}
*/
function (source, keys, keepVoid) {
if (keys === void 0) { keys = Object.keys(source); }
if (keepVoid === void 0) { keepVoid = !1; }
/** @type {?} */
var result = [];
each(keys, function (k) {
source[k] !== void 0 &&
result.push({
description: k,
value: source[k]
});
});
return result;
};
/**
* @param {?=} data
* @param {?=} returnRef
* @return {?}
*/
XmatFunctionsService.prototype.openAlertDialog = /**
* @param {?=} data
* @param {?=} returnRef
* @return {?}
*/
function (data,
// tslint:disable-next-line:max-line-length
returnRef) {
if (data === void 0) { data = this._defaultAlertData; }
if (returnRef === void 0) { returnRef = false; }
data = extend({}, this._defaultAlertData, data);
/** @type {?} */
var dialogConfig = new MatDialogConfig();
extend(dialogConfig, {
id: data.dialogId,
width: this._xmatConstants.dialogOptions.defaultWidth,
data: data,
disableClose: true
});
/** @type {?} */
var dialogRef = this._dialog.open(XmatAlertDialogComponent, dialogConfig);
if (returnRef) {
return dialogRef;
}
else {
return new Observable(function (observer) {
// Catch result
dialogRef.afterClosed().subscribe(function (result) {
observer.next(result);
observer.complete();
});
});
}
};
/**
* @param {?=} data
* @param {?=} disableClose
* @param {?=} width
* @param {?=} returnRef
* @return {?}
*/
XmatFunctionsService.prototype.openConfirmDialog = /**
* @param {?=} data
* @param {?=} disableClose
* @param {?=} width
* @param {?=} returnRef
* @return {?}
*/
function (data, disableClose, width,
// tslint:disable-next-line:max-line-length
returnRef) {
if (disableClose === void 0) { disableClose = false; }
if (width === void 0) { width = this._xmatConstants.dialogOptions.defaultWidth; }
if (returnRef === void 0) { returnRef = false; }
/** @type {?} */
var dialogConfig = new MatDialogConfig();
extend(dialogConfig, {
id: data.dialogId,
width: width,
data: /** @type {?} */ (tslib_1.__assign({}, this._confirmDialogDefaults, data)),
disableClose: disableClose
});
/** @type {?} */
var dialogRef = this._dialog.open(XmatConfirmDialogComponent, dialogConfig);
if (returnRef) {
return dialogRef;
}
else {
return new Observable(function (observer) {
// Catch result
dialogRef.afterClosed().subscribe(function (result) {
observer.next(result);
observer.complete();
});
});
}
};
/**
* @param {?} value
* @return {?}
*/
XmatFunctionsService.prototype.parseDate = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (!value) {
return void 0;
}
/** @type {?} */
var momentDate = moment(value);
if (!momentDate.isValid()) {
return this._parseDateFallback(value);
}
return moment(momentDate).toDate();
};
/**
* @param {?} source
* @return {?}
*/
XmatFunctionsService.prototype.readAsUrl = /**
* @param {?} source
* @return {?}
*/
function (source) {
return new Observable(function (observer) {
/** @type {?} */
var reader = new FileReader();
reader.onload = function (event) {
observer.next(event);
observer.complete();
};
reader.onerror = reader.onabort = function () {
observer.error(!1);
};
reader.readAsDataURL(source);
});
};
/**
* @param {?} haystack
* @param {?} mapObj
* @return {?}
*/
XmatFunctionsService.prototype.replaceAll = /**
* @param {?} haystack
* @param {?} mapObj
* @return {?}
*/
function (haystack, mapObj) {
/** @type {?} */
var regExp = new RegExp(Object.keys(mapObj).join("|"), "gi");
return haystack.replace(regExp, function (matched) {
return mapObj[matched.toLowerCase()];
});
};
/**
* @param {?=} data
* @return {?}
*/
XmatFunctionsService.prototype.showSnackBar = /**
* @param {?=} data
* @return {?}
*/
function (data) {
if (data === void 0) { data = { message: "-", showAction: false }; }
return this._snackBar.openFromComponent(XmatSnackBarComponent, extend(new MatSnackBarConfig(), {
data: data,
duration: data.duration || 5000,
panelClass: ["xmat-snack", data.type]
}));
};
/**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param msg
*/
/**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param {?=} msg
* @param {?=} duration
* @return {?}
*/
XmatFunctionsService.prototype.showErrorSnackBar = /**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param {?=} msg
* @param {?=} duration
* @return {?}
*/
function (msg, duration) {
if (msg === void 0) { msg = this._xmatConstants.labels.genericError; }
if (duration === void 0) { duration = 5000; }
return this.showSnackBar({
showAction: !1,
message: msg,
duration: duration,
type: XmatSnackBarDataTypes.fail
});
};
/**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param msg
*/
/**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param {?=} msg
* @return {?}
*/
XmatFunctionsService.prototype.showErrorAlert = /**
* Shortcut to open an XmatAlertDialog passing only an error message
* @param {?=} msg
* @return {?}
*/
function (msg) {
if (msg === void 0) { msg = this._xmatConstants.labels.genericError; }
return this.openAlertDialog(/** @type {?} */ ({
type: XmatAlertTypes.error,
title: this._xmatConstants.labels.errorTitle,
dialogContent: msg,
hideCancelButton: !0,
hideConfirmButton: !1,
confirmText: this._xmatConstants.labels.close
}));
};
/**
* Returns a formatted string using the first argument as a printf-like format.
*
* The first argument is a string that contains zero or more placeholders.
* Each placeholder is replaced with the converted value from its corresponding argument.
*
* Supported placeholders are:
*
* %s - String.
* %d - Number (both integer and float).
* %% - single percent sign ('%'). This does not consume an argument.
*/
/**
* Returns a formatted string using the first argument as a printf-like format.
*
* The first argument is a string that contains zero or more placeholders.
* Each placeholder is replaced with the converted value from its corresponding argument.
*
* Supported placeholders are:
*
* %s - String.
* %d - Number (both integer and float).
* %% - single percent sign ('%'). This does not consume an argument.
* @param {...?} args
* @return {?}
*/
XmatFunctionsService.prototype.sprintf = /**
* Returns a formatted string using the first argument as a printf-like format.
*
* The first argument is a string that contains zero or more placeholders.
* Each placeholder is replaced with the converted value from its corresponding argument.
*
* Supported placeholders are:
*
* %s - String.
* %d - Number (both integer and float).
* %% - single percent sign ('%'). This does not consume an argument.
* @param {...?} args
* @return {?}
*/
function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
/** @type {?} */
var index = 1;
return (args[0] + "").replace(/%((\d)\$)?([sd%])/g, function (match, _group_, pos, _format_) {
if (match === "%%") {
return "%";
}
if (typeof pos === "undefined") {
pos = index++;
}
if (pos in args && pos > 0) {
return args[pos];
}
else {
return match;
}
});
};
/**
* @param {?} str
* @return {?}
*/
XmatFunctionsService.prototype.stripEmojis = /**
* @param {?} str
* @return {?}
*/
function (str) {
return str.replace(new RegExp(this._xmatConstants.regExps["emojis"], "g"), "");
};
/**
* @param {?} str
* @return {?}
*/
XmatFunctionsService.prototype.stripSpecialChars = /**
* @param {?} str
* @return {?}
*/
function (str) {
return str.replace(new RegExp(this._xmatConstants.regExps["specialChars"], "g"), "");
};
/**
* @template T
* @param {?} source
* @return {?}
*/
XmatFunctionsService.prototype.$qMap = /**
* @template T
* @param {?} source
* @return {?}
*/
function (source) {
/** @type {?} */
var queue = [];
/** @type {?} */
var queueKeys = [];
each(source, function (o, key) {
queue.push(o);
queueKeys.push(key);
});
return forkJoin(queue)
.pipe(map(function (raw) {
/** @type {?} */
var mapped = {};
each(raw, function (value, index) {
mapped[queueKeys[index]] = value;
});
return /** @type {?} */ (mapped);
}));
};
/**
* @template T
* @param {?} source
* @return {?}
*/
XmatFunctionsService.prototype.$qArray = /**
* @template T
* @param {?} source
* @return {?}
*/
function (source) {
/** @type {?} */
var queue = [];
each(source, function (o) {
queue.push(o);
});
return forkJoin(queue);
};
/**
* @param {?} value
* @return {?}
*/
XmatFunctionsService.prototype._parseDateFallback = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (typeof value === typeof 0 || !isNaN(+value)) {
return new Date(+value);
}
else {
return new Date(/** @type {?} */ (value));
}
};
XmatFunctionsService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
XmatFunctionsService.ctorParameters = function () { return [
{ type: MatDialog },
{ type: MatSnackBar },
{ type: XmatConstantsService }
]; };
return XmatFunctionsService;
}());
export { XmatFunctionsService };
if (false) {
/** @type {?} */
XmatFunctionsService.prototype._confirmDialogDefaults;
/** @type {?} */
XmatFunctionsService.prototype._colorDb;
/** @type {?} */
XmatFunctionsService.prototype._defaultAlertData;
/** @type {?} */
XmatFunctionsService.prototype._dialog;
/** @type {?} */
XmatFunctionsService.prototype._snackBar;
/** @type {?} */
XmatFunctionsService.prototype._xmatConstants;
}
export { ɵ0, ɵ1, ɵ2 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1mdW5jdGlvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtbGliLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3htYXQtZnVuY3Rpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsU0FBUyxFQUNULGVBQWUsRUFDZixXQUFXLEVBQ1gsaUJBQWlCLEVBR3BCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUNILDBCQUEwQixFQUMxQix3QkFBd0IsRUFDM0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBRUgsY0FBYyxFQU1kLHFCQUFxQixFQUV4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsSUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7QUFJN0MsSUFBTSxXQUFXLEdBQUc7SUFDaEIsTUFBTSxFQUFFLEdBQUc7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQzs7QUFFRixJQUFNLFNBQVMsR0FBVyxrQkFBa0IsQ0FBQzs7QUFFN0MsSUFBTSxRQUFRLEdBQUcsVUFB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RixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtTQUNiOztRQUVELElBQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRTFELElBQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRTVELElBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxH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SSxDQUFDLEdBQUcsRUFBRSxVQUFDLEtBQUssRUFBRSxLQUFLO2dCQUNuQixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BDLENBQUMsQ0FBQztZQUVILHlCQUFPLE1BQVcsRUFBQztTQUN0QixDQUFDLENBQUMsQ0FBQztLQUNYOzs7Ozs7SUFFRCxzQ0FBTzs7Ozs7SUFBUCxVQUFpQixNQUF1Qjs7UUFDcEMsSUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQUMsQ0FBZ0I7WUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQixDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMxQjs7Ozs7SUFJTyxpREFBa0I7Ozs7Y0FBQyxLQUFzQjtRQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFDRCxPQUFPLElBQUksSUFBSSxtQkFBUyxLQUFLLEVBQUMsQ0FBQztTQUNsQzs7O2dCQWphUixVQUFVOzs7O2dCQWxFUCxTQUFTO2dCQUVULFdBQVc7Z0JBcUJOLG9CQUFvQjs7K0JBMUI3Qjs7U0FzRWEsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQYXJhbU1hcCwgUGFyYW1zLCBjb252ZXJ0VG9QYXJhbU1hcCB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7XG4gICAgTWF0RGlhbG9nLFxuICAgIE1hdERpYWxvZ0NvbmZpZyxcbiAgICBNYXRTbmFja0JhcixcbiAgICBNYXRTbmFja0JhckNvbmZpZyxcbiAgICBNYXRTbmFja0JhclJlZixcbiAgICBNYXREaWFsb2dSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsXCI7XG4vL1xuaW1wb3J0IHtcbiAgICBYbWF0Q29uZmlybURpYWxvZ0NvbXBvbmVudCxcbiAgICBYbWF0QWxlcnREaWFsb2dDb21wb25lbnRcbn0gZnJvbSBcIi4uL2NvbXBvbmVudHMveG1hdC1kaWFsb2cvaW5kZXhcIjtcbmltcG9ydCB7XG4gICAgWG1hdEFsZXJ0RGlhbG9nRGF0YSxcbiAgICBYbWF0QWxlcnRUeXBlcyxcbiAgICBYbWF0QWxlcnREaWFsb2dBY3Rpb25zLFxuICAgIFhtYXRDb25maXJtRGlhbG9nRGF0YSxcbiAgICBYbWF0U25hY2tCYXJEYXRhLFxuICAgIFhtYXRGaWxlUmVhZGVyRXZlbnQsXG4gICAgWG1hdEdlbmVyaWNPYmplY3QsXG4gICAgWG1hdFNuYWNrQmFyRGF0YVR5cGVzLFxuICAgIFhtYXRTZWxlY3Rcbn0gZnJvbSBcIi4uL21vZGVscy9pbmRleFwiO1xuaW1wb3J0IHsgWG1hdENvbnN0YW50c1NlcnZpY2UsIFhNQVRfQ09OU1RBTlRfTEFCRUxTIH0gZnJvbSBcIi4veG1hdC1jb25zdGFudHMuc2VydmljZVwiO1xuaW1wb3J0IHsgWG1hdFNuYWNrQmFyQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMveG1hdC1zbmFjay1iYXIvaW5kZXhcIjtcbi8vXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGVhY2gsIGluY2x1ZGVzLCBleHRlbmQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBwYXJzZVpvbmUgYXMgbW9tZW50IH0gZnJvbSBcIm1vbWVudFwiO1xuXG50eXBlIFhtYXRPYnNlcnZhYmxlc01hcCA9IFhtYXRHZW5lcmljT2JqZWN0PE9ic2VydmFibGU8YW55Pj47XG5cbmNvbnN0IGNvbG9yUGFyYW1zID0ge1xuICAgIGNlbnRlcjogMTI4LFxuICAgIGRpdmVyc2l0eTogMTAsXG4gICAgd2lkdGg6IDEyN1xufTtcblxuY29uc3QgaGV4VmFsdWVzOiBzdHJpbmcgPSBcIjAxMjM0NTY3ODlBQkNERUZcIjtcblxuY29uc3QgYnl0ZTJIZXggPSAobikgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgcmV0dXJuIFN0cmluZyhoZXhWYWx1ZXMuc3Vic3RyKChuID4+IDQpICYgMHgwRiwgMSkpICsgaGV4VmFsdWVzLnN1YnN0cihuICYgMHgwRiwgMSk7XG59O1xuXG5jb25zdCByZ2IySGV4ID0gKHIsIGcsIGIpID0+IHtcbiAgICByZXR1cm4gXCIjXCIgKyBieXRlMkhleChyKSArIGJ5dGUySGV4KGcpICsgYnl0ZTJIZXgoYik7XG59O1xuXG5jb25zdCBlYWNoRW51bSA9IChzcmNFbnVtLCBpdGVyYXRlZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IFtdO1xuICAgIGVhY2goc3JjRW51bSwgKGtleSkgPT4ge1xuICAgICAgICAvLyBDb250aW51ZSBpZiBrZXkgaXMgbm90IGEgbnVtYmVyXG4gICAgICAgIGlmICh0eXBlb2Ygc3JjRW51bVtrZXldICE9PSB0eXBlb2YgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnB1c2goc3JjRW51bVtrZXldKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZWFjaCh0YXJnZXQsIGl0ZXJhdGVlKTtcbn07XG5cbi8qKlxuICogVEhJUyBTRVJWSUNFIFJFUVVJUkVTIDMgREVQRU5ERU5DSUVTOlxuICogWG1hdENvbnN0YW50c1NlcnZpY2UsIFhtYXRTbmFja0Jhck1vZHVsZSBhbmQgWG1hdERpYWxvZ01vZHVsZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWG1hdEZ1bmN0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIF9jb25maXJtRGlhbG9nRGVmYXVsdHM6IFhtYXRDb25maXJtRGlhbG9nRGF0YSA9IHtcbiAgICAgICAgY29uZmlybVRleHQ6IFhNQVRfQ09OU1RBTlRfTEFCRUxTLmNvbmZpcm0sXG4gICAgICAgIGNhbmNlbFRleHQ6IFhNQVRfQ09OU1RBTlRfTEFCRUxTLmNhbmNlbCxcbiAgICAgICAgZGlhbG9nQ29udGVudDogWE1BVF9DT05TVEFOVF9MQUJFTFMucHJvY2VlZCxcbiAgICAgICAgaGlkZUNhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgIGNvbmZpcm1Db2xvcjogXCJ3YXJuXCIsXG4gICAgICAgIHRpdGxlOiBYTUFUX0NPTlNUQU5UX0xBQkVMUy53YXJuaW5nVGl0bGVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfY29sb3JEYiA9IHtcbiAgICAgICAgZmFjdG9yOiBjb2xvclBhcmFtcy53aWR0aCArIGNvbG9yUGFyYW1zLmNlbnRlcixcbiAgICAgICAgZnJlcXVlbmN5OiBNYXRoLlBJICogMiAvIGNvbG9yUGFyYW1zLmRpdmVyc2l0eSxcbiAgICAgICAgZ2VuZXJhdGVkOiBbXVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0QWxlcnREYXRhOiBYbWF0QWxlcnREaWFsb2dEYXRhID0ge1xuICAgICAgICB0eXBlOiBYbWF0QWxlcnRUeXBlcy53YXJuaW5nLFxuICAgICAgICB0aXRsZTogWE1BVF9DT05TVEFOVF9MQUJFTFMud2FybmluZ1RpdGxlLFxuICAgICAgICBjb25maXJtVGV4dDogWE1BVF9DT05TVEFOVF9MQUJFTFMuY29uZmlybSxcbiAgICAgICAgY2FuY2VsVGV4dDogWE1BVF9DT05TVEFOVF9MQUJFTFMuY2FuY2VsXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByb3RlY3RlZCBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgICAgICBwcm90ZWN0ZWQgX3htYXRDb25zdGFudHM6IFhtYXRDb25zdGFudHNTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUFVCTElDIEZVTkNUSU9OU1xuICAgICAqL1xuICAgIGFkZExlYWRpbmdaZXJvZXMobjogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIChcIjBcIiArIG4pLnNsaWNlKC0yKTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZWZsZWN0aW9uTW9kZWwoc291cmNlLCBsZXZlbCA9IDApOiBhbnkge1xuICAgICAgICAvLyBGb3IgYm90aCBhcnJheXMgYW5kIG9iamVjdHNcbiAgICAgICAgaWYgKCEhc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09IHR5cGVvZiB7fSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyAvLyBuZXcgT2JqZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjcmVhdGUgbmV3IGtleSBvbiB0aGUgdGFyZ2V0LCBpdCB3aWxsIGV2ZW50dWFsbHkgYmUgY29udmVydGVkIHRvIG9iamVjdFxuICAgICAgICAgICAgICAgIC8vIEZvciBib3RoIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XSA9IHRoaXMuY3JlYXRlUmVmbGVjdGlvbk1vZGVsKHNvdXJjZVtrZXldLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkYXRlQWRkTW9udGhzKGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpLCBtb250aHM6IG51bWJlciA9IDApOiBEYXRlIHtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgK21vbnRocyk7XG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSAhPT0gZGF5KSB7XG4gICAgICAgICAgICBkYXRlLnNldERhdGUoMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZWFjaEVudW0oc3JjRW51bSwgaXRlcmF0ZWUpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBlYWNoRW51bShzcmNFbnVtLCBpdGVyYXRlZSk7XG4gICAgfVxuXG4gICAgZWFjaEZyb208VCA9IGFueT4oYXJyYXk6IFRbXSwgaW5kZXg6IG51bWJlciwgaXRlcmF0ZWU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyLCBzb3VyY2U6IFRbXSkgPT4gYW55KTogVFtdIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgZWFjaEZyb20gb25seSBhY2NlcHQgYXJyYXlzIGFzIHNvdXJjZSwgZm91bmQgaW5zdGVhZCAke3R5cGVvZiBhcnJheX1gKTtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgbGV0IF9pbmRleCA9IGluZGV4ID09IG51bGwgPyAtMSA6IGluZGV4O1xuICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytfaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpdGVyYXRlZShhcnJheVtfaW5kZXhdLCBfaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgZXh0cmFjdFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nID0gbG9jYXRpb24uc2VhcmNoKTogUGFyYW1NYXAge1xuICAgICAgICBjb25zdCBxdWVyeTogUGFyYW1zID0ge307XG4gICAgICAgIGNvbnN0IHBhaXJzID0gKHF1ZXJ5U3RyaW5nWzBdID09PSBcIj9cIiA/IHF1ZXJ5U3RyaW5nLnN1YnN0cigxKSA6IHF1ZXJ5U3RyaW5nKS5zcGxpdChcIiZcIik7XG4gICAgICAgIGVhY2gocGFpcnMsIHBhaXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc3BsaXQoXCI9XCIpWzBdKTtcbiAgICAgICAgICAgIGlmICghIWtleSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5W2tleV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zcGxpdChcIj1cIilbMV0gfHwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udmVydFRvUGFyYW1NYXAocXVlcnkpO1xuICAgIH1cblxuICAgIGZpbHRlclByb3BzKG9yaWdpbmFsOiBYbWF0R2VuZXJpY09iamVjdCwgZXhjbHVkZTogc3RyaW5nW10gPSBbXSk6IFhtYXRHZW5lcmljT2JqZWN0IHtcbiAgICAgICAgaWYgKG9yaWdpbmFsICE9PSBPYmplY3Qob3JpZ2luYWwpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGlkVXRpbHMgPT4gQXJndW1lbnQgd2FzIG5vdCB2YWxpZCBvYmplY3RcIiwgb3JpZ2luYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhjbHVkZSkgJiYgZXhjbHVkZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvcmlnaW5hbC