@alauda-fe/common
Version:
Alauda frontend team common codes.
207 lines • 29 kB
JavaScript
import { ButtonModule, IconModule, InputModule, SelectModule, } from '@alauda/ui';
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, forwardRef } from '@angular/core';
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { TaintEffect, createNestedFormControl } from '../../core/public-api';
import { EffectDirectiveModule } from '../../effect-directive/module';
import { TranslateModule } from '../../translate/public-api';
import { ErrorsMapperModule } from '../errors-mapper/public-api';
import { ValidatorsModule } from '../validators/public-api';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../translate/translate.pipe";
import * as i3 from "@angular/forms";
import * as i4 from "@alauda/ui";
import * as i5 from "../validators/function-validator.directive";
import * as i6 from "../validators/maxlength-minlength-validator.directive";
import * as i7 from "../errors-mapper/errors-mapper-component/component";
import * as i8 from "../../effect-directive/e2e-attribute-binding.directive";
import * as i9 from "../../effect-directive/validators.directive";
function TaintsEditorComponent_tr_15_acl_errors_mapper_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-errors-mapper", 22);
} if (rf & 2) {
i0.ɵɵnextContext();
const key_r4 = i0.ɵɵreference(3);
i0.ɵɵproperty("errors", key_r4.errors);
} }
function TaintsEditorComponent_tr_15_acl_errors_mapper_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-errors-mapper", 22);
} if (rf & 2) {
i0.ɵɵnextContext();
const value_r5 = i0.ɵɵreference(7);
i0.ɵɵproperty("errors", value_r5.errors);
} }
function TaintsEditorComponent_tr_15_aui_option_11_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-option", 23);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const effect_r6 = ctx.$implicit;
i0.ɵɵproperty("value", effect_r6);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", effect_r6, " ");
} }
function TaintsEditorComponent_tr_15_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "input", 14, 0);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_input_ngModelChange_2_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "key", $event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, TaintsEditorComponent_tr_15_acl_errors_mapper_4_Template, 1, 1, "acl-errors-mapper", 15);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "td")(6, "input", 16, 1);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_input_ngModelChange_6_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "value", $event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(8, TaintsEditorComponent_tr_15_acl_errors_mapper_8_Template, 1, 1, "acl-errors-mapper", 15);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(9, "td")(10, "aui-select", 17);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_aui_select_ngModelChange_10_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "effect", $event)); });
i0.ɵɵtemplate(11, TaintsEditorComponent_tr_15_aui_option_11_Template, 2, 2, "aui-option", 18);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(12, "td", 19)(13, "button", 20);
i0.ɵɵlistener("click", function TaintsEditorComponent_tr_15_Template_button_click_13_listener() { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.removeTaint(index_r2)); });
i0.ɵɵelement(14, "aui-icon", 21);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const taint_r7 = ctx.$implicit;
const key_r4 = i0.ɵɵreference(3);
const value_r5 = i0.ɵɵreference(7);
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.key)("aclValidateFn", ctx_r2.keyPattern);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r2.submitted || key_r4.dirty);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.value);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r2.submitted || value_r5.dirty);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.effect);
i0.ɵɵadvance();
i0.ɵɵproperty("ngForOf", ctx_r2.effects);
i0.ɵɵadvance(2);
i0.ɵɵproperty("square", true)("plain", true);
} }
function TaintsEditorComponent_tr_16_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "tr")(1, "td", 10)(2, "div", 24);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()()();
} if (rf & 2) {
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "no_taint"));
} }
export class TaintsEditorComponent extends createNestedFormControl() {
constructor() {
super(...arguments);
this.effects = Object.values(TaintEffect);
}
addTaint() {
this.model = this.model ?? [];
this.model.push({ key: '', value: '', effect: TaintEffect.NoSchedule });
}
editTaint(index, key, value) {
this.model[index][key] = value;
this.emitModel();
}
removeTaint(index) {
this.model.splice(index, 1);
this.emitModel();
}
keyPattern(control) {
if (!control.value) {
return null;
}
const [name, prefix = ''] = control.value.split('/').reverse();
if (name.length > 63 ||
/^(([\dA-Za-z][\w.-]*)?[\dA-Za-z])$/.test(name) === false) {
return { pattern: true };
}
if (!!prefix &&
(prefix.length > 253 ||
/^[\da-z]([\da-z-]*[\da-z])?(\.[\da-z]([\da-z-]*[\da-z])?)*$/.test(prefix) === false)) {
return { pattern: true };
}
return null;
}
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵTaintsEditorComponent_BaseFactory; return function TaintsEditorComponent_Factory(t) { return (ɵTaintsEditorComponent_BaseFactory || (ɵTaintsEditorComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TaintsEditorComponent)))(t || TaintsEditorComponent); }; })(); }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaintsEditorComponent, selectors: [["acl-taints-editor"]], standalone: true, features: [i0.ɵɵProvidersFeature([
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 25, vars: 18, consts: [["key", "ngModel"], ["value", "ngModel"], [1, "acl-array-form-table", "mp-sticky-table-header", "mp-sticky-table-actions"], ["required", "", "width", "40%"], ["width", "40%"], ["width", "20%"], [2, "min-width", "44px"], [4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "acl-array-form-table--row-action"], ["colspan", "100"], [1, "acl-array-form-table__bottom-control-buttons"], ["aui-button", "primary", "size", "mini", "type", "button", 3, "click", "plain", "disabled"], ["icon", "plus_circle"], ["aui-input", "", "size", "small", "name", "key", "required", "", 3, "ngModelChange", "ngModel", "aclValidateFn"], [3, "errors", 4, "ngIf"], ["aui-input", "", "size", "small", "name", "value", "aclMaxlength", "63", "pattern", "^(([\\dA-Za-z][\\w.-]*)?[\\dA-Za-z])?$", 3, "ngModelChange", "ngModel"], ["size", "small", "name", "effect", 3, "ngModelChange", "ngModel"], [3, "value", 4, "ngFor", "ngForOf"], [1, "acl-array-form-table__action-col"], ["aui-button", "text", "size", "small", "type", "button", 3, "click", "square", "plain"], ["icon", "minus_circle"], [3, "errors"], [3, "value"], [1, "placeholder"]], template: function TaintsEditorComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "table", 2)(1, "thead")(2, "tr")(3, "th", 3)(4, "span");
i0.ɵɵtext(5);
i0.ɵɵpipe(6, "translate");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(7, "th", 4);
i0.ɵɵtext(8);
i0.ɵɵpipe(9, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(10, "th", 5);
i0.ɵɵtext(11);
i0.ɵɵpipe(12, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelement(13, "th", 6);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(14, "tbody");
i0.ɵɵtemplate(15, TaintsEditorComponent_tr_15_Template, 15, 9, "tr", 7)(16, TaintsEditorComponent_tr_16_Template, 5, 3, "tr", 8);
i0.ɵɵelementStart(17, "tr", 9)(18, "td", 10)(19, "div", 11)(20, "button", 12);
i0.ɵɵlistener("click", function TaintsEditorComponent_Template_button_click_20_listener() { return ctx.addTaint(); });
i0.ɵɵelement(21, "aui-icon", 13);
i0.ɵɵelementStart(22, "span");
i0.ɵɵtext(23);
i0.ɵɵpipe(24, "translate");
i0.ɵɵelementEnd()()()()()()();
} if (rf & 2) {
i0.ɵɵclassProp("submitted", ctx.submitted);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 10, "key"));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 12, "value"));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(12, 14, "type"));
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngForOf", ctx.model);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !(ctx.model == null ? null : ctx.model.length));
i0.ɵɵadvance(4);
i0.ɵɵproperty("plain", true)("disabled", (ctx.model == null ? null : ctx.model.length) >= 50);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(24, 16, "add"), " ");
} }, dependencies: [CommonModule, i1.NgForOf, i1.NgIf, TranslateModule, i2.TranslatePipe, FormsModule, i3.DefaultValueAccessor, i3.NgControlStatus, i3.RequiredValidator, i3.PatternValidator, i3.NgModel, InputModule, i4.InputComponent, SelectModule, i4.SelectComponent, i4.OptionComponent, ValidatorsModule, i5.FunctionValidatorDirective, i6.MaxLengthValidatorDirective, ErrorsMapperModule, i7.ErrorsMapperComponent, IconModule, i4.IconComponent, ButtonModule, i4.ButtonComponent, EffectDirectiveModule, i8.E2eAttributeBindingDirective, i9.ValidatorsDirective], styles: ["[_nghost-%COMP%] {display:block;width:100%}[_nghost-%COMP%] .acl-array-form-table tbody td{vertical-align:top;line-height:var(--aui-inline-height-s)}[_nghost-%COMP%] .acl-array-form-table tbody tr .placeholder{text-align:center;color:rgb(var(--aui-color-help-text))}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaintsEditorComponent, [{
type: Component,
args: [{ standalone: true, selector: 'acl-taints-editor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
CommonModule,
TranslateModule,
FormsModule,
InputModule,
SelectModule,
ValidatorsModule,
ErrorsMapperModule,
IconModule,
ButtonModule,
EffectDirectiveModule,
], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
], template: "<table\n class=\"acl-array-form-table mp-sticky-table-header mp-sticky-table-actions\"\n [class.submitted]=\"submitted\"\n>\n <thead>\n <tr>\n <th\n required\n width=\"40%\"\n >\n <span>{{ 'key' | translate }}</span>\n </th>\n <th width=\"40%\">{{ 'value' | translate }}</th>\n <th width=\"20%\">{{ 'type' | translate }}</th>\n <th style=\"min-width: 44px\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let taint of model; let index = index\">\n <td>\n <input\n aui-input\n size=\"small\"\n name=\"key\"\n #key=\"ngModel\"\n [ngModel]=\"taint.key\"\n (ngModelChange)=\"editTaint(index, 'key', $event)\"\n required\n [aclValidateFn]=\"keyPattern\"\n />\n <acl-errors-mapper\n *ngIf=\"submitted || key.dirty\"\n [errors]=\"key.errors\"\n ></acl-errors-mapper>\n </td>\n <td>\n <input\n aui-input\n size=\"small\"\n name=\"value\"\n #value=\"ngModel\"\n [ngModel]=\"taint.value\"\n (ngModelChange)=\"editTaint(index, 'value', $event)\"\n aclMaxlength=\"63\"\n pattern=\"^(([\\dA-Za-z][\\w.-]*)?[\\dA-Za-z])?$\"\n />\n <acl-errors-mapper\n *ngIf=\"submitted || value.dirty\"\n [errors]=\"value.errors\"\n ></acl-errors-mapper>\n </td>\n <td>\n <aui-select\n size=\"small\"\n name=\"effect\"\n [ngModel]=\"taint.effect\"\n (ngModelChange)=\"editTaint(index, 'effect', $event)\"\n >\n <aui-option\n *ngFor=\"let effect of effects\"\n [value]=\"effect\"\n >\n {{ effect }}\n </aui-option>\n </aui-select>\n </td>\n <td class=\"acl-array-form-table__action-col\">\n <button\n aui-button=\"text\"\n size=\"small\"\n type=\"button\"\n [square]=\"true\"\n [plain]=\"true\"\n (click)=\"removeTaint(index)\"\n >\n <aui-icon icon=\"minus_circle\"></aui-icon>\n </button>\n </td>\n </tr>\n <tr *ngIf=\"!model?.length\">\n <td colspan=\"100\">\n <div class=\"placeholder\">{{ 'no_taint' | translate }}</div>\n </td>\n </tr>\n <tr class=\"acl-array-form-table--row-action\">\n <td colspan=\"100\">\n <div class=\"acl-array-form-table__bottom-control-buttons\">\n <button\n aui-button=\"primary\"\n [plain]=\"true\"\n size=\"mini\"\n type=\"button\"\n (click)=\"addTaint()\"\n [disabled]=\"model?.length >= 50\"\n >\n <aui-icon icon=\"plus_circle\"></aui-icon>\n <span>\n {{ 'add' | translate }}\n </span>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [":host::ng-deep{display:block;width:100%}:host::ng-deep .acl-array-form-table tbody td{vertical-align:top;line-height:var(--aui-inline-height-s)}:host::ng-deep .acl-array-form-table tbody tr .placeholder{text-align:center;color:rgb(var(--aui-color-help-text))}\n"] }]
}], null, null); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TaintsEditorComponent, { className: "TaintsEditorComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2Zvcm0vdGFpbnRzLWVkaXRvci9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZm9ybS90YWludHMtZWRpdG9yL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUVMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7O0lDV3BELHdDQUdxQjs7OztJQURuQixzQ0FBcUI7OztJQWN2Qix3Q0FHcUI7Ozs7SUFEbkIsd0NBQXVCOzs7SUFVdkIsc0NBR0M7SUFDQyxZQUNGO0lBQUEsaUJBQWE7OztJQUhYLGlDQUFnQjtJQUVoQixjQUNGO0lBREUsMENBQ0Y7Ozs7SUEzQ0YsQUFERixBQURGLDBCQUFtRCxTQUM3QyxtQkFVQTtJQUhBLDZOQUFpQiwyQkFBaUIsS0FB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a0JBQWtCLDRCQUNsQixVQUFVLG9CQUNWLFlBQVksc0JBQ1oscUJBQXFCOztpRkFlWixxQkFBcUI7Y0EvQmpDLFNBQVM7NkJBQ0ksSUFBSSxZQUNOLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO29CQUNQLFlBQVk7b0JBQ1osZUFBZTtvQkFDZixXQUFXO29CQUNYLFdBQVc7b0JBQ1gsWUFBWTtvQkFDWixnQkFBZ0I7b0JBQ2hCLGtCQUFrQjtvQkFDbEIsVUFBVTtvQkFDVixZQUFZO29CQUNaLHFCQUFxQjtpQkFDdEIsYUFDVTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzt3QkFDcEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLGFBQWE7d0JBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDO3dCQUNwRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjs7a0ZBRVUscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnV0dG9uTW9kdWxlLFxuICBJY29uTW9kdWxlLFxuICBJbnB1dE1vZHVsZSxcbiAgU2VsZWN0TW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUYWludEVmZmVjdCwgY3JlYXRlTmVzdGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgRWZmZWN0RGlyZWN0aXZlTW9kdWxlIH0gZnJvbSAnLi4vLi4vZWZmZWN0LWRpcmVjdGl2ZS9tb2R1bGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgRXJyb3JzTWFwcGVyTW9kdWxlIH0gZnJvbSAnLi4vZXJyb3JzLW1hcHBlci9wdWJsaWMtYXBpJztcbmltcG9ydCB7IFZhbGlkYXRvcnNNb2R1bGUgfSBmcm9tICcuLi92YWxpZGF0b3JzL3B1YmxpYy1hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdhY2wtdGFpbnRzLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3R5bGUuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgU2VsZWN0TW9kdWxlLFxuICAgIFZhbGlkYXRvcnNNb2R1bGUsXG4gICAgRXJyb3JzTWFwcGVyTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIEVmZmVjdERpcmVjdGl2ZU1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWludHNFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGFpbnRzRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRhaW50c0VkaXRvckNvbXBvbmVudCBleHRlbmRzIGNyZWF0ZU5lc3RlZEZvcm1Db250cm9sPFRhaW50W10+KCkge1xuICBlZmZlY3RzID0gT2JqZWN0LnZhbHVlcyhUYWludEVmZmVjdCk7XG5cbiAgYWRkVGFpbnQoKSB7XG4gICAgdGhpcy5tb2RlbCA9IHRoaXMubW9kZWwgPz8gW107XG4gICAgdGhpcy5tb2RlbC5wdXNoKHsga2V5OiAnJywgdmFsdWU6ICcnLCBlZmZlY3Q6IFRhaW50RWZmZWN0Lk5vU2NoZWR1bGUgfSk7XG4gIH1cblxuICBlZGl0VGFpbnQoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBrZXk6IGtleW9mIE9taXQ8VGFpbnQsICdlZmZlY3QnPixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICApOiB2b2lkO1xuXG4gIGVkaXRUYWludChpbmRleDogbnVtYmVyLCBrZXk6ICdlZmZlY3QnLCB2YWx1ZTogVGFpbnRFZmZlY3QpOiB2b2lkO1xuICBlZGl0VGFpbnQoaW5kZXg6IG51bWJlciwga2V5OiBrZXlvZiBUYWludCwgdmFsdWU6IHN0cmluZyB8IFRhaW50RWZmZWN0KSB7XG4gICAgdGhpcy5tb2RlbFtpbmRleF1ba2V5XSA9IHZhbHVlIGFzIGFueTtcbiAgICB0aGlzLmVtaXRNb2RlbCgpO1xuICB9XG5cbiAgcmVtb3ZlVGFpbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmVtaXRNb2RlbCgpO1xuICB9XG5cbiAga2V5UGF0dGVybihjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8c3RyaW5nPikge1xuICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtuYW1lLCBwcmVmaXggPSAnJ10gPSBjb250cm9sLnZhbHVlLnNwbGl0KCcvJykucmV2ZXJzZSgpO1xuICAgIGlmIChcbiAgICAgIG5hbWUubGVuZ3RoID4gNjMgfHxcbiAgICAgIC9eKChbXFxkQS1aYS16XVtcXHcuLV0qKT9bXFxkQS1aYS16XSkkLy50ZXN0KG5hbWUpID09PSBmYWxzZVxuICAgICkge1xuICAgICAgcmV0dXJuIHsgcGF0dGVybjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICEhcHJlZml4ICYmXG4gICAgICAocHJlZml4Lmxlbmd0aCA+IDI1MyB8fFxuICAgICAgICAvXltcXGRhLXpdKFtcXGRhLXotXSpbXFxkYS16XSk/KFxcLltcXGRhLXpdKFtcXGRhLXotXSpbXFxkYS16XSk/KSokLy50ZXN0KFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgKSA9PT0gZmFsc2UpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBwYXR0ZXJuOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFRhaW50IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGVmZmVjdDogVGFpbnRFZmZlY3Q7XG59XG4iLCI8dGFibGVcbiAgY2xhc3M9XCJhY2wtYXJyYXktZm9ybS10YWJsZSBtcC1zdGlja3ktdGFibGUtaGVhZGVyIG1wLXN0aWNreS10YWJsZS1hY3Rpb25zXCJcbiAgW2NsYXNzLnN1Ym1pdHRlZF09XCJzdWJtaXR0ZWRcIlxuPlxuICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgPHRoXG4gICAgICAgIHJlcXVpcmVkXG4gICAgICAgIHdpZHRoPVwiNDAlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4+e3sgJ2tleScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8L3RoPlxuICAgICAgPHRoIHdpZHRoPVwiNDAlXCI+e3sgJ3ZhbHVlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICA8dGggd2lkdGg9XCIyMCVcIj57eyAndHlwZScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOiA0NHB4XCI+PC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgPHRyICpuZ0Zvcj1cImxldCB0YWludCBvZiBtb2RlbDsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgIDx0ZD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBuYW1lPVwia2V5XCJcbiAgICAgICAgICAja2V5PVwibmdNb2RlbFwiXG4gICAgICAgICAgW25nTW9kZWxdPVwidGFpbnQua2V5XCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJlZGl0VGFpbnQoaW5kZXgsICdrZXknLCAkZXZlbnQpXCJcbiAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgIFthY2xWYWxpZGF0ZUZuXT1cImtleVBhdHRlcm5cIlxuICAgICAgICAvPlxuICAgICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgICAqbmdJZj1cInN1Ym1pdHRlZCB8fCBrZXkuZGlydHlcIlxuICAgICAgICAgIFtlcnJvcnNdPVwia2V5LmVycm9yc1wiXG4gICAgICAgID48L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICN2YWx1ZT1cIm5nTW9kZWxcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInRhaW50LnZhbHVlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJlZGl0VGFpbnQoaW5kZXgsICd2YWx1ZScsICRldmVudClcIlxuICAgICAgICAgIGFjbE1heGxlbmd0aD1cIjYzXCJcbiAgICAgICAgICBwYXR0ZXJuPVwiXigoW1xcZEEtWmEtel1bXFx3Li1dKik/W1xcZEEtWmEtel0pPyRcIlxuICAgICAgICAvPlxuICAgICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgICAqbmdJZj1cInN1Ym1pdHRlZCB8fCB2YWx1ZS5kaXJ0eVwiXG4gICAgICAgICAgW2Vycm9yc109XCJ2YWx1ZS5lcnJvcnNcIlxuICAgICAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQ+XG4gICAgICAgIDxhdWktc2VsZWN0XG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBuYW1lPVwiZWZmZWN0XCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ0YWludC5lZmZlY3RcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImVkaXRUYWludChpbmRleCwgJ2VmZmVjdCcsICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBlZmZlY3Qgb2YgZWZmZWN0c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWZmZWN0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBlZmZlY3QgfX1cbiAgICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICAgIDwvYXVpLXNlbGVjdD5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQgY2xhc3M9XCJhY2wtYXJyYXktZm9ybS10YWJsZV9fYWN0aW9uLWNvbFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgYXVpLWJ1dHRvbj1cInRleHRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3NxdWFyZV09XCJ0cnVlXCJcbiAgICAgICAgICBbcGxhaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhaW50KGluZGV4KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWljb24gaWNvbj1cIm1pbnVzX2NpcmNsZVwiPjwvYXVpLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIDx0ciAqbmdJZj1cIiFtb2RlbD8ubGVuZ3RoXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2Vob2xkZXJcIj57eyAnbm9fdGFpbnQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgPHRyIGNsYXNzPVwiYWNsLWFycmF5LWZvcm0tdGFibGUtLXJvdy1hY3Rpb25cIj5cbiAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2wtYXJyYXktZm9ybS10YWJsZV9fYm90dG9tLWNvbnRyb2wtYnV0dG9uc1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGF1aS1idXR0b249XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIFtwbGFpbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNpemU9XCJtaW5pXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhaW50KClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsPy5sZW5ndGggPj0gNTBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxhdWktaWNvbiBpY29uPVwicGx1c19jaXJjbGVcIj48L2F1aS1pY29uPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIHt7ICdhZGQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==