ng-devui
Version:
DevUI components based on Angular
585 lines • 78 kB
JavaScript
import { ComponentFactoryResolver, Directive, ElementRef, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, } from '@angular/core';
import { AbstractControlDirective, ControlContainer, NgControl, } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { OverlayContainerRef } from 'ng-devui/overlay-container';
import { PopoverComponent } from 'ng-devui/popover';
import { Subject, fromEvent, merge, timer } from 'rxjs';
import { map, switchMap, takeUntil } from 'rxjs/operators';
import { FormItemComponent } from '../form-item.component';
import { dDefaultValidators, ruleReservedWords, } from './validate.type';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "ng-devui/i18n";
import * as i3 from "../form-item.component";
import * as i4 from "ng-devui/overlay-container";
export class DAbstractControlRuleDirective {
set locale(key) {
this._locale = key;
this._parseErrors(this._cd.control.errors);
this.updateStatusAndMessageToView(this._cd.control.status);
}
get locale() {
return this._locale;
}
get errorMessage() {
return this._cd && this._cd.control.invalid
? this._errorMessage || (this._rules && this._rules.message)
: null;
}
set errorMessage(msg) {
if (this._cd && this._cd.control.invalid) {
this._errorMessage = msg;
}
else {
this._errorMessage = null;
}
}
constructor(cd, parent) {
/* 统一设置错误抛出策略 */
this._errorStrategy = 'dirty'; // 统一设置错误抛出策略
/* 是否已经注册监听 */
this._registered = false;
this._errorMessage = null;
this.dRulesStatusChange = new EventEmitter();
this._cd = cd;
this._parent = parent;
}
get isReady() {
return this._cd.control ? !(this._cd.control.invalid || this._cd.control.pending) : true;
}
get pending() {
return this._cd.control ? this._cd.control.pending : true;
}
/* 包含继承自父级的rule */
get fullRules() {
const keysCanInherit = ['messageShowType', 'errorStrategy', 'messageToView', 'popPosition', 'asyncDebounceTime'];
const resRules = { ...this._rules };
keysCanInherit.forEach((key) => {
if (this._parent && this._parent.fullRules) {
resRules[key] = resRules[key] !== undefined ? resRules[key] : this._parent.fullRules[key];
}
});
return resRules;
}
get asyncValidatorDebounceTime() {
const time = this.fullRules.asyncDebounceTime;
return time === undefined ? 300 : time;
}
ngOnChanges(changes) {
if ('rules' in changes && !this._rules) {
// TODO:提供外部调用可手动更新rule方法
this._rules = { ...this._originRules, ...this._translateRulesToObject(changes.rules.currentValue) };
this.setupOrUpdateRules();
}
if (!this._registered) {
this._registerOnStatusChange();
}
}
updateRules(rules) {
this._rules = { ...this._originRules, ...this._translateRulesToObject(rules) };
this.setupOrUpdateRules();
}
setOriginRules(rules) {
this._originRules = this._translateRulesToObject(rules);
}
setupOrUpdateRules() {
// TODO:校验rules规则是否合法
this._transformRulesAndUpdateToModel();
this._setUpdateStrategy();
}
_transformRulesAndUpdateToModel() {
this._messageOpts = {};
if (!Array.isArray(this._rules)) {
if (this._rules.validators) {
const validators = this._transformValidatorsToFnArray(this._rules.validators);
this._updateValidators(validators);
}
if (this._rules.asyncValidators) {
const asyncValidators = this._transformValidatorsToFnArray(this._rules.asyncValidators, true);
this._updateAsyncValidators(asyncValidators);
}
}
else {
const validators = this._transformValidatorsToFnArray(this._rules);
this._updateValidators(validators);
}
this._updateValueAndValidity();
}
_transformValidatorsToFnArray(validators, async = false) {
const resultFns = [];
validators.forEach((validatorRule) => {
// TODO: 提供可全局统一注册方法
const validatorId = this._autoGetIdFromRule(validatorRule);
let validator = null;
if (!validatorId) {
// TODO:抛出错误
}
if (validatorId in dDefaultValidators) {
validator = this._generateValidatorFnFromDefault(validatorId, validatorRule[validatorId]);
}
else {
if (typeof validatorRule[validatorId] === 'string') {
validator = validatorRule.validator;
}
else {
validator = validatorRule[validatorId];
}
if (!validatorRule.isNgValidator) {
if (!async) {
validator = this._transformRuleToNgValidator(validatorId, validator, validatorRule.message);
}
else {
validator = this._transformRuleToNgAsyncValidator(validatorId, validator, validatorRule.message);
}
}
}
if (validator) {
if (async && this.asyncValidatorDebounceTime) {
const oldValidator = validator;
validator = (control) => {
return timer(this.asyncValidatorDebounceTime).pipe(switchMap(() => {
return oldValidator(control);
}));
};
}
resultFns.push(validator);
this._messageOpts[validatorId] = validatorRule;
}
// else {
// // TODO: 抛出错误
// }
});
return resultFns;
}
_translateRulesToObject(rules) {
if (Array.isArray(rules)) {
return {
validators: rules,
};
}
return rules;
}
_findNgValidatorInDefault(validatorRule) {
for (const key in dDefaultValidators) {
if (Object.prototype.hasOwnProperty.call(validatorRule, key)) {
return { id: key, ngValidator: this._generateValidatorFnFromDefault(key, validatorRule[key]) };
}
}
return null;
}
_generateValidatorFnFromDefault(key, value) {
if (typeof value === 'boolean' && value) {
// boolean无需再执行函数进行传值
return dDefaultValidators[key];
}
else if (typeof value !== 'boolean') {
return dDefaultValidators[key](value);
}
return null;
}
_transformRuleToNgValidator(id, validatorFn, message) {
return (control) => {
const res = validatorFn(control.value);
return this._transValidatorResultToNgError(id, res, message);
};
}
_transformRuleToNgAsyncValidator(id, validator, message) {
return (control) => {
return validator(control.value).pipe(map((res) => {
return this._transValidatorResultToNgError(id, res, message);
}));
};
}
_transValidatorResultToNgError(id, res, message) {
let error = null;
if (typeof res === 'boolean' && !res) {
error = {};
error[id] = message;
}
else if (typeof res === 'string' || (res && typeof res === 'object')) {
// 兼容国际化词条
error = {};
error[id] = res;
}
return error;
}
_autoGetIdFromRule(rule) {
for (const key in rule) {
if (!(key in ruleReservedWords)) {
return key;
}
}
return rule.id || null;
}
// TODO: 考虑自定义函数返回多种key场景
get dClassError() {
if (this._errorStrategy === 'dirty') {
return this._cd.control ? this._cd.control.invalid && this._cd.control.dirty : false;
}
else {
return this._cd.control ? this._cd.control.invalid : false;
}
}
get showError() {
return this.dClassError;
}
get showStatus() {
if (this._errorStrategy === 'dirty') {
return this._cd.control ? this._cd.control.dirty : false;
}
else {
return true;
}
}
get dClassSuccess() {
// COMMENT: 暂不默认提供
if (this._rules.errorStrategy === 'dirty') {
return this._cd.control ? this._cd.control.valid && this._cd.control.dirty : false;
}
else if (!this._rules.errorStrategy) {
return false;
}
else {
return this._cd.control ? this._cd.control.valid : false;
}
}
get dClassWarning() {
return this._warning ? true : false;
}
get invalid() {
return this._cd.control ? this._cd.control.invalid : false;
}
_registerOnStatusChange() {
if (this._cd && this._cd.control) {
this._cd.control.statusChanges.subscribe((status) => {
this._parseErrors(this._cd.control.errors);
this._updateParent(); // update error message to parent directive
this.updateStatusAndMessageToView(status);
});
this._registered = true;
}
}
_parseErrors(errors) {
if (!errors) {
this._errorMessage = null;
}
else {
/* if a rule did not have a message, we will try to get a message from errors by id */
const { resId, resRule } = this._getARuleByErrors(errors);
this._errorStrategy = this._getErrorStrategy(resRule);
this._errorMessage =
resRule &&
(resRule.message ||
this._getMessageFormErrorsById(errors, resId) ||
this._getDefaultErrorMessage(resRule, resId) ||
this._rules.message);
}
this.dRulesStatusChange.emit({
showError: this.showError,
errorMessage: this._errorMessage,
errors: errors,
});
}
_getDefaultErrorMessage(rule, id) {
return rule && rule[id] && this.i18nFormText[id] && this.i18nFormText[id](rule[id]);
}
_getErrorStrategy(rule) {
return (rule && rule.errorStrategy) || this._rules.errorStrategy || 'dirty';
}
_getMessageFormErrorsById(errors, id) {
if (errors[id] && typeof errors[id] === 'string') {
return errors[id];
}
else if (errors[id] && typeof errors[id] === 'object' && (errors[id][this.locale] || errors[id].default)) {
return errors[id];
}
else {
return null;
}
}
_getARuleByErrors(errors) {
// TODO:处理errors为null
let resId;
let resRule = null;
for (const key of Object.keys(errors)) {
if (this._messageOpts[key]) {
if (resRule) {
const priority = resRule.priority || 0;
if (this._messageOpts[key].priority && this._messageOpts[key].priority > priority) {
resId = key;
resRule = this._messageOpts[key];
}
}
else {
resId = key;
resRule = this._messageOpts[key];
}
}
}
return { resId: resId, resRule: resRule };
}
_updateParent() {
if (this._parent) {
// TODO
}
}
_setUpdateStrategy() {
if (!Array.isArray(this._rules) && typeof this._rules === 'object' && this._rules.updateOn) {
this._cd.control._updateOn = this._rules.updateOn;
}
}
_updateValueAndValidity() {
if (this._cd && this._cd.control) {
this._cd.control.updateValueAndValidity();
}
}
_updateValidators(newValidator) {
if (this._cd && this._cd.control) {
this._cd.control.setValidators(newValidator);
}
}
_updateAsyncValidators(newValidator) {
if (this._cd && this._cd.control) {
this._cd.control.setAsyncValidators(newValidator);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DAbstractControlRuleDirective, deps: [{ token: i1.AbstractControlDirective }, { token: DAbstractControlRuleDirective }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DAbstractControlRuleDirective, outputs: { dRulesStatusChange: "dRulesStatusChange" }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DAbstractControlRuleDirective, decorators: [{
type: Directive
}], ctorParameters: () => [{ type: i1.AbstractControlDirective }, { type: DAbstractControlRuleDirective }], propDecorators: { dRulesStatusChange: [{
type: Output
}] } });
const dControlErrorStatusHost = {
'[class.devui-error]': 'dClassError',
'[class.devui-success]': 'dClassSuccess',
'[class.devui-warning]': 'dClassWarning',
};
export class DFormGroupRuleDirective extends DAbstractControlRuleDirective {
constructor(cd, parentDir, i18n) {
super(cd, parentDir);
this.i18n = i18n;
this.dRulesStatusChange = new EventEmitter();
this.destroy$ = new Subject();
}
ngOnInit() {
this.i18nFormText = this.i18n.getI18nText().form;
this.locale = this.i18n.getI18nText().locale;
this.i18n
.langChange()
.pipe(takeUntil(this.destroy$))
.subscribe((data) => {
this.i18nFormText = data.form;
this.locale = data.locale;
});
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
setErrorMessageByChild(msg) {
if (!this.errorMessage) {
this.errorMessage = msg;
}
}
updateStatusAndMessageToView(status) {
// do nothing
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormGroupRuleDirective, deps: [{ token: i1.ControlContainer, self: true }, { token: DFormGroupRuleDirective, host: true, optional: true, skipSelf: true }, { token: i2.I18nService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormGroupRuleDirective, selector: "[dValidateRules][formGroupName],[dValidateRules][formArrayName],[dValidateRules][ngModelGroup],\n [dValidateRules][formGroup],[dValidateRules]form:not([ngNoForm]),[dValidateRules][ngForm]", inputs: { rules: ["dValidateRules", "rules"] }, outputs: { dRulesStatusChange: "dRulesStatusChange" }, host: { properties: { "class.devui-error": "dClassError", "class.devui-success": "dClassSuccess", "class.devui-warning": "dClassWarning" } }, exportAs: ["dValidateRules"], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormGroupRuleDirective, decorators: [{
type: Directive,
args: [{
selector: `[dValidateRules][formGroupName],[dValidateRules][formArrayName],[dValidateRules][ngModelGroup],
[dValidateRules][formGroup],[dValidateRules]form:not([ngNoForm]),[dValidateRules][ngForm]`,
/* eslint-disable-next-line @angular-eslint/no-host-metadata-property*/
host: dControlErrorStatusHost,
exportAs: 'dValidateRules',
}]
}], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
type: Self
}] }, { type: DFormGroupRuleDirective, decorators: [{
type: Optional
}, {
type: Host
}, {
type: SkipSelf
}] }, { type: i2.I18nService }], propDecorators: { rules: [{
type: Input,
args: ['dValidateRules']
}], dRulesStatusChange: [{
type: Output
}] } });
export class DFormControlRuleDirective extends DAbstractControlRuleDirective {
get showType() {
return this.fullRules.messageShowType || 'popover';
}
get popPosition() {
return this.fullRules.popPosition || ['right', 'bottom'];
}
constructor(cd, dFormItem, parentDir, i18n, triggerElementRef, overlayContainerRef, componentFactoryResolver) {
super(cd, parentDir);
this.dFormItem = dFormItem;
this.i18n = i18n;
this.triggerElementRef = triggerElementRef;
this.overlayContainerRef = overlayContainerRef;
this.componentFactoryResolver = componentFactoryResolver;
this.dRulesStatusChange = new EventEmitter();
this.destroy$ = new Subject();
}
ngOnInit() {
this.setI18nText();
this._registerFocusChange();
}
setI18nText() {
this.i18nFormText = this.i18n.getI18nText().form;
this.locale = this.i18n.getI18nText().locale;
this.i18n
.langChange()
.pipe(takeUntil(this.destroy$))
.subscribe((data) => {
this.i18nFormText = data.form;
this.locale = data.locale;
});
}
_registerFocusChange() {
merge(fromEvent(this.triggerElementRef.nativeElement, 'focusin'), fromEvent(this.triggerElementRef.nativeElement, 'focusout'))
.pipe(takeUntil(this.destroy$))
.subscribe((event) => {
if (event.type === 'focusin') {
this.showPopMessage();
}
if (event.type === 'focusout') {
this.hidePopMessage();
}
});
}
_updateFormContainer(status, message) {
if (this.dFormItem) {
this.dFormItem.updateFeedback(status, message);
}
}
_updatePopMessage(status, message) {
this.popMessage = status === 'error' ? message : null; // 暂不提供除errorMessage外提示
if (this.popoverComponentRef) {
if (this._prevMessage !== this.popMessage) {
this.hidePopMessage();
this.showPopMessage();
this._prevMessage = this.popMessage;
}
}
}
updateStatusAndMessageToView(status) {
let controlStatus = null;
let message = null;
if (this.showStatus) {
[controlStatus, message] = this.getFormControlStatusAndMessage(status);
}
/* 国际化适配 */
if (message && typeof message === 'object') {
message = message[this.locale] || message.default || message;
}
if (this.showType === 'popover') {
this._updatePopMessage(controlStatus, message);
this._updateFormContainer(controlStatus, null);
}
else if (this.showType === 'text') {
this._updateFormContainer(controlStatus, message);
}
}
getFormControlStatusAndMessage(ngStatus) {
let status = null;
let message = null;
if (ngStatus === 'INVALID') {
status = 'error';
message = this.errorMessage;
}
else if (ngStatus === 'PENDING') {
status = 'pending';
}
else if (ngStatus === 'VALID') {
status = 'success';
}
return [status, message];
}
createPopover(type, content) {
this.popoverComponentRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent));
Object.assign(this.popoverComponentRef.instance, {
content: content,
triggerElementRef: this.triggerElementRef,
position: this.popPosition,
popType: type,
popMaxWidth: this.popConfig?.popMaxWidth || 200,
scrollElement: this.popConfig?.scrollElement,
zIndex: this.popConfig?.zIndex || 1060,
showAnimation: this.popConfig?.showAnimation ?? true,
appendToBody: true,
});
}
showPopMessage() {
this.showPop('error', this.popMessage);
if (this.popMessage) {
this._updateFormContainer(null, null);
}
}
hidePopMessage() {
this.hidePop();
if (this.popMessage) {
this._updateFormContainer(this.showError ? 'error' : null, null);
}
}
showPop(type, message) {
this.hidePop();
this.createPopover(type, message);
}
hidePop() {
if (this.popoverComponentRef) {
this.destroyPop();
}
}
destroyPop() {
if (this.popoverComponentRef) {
this.popoverComponentRef.destroy();
this.popoverComponentRef = null;
}
}
ngOnDestroy() {
this.destroyPop();
this.destroy$.next();
this.destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormControlRuleDirective, deps: [{ token: i1.NgControl, self: true }, { token: i3.FormItemComponent, host: true, optional: true }, { token: DFormGroupRuleDirective, host: true, optional: true, skipSelf: true }, { token: i2.I18nService }, { token: i0.ElementRef }, { token: i4.OverlayContainerRef }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormControlRuleDirective, selector: "[dValidateRules][formControlName],[dValidateRules][ngModel],[dValidateRules][formControl]", inputs: { rules: ["dValidateRules", "rules"], popConfig: ["dValidatePopConfig", "popConfig"] }, outputs: { dRulesStatusChange: "dRulesStatusChange" }, host: { properties: { "class.devui-error": "dClassError", "class.devui-success": "dClassSuccess", "class.devui-warning": "dClassWarning" } }, exportAs: ["dValidateRules"], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormControlRuleDirective, decorators: [{
type: Directive,
args: [{
selector: '[dValidateRules][formControlName],[dValidateRules][ngModel],[dValidateRules][formControl]',
/* eslint-disable-next-line @angular-eslint/no-host-metadata-property*/
host: dControlErrorStatusHost,
exportAs: 'dValidateRules',
}]
}], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
type: Self
}] }, { type: i3.FormItemComponent, decorators: [{
type: Optional
}, {
type: Host
}] }, { type: DFormGroupRuleDirective, decorators: [{
type: Optional
}, {
type: Host
}, {
type: SkipSelf
}] }, { type: i2.I18nService }, { type: i0.ElementRef }, { type: i4.OverlayContainerRef }, { type: i0.ComponentFactoryResolver }], propDecorators: { rules: [{
type: Input,
args: ['dValidateRules']
}], dRulesStatusChange: [{
type: Output
}], popConfig: [{
type: Input,
args: ['dValidatePopConfig']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLXJ1bGVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2Zvcm0vdmFsaWRhdG9yLWRpcmVjdGl2ZS9mb3JtLWNvbnRyb2wtcnVsZXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFFSixRQUFRLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLHdCQUF3QixFQUV4QixnQkFBZ0IsRUFDaEIsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBUUwsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFHekIsTUFBTSxPQUFnQiw2QkFBNkI7SUFrQ2pELElBQUksTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FB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QkFDaEIsUUFBUTs7MEJBQUksSUFBSTs7MEJBQUksUUFBUTtxS0FyQlosS0FBSztzQkFBN0IsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ2Isa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVzQixTQUFTO3NCQUFyQyxLQUFLO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgU2VsZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFNraXBTZWxmLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUsXHJcbiAgQXN5bmNWYWxpZGF0b3JGbixcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIE5nQ29udHJvbCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgT3ZlcmxheUNvbnRhaW5lclJlZiB9IGZyb20gJ25nLWRldnVpL292ZXJsYXktY29udGFpbmVyJztcclxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ25nLWRldnVpL3BvcG92ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0taXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIERBc3luY1ZhbGlkYXRlUnVsZSxcclxuICBERm9ybUNvbnRyb2xTdGF0dXMsXHJcbiAgRFBvcENvbmZpZyxcclxuICBEVmFsaWRhdGVFcnJvclN0YXR1cyxcclxuICBEVmFsaWRhdGVSdWxlLFxyXG4gIERWYWxpZGF0ZVJ1bGVzLFxyXG4gIERWYWxpZGF0aW9uRXJyb3JTdHJhdGVneSxcclxuICBkRGVmYXVsdFZhbGlkYXRvcnMsXHJcbiAgcnVsZVJlc2VydmVkV29yZHMsXHJcbn0gZnJvbSAnLi92YWxpZGF0ZS50eXBlJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgREFic3RyYWN0Q29udHJvbFJ1bGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qIG1vZGUgaXMgX2NkLmNvbnRyb2wgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgX2NkOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmU7IC8vIG1vZGVsIGlzIF9jZC5jb250cm9sXHJcblxyXG4gIC8qI