UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

528 lines 45.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { MatDialog, MatSnackBar } from '@angular/material'; import { BillBackfaceService, BillOperate, RouteElementService, BillFieldDataType } from 'dbweb-core'; import { TabsService } from '../home/tabs.service'; import { BillCloneBackfaceService } from './bill-clone-backface.service'; import { CloneComponent } from './clone/clone.component'; import { ErrorMessageComponent } from './error-message/error-message.component'; /** * @record */ function Record() { } if (false) { /** @type {?} */ Record.prototype.Main; /** @type {?|undefined} */ Record.prototype.Child; } /** * @record */ export function BeforeSaveParam() { } if (false) { /** @type {?} */ BeforeSaveParam.prototype.record; /** @type {?|undefined} */ BeforeSaveParam.prototype.tag; } var BillComponent = /** @class */ (function () { function BillComponent(rele, billBackface, tabs, dialog, billCloneService, snackBar) { var _this = this; this.rele = rele; this.billBackface = billBackface; this.tabs = tabs; this.dialog = dialog; this.billCloneService = billCloneService; this.snackBar = snackBar; this.init = new EventEmitter(); // 这里的Name依据typestruct来 this.useTypeRecord = false; this.typeRecord = {}; this.rele.currentElement.subscribe((/** * @param {?} v * @return {?} */ function (v) { _this.element = v; _this.billBackface.get(v).subscribe((/** * @param {?} vv * @return {?} */ function (vv) { _this.checkResults = vv.CheckResults; _this.oldData = vv.EncodeData; _this.operate = vv.Operate; _this.allowClone = vv.AllowClone; _this.fields = vv.Fields; _this.typeRecord = vv.TypeRecord; _this.record = vv.Record; _this.signKeyValues = vv.SignKeyValues; _this.useTypeRecord = vv.TypeRecord !== undefined && vv.TypeRecord !== null; // 对主表字段的映射 _this.fieldMap = vv.Fields.reduce((/** * @param {?} result * @param {?} item * @return {?} */ function (result, item) { result[item.Name] = item; return result; }), {}); // 只建立主表的formgroup if (_this.useTypeRecord) { _this.formGroup = new FormGroup(_this.fields.reduce((/** * @param {?} result * @param {?} fld * @return {?} */ function (result, fld) { if (fld.Type === BillFieldDataType.DATE && _this.typeRecord[fld.Name]) { result[fld.Name] = new FormControl({ value: _this.fixShowDate((/** @type {?} */ (_this.typeRecord[fld.Name]))), // 去掉时区 disabled: fld.Readonly }); } else { result[fld.Name] = new FormControl({ value: _this.typeRecord[fld.Name], disabled: fld.Readonly }); } return result; }), {})); } else { _this.formGroup = new FormGroup(_this.fields.reduce((/** * @param {?} result * @param {?} fld * @return {?} */ function (result, fld) { if (fld.Type === BillFieldDataType.DATE && _this.record.Main[fld.Name]) { result[fld.Name] = new FormControl({ value: _this.fixShowDate((/** @type {?} */ (_this.record.Main[fld.Name]))), // 去掉时区 disabled: fld.Readonly }); } else { result[fld.Name] = new FormControl({ value: _this.record.Main[fld.Name], disabled: fld.Readonly }); } return result; }), {})); } _this.init.emit(); }), (/** * @param {?} err * @return {?} */ function (err) { _this.error = err.error.Error; })); })); } /** * @private * @param {?} d * @return {?} */ BillComponent.prototype.fixShowDate = /** * @private * @param {?} d * @return {?} */ function (d) { if (d) { return d.substr(0, 16); } return d; }; /** * @return {?} */ BillComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { }; /** * @param {?} mes * @return {?} */ BillComponent.prototype.showErrorMessage = /** * @param {?} mes * @return {?} */ function (mes) { this.dialog.open(ErrorMessageComponent, { // width: '450px', data: { message: mes }, autoFocus: false }); // dialogRef.afterClosed().subscribe(result => { // console.log('The dialog was closed'); // }); }; /** * @return {?} */ BillComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ BillComponent.prototype.isAdd = /** * @return {?} */ function () { return this.operate === BillOperate.Add; }; /** * @return {?} */ BillComponent.prototype.isEdit = /** * @return {?} */ function () { return this.operate === BillOperate.Edit; }; /** * @return {?} */ BillComponent.prototype.isDelete = /** * @return {?} */ function () { return this.operate === BillOperate.Delete; }; /** * @return {?} */ BillComponent.prototype.isBrowse = /** * @return {?} */ function () { return this.operate === BillOperate.Browse; }; /** * @return {?} */ BillComponent.prototype.close = /** * @return {?} */ function () { this.tabs.close(); }; /** * @private * @param {?} d * @return {?} */ BillComponent.prototype.fixDate = /** * @private * @param {?} d * @return {?} */ function (d) { /** @type {?} */ var timezoneOffsetInHours = -(d.getTimezoneOffset() / 60); // UTC minus local time /** @type {?} */ var sign = timezoneOffsetInHours >= 0 ? '+' : '-'; /** @type {?} */ var leadingZero = Math.abs(timezoneOffsetInHours) < 10 ? '0' : ''; // It's a bit unfortunate that we need to construct a new Date instance // (we don't want _this_ Date instance to be modified) /** @type {?} */ var correctedDate = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()); correctedDate.setHours(d.getHours() + timezoneOffsetInHours); /** @type {?} */ var iso = correctedDate.toISOString().replace('Z', ''); return iso + sign + leadingZero + Math.abs(timezoneOffsetInHours).toString() + ':00'; }; // 返回formgroup的转换好类型的值 // 返回formgroup的转换好类型的值 /** * @return {?} */ BillComponent.prototype.getFormGroupValueAsType = // 返回formgroup的转换好类型的值 /** * @return {?} */ function () { var _this = this; /** @type {?} */ var rev = {}; this.fields.forEach((/** * @param {?} fld * @return {?} */ function (fld) { switch (fld.Type) { case BillFieldDataType.FLOAT: rev[fld.Name] = parseFloat(_this.formGroup.get(fld.Name).value); break; case BillFieldDataType.INT: rev[fld.Name] = parseInt(_this.formGroup.get(fld.Name).value, 10); break; case BillFieldDataType.DATE: if (_this.formGroup.get(fld.Name).value) { rev[fld.Name] = _this.fixDate(new Date(_this.formGroup.get(fld.Name).value)); } else { rev[fld.Name] = null; } break; default: rev[fld.Name] = _this.formGroup.get(fld.Name).value; break; } })); return rev; }; /** * @return {?} */ BillComponent.prototype.save = /** * @return {?} */ function () { var _this = this; // 合并修改的数据 if (this.useTypeRecord) { this.typeRecord = tslib_1.__assign({}, this.typeRecord, this.getFormGroupValueAsType()); } else { this.record = { Main: tslib_1.__assign({}, this.record.Main, this.getFormGroupValueAsType()), Child: tslib_1.__assign({}, this.record.Child) }; } /** @type {?} */ var process = (/** * @param {?} data * @return {?} */ function (data) { // 合并修改的数据 if (_this.useTypeRecord) { _this.typeRecord = tslib_1.__assign({}, _this.typeRecord, data ? data.record : null); } else { if (data && data.record) { _this.record.Main = tslib_1.__assign({}, _this.record.Main, data.record.Main); _this.record.Child = data.record.Child; } } _this.billBackface .post(_this.element, (/** @type {?} */ ({ CheckOnly: false, OldData: _this.oldData, Tag: data ? data.tag : null, NewTypeRecord: _this.typeRecord, NewRecord: _this.record }))) .subscribe((/** * @param {?} v * @return {?} */ function (v) { if (v.Ok) { _this.tabs.close(); return; } _this.showErrorMessage(v.Error); })); }); if (this.onBeforeSave) { this.onBeforeSave(this).subscribe((/** * @param {?} v * @return {?} */ function (v) { process(v); })); } else { process(null); } }; /** * @return {?} */ BillComponent.prototype.delete = /** * @return {?} */ function () { var _this = this; return this.billBackface.delete(this.element, this.oldData).subscribe((/** * @param {?} v * @return {?} */ function (v) { if (v.Ok) { _this.tabs.close(); return; } _this.showErrorMessage(v.Error); })); }; /** * @return {?} */ BillComponent.prototype.clone = /** * @return {?} */ function () { var _this = this; this.billCloneService .getClonePK({ OldSignPK: this.signKeyValues, EleName: this.element.element.Name }) .subscribe((/** * @param {?} v * @return {?} */ function (v) { /** @type {?} */ var dialogRef = _this.dialog.open(CloneComponent, { // width: '450px', data: v }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ function (result) { if (result) { _this.billCloneService .billClone({ EleName: _this.element.element.Name, OldSignPK: _this.signKeyValues, NewPK: result }) .subscribe((/** * @param {?} apirev * @return {?} */ function (apirev) { if (apirev.Ok) { _this.snackBar.open('成功完成克隆', '关闭', { horizontalPosition: 'right', verticalPosition: 'bottom', duration: 5000 }); } else { _this.snackBar.open(apirev.Error, '关闭', { horizontalPosition: 'right', verticalPosition: 'bottom' }); } })); } })); })); }; BillComponent.decorators = [ { type: Component, args: [{ selector: 'common-bill', template: "<div *ngIf=\"error;else noErr\">{{error}}</div>\r\n<ng-template #noErr>\r\n\t<div class=\"bill\">\r\n\t\t<div class=\"content\">\r\n\t\t\t<ng-content></ng-content>\r\n\t\t</div>\r\n\t\t<div class=\"footer\">\r\n\t\t\t<div class=\"clone\">\r\n\t\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"clone()\"\r\n\t\t\t\t\t*ngIf=\"allowClone\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"compare_arrows\"></mat-icon>\u514B\u9686\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\"\r\n\t\t\t\t*ngIf=\"checkResults&&checkResults.length>0\">\r\n\t\t\t\t<mat-icon svgIcon=\"spellcheck\"></mat-icon>\u5BA1\u6838\u5907\u6CE8\r\n\t\t\t</button>\r\n\t\t\t<div class=\"\u5206\u5272\u7EBF\"\r\n\t\t\t\t*ngIf=\"allowClone || (checkResults && checkResults.length>0)\">\r\n\t\t\t</div>\r\n\t\t\t<!-- <button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\">\r\n\t\t\t\t<mat-icon svgIcon=\"outlined:book\"></mat-icon>\u65E5\u5FD7\r\n\t\t\t</button> -->\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\"\r\n\t\t\t\t*ngIf=\"isAdd() || isEdit() || isDelete()\">\r\n\t\t\t\t<mat-icon svgIcon=\"close\"></mat-icon>\u53D6\u6D88\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\"\r\n\t\t\t\t*ngIf=\"isBrowse()\">\r\n\t\t\t\t<mat-icon svgIcon=\"close\"></mat-icon>\u5173\u95ED\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"save()\" *ngIf=\"isAdd()\">\r\n\t\t\t\t<mat-icon svgIcon=\"add\"></mat-icon>\u65B0\u589E\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE \u4FDD\u5B58\u6309\u94AE\" (click)=\"save()\"\r\n\t\t\t\t*ngIf=\"isEdit()\">\r\n\t\t\t\t<mat-icon svgIcon=\"outlined:save\"></mat-icon>\u4FDD\u5B58\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"delete()\"\r\n\t\t\t\t*ngIf=\"isDelete()\">\r\n\t\t\t\t<mat-icon svgIcon=\"delete\"></mat-icon>\u5220\u9664\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";.bill{width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch}.content{width:100%;flex:1;overflow:auto;padding:16px 8px;box-sizing:border-box}.footer{width:100%;height:48px;display:flex;justify-content:flex-end;align-items:center;padding-right:16px;box-sizing:border-box}.clone{text-align:left}.\u529F\u80FD\u6309\u94AE{height:32px;text-align:center;max-height:32px;line-height:32px;font-size:14px;cursor:pointer}.\u529F\u80FD\u6309\u94AE .mat-icon{width:16px;height:16px;line-height:16px;margin-right:4px;vertical-align:middle}.\u4FDD\u5B58\u6309\u94AE{display:inline-block;margin-left:8px}.\u5206\u5272\u7EBF{width:1px;height:50%;margin:0 24px}"] }] } ]; /** @nocollapse */ BillComponent.ctorParameters = function () { return [ { type: RouteElementService }, { type: BillBackfaceService }, { type: TabsService }, { type: MatDialog }, { type: BillCloneBackfaceService }, { type: MatSnackBar } ]; }; BillComponent.propDecorators = { onBeforeSave: [{ type: Input }], init: [{ type: Output }] }; return BillComponent; }()); export { BillComponent }; if (false) { /** @type {?} */ BillComponent.prototype.onBeforeSave; /** @type {?} */ BillComponent.prototype.init; /** @type {?} */ BillComponent.prototype.element; /** * @type {?} * @private */ BillComponent.prototype.oldData; /** * @type {?} * @private */ BillComponent.prototype.operate; /** @type {?} */ BillComponent.prototype.allowClone; /** @type {?} */ BillComponent.prototype.checkResults; /** @type {?} */ BillComponent.prototype.fieldMap; /** @type {?} */ BillComponent.prototype.fields; /** * @type {?} * @private */ BillComponent.prototype.useTypeRecord; /** * @type {?} * @private */ BillComponent.prototype.signKeyValues; /** @type {?} */ BillComponent.prototype.formGroup; /** @type {?} */ BillComponent.prototype.typeRecord; /** @type {?} */ BillComponent.prototype.record; /** @type {?} */ BillComponent.prototype.error; /** @type {?} */ BillComponent.prototype.rele; /** * @type {?} * @private */ BillComponent.prototype.billBackface; /** * @type {?} * @private */ BillComponent.prototype.tabs; /** @type {?} */ BillComponent.prototype.dialog; /** * @type {?} * @private */ BillComponent.prototype.billCloneService; /** * @type {?} * @private */ BillComponent.prototype.snackBar; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvYmlsbC9iaWxsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBb0IsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ04sbUJBQW1CLEVBQ25CLFdBQVcsRUFJWCxtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLE1BQU0sWUFBWSxDQUFDO0FBR3BCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7QUFDaEYscUJBR0M7OztJQUZBLHNCQUE2Qjs7SUFDN0IsdUJBQW9EOzs7OztBQUVyRCxxQ0FHQzs7O0lBRkEsaUNBQXdDOztJQUN4Qyw4QkFBVTs7QUFFWDtJQXFCQyx1QkFDUSxJQUF5QixFQUN4QixZQUFpQyxFQUNqQyxJQUFpQixFQUNsQixNQUFpQixFQUNoQixnQkFBMEMsRUFDMUMsUUFBcUI7UUFOOUIsaUJBcUVDO1FBcEVPLFNBQUksR0FBSixJQUFJLENBQXFCO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtR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OUIsc0NBQThCOztJQUM5QixrQ0FBNkI7O0lBQzdCLG1DQUErQzs7SUFDL0MsK0JBQXNCOztJQUN0Qiw4QkFBcUI7O0lBRXBCLDZCQUFnQzs7Ozs7SUFDaEMscUNBQXlDOzs7OztJQUN6Qyw2QkFBeUI7O0lBQ3pCLCtCQUF3Qjs7Ozs7SUFDeEIseUNBQWtEOzs7OztJQUNsRCxpQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5pbXBvcnQge1xyXG5cdEJpbGxCYWNrZmFjZVNlcnZpY2UsXHJcblx0QmlsbE9wZXJhdGUsXHJcblx0RWxlbWVudFJvdXRlLFxyXG5cdElCaWxsUG9zdEV2ZW50Qm9keSxcclxuXHRJRmllbGQsXHJcblx0Um91dGVFbGVtZW50U2VydmljZSxcclxuXHRJVGFibGVDaGVja1Jlc3VsdCxcclxuXHRCaWxsRmllbGREYXRhVHlwZVxyXG59IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhYnNTZXJ2aWNlIH0gZnJvbSAnLi4vaG9tZS90YWJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCaWxsQ2xvbmVCYWNrZmFjZVNlcnZpY2UgfSBmcm9tICcuL2JpbGwtY2xvbmUtYmFja2ZhY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENsb25lQ29tcG9uZW50IH0gZnJvbSAnLi9jbG9uZS9jbG9uZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFcnJvck1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuL2Vycm9yLW1lc3NhZ2UvZXJyb3ItbWVzc2FnZS5jb21wb25lbnQnO1xyXG5pbnRlcmZhY2UgUmVjb3JkIHtcclxuXHRNYWluOiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xyXG5cdENoaWxkPzogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10gfTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIEJlZm9yZVNhdmVQYXJhbSB7XHJcblx0cmVjb3JkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgUmVjb3JkO1xyXG5cdHRhZz86IGFueTtcclxufVxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi1iaWxsJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vYmlsbC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vYmlsbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCaWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHRASW5wdXQoKSBvbkJlZm9yZVNhdmU6IChzZWxmdDogQmlsbENvbXBvbmVudCkgPT4gT2JzZXJ2YWJsZTxCZWZvcmVTYXZlUGFyYW0+O1xyXG5cdEBPdXRwdXQoKSBpbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cdHB1YmxpYyBlbGVtZW50OiBFbGVtZW50Um91dGU7XHJcblx0cHJpdmF0ZSBvbGREYXRhOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBvcGVyYXRlOiBCaWxsT3BlcmF0ZTtcclxuXHRwdWJsaWMgYWxsb3dDbG9uZTogYm9vbGVhbjtcclxuXHRwdWJsaWMgY2hlY2tSZXN1bHRzOiBJVGFibGVDaGVja1Jlc3VsdFtdO1xyXG5cdHB1YmxpYyBmaWVsZE1hcDogeyBba2V5OiBzdHJpbmddOiBJRmllbGQgfTtcclxuXHRwdWJsaWMgZmllbGRzOiBJRmllbGRbXTsgLy8g6L+Z6YeM55qETmFtZeS+neaNrnR5cGVzdHJ1Y3TmnaVcclxuXHRwcml2YXRlIHVzZVR5cGVSZWNvcmQgPSBmYWxzZTtcclxuXHRwcml2YXRlIHNpZ25LZXlWYWx1ZXM6IHN0cmluZztcclxuXHRwdWJsaWMgZm9ybUdyb3VwPzogRm9ybUdyb3VwO1xyXG5cdHB1YmxpYyB0eXBlUmVjb3JkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblx0cHVibGljIHJlY29yZDogUmVjb3JkO1xyXG5cdHB1YmxpYyBlcnJvcjogc3RyaW5nO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIHJlbGU6IFJvdXRlRWxlbWVudFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGJpbGxCYWNrZmFjZTogQmlsbEJhY2tmYWNlU2VydmljZSxcclxuXHRcdHByaXZhdGUgdGFiczogVGFic1NlcnZpY2UsXHJcblx0XHRwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcblx0XHRwcml2YXRlIGJpbGxDbG9uZVNlcnZpY2U6IEJpbGxDbG9uZUJhY2tmYWNlU2VydmljZSxcclxuXHRcdHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyXHJcblx0KSB7XHJcblx0XHR0aGlzLnJlbGUuY3VycmVudEVsZW1lbnQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHR0aGlzLmVsZW1lbnQgPSB2O1xyXG5cdFx0XHR0aGlzLmJpbGxCYWNrZmFjZS5nZXQodikuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdHZ2ID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuY2hlY2tSZXN1bHRzID0gdnYuQ2hlY2tSZXN1bHRzO1xyXG5cdFx0XHRcdFx0dGhpcy5vbGREYXRhID0gdnYuRW5jb2RlRGF0YTtcclxuXHRcdFx0XHRcdHRoaXMub3BlcmF0ZSA9IHZ2Lk9wZXJhdGU7XHJcblx0XHRcdFx0XHR0aGlzLmFsbG93Q2xvbmUgPSB2di5BbGxvd0Nsb25lO1xyXG5cdFx0XHRcdFx0dGhpcy5maWVsZHMgPSB2di5GaWVsZHM7XHJcblx0XHRcdFx0XHR0aGlzLnR5cGVSZWNvcmQgPSB2di5UeXBlUmVjb3JkO1xyXG5cdFx0XHRcdFx0dGhpcy5yZWNvcmQgPSB2di5SZWNvcmQ7XHJcblx0XHRcdFx0XHR0aGlzLnNpZ25LZXlWYWx1ZXMgPSB2di5TaWduS2V5VmFsdWVzO1xyXG5cdFx0XHRcdFx0dGhpcy51c2VUeXBlUmVjb3JkID0gdnYuVHlwZVJlY29yZCAhPT0gdW5kZWZpbmVkICYmIHZ2LlR5cGVSZWNvcmQgIT09IG51bGw7XHJcblx0XHRcdFx0XHQvLyDlr7nkuLvooajlrZfmrrXnmoTmmKDlsIRcclxuXHRcdFx0XHRcdHRoaXMuZmllbGRNYXAgPSB2di5GaWVsZHMucmVkdWNlKChyZXN1bHQsIGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0W2l0ZW0uTmFtZV0gPSBpdGVtO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHRcdFx0fSwge30pO1xyXG5cdFx0XHRcdFx0Ly8g5Y+q5bu656uL5Li76KGo55qEZm9ybWdyb3VwXHJcblx0XHRcdFx0XHRpZiAodGhpcy51c2VUeXBlUmVjb3JkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZpZWxkcy5yZWR1Y2UoKHJlc3VsdCwgZmxkKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmxkLlR5cGUgPT09IEJpbGxGaWVsZERhdGFUeXBlLkRBVEUgJiYgdGhpcy50eXBlUmVjb3JkW2ZsZC5OYW1lXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbZmxkLk5hbWVdID0gbmV3IEZvcm1Db250cm9sKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdGhpcy5maXhTaG93RGF0ZSh0aGlzLnR5cGVSZWNvcmRbZmxkLk5hbWVdIGFzIHN0cmluZyksIC8vIOWOu+aOieaXtuWMulxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpc2FibGVkOiBmbGQuUmVhZG9ubHlcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbZmxkLk5hbWVdID0gbmV3IEZvcm1Db250cm9sKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdGhpcy50eXBlUmVjb3JkW2ZsZC5OYW1lXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogZmxkLlJlYWRvbmx5XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHR9LCB7fSlcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZpZWxkcy5yZWR1Y2UoKHJlc3VsdCwgZmxkKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmxkLlR5cGUgPT09IEJpbGxGaWVsZERhdGFUeXBlLkRBVEUgJiYgdGhpcy5yZWNvcmQuTWFpbltmbGQuTmFtZV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ZsZC5OYW1lXSA9IG5ldyBGb3JtQ29udHJvbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMuZml4U2hvd0RhdGUodGhpcy5yZWNvcmQuTWFpbltmbGQuTmFtZV0gYXMgc3RyaW5nKSwgLy8g5Y675o6J5pe25Yy6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ6IGZsZC5SZWFkb25seVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtmbGQuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnJlY29yZC5NYWluW2ZsZC5OYW1lXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogZmxkLlJlYWRvbmx5XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHR9LCB7fSlcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuaW5pdC5lbWl0KCk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5lcnJvciA9IGVyci5lcnJvci5FcnJvcjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBmaXhTaG93RGF0ZShkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0aWYgKGQpIHtcclxuXHRcdFx0cmV0dXJuIGQuc3Vic3RyKDAsIDE2KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBkO1xyXG5cdH1cclxuXHRuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7fVxyXG5cdHNob3dFcnJvck1lc3NhZ2UobWVzOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nLm9wZW4oRXJyb3JNZXNzYWdlQ29tcG9uZW50LCB7XHJcblx0XHRcdC8vIHdpZHRoOiAnNDUwcHgnLFxyXG5cdFx0XHRkYXRhOiB7IG1lc3NhZ2U6IG1lcyB9LFxyXG5cdFx0XHRhdXRvRm9jdXM6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHRcdC8vIFx0Y29uc29sZS5sb2coJ1RoZSBkaWFsb2cgd2FzIGNsb3NlZCcpO1xyXG5cdFx0Ly8gfSk7XHJcblx0fVxyXG5cdG5nT25Jbml0KCkge31cclxuXHRpc0FkZCgpIHtcclxuXHRcdHJldHVybiB0aGlzLm9wZXJhdGUgPT09IEJpbGxPcGVyYXRlLkFkZDtcclxuXHR9XHJcblx0aXNFZGl0KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMub3BlcmF0ZSA9PT0gQmlsbE9wZXJhdGUuRWRpdDtcclxuXHR9XHJcblx0aXNEZWxldGUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVyYXRlID09PSBCaWxsT3BlcmF0ZS5EZWxldGU7XHJcblx0fVxyXG5cdGlzQnJvd3NlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMub3BlcmF0ZSA9PT0gQmlsbE9wZXJhdGUuQnJvd3NlO1xyXG5cdH1cclxuXHRjbG9zZSgpIHtcclxuXHRcdHRoaXMudGFicy5jbG9zZSgpO1xyXG5cdH1cclxuXHRwcml2YXRlIGZpeERhdGUoZDogRGF0ZSkge1xyXG5cdFx0Y29uc3QgdGltZXpvbmVPZmZzZXRJbkhvdXJzID0gLShkLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCk7IC8vIFVUQyBtaW51cyBsb2NhbCB0aW1lXHJcblx0XHRjb25zdCBzaWduID0gdGltZXpvbmVPZmZzZXRJbkhvdXJzID49IDAgPyAnKycgOiAnLSc7XHJcblx0XHRjb25zdCBsZWFkaW5nWmVybyA9IE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0SW5Ib3VycykgPCAxMCA/ICcwJyA6ICcnO1xyXG5cclxuXHRcdC8vIEl0J3MgYSBiaXQgdW5mb3J0dW5hdGUgdGhhdCB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBhIG5ldyBEYXRlIGluc3RhbmNlXHJcblx0XHQvLyAod2UgZG9uJ3Qgd2FudCBfdGhpc18gRGF0ZSBpbnN0YW5jZSB0byBiZSBtb2RpZmllZClcclxuXHRcdGNvbnN0IGNvcnJlY3RlZERhdGUgPSBuZXcgRGF0ZShcclxuXHRcdFx0ZC5nZXRGdWxsWWVhcigpLFxyXG5cdFx0XHRkLmdldE1vbnRoKCksXHJcblx0XHRcdGQuZ2V0RGF0ZSgpLFxyXG5cdFx0XHRkLmdldEhvdXJzKCksXHJcblx0XHRcdGQuZ2V0TWludXRlcygpLFxyXG5cdFx0XHRkLmdldFNlY29uZHMoKSxcclxuXHRcdFx0ZC5nZXRNaWxsaXNlY29uZHMoKVxyXG5cdFx0KTtcclxuXHRcdGNvcnJlY3RlZERhdGUuc2V0SG91cnMoZC5nZXRIb3VycygpICsgdGltZXpvbmVPZmZzZXRJbkhvdXJzKTtcclxuXHRcdGNvbnN0IGlzbyA9IGNvcnJlY3RlZERhdGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdaJywgJycpO1xyXG5cclxuXHRcdHJldHVybiBpc28gKyBzaWduICsgbGVhZGluZ1plcm8gKyBNYXRoLmFicyh0aW1lem9uZU9mZnNldEluSG91cnMpLnRvU3RyaW5nKCkgKyAnOjAwJztcclxuXHR9XHJcblx0Ly8g6L+U5ZueZm9ybWdyb3Vw55qE6L2s5o2i5aW957G75Z6L55qE5YC8XHJcblx0Z2V0Rm9ybUdyb3VwVmFsdWVBc1R5cGUoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XHJcblx0XHRjb25zdCByZXY6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHRcdHRoaXMuZmllbGRzLmZvckVhY2goZmxkID0+IHtcclxuXHRcdFx0c3dpdGNoIChmbGQuVHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgQmlsbEZpZWxkRGF0YVR5cGUuRkxPQVQ6XHJcblx0XHRcdFx0XHRyZXZbZmxkLk5hbWVdID0gcGFyc2VGbG9hdCh0aGlzLmZvcm1Hcm91cC5nZXQoZmxkLk5hbWUpLnZhbHVlKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgQmlsbEZpZWxkRGF0YVR5cGUuSU5UOlxyXG5cdFx0XHRcdFx0cmV2W2ZsZC5OYW1lXSA9IHBhcnNlSW50KHRoaXMuZm9ybUdyb3VwLmdldChmbGQuTmFtZSkudmFsdWUsIDEwKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgQmlsbEZpZWxkRGF0YVR5cGUuREFURTpcclxuXHRcdFx0XHRcdGlmICh0aGlzLmZvcm1Hcm91cC5nZXQoZmxkLk5hbWUpLnZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdHJldltmbGQuTmFtZV0gPSB0aGlzLmZpeERhdGUobmV3IERhdGUodGhpcy5mb3JtR3JvdXAuZ2V0KGZsZC5OYW1lKS52YWx1ZSkpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV2W2ZsZC5OYW1lXSA9IG51bGw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0cmV2W2ZsZC5OYW1lXSA9IHRoaXMuZm9ybUdyb3VwLmdldChmbGQuTmFtZSkudmFsdWU7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gcmV2O1xyXG5cdH1cclxuXHRzYXZlKCkge1xyXG5cdFx0Ly8g5ZCI5bm25L+u5pS555qE5pWw5o2uXHJcblx0XHRpZiAodGhpcy51c2VUeXBlUmVjb3JkKSB7XHJcblx0XHRcdHRoaXMudHlwZVJlY29yZCA9IHsgLi4udGhpcy50eXBlUmVjb3JkLCAuLi50aGlzLmdldEZvcm1Hcm91cFZhbHVlQXNUeXBlKCkgfTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucmVjb3JkID0ge1xyXG5cdFx0XHRcdE1haW46IHsgLi4udGhpcy5yZWNvcmQuTWFpbiwgLi4udGhpcy5nZXRGb3JtR3JvdXBWYWx1ZUFzVHlwZSgpIH0sXHJcblx0XHRcdFx0Q2hpbGQ6IHsgLi4udGhpcy5yZWNvcmQuQ2hpbGQgfVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcHJvY2VzcyA9IChkYXRhOiBCZWZvcmVTYXZlUGFyYW0pID0+IHtcclxuXHRcdFx0Ly8g5ZCI5bm25L+u5pS555qE5pWw5o2uXHJcblx0XHRcdGlmICh0aGlzLnVzZVR5cGVSZWNvcmQpIHtcclxuXHRcdFx0XHR0aGlzLnR5cGVSZWNvcmQgPSB7IC4uLnRoaXMudHlwZVJlY29yZCwgLi4uZGF0YSA/IGRhdGEucmVjb3JkIDogbnVsbCB9O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChkYXRhICYmIGRhdGEucmVjb3JkKSB7XHJcblx0XHRcdFx0XHR0aGlzLnJlY29yZC5NYWluID0geyAuLi50aGlzLnJlY29yZC5NYWluLCAuLi5kYXRhLnJlY29yZC5NYWluIH07XHJcblx0XHRcdFx0XHR0aGlzLnJlY29yZC5DaGlsZCA9IGRhdGEucmVjb3JkLkNoaWxkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmJpbGxCYWNrZmFjZVxyXG5cdFx0XHRcdC5wb3N0KHRoaXMuZWxlbWVudCwge1xyXG5cdFx0XHRcdFx0Q2hlY2tPbmx5OiBmYWxzZSxcclxuXHRcdFx0XHRcdE9sZERhdGE6IHRoaXMub2xkRGF0YSxcclxuXHRcdFx0XHRcdFRhZzogZGF0YSA/IGRhdGEudGFnIDogbnVsbCxcclxuXHRcdFx0XHRcdE5ld1R5cGVSZWNvcmQ6IHRoaXMudHlwZVJlY29yZCxcclxuXHRcdFx0XHRcdE5ld1JlY29yZDogdGhpcy5yZWNvcmRcclxuXHRcdFx0XHR9IGFzIElCaWxsUG9zdEV2ZW50Qm9keSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHYuT2spIHtcclxuXHRcdFx0XHRcdFx0dGhpcy50YWJzLmNsb3NlKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuc2hvd0Vycm9yTWVzc2FnZSh2LkVycm9yKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH07XHJcblx0XHRpZiAodGhpcy5vbkJlZm9yZVNhdmUpIHtcclxuXHRcdFx0dGhpcy5vbkJlZm9yZVNhdmUodGhpcykuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdHByb2Nlc3Modik7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJvY2VzcyhudWxsKTtcclxuXHRcdH1cclxuXHR9XHJcblx0ZGVsZXRlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuYmlsbEJhY2tmYWNlLmRlbGV0ZSh0aGlzLmVsZW1lbnQsIHRoaXMub2xkRGF0YSkuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRpZiAodi5Paykge1xyXG5cdFx0XHRcdHRoaXMudGFicy5jbG9zZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNob3dFcnJvck1lc3NhZ2Uodi5FcnJvcik7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0Y2xvbmUoKSB7XHJcblx0XHR0aGlzLmJpbGxDbG9uZVNlcnZpY2VcclxuXHRcdFx0LmdldENsb25lUEsoeyBPbGRTaWduUEs6IHRoaXMuc2lnbktleVZhbHVlcywgRWxlTmFtZTogdGhpcy5lbGVtZW50LmVsZW1lbnQuTmFtZSB9KVxyXG5cdFx0XHQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2xvbmVDb21wb25lbnQsIHtcclxuXHRcdFx0XHRcdC8vIHdpZHRoOiAnNDUwcHgnLFxyXG5cdFx0XHRcdFx0ZGF0YTogdlxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJpbGxDbG9uZVNlcnZpY2VcclxuXHRcdFx0XHRcdFx0XHQuYmlsbENsb25lKHtcclxuXHRcdFx0XHRcdFx0XHRcdEVsZU5hbWU6IHRoaXMuZWxlbWVudC5lbGVtZW50Lk5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRPbGRTaWduUEs6IHRoaXMuc2lnbktleVZhbHVlcyxcclxuXHRcdFx0XHRcdFx0XHRcdE5ld1BLOiByZXN1bHRcclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdC5zdWJzY3JpYmUoYXBpcmV2ID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhcGlyZXYuT2spIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKCfmiJDlip/lrozmiJDlhYvpmoYnLCAn5YWz6ZetJywge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhvcml6b250YWxQb3NpdGlvbjogJ3JpZ2h0JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2ZXJ0aWNhbFBvc2l0aW9uOiAnYm90dG9tJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogNTAwMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbihhcGlyZXYuRXJyb3IsICflhbPpl60nLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aG9yaXpvbnRhbFBvc2l0aW9uOiAncmlnaHQnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZlcnRpY2FsUG9zaXRpb246ICdib3R0b20nXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcbn1cclxuIl19