dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
226 lines • 25.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, ViewChild } from '@angular/core';
import { CurrentService } from 'dbweb-core';
import { of } from 'rxjs';
import { debounceTime, startWith } from 'rxjs/operators';
import { BillComponent } from '../bill/bill.component';
import { UserBack, RoleType } from './back';
import pinyin from 'pinyin';
/**
* @record
*/
function ModelUserRole() { }
if (false) {
/** @type {?} */
ModelUserRole.prototype.UserName;
/** @type {?} */
ModelUserRole.prototype.RoleName;
}
export class UserComponent {
/**
* @param {?} back
* @param {?} curr
*/
constructor(back, curr) {
this.back = back;
this.curr = curr;
this.hostClass = true;
this.roles = {};
this.roleTypeAlways = RoleType.always;
this.beforeSave = this.beforeSave.bind(this);
}
/**
* @return {?}
*/
ngOnInit() {
this.back.fetchRoles().subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.validRoles = v;
this.roleLists = this.validRoles.map((/**
* @param {?} num
* @return {?}
*/
num => num.Name));
this.roleLitters = map2WithLetter(this.roleLists);
}));
}
/**
* @param {?} selft
* @return {?}
*/
beforeSave(selft) {
return of((/** @type {?} */ ({
record: {
Password: selft.typeRecord.Password ? btoa(selft.typeRecord.Password) : null,
Roles: Object.keys(this.roles)
.filter((/**
* @param {?} v
* @return {?}
*/
v => this.roles[v]))
.map((/**
* @param {?} v
* @return {?}
*/
v => ({
UserName: selft.typeRecord.Name,
RoleName: v
})))
}
})));
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.bill.init.subscribe((/**
* @return {?}
*/
() => {
this.bill.formGroup.get('Password').patchValue(null);
((/** @type {?} */ ((this.bill.typeRecord.Roles || [])))).forEach((/**
* @param {?} v
* @return {?}
*/
v => {
this.roles[v.RoleName] = true;
}));
this.bill.formGroup
.get('Dept')
.valueChanges.pipe(startWith(this.curr.data.Dept.Code), debounceTime(500))
.subscribe((/**
* @param {?} val
* @return {?}
*/
val => {
this.filterDeptList = this.back.fetchFilterDept(val);
console.log('内:', this.filterDeptList);
}));
}));
this.bill.onBeforeSave = this.beforeSave;
}
/**
* @param {?} event
* @param {?} roleName
* @return {?}
*/
roleChange(event, roleName) {
if (event.checked) {
this.roles[roleName] = true;
}
else {
delete this.roles[roleName];
}
}
/**
* @param {?} letter
* @return {?}
*/
acronymFun(letter) {
document.querySelector('#' + letter).scrollIntoView(true);
}
/**
* @return {?}
*/
try() {
console.log(this.filterDeptList);
}
}
UserComponent.decorators = [
{ type: Component, args: [{
selector: 'common-user',
template: "<common-bill #bill>\r\n\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main mat-elevation-z2 dis-row-sb\">\r\n\t\t<section class=\"section-1\">\r\n\t\t\t<header class=\"title\">\u4FEE\u6539\u7528\u6237</header>\r\n\t\t\t<section class=\"s1-content\">\r\n\t\t\t\t<div class=\"box-1\">\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u540D\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Name\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6635\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"NickName\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u5BC6\u7801</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"password\"\r\n\t\t\t\t\t\t\t\tformControlName=\"Password\" commonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6240\u5C5E\u90E8\u95E8</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Dept\"\r\n\t\t\t\t\t\t\t\tcommonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-autocomplete>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"box-2\">\r\n\t\t\t\t\t<div class=\"wrapper freeze-time\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u65E5\u671F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"datetime-local\" \r\n\t\t\t\t\t\t\t\tformControlName=\"FreezeTime\" commonBillField\r\n\t\t\t\t\t\t\t\tstep=\"1\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u539F\u56E0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"FreezeDesc\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u9644\u52A0\u4FE1\u606F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<textarea matInput matTextareaAutosize matAutosizeMinRows=2 matAutosizeMaxRows=5 formControlName=\"Tag\"\r\n\t\t\t\t\t\t\t\tcommonBillField></textarea>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t\t<section class=\"section-2\">\r\n\t\t\t\r\n\t\t\t<section class=\"s2-content\">\r\n\t\t\t\t<header class=\"title\">\u89D2\u8272</header>\r\n\t\t\t\t<div class=\"s2-box-1\">\r\n\t\t\t\t\t<div class=\"wrapper-box\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t\t<div class=\"s2-title\" id=\"{{ letter.Letter }}\">{{letter.Letter | uppercase}}</div>\r\n\t\t\t\t\t\t<div class=\"s2-wrapper\" *ngFor=\"let list of letter.Columns\">\r\n\t\t\t\t\t\t\t<mat-checkbox [checked]=\"roles[list]\" (change)=\"roleChange($event,list)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<span>{{list}}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n\t\t\t\t</div>\r\n\t\t\t\r\n\t\t\t</section>\r\n\t\t\t<section class=\"s2-content-2\">\r\n\t\t\t\t<div class=\"s2-title\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t<span (click)=\"acronymFun(letter.Letter)\">{{letter.Letter | uppercase}}</span>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t</div>\r\n<button (click)=\"try()\">111</button>\r\n</common-bill>\r\n\r\n\r\n<!-- 0: {Name: \"Name\", DBName: \"NAME\", Type: \"STR\", MaxLength: 50, Hidden: true, \u2026}\r\n1: {Name: \"NickName\", DBName: \"NICKNAME\", Type: \"STR\", MaxLength: 50, Null: true, \u2026}\r\n2: {Name: \"Salt\", DBName: \"SALT\", Type: \"BYTEA\", Value: \"pMA8mf37dmKZ8QKiZ/1FiA==\"}\r\n3: {Name: \"Password\", DBName: \"PASSWORD\", Type: \"BYTEA\", Value: \"ul0c07xKTaeYr2IX/jd6VI8iRnkWlCukaMF0Q4JyEic=\"}\r\n4: {Name: \"Dept\", DBName: \"DEPT\", Type: \"STR\", MaxLength: 50, Value: \"r\"}\r\n5: {Name: \"Tag\", DBName: \"TAG\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n6: {Name: \"FreezeTime\", DBName: \"FREEZETIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n7: {Name: \"FreezeDesc\", DBName: \"FREEZEDESC\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n8: {Name: \"HeadPortrait\", DBName: \"HEADPORTRAIT\", Type: \"BYTEA\", Null: true, Value: \"\"}\r\n9: {Name: \"HeadPortraitType\", DBName: \"HEADPORTRAITTYPE\", Type: \"STR\", MaxLength: 15, Null: true, \u2026}\r\n10: {Name: \"HeadPortraitTime\", DBName: \"HEADPORTRAITTIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n11: {Name: \"IndexSetting\", DBName: \"INDEXSETTING\", Type: \"BY -->\r\n\r\n\r\n\r\n<!-- \r\n<common-bill #bill>\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main\">\r\n\t\t<span>\u540D\u79F0</span>\r\n\t\t<mat-form-field>\r\n\t\t\t<input matInput formControlName=\"Name\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6635\u79F0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"NickName\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u5BC6\u7801</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput type=\"password\" formControlName=\"Password\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6240\u5C5E\u90E8\u95E8</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Dept\" commonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t</mat-form-field>\r\n\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t</mat-option>\r\n\t\t</mat-autocomplete>\r\n\t\t<span>\u51BB\u7ED3\u5230\u671F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input type=\"datetime-local\" matInput formControlName=\"FreezeTime\" commonBillField step=\"1\">\r\n\t\t</mat-form-field>\r\n\t\t<span>\u51BB\u7ED3\u539F\u56E0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"FreezeDesc\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u9644\u52A0\u4FE1\u606F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Tag\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<ng-container *ngFor=\"let role of validRoles\">\r\n\t\t<mat-checkbox *ngIf=\"role.Type==='roleTypeAlways';else normalRole\" [checked]=\"roles[role.Name]\"\r\n\t\t\t(click)=\"$event.preventDefault()\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t{{role.Name}}\r\n\t\t</mat-checkbox>\r\n\t\t<ng-template #normalRole>\r\n\t\t\t<mat-checkbox [checked]=\"roles[role.Name]\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t\t{{role.Name}}\r\n\t\t\t</mat-checkbox>\r\n\t\t</ng-template>\r\n\t</ng-container>\r\n\r\n</common-bill> -->",
providers: [UserBack],
styles: ["@charset \"UTF-8\";.dis-row-c{display:flex;justify-content:center}.dis-row-sb{display:flex;justify-content:space-between}.main{width:100%;max-width:960px;min-width:300px;height:calc(100% - 48px - 40px);box-sizing:border-box;margin:48px auto;border-radius:4px}.main .mat-form-field ::ng-deep .mat-form-field-wrapper{margin:0;padding-bottom:0}.main .mat-form-field ::ng-deep .mat-form-field-infix{border:0;padding:14px 0 11px}.section-1{width:65%;max-width:664px;min-width:100px;box-sizing:border-box;margin-top:24px;margin-left:24px}.section-1 .title{font-size:20px}.s1-content{display:flex;width:100%;max-width:664px;min-width:300px;height:100%;box-sizing:border-box}.s1-content .title{padding-top:24px;padding-bottom:8px}.box-1{width:35%;max-width:216px;min-width:100px;box-sizing:border-box;padding-right:32px;height:calc(100% - 48px - 24px)}.box-1 .wrapper{width:100%;max-width:100%}.box-1 .wrapper .title{font-size:12px}.box-1 .wrapper .mat-form-field{width:100%;font-size:14px}.box-2{width:65%;max-width:304px;min-width:100px;box-sizing:border-box;margin-left:32px;height:368px}.box-2 .wrapper{width:100%;max-width:100%}.box-2 .wrapper .title{font-size:12px}.box-2 .wrapper .mat-form-field{width:100%;font-size:14px}.section-2{position:relative;width:30%;max-width:296px;min-width:100px;box-sizing:border-box}.s2-content{padding-left:24px}.s2-content header{padding-top:24px;margin-bottom:8px;font-size:14px}.s2-title{font-size:12px}.s2-box-1{height:100%;max-height:calc(100vh - 96px - 192px);box-sizing:border-box;overflow:auto}.s2-box-1 .wrapper-box{margin-bottom:8px}.s2-box-1 .s2-wrapper{font-size:14px;height:40px;line-height:40px}.s2-box-1 .s2-wrapper span{margin-left:16px}.s2-content-2{position:absolute;top:0;right:0;margin-top:74px;margin-right:12px}"]
}] }
];
/** @nocollapse */
UserComponent.ctorParameters = () => [
{ type: UserBack },
{ type: CurrentService }
];
UserComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.c-user',] }],
bill: [{ type: ViewChild, args: ['bill', { static: true },] }]
};
if (false) {
/** @type {?} */
UserComponent.prototype.hostClass;
/** @type {?} */
UserComponent.prototype.bill;
/** @type {?} */
UserComponent.prototype.filterDeptList;
/** @type {?} */
UserComponent.prototype.validRoles;
/** @type {?} */
UserComponent.prototype.roles;
/** @type {?} */
UserComponent.prototype.roleLists;
/** @type {?} */
UserComponent.prototype.roleLitters;
/** @type {?} */
UserComponent.prototype.roleTypeAlways;
/**
* @type {?}
* @private
*/
UserComponent.prototype.back;
/**
* @type {?}
* @private
*/
UserComponent.prototype.curr;
}
/**
* @param {?} v
* @return {?}
*/
function map2WithLetter(v) {
/** @type {?} */
const mapList = new Map();
v.forEach((/**
* @param {?} vv
* @return {?}
*/
vv => {
/** @type {?} */
let headerLetter = pinyin(vv, { style: pinyin.STYLE_FIRST_LETTER }).map((/**
* @param {?} s
* @return {?}
*/
s => s[0]))[0];
if (headerLetter.length > 1) {
headerLetter = headerLetter[0];
}
if (mapList.has(headerLetter)) {
mapList.get(headerLetter).push(vv);
}
else {
mapList.set(headerLetter, [vv]);
}
}));
// 排序
/** @type {?} */
const rev = (/** @type {?} */ ([]));
mapList.forEach((/**
* @param {?} columns
* @param {?} letter
* @return {?}
*/
(columns, letter) => {
rev.push((/** @type {?} */ ({ Letter: letter, Columns: columns })));
}));
return rev.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a.Letter.localeCompare(b.Letter)));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlci91c2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQVMsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQVksUUFBUSxFQUFxQixNQUFNLFFBQVEsQ0FBQztBQUN6RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsNEJBR0M7OztJQUZBLGlDQUFpQjs7SUFDakIsaUNBQWlCOztBQVFsQixNQUFNLE9BQU8sYUFBYTs7Ozs7SUFXekIsWUFBb0IsSUFBYyxFQUFVLElBQW9CO1FBQTVDLFNBQUksR0FBSixJQUFJLENBQVU7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQVZuQyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBSzlDLFVBQUssR0FBK0IsRUFBRSxDQUFDO1FBSTlCLG1CQUFjLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENB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WSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoQztJQUNGLENBQUMsRUFBQyxDQUFDOzs7VUFHRyxHQUFHLEdBQUcsbUJBQUEsRUFBRSxFQUF1QjtJQUNyQyxPQUFPLENBQUMsT0FBTzs7Ozs7SUFBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFBLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQXFCLENBQUMsQ0FBQztJQUNyRSxDQUFDLEVBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDLElBQUk7Ozs7O0lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IElEZXB0LCBDdXJyZW50U2VydmljZSB9IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmVmb3JlU2F2ZVBhcmFtLCBCaWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vYmlsbC9iaWxsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVzZXJCYWNrLCBVc2VyUm9sZSwgUm9sZVR5cGUsIENvbHVtbnNXaXRoTGV0dGVyIH0gZnJvbSAnLi9iYWNrJztcclxuaW1wb3J0IHBpbnlpbiBmcm9tICdwaW55aW4nO1xyXG5cclxuaW50ZXJmYWNlIE1vZGVsVXNlclJvbGUge1xyXG5cdFVzZXJOYW1lOiBzdHJpbmc7XHJcblx0Um9sZU5hbWU6IHN0cmluZztcclxufVxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi11c2VyJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vdXNlci5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vdXNlci5jb21wb25lbnQuc2NzcyddLFxyXG5cdHByb3ZpZGVyczogW1VzZXJCYWNrXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5jLXVzZXInKSBob3N0Q2xhc3MgPSB0cnVlO1xyXG5cdEBWaWV3Q2hpbGQoJ2JpbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdGJpbGw6IEJpbGxDb21wb25lbnQ7XHJcblx0ZmlsdGVyRGVwdExpc3Q6IE9ic2VydmFibGU8SURlcHRbXT47XHJcblx0dmFsaWRSb2xlczogVXNlclJvbGVbXTtcclxuXHRyb2xlczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuXHRyb2xlTGlzdHM6IHN0cmluZ1tdO1xyXG5cdHJvbGVMaXR0ZXJzOiBDb2x1bW5zV2l0aExldHRlcltdO1xyXG5cclxuXHRyZWFkb25seSByb2xlVHlwZUFsd2F5cyA9IFJvbGVUeXBlLmFsd2F5cztcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGJhY2s6IFVzZXJCYWNrLCBwcml2YXRlIGN1cnI6IEN1cnJlbnRTZXJ2aWNlKSB7XHJcblx0XHR0aGlzLmJlZm9yZVNhdmUgPSB0aGlzLmJlZm9yZVNhdmUuYmluZCh0aGlzKTtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5iYWNrLmZldGNoUm9sZXMoKS5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdHRoaXMudmFsaWRSb2xlcyA9IHY7XHJcblx0XHRcdHRoaXMucm9sZUxpc3RzID0gdGhpcy52YWxpZFJvbGVzLm1hcChudW0gPT4gbnVtLk5hbWUpO1xyXG5cdFx0XHR0aGlzLnJvbGVMaXR0ZXJzID0gbWFwMldpdGhMZXR0ZXIodGhpcy5yb2xlTGlzdHMpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRiZWZvcmVTYXZlKHNlbGZ0OiBCaWxsQ29tcG9uZW50KTogT2JzZXJ2YWJsZTxCZWZvcmVTYXZlUGFyYW0+IHtcclxuXHRcdHJldHVybiBvZih7XHJcblx0XHRcdHJlY29yZDoge1xyXG5cdFx0XHRcdFBhc3N3b3JkOiBzZWxmdC50eXBlUmVjb3JkLlBhc3N3b3JkID8gYnRvYShzZWxmdC50eXBlUmVjb3JkLlBhc3N3b3JkKSA6IG51bGwsXHJcblx0XHRcdFx0Um9sZXM6IE9iamVjdC5rZXlzKHRoaXMucm9sZXMpXHJcblx0XHRcdFx0XHQuZmlsdGVyKHYgPT4gdGhpcy5yb2xlc1t2XSlcclxuXHRcdFx0XHRcdC5tYXAodiA9PiAoe1xyXG5cdFx0XHRcdFx0XHRVc2VyTmFtZTogc2VsZnQudHlwZVJlY29yZC5OYW1lLFxyXG5cdFx0XHRcdFx0XHRSb2xlTmFtZTogdlxyXG5cdFx0XHRcdFx0fSkpXHJcblx0XHRcdH1cclxuXHRcdH0gYXMgQmVmb3JlU2F2ZVBhcmFtKTtcclxuXHR9XHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0dGhpcy5iaWxsLmluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0dGhpcy5iaWxsLmZvcm1Hcm91cC5nZXQoJ1Bhc3N3b3JkJykucGF0Y2hWYWx1ZShudWxsKTtcclxuXHRcdFx0KCh0aGlzLmJpbGwudHlwZVJlY29yZC5Sb2xlcyB8fCBbXSkgYXMgTW9kZWxVc2VyUm9sZVtdKS5mb3JFYWNoKHYgPT4ge1xyXG5cdFx0XHRcdHRoaXMucm9sZXNbdi5Sb2xlTmFtZV0gPSB0cnVlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMuYmlsbC5mb3JtR3JvdXBcclxuXHRcdFx0XHQuZ2V0KCdEZXB0JylcclxuXHRcdFx0XHQudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuY3Vyci5kYXRhLkRlcHQuQ29kZSksIGRlYm91bmNlVGltZSg1MDApKVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUodmFsID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZmlsdGVyRGVwdExpc3QgPSB0aGlzLmJhY2suZmV0Y2hGaWx0ZXJEZXB0KHZhbCk7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZygn5YaF77yaJywgdGhpcy5maWx0ZXJEZXB0TGlzdCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYmlsbC5vbkJlZm9yZVNhdmUgPSB0aGlzLmJlZm9yZVNhdmU7XHJcblx0fVxyXG5cdHJvbGVDaGFuZ2UoZXZlbnQ6IE1hdENoZWNrYm94Q2hhbmdlLCByb2xlTmFtZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoZXZlbnQuY2hlY2tlZCkge1xyXG5cdFx0XHR0aGlzLnJvbGVzW3JvbGVOYW1lXSA9IHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkZWxldGUgdGhpcy5yb2xlc1tyb2xlTmFtZV07XHJcblx0XHR9XHJcblx0fVxyXG5cdGFjcm9ueW1GdW4obGV0dGVyOiBzdHJpbmcpIHtcclxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgbGV0dGVyKS5zY3JvbGxJbnRvVmlldyh0cnVlKTtcclxuXHR9XHJcblx0dHJ5KCkge1xyXG5cdFx0Y29uc29sZS5sb2codGhpcy5maWx0ZXJEZXB0TGlzdCk7XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIG1hcDJXaXRoTGV0dGVyKHY6IHN0cmluZ1tdKSB7XHJcblx0Y29uc3QgbWFwTGlzdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcclxuXHR2LmZvckVhY2godnYgPT4ge1xyXG5cdFx0bGV0IGhlYWRlckxldHRlciA9IHBpbnlpbih2diwgeyBzdHlsZTogcGlueWluLlNUWUxFX0ZJUlNUX0xFVFRFUiB9KS5tYXAocyA9PiBzWzBdKVswXTtcclxuXHRcdGlmIChoZWFkZXJMZXR0ZXIubGVuZ3RoID4gMSkge1xyXG5cdFx0XHRoZWFkZXJMZXR0ZXIgPSBoZWFkZXJMZXR0ZXJbMF07XHJcblx0XHR9XHJcblx0XHRpZiAobWFwTGlzdC5oYXMoaGVhZGVyTGV0dGVyKSkge1xyXG5cdFx0XHRtYXBMaXN0LmdldChoZWFkZXJMZXR0ZXIpLnB1c2godnYpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWFwTGlzdC5zZXQoaGVhZGVyTGV0dGVyLCBbdnZdKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHQvLyDmjpLluo9cclxuXHJcblx0Y29uc3QgcmV2ID0gW10gYXMgQ29sdW1uc1dpdGhMZXR0ZXJbXTtcclxuXHRtYXBMaXN0LmZvckVhY2goKGNvbHVtbnMsIGxldHRlcikgPT4ge1xyXG5cdFx0cmV2LnB1c2goeyBMZXR0ZXI6IGxldHRlciwgQ29sdW1uczogY29sdW1ucyB9IGFzIENvbHVtbnNXaXRoTGV0dGVyKTtcclxuXHR9KTtcclxuXHRyZXR1cm4gcmV2LnNvcnQoKGEsIGIpID0+IGEuTGV0dGVyLmxvY2FsZUNvbXBhcmUoYi5MZXR0ZXIpKTtcclxufVxyXG4iXX0=