@lxlib/form
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.1.
331 lines • 28.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: src/utils.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign, __read, __rest, __spread, __values } from "tslib";
import { deepCopy, toBoolean } from '@lxlib/util';
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
import { SF_SEQ } from './const';
/** @type {?} */
export var FORMATMAPS = {
'date-time': {
widget: 'date',
showTime: true,
format: 'yyyy-MM-ddTHH:mm:ssZ',
},
date: { widget: 'date', format: 'yyyy-MM-dd' },
'full-date': { widget: 'date', format: 'yyyy-MM-dd' },
time: { widget: 'time' },
'full-time': { widget: 'time' },
week: { widget: 'date', mode: 'week', format: 'yyyy-WW' },
month: { widget: 'date', mode: 'month', format: 'yyyy-MM' },
uri: { widget: 'upload' },
email: { widget: 'autocomplete', type: 'email' },
color: { widget: 'string', type: 'color' },
'': { widget: 'string' },
};
/**
* @param {?} o
* @return {?}
*/
export function isBlank(o) {
return o == null;
}
/**
* @param {?} value
* @param {?} defaultValue
* @return {?}
*/
export function toBool(value, defaultValue) {
value = toBoolean(value, true);
return value == null ? defaultValue : value;
}
/**
* @param {?} ui
* @param {...?} args
* @return {?}
*/
export function di(ui) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
if (ui.debug) {
// tslint:disable-next-line:no-console
console.warn.apply(console, __spread(args));
}
}
/**
* 根据 `$ref` 查找 `definitions`
* @param {?} $ref
* @param {?} definitions
* @return {?}
*/
function findSchemaDefinition($ref, definitions) {
var e_1, _a;
/** @type {?} */
var match = /^#\/definitions\/(.*)$/.exec($ref);
if (match && match[1]) {
// parser JSON Pointer
/** @type {?} */
var parts = match[1].split(SF_SEQ);
/** @type {?} */
var current = definitions;
try {
for (var parts_1 = __values(parts), parts_1_1 = parts_1.next(); !parts_1_1.done; parts_1_1 = parts_1.next()) {
var part = parts_1_1.value;
part = part.replace(/~1/g, SF_SEQ).replace(/~0/g, '~');
if (current.hasOwnProperty(part)) {
current = current[part];
}
else {
throw new Error("Could not find a definition for " + $ref + ".");
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (parts_1_1 && !parts_1_1.done && (_a = parts_1.return)) _a.call(parts_1);
}
finally { if (e_1) throw e_1.error; }
}
return current;
}
throw new Error("Could not find a definition for " + $ref + ".");
}
/**
* 取回Schema,并处理 `$ref` 的关系
* @param {?} schema
* @param {?=} definitions
* @return {?}
*/
export function retrieveSchema(schema, definitions) {
if (definitions === void 0) { definitions = {}; }
if (schema.hasOwnProperty('$ref')) {
/** @type {?} */
var $refSchema = findSchemaDefinition((/** @type {?} */ (schema.$ref)), definitions);
// remove $ref property
var $ref = schema.$ref, localSchema = __rest(schema, ["$ref"]);
return retrieveSchema(__assign(__assign({}, $refSchema), localSchema), definitions);
}
return schema;
}
/**
* @param {?} schema
* @param {?} ui
* @return {?}
*/
export function resolveIf(schema, ui) {
if (!(schema.hasOwnProperty('if') && schema.hasOwnProperty('then')))
return null;
if (!(/** @type {?} */ (schema.if)).properties)
throw new Error("if: does not contain 'properties'");
/** @type {?} */
var allKeys = Object.keys((/** @type {?} */ (schema.properties)));
/** @type {?} */
var ifKeys = Object.keys((/** @type {?} */ ((/** @type {?} */ (schema.if)).properties)));
detectKey(allKeys, ifKeys);
detectKey(allKeys, (/** @type {?} */ ((/** @type {?} */ (schema.then)).required)));
schema.required = (/** @type {?} */ (schema.required)).concat((/** @type {?} */ ((/** @type {?} */ (schema.then)).required)));
/** @type {?} */
var hasElse = schema.hasOwnProperty('else');
if (hasElse) {
detectKey(allKeys, (/** @type {?} */ ((/** @type {?} */ (schema.else)).required)));
schema.required = schema.required.concat((/** @type {?} */ ((/** @type {?} */ (schema.else)).required)));
}
/** @type {?} */
var visibleIf = {};
/** @type {?} */
var visibleElse = {};
ifKeys.forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
/** @type {?} */
var cond = (/** @type {?} */ ((/** @type {?} */ (schema.if)).properties))[key].enum;
visibleIf[key] = cond;
if (hasElse)
visibleElse[key] = (/**
* @param {?} value
* @return {?}
*/
function (value) { return !(/** @type {?} */ (cond)).includes(value); });
}));
(/** @type {?} */ ((/** @type {?} */ (schema.then)).required)).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) { return (ui["$" + key].visibleIf = visibleIf); }));
if (hasElse)
(/** @type {?} */ ((/** @type {?} */ (schema.else)).required)).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) { return (ui["$" + key].visibleIf = visibleElse); }));
return schema;
}
/**
* @param {?} keys
* @param {?} detectKeys
* @return {?}
*/
function detectKey(keys, detectKeys) {
detectKeys.forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
if (!keys.includes(key)) {
throw new Error("if: properties does not contain '" + key + "'");
}
}));
}
/**
* @param {?} properties
* @param {?} order
* @return {?}
*/
export function orderProperties(properties, order) {
if (!Array.isArray(order))
return properties;
/** @type {?} */
var arrayToHash = (/**
* @param {?} arr
* @return {?}
*/
function (arr) {
return arr.reduce((/**
* @param {?} prev
* @param {?} curr
* @return {?}
*/
function (prev, curr) {
prev[curr] = true;
return prev;
}), {});
});
/** @type {?} */
var errorPropList = (/**
* @param {?} arr
* @return {?}
*/
function (arr) { return "property [" + arr.join("', '") + "]"; });
/** @type {?} */
var propertyHash = arrayToHash(properties);
/** @type {?} */
var orderHash = arrayToHash(order);
/** @type {?} */
var extraneous = order.filter((/**
* @param {?} prop
* @return {?}
*/
function (prop) { return prop !== '*' && !propertyHash[prop]; }));
if (extraneous.length) {
throw new Error("ui schema order list contains extraneous " + errorPropList(extraneous));
}
/** @type {?} */
var rest = properties.filter((/**
* @param {?} prop
* @return {?}
*/
function (prop) { return !orderHash[prop]; }));
/** @type {?} */
var restIndex = order.indexOf('*');
if (restIndex === -1) {
if (rest.length) {
throw new Error("ui schema order list does not contain " + errorPropList(rest));
}
return order;
}
if (restIndex !== order.lastIndexOf('*')) {
throw new Error('ui schema order list contains more than one wildcard item');
}
/** @type {?} */
var complete = __spread(order);
complete.splice.apply(complete, __spread([restIndex, 1], rest));
return complete;
}
/**
* @param {?} list
* @param {?} formData
* @param {?} readOnly
* @return {?}
*/
export function getEnum(list, formData, readOnly) {
if (isBlank(list) || !Array.isArray(list) || list.length === 0)
return [];
if (typeof list[0] !== 'object') {
list = list.map((/**
* @param {?} item
* @return {?}
*/
function (item) {
return (/** @type {?} */ ({ label: item, value: item }));
}));
}
if (formData) {
if (!Array.isArray(formData))
formData = [formData];
list.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (~formData.indexOf(item.value))
item.checked = true;
}));
}
// fix disabled status
if (readOnly) {
list.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) { return (item.disabled = true); }));
}
return list;
}
/**
* @param {?} list
* @param {?} formData
* @param {?} readOnly
* @return {?}
*/
export function getCopyEnum(list, formData, readOnly) {
return getEnum(deepCopy(list || []), formData, readOnly);
}
/**
* @param {?} schema
* @param {?} ui
* @param {?} formData
* @param {?=} asyncArgs
* @return {?}
*/
export function getData(schema, ui, formData, asyncArgs) {
if (typeof ui.asyncData === 'function') {
return ui.asyncData(asyncArgs).pipe(map((/**
* @param {?} list
* @return {?}
*/
function (list) { return getEnum(list, formData, (/** @type {?} */ (schema.readOnly))); })));
}
return of(getCopyEnum((/** @type {?} */ (schema.enum)), formData, (/** @type {?} */ (schema.readOnly))));
}
/**
* Whether to using date-fns to format a date
* @param {?} srv
* @return {?}
*/
export function isDateFns(srv) {
if (!srv)
return false;
/** @type {?} */
var data = srv.getDateLocale();
// Compatible date-fns v1.x & v2.x
return data != null && !!data.formatDistance; // (!!data.distanceInWords || !!data.formatDistance);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHhsaWIvZm9ybS8iLCJzb3VyY2VzIjpbInNyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUlqQyxNQUFNLEtBQU8sVUFBVSxHQUFHO0lBQ3hCLFdBQVcsRUFBRTtRQUNYLE1BQU0sRUFBRSxNQUFNO1FBQ2QsUUFBUSxFQUFFLElBQUk7UUFDZCxNQUFNLEVBQUUsc0JBQXNCO0tBQy9CO0lBQ0QsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQzlDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRTtJQUNyRCxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ3hCLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7SUFDL0IsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDekQsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDM0QsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUN6QixLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7SUFDaEQsS0FBSyxFQUFFLEVBQUUsTUFBTSxF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QUFDO0tBQzlEO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDOzs7Ozs7O0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFXLEVBQUUsUUFBYSxFQUFFLFFBQWlCO0lBQ3ZFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNELENBQUM7Ozs7Ozs7O0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFnQixFQUFFLEVBQWtCLEVBQUUsUUFBYSxFQUFFLFNBQWU7SUFDMUYsSUFBSSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQ3RDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRzs7OztRQUFDLFVBQUMsSUFBb0IsSUFBSyxPQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLG1CQUFBLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxFQUF6QyxDQUF5QyxFQUFDLENBQUMsQ0FBQztLQUMvRztJQUNELE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxtQkFBQSxNQUFNLENBQUMsSUFBSSxFQUFDLEVBQUUsUUFBUSxFQUFFLG1CQUFBLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQzs7Ozs7O0FBS0QsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFrQjtJQUMxQyxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDOztRQUNqQixJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRTtJQUNoQyxrQ0FBa0M7SUFDbEMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMscURBQXFEO0FBQ3JHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwQ29weSwgdG9Cb29sZWFuIH0gZnJvbSAnQGx4bGliL3V0aWwnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNGX1NFUSB9IGZyb20gJy4vY29uc3QnO1xuaW1wb3J0IHsgU0ZTY2hlbWEsIFNGU2NoZW1hRGVmaW5pdGlvbiwgU0ZTY2hlbWFFbnVtIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgU0ZVSVNjaGVtYSwgU0ZVSVNjaGVtYUl0ZW0sIFNGVUlTY2hlbWFJdGVtUnVuIH0gZnJvbSAnLi9zY2hlbWEvdWknO1xuXG5leHBvcnQgY29uc3QgRk9STUFUTUFQUyA9IHtcbiAgJ2RhdGUtdGltZSc6IHtcbiAgICB3aWRnZXQ6ICdkYXRlJyxcbiAgICBzaG93VGltZTogdHJ1ZSxcbiAgICBmb3JtYXQ6ICd5eXl5LU1NLWRkVEhIOm1tOnNzWicsXG4gIH0sXG4gIGRhdGU6IHsgd2lkZ2V0OiAnZGF0ZScsIGZvcm1hdDogJ3l5eXktTU0tZGQnIH0sXG4gICdmdWxsLWRhdGUnOiB7IHdpZGdldDogJ2RhdGUnLCBmb3JtYXQ6ICd5eXl5LU1NLWRkJyB9LFxuICB0aW1lOiB7IHdpZGdldDogJ3RpbWUnIH0sXG4gICdmdWxsLXRpbWUnOiB7IHdpZGdldDogJ3RpbWUnIH0sXG4gIHdlZWs6IHsgd2lkZ2V0OiAnZGF0ZScsIG1vZGU6ICd3ZWVrJywgZm9ybWF0OiAneXl5eS1XVycgfSxcbiAgbW9udGg6IHsgd2lkZ2V0OiAnZGF0ZScsIG1vZGU6ICdtb250aCcsIGZvcm1hdDogJ3l5eXktTU0nIH0sXG4gIHVyaTogeyB3aWRnZXQ6ICd1cGxvYWQnIH0sXG4gIGVtYWlsOiB7IHdpZGdldDogJ2F1dG9jb21wbGV0ZScsIHR5cGU6ICdlbWFpbCcgfSxcbiAgY29sb3I6IHsgd2lkZ2V0OiAnc3RyaW5nJywgdHlwZTogJ2NvbG9yJyB9LFxuICAnJzogeyB3aWRnZXQ6ICdzdHJpbmcnIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNCbGFuayhvOiBhbnkpIHtcbiAgcmV0dXJuIG8gPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbCh2YWx1ZTogYW55LCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgdmFsdWUgPSB0b0Jvb2xlYW4odmFsdWUsIHRydWUpO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGkodWk6IFNGVUlTY2hlbWEsIC4uLmFyZ3M6IE56U2FmZUFueVtdKSB7XG4gIGlmICh1aS5kZWJ1Zykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKiDmoLnmja4gYCRyZWZgIOafpeaJviBgZGVmaW5pdGlvbnNgICovXG5mdW5jdGlvbiBmaW5kU2NoZW1hRGVmaW5pdGlvbigkcmVmOiBzdHJpbmcsIGRlZmluaXRpb25zOiBTRlNjaGVtYURlZmluaXRpb24pIHtcbiAgY29uc3QgbWF0Y2ggPSAvXiNcXC9kZWZpbml0aW9uc1xcLyguKikkLy5leGVjKCRyZWYpO1xuICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHtcbiAgICAvLyBwYXJzZXIgSlNPTiBQb2ludGVyXG4gICAgY29uc3QgcGFydHMgPSBtYXRjaFsxXS5zcGxpdChTRl9TRVEpO1xuICAgIGxldCBjdXJyZW50OiBhbnkgPSBkZWZpbml0aW9ucztcbiAgICBmb3IgKGxldCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBwYXJ0ID0gcGFydC5yZXBsYWNlKC9+MS9nLCBTRl9TRVEpLnJlcGxhY2UoL34wL2csICd+Jyk7XG4gICAgICBpZiAoY3VycmVudC5oYXNPd25Qcm9wZXJ0eShwYXJ0KSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBkZWZpbml0aW9uIGZvciAkeyRyZWZ9LmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgZGVmaW5pdGlvbiBmb3IgJHskcmVmfS5gKTtcbn1cblxuLyoqXG4gKiDlj5blm55TY2hlbWHvvIzlubblpITnkIYgYCRyZWZgIOeahOWFs+ezu1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmV0cmlldmVTY2hlbWEoc2NoZW1hOiBTRlNjaGVtYSwgZGVmaW5pdGlvbnM6IFNGU2NoZW1hRGVmaW5pdGlvbiA9IHt9KTogU0ZTY2hlbWEge1xuICBpZiAoc2NoZW1hLmhhc093blByb3BlcnR5KCckcmVmJykpIHtcbiAgICBjb25zdCAkcmVmU2NoZW1hID0gZmluZFNjaGVtYURlZmluaXRpb24oc2NoZW1hLiRyZWYhLCBkZWZpbml0aW9ucyk7XG4gICAgLy8gcmVtb3ZlICRyZWYgcHJvcGVydHlcbiAgICBjb25zdCB7ICRyZWYsIC4uLmxvY2FsU2NoZW1hIH0gPSBzY2hlbWE7XG4gICAgcmV0dXJuIHJldHJpZXZlU2NoZW1hKHsgLi4uJHJlZlNjaGVtYSwgLi4ubG9jYWxTY2hlbWEgfSwgZGVmaW5pdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZihzY2hlbWE6IFNGU2NoZW1hLCB1aTogU0ZVSVNjaGVtYUl0ZW1SdW4pOiBTRlNjaGVtYSB8IG51bGwge1xuICBpZiAoIShzY2hlbWEuaGFzT3duUHJvcGVydHkoJ2lmJykgJiYgc2NoZW1hLmhhc093blByb3BlcnR5KCd0aGVuJykpKSByZXR1cm4gbnVsbDtcblxuICBpZiAoIXNjaGVtYS5pZiEucHJvcGVydGllcykgdGhyb3cgbmV3IEVycm9yKGBpZjogZG9lcyBub3QgY29udGFpbiAncHJvcGVydGllcydgKTtcblxuICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMhKTtcbiAgY29uc3QgaWZLZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hLmlmIS5wcm9wZXJ0aWVzISk7XG4gIGRldGVjdEtleShhbGxLZXlzLCBpZktleXMpO1xuICBkZXRlY3RLZXkoYWxsS2V5cywgc2NoZW1hLnRoZW4hLnJlcXVpcmVkISk7XG4gIHNjaGVtYS5yZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZCEuY29uY2F0KHNjaGVtYS50aGVuIS5yZXF1aXJlZCEpO1xuICBjb25zdCBoYXNFbHNlID0gc2NoZW1hLmhhc093blByb3BlcnR5KCdlbHNlJyk7XG4gIGlmIChoYXNFbHNlKSB7XG4gICAgZGV0ZWN0S2V5KGFsbEtleXMsIHNjaGVtYS5lbHNlIS5yZXF1aXJlZCEpO1xuICAgIHNjaGVtYS5yZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZC5jb25jYXQoc2NoZW1hLmVsc2UhLnJlcXVpcmVkISk7XG4gIH1cblxuICBjb25zdCB2aXNpYmxlSWY6IGFueSA9IHt9O1xuICBjb25zdCB2aXNpYmxlRWxzZTogYW55ID0ge307XG4gIGlmS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3QgY29uZCA9IHNjaGVtYS5pZiEucHJvcGVydGllcyFba2V5XS5lbnVtO1xuICAgIHZpc2libGVJZltrZXldID0gY29uZDtcbiAgICBpZiAoaGFzRWxzZSkgdmlzaWJsZUVsc2Vba2V5XSA9ICh2YWx1ZTogYW55KSA9PiAhY29uZCEuaW5jbHVkZXModmFsdWUpO1xuICB9KTtcblxuICBzY2hlbWEudGhlbiEucmVxdWlyZWQhLmZvckVhY2goa2V5ID0+ICh1aVtgJCR7a2V5fWBdLnZpc2libGVJZiA9IHZpc2libGVJZikpO1xuICBpZiAoaGFzRWxzZSkgc2NoZW1hLmVsc2UhLnJlcXVpcmVkIS5mb3JFYWNoKGtleSA9PiAodWlbYCQke2tleX1gXS52aXNpYmxlSWYgPSB2aXNpYmxlRWxzZSkpO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEtleShrZXlzOiBzdHJpbmdbXSwgZGV0ZWN0S2V5czogc3RyaW5nW10pIHtcbiAgZGV0ZWN0S2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaWY6IHByb3BlcnRpZXMgZG9lcyBub3QgY29udGFpbiAnJHtrZXl9J2ApO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRlclByb3BlcnRpZXMocHJvcGVydGllczogc3RyaW5nW10sIG9yZGVyOiBzdHJpbmdbXSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXIpKSByZXR1cm4gcHJvcGVydGllcztcbiAgY29uc3QgYXJyYXlUb0hhc2ggPSAoYXJyOiBOelNhZmVBbnkpID0+XG4gICAgYXJyLnJlZHVjZSgocHJldjogTnpTYWZlQW55LCBjdXJyOiBOelNhZmVBbnkpID0+IHtcbiAgICAgIHByZXZbY3Vycl0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwge30pO1xuICBjb25zdCBlcnJvclByb3BMaXN0ID0gKGFycjogTnpTYWZlQW55KSA9PiBgcHJvcGVydHkgWyR7YXJyLmpvaW4oYCcsICdgKX1dYDtcblxuICBjb25zdCBwcm9wZXJ0eUhhc2ggPSBhcnJheVRvSGFzaChwcm9wZXJ0aWVzKTtcbiAgY29uc3Qgb3JkZXJIYXNoID0gYXJyYXlUb0hhc2gob3JkZXIpO1xuICBjb25zdCBleHRyYW5lb3VzID0gb3JkZXIuZmlsdGVyKHByb3AgPT4gcHJvcCAhPT0gJyonICYmICFwcm9wZXJ0eUhhc2hbcHJvcF0pO1xuICBpZiAoZXh0cmFuZW91cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVpIHNjaGVtYSBvcmRlciBsaXN0IGNvbnRhaW5zIGV4dHJhbmVvdXMgJHtlcnJvclByb3BMaXN0KGV4dHJhbmVvdXMpfWApO1xuICB9XG4gIGNvbnN0IHJlc3QgPSBwcm9wZXJ0aWVzLmZpbHRlcihwcm9wID0+ICFvcmRlckhhc2hbcHJvcF0pO1xuICBjb25zdCByZXN0SW5kZXggPSBvcmRlci5pbmRleE9mKCcqJyk7XG4gIGlmIChyZXN0SW5kZXggPT09IC0xKSB7XG4gICAgaWYgKHJlc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVpIHNjaGVtYSBvcmRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gJHtlcnJvclByb3BMaXN0KHJlc3QpfWApO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXI7XG4gIH1cbiAgaWYgKHJlc3RJbmRleCAhPT0gb3JkZXIubGFzdEluZGV4T2YoJyonKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndWkgc2NoZW1hIG9yZGVyIGxpc3QgY29udGFpbnMgbW9yZSB0aGFuIG9uZSB3aWxkY2FyZCBpdGVtJyk7XG4gIH1cbiAgY29uc3QgY29tcGxldGUgPSBbLi4ub3JkZXJdO1xuICBjb21wbGV0ZS5zcGxpY2UocmVzdEluZGV4LCAxLCAuLi5yZXN0KTtcbiAgcmV0dXJuIGNvbXBsZXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bShsaXN0OiBhbnlbXSwgZm9ybURhdGE6IGFueSwgcmVhZE9ubHk6IGJvb2xlYW4pOiBTRlNjaGVtYUVudW1bXSB7XG4gIGlmIChpc0JsYW5rKGxpc3QpIHx8ICFBcnJheS5pc0FycmF5KGxpc3QpIHx8IGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGlmICh0eXBlb2YgbGlzdFswXSAhPT0gJ29iamVjdCcpIHtcbiAgICBsaXN0ID0gbGlzdC5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHsgbGFiZWw6IGl0ZW0sIHZhbHVlOiBpdGVtIH0gYXMgU0ZTY2hlbWFFbnVtO1xuICAgIH0pO1xuICB9XG4gIGlmIChmb3JtRGF0YSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmb3JtRGF0YSkpIGZvcm1EYXRhID0gW2Zvcm1EYXRhXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW06IFNGU2NoZW1hRW51bSkgPT4ge1xuICAgICAgaWYgKH5mb3JtRGF0YS5pbmRleE9mKGl0ZW0udmFsdWUpKSBpdGVtLmNoZWNrZWQgPSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIC8vIGZpeCBkaXNhYmxlZCBzdGF0dXNcbiAgaWYgKHJlYWRPbmx5KSB7XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtOiBTRlNjaGVtYUVudW0pID0+IChpdGVtLmRpc2FibGVkID0gdHJ1ZSkpO1xuICB9XG4gIHJldHVybiBsaXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weUVudW0obGlzdDogYW55W10sIGZvcm1EYXRhOiBhbnksIHJlYWRPbmx5OiBib29sZWFuKSB7XG4gIHJldHVybiBnZXRFbnVtKGRlZXBDb3B5KGxpc3QgfHwgW10pLCBmb3JtRGF0YSwgcmVhZE9ubHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YShzY2hlbWE6IFNGU2NoZW1hLCB1aTogU0ZVSVNjaGVtYUl0ZW0sIGZvcm1EYXRhOiBhbnksIGFzeW5jQXJncz86IGFueSk6IE9ic2VydmFibGU8U0ZTY2hlbWFFbnVtW10+IHtcbiAgaWYgKHR5cGVvZiB1aS5hc3luY0RhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdWkuYXN5bmNEYXRhKGFzeW5jQXJncykucGlwZShtYXAoKGxpc3Q6IFNGU2NoZW1hRW51bVtdKSA9PiBnZXRFbnVtKGxpc3QsIGZvcm1EYXRhLCBzY2hlbWEucmVhZE9ubHkhKSkpO1xuICB9XG4gIHJldHVybiBvZihnZXRDb3B5RW51bShzY2hlbWEuZW51bSEsIGZvcm1EYXRhLCBzY2hlbWEucmVhZE9ubHkhKSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0byB1c2luZyBkYXRlLWZucyB0byBmb3JtYXQgYSBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVGbnMoc3J2OiBOekkxOG5TZXJ2aWNlKTogYm9vbGVhbiB7XG4gIGlmICghc3J2KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRhdGEgPSBzcnYuZ2V0RGF0ZUxvY2FsZSgpO1xuICAvLyBDb21wYXRpYmxlIGRhdGUtZm5zIHYxLnggJiB2Mi54XG4gIHJldHVybiBkYXRhICE9IG51bGwgJiYgISFkYXRhLmZvcm1hdERpc3RhbmNlOyAvLyAoISFkYXRhLmRpc3RhbmNlSW5Xb3JkcyB8fCAhIWRhdGEuZm9ybWF0RGlzdGFuY2UpO1xufVxuIl19