barsa-novin-ray-core 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/barsa-novin-ray-core.mjs +257 -142
- package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
- package/lib/pipes/can-upload.pipe.d.ts +1 -1
- package/package.json +3 -5
- package/esm2022/barsa-novin-ray-core.mjs +0 -5
- package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
- package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
- package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
- package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
- package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
- package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
- package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
- package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
- package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
- package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
- package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
- package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
- package/esm2022/lib/abstract-classes/index.mjs +0 -25
- package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
- package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
- package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
- package/esm2022/lib/abstract-classes/models.mjs +0 -184
- package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
- package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
- package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
- package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
- package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
- package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
- package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
- package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
- package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
- package/esm2022/lib/auth-guard.mjs +0 -48
- package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
- package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
- package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
- package/esm2022/lib/base.module.mjs +0 -28
- package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
- package/esm2022/lib/constants.mjs +0 -898
- package/esm2022/lib/container.component.mjs +0 -99
- package/esm2022/lib/controllers/base-controller.mjs +0 -30
- package/esm2022/lib/controllers/index.mjs +0 -5
- package/esm2022/lib/controllers/login-controller.mjs +0 -54
- package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
- package/esm2022/lib/controllers/models.mjs +0 -2
- package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
- package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
- package/esm2022/lib/date-services/date-info.mjs +0 -2
- package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
- package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
- package/esm2022/lib/date-services/date.service.mjs +0 -149
- package/esm2022/lib/date-services/index.mjs +0 -6
- package/esm2022/lib/device.mjs +0 -663
- package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
- package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
- package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
- package/esm2022/lib/directives/base.directive.mjs +0 -55
- package/esm2022/lib/directives/body-click.directive.mjs +0 -35
- package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
- package/esm2022/lib/directives/copy.directive.mjs +0 -59
- package/esm2022/lib/directives/count-down.directive.mjs +0 -108
- package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
- package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
- package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
- package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
- package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
- package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
- package/esm2022/lib/directives/form-close.directive.mjs +0 -32
- package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
- package/esm2022/lib/directives/index.mjs +0 -35
- package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
- package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
- package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
- package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
- package/esm2022/lib/directives/mobile.directive.mjs +0 -29
- package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
- package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
- package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
- package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
- package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
- package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
- package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
- package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
- package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
- package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
- package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
- package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
- package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
- package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
- package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
- package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
- package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
- package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
- package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
- package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
- package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
- package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
- package/esm2022/lib/dynamic-component/index.mjs +0 -11
- package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
- package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
- package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
- package/esm2022/lib/form/form.component.mjs +0 -211
- package/esm2022/lib/form-new/form-new.component.mjs +0 -30
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
- package/esm2022/lib/form-page-routing/constants.mjs +0 -9
- package/esm2022/lib/form-page-routing/index.mjs +0 -3
- package/esm2022/lib/from-intersection-observer.mjs +0 -53
- package/esm2022/lib/global-error-handler.mjs +0 -26
- package/esm2022/lib/injdection-tokens.mjs +0 -8
- package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
- package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
- package/esm2022/lib/login2/login2.component.mjs +0 -60
- package/esm2022/lib/modal-root.component.mjs +0 -33
- package/esm2022/lib/not-found/not-found.component.mjs +0 -16
- package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
- package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
- package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
- package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
- package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
- package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
- package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
- package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
- package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
- package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
- package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
- package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
- package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
- package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
- package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
- package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
- package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
- package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
- package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
- package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
- package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
- package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
- package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
- package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
- package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
- package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
- package/esm2022/lib/pipes/index.mjs +0 -48
- package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
- package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
- package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
- package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
- package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
- package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
- package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
- package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
- package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
- package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
- package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
- package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
- package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
- package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
- package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
- package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
- package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
- package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
- package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
- package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
- package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
- package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
- package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
- package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
- package/esm2022/lib/redirect-home-guard.mjs +0 -51
- package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
- package/esm2022/lib/report-container/report-container.component.mjs +0 -63
- package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
- package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
- package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
- package/esm2022/lib/resolvers/index.mjs +0 -6
- package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
- package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
- package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
- package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
- package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
- package/esm2022/lib/root-page/root-page.component.mjs +0 -21
- package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
- package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
- package/esm2022/lib/services/api.service.mjs +0 -63
- package/esm2022/lib/services/audio-recording.service.mjs +0 -95
- package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
- package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
- package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
- package/esm2022/lib/services/column.service.mjs +0 -20
- package/esm2022/lib/services/container.service.mjs +0 -69
- package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
- package/esm2022/lib/services/form-panel.service.mjs +0 -380
- package/esm2022/lib/services/form.service.mjs +0 -14
- package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
- package/esm2022/lib/services/index.mjs +0 -29
- package/esm2022/lib/services/indexeddb.service.mjs +0 -34
- package/esm2022/lib/services/layout.service.mjs +0 -42
- package/esm2022/lib/services/local-storage.service.mjs +0 -32
- package/esm2022/lib/services/log.service.mjs +0 -50
- package/esm2022/lib/services/network-status.service.mjs +0 -15
- package/esm2022/lib/services/notification-popup.service.mjs +0 -2
- package/esm2022/lib/services/notification-sw.service.mjs +0 -180
- package/esm2022/lib/services/notification.service.mjs +0 -308
- package/esm2022/lib/services/portal.service.mjs +0 -929
- package/esm2022/lib/services/prompt-update.service.mjs +0 -56
- package/esm2022/lib/services/routing.service.mjs +0 -60
- package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
- package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
- package/esm2022/lib/services/toast.service.mjs +0 -2
- package/esm2022/lib/services/ui.service.mjs +0 -23
- package/esm2022/lib/services/ulvmain.service.mjs +0 -810
- package/esm2022/lib/services/upload.service.mjs +0 -161
- package/esm2022/lib/services/video-recording.service.mjs +0 -115
- package/esm2022/public-api.mjs +0 -44
|
@@ -1,525 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, Self, SkipSelf, ViewChild } from '@angular/core';
|
|
2
|
-
import { catchError, from, tap, Subject, switchMap, takeUntil, throwError, debounceTime } from 'rxjs';
|
|
3
|
-
import { BarsaApi } from '../abstract-classes';
|
|
4
|
-
import { PreventDefaulEvent, createGridEditorFormPanel } from '../constants';
|
|
5
|
-
import { BaseViewPropsComponent } from './base-view-props';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/platform-browser";
|
|
8
|
-
import * as i2 from "../pipes";
|
|
9
|
-
import * as i3 from "../services";
|
|
10
|
-
export class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
11
|
-
set serializedRelatedMo(val) {
|
|
12
|
-
this._serializedRelatedMo = val;
|
|
13
|
-
this._updateCartableMo(val);
|
|
14
|
-
this._createCartableParams();
|
|
15
|
-
}
|
|
16
|
-
set cartableTemplate(val) {
|
|
17
|
-
this._cartableTemplate = val;
|
|
18
|
-
this._createCartableParams();
|
|
19
|
-
}
|
|
20
|
-
set cartableMo(val) {
|
|
21
|
-
this._cartableMo = val;
|
|
22
|
-
this._updateCartableMo(this._serializedRelatedMo);
|
|
23
|
-
this._createCartableParams();
|
|
24
|
-
}
|
|
25
|
-
set cartableWorkflowData(val) {
|
|
26
|
-
this._cartableWorkflowData = val;
|
|
27
|
-
this._createCartableParams();
|
|
28
|
-
}
|
|
29
|
-
constructor(_el, _domSanitizer, _cdr, _reportValuePipe, _parentFormPanelService, _formPanelService, _ulvMainService) {
|
|
30
|
-
super();
|
|
31
|
-
this._el = _el;
|
|
32
|
-
this._domSanitizer = _domSanitizer;
|
|
33
|
-
this._cdr = _cdr;
|
|
34
|
-
this._reportValuePipe = _reportValuePipe;
|
|
35
|
-
this._parentFormPanelService = _parentFormPanelService;
|
|
36
|
-
this._formPanelService = _formPanelService;
|
|
37
|
-
this._ulvMainService = _ulvMainService;
|
|
38
|
-
this.actionListClick = new EventEmitter();
|
|
39
|
-
this.events = new EventEmitter();
|
|
40
|
-
// @HostListener('document:mousedown', ['$event'])
|
|
41
|
-
// onMouseDown(e): void {
|
|
42
|
-
// // we make sure only draggables on the document elements are selected
|
|
43
|
-
// if (
|
|
44
|
-
// !this._el.nativeElement.contains(e.target) &&
|
|
45
|
-
// this.inlineEditMode &&
|
|
46
|
-
// this.allowInlineEdit &&
|
|
47
|
-
// this.isChecked &&
|
|
48
|
-
// e.target.tagName.toLowerCase() === 'button'
|
|
49
|
-
// ) {
|
|
50
|
-
// this.deselectAll.emit();
|
|
51
|
-
// // this._saveEditedMo$.next('MOUSEDOWN_OUTSIDE');
|
|
52
|
-
// }
|
|
53
|
-
// }
|
|
54
|
-
this.hasError = false;
|
|
55
|
-
this._focusToFirstEidtableColumn = false;
|
|
56
|
-
this.inlineEditInReport = true;
|
|
57
|
-
this.inRow = true;
|
|
58
|
-
this.hasCartableTemplate = false;
|
|
59
|
-
this.bruleActionMessage = null;
|
|
60
|
-
this._saveEditedMo$ = new Subject();
|
|
61
|
-
this._formpanelValueChanged$ = new Subject();
|
|
62
|
-
this._saveEditedMo$
|
|
63
|
-
.asObservable()
|
|
64
|
-
.pipe(takeUntil(this._onDestroy$), debounceTime(500), switchMap((reason) => this._inlineEditSaveFormPanel(reason)), catchError((err) => throwError(() => err)))
|
|
65
|
-
.subscribe((res) => {
|
|
66
|
-
if (res.saved) {
|
|
67
|
-
this.mo.$IsChecked = false;
|
|
68
|
-
this._formpanelValueChanged$.next('');
|
|
69
|
-
this._cdr.markForCheck();
|
|
70
|
-
}
|
|
71
|
-
if (res.reason === 'TAB' || res.reason === 'CTRL+ENTER') {
|
|
72
|
-
this.selectNextInlineRecord.emit(this.mo);
|
|
73
|
-
}
|
|
74
|
-
else if (res.reason === 'ESC') {
|
|
75
|
-
this.editFormPanelCancel.emit(this.mo);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
this._formpanelValueChanged$
|
|
79
|
-
.asObservable()
|
|
80
|
-
.pipe(takeUntil(this._onDestroy$),
|
|
81
|
-
// switchMap(() => this._syncMo()),
|
|
82
|
-
tap((c) => this._syncMo()), tap((c) => {
|
|
83
|
-
if (typeof this.mo.$InlineMoChanged === 'undefined') {
|
|
84
|
-
this.mo.$InlineMoChanged = true;
|
|
85
|
-
}
|
|
86
|
-
}))
|
|
87
|
-
.subscribe((c) => {
|
|
88
|
-
this.editFormPanelValueChange.emit({ mo: this.mo, fieldDbName: c });
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
get _hasFormPanelService() {
|
|
92
|
-
return this._formPanelService !== null && this.formSetting;
|
|
93
|
-
}
|
|
94
|
-
ngOnInit() {
|
|
95
|
-
super.ngOnInit();
|
|
96
|
-
if (this._hasFormPanelService) {
|
|
97
|
-
this._formPanelService.context$.pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
98
|
-
this._formPanelService.view$.pipe(takeUntil(this._onDestroy$)).subscribe();
|
|
99
|
-
this.layout$ = this._formPanelService.layout$;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
ngOnChanges(changes) {
|
|
103
|
-
super.ngOnChanges(changes);
|
|
104
|
-
const { isChecked, inlineEditMode } = changes;
|
|
105
|
-
let needToLoadForm = false;
|
|
106
|
-
if (this.inlineEditMode) {
|
|
107
|
-
if (isChecked) {
|
|
108
|
-
if (!isChecked.currentValue && isChecked.previousValue) {
|
|
109
|
-
if (this._needToSave()) {
|
|
110
|
-
this._saveEditedMo$.next('CHECK_CHANGED');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
else if (isChecked.currentValue) {
|
|
114
|
-
needToLoadForm = true;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (isChecked && !isChecked.firstChange) {
|
|
119
|
-
this._raiseWorkflowShareButtons(isChecked.currentValue);
|
|
120
|
-
}
|
|
121
|
-
if (inlineEditMode?.currentValue && !inlineEditMode?.previousValue && this.isChecked) {
|
|
122
|
-
needToLoadForm = true;
|
|
123
|
-
}
|
|
124
|
-
else if (!inlineEditMode?.currentValue && inlineEditMode?.previousValue && this.isChecked) {
|
|
125
|
-
this._saveEditedMo$.next('ESC');
|
|
126
|
-
}
|
|
127
|
-
if (needToLoadForm) {
|
|
128
|
-
this._loadAndCreateFormPanelCtrlr();
|
|
129
|
-
}
|
|
130
|
-
if (changes.mo && !changes.mo.firstChange && this.inlineEditMode) {
|
|
131
|
-
if (this._formPanelLoaded) {
|
|
132
|
-
this.formPanelCtrlr.SetValue(changes.mo.currentValue);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// if (mo && !mo.firstChange && this._hasFormPanelService && this.isChecked && this.inlineEditMode) {
|
|
136
|
-
// //this.formPanelCtrlr.SetValue(changes.mo.currentValue);
|
|
137
|
-
// }
|
|
138
|
-
}
|
|
139
|
-
ngOnDestroy() {
|
|
140
|
-
super.ngOnDestroy();
|
|
141
|
-
if (this.formPanelCtrlr) {
|
|
142
|
-
this.formPanelCtrlr.un('bruleShowMessageAction', this._handleBruleShowMessageAction);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
OnCartableFormClick(e) {
|
|
146
|
-
if (this.isChecked) {
|
|
147
|
-
e.preventDefault();
|
|
148
|
-
e.stopPropagation();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
onRowCheck(onlyCheck) {
|
|
152
|
-
this._rowCheck(onlyCheck);
|
|
153
|
-
}
|
|
154
|
-
onRowClick() {
|
|
155
|
-
this.rowClick.emit({ mo: this.mo, index: this.index });
|
|
156
|
-
}
|
|
157
|
-
onColumnChangeToEditMode(elDom, index) {
|
|
158
|
-
const focusables = elDom.querySelectorAll(`button,button:not([disabled]),[href],input:not([disabled]),input,
|
|
159
|
-
select,select:not([disabled]),textarea,textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);
|
|
160
|
-
this._lastEditableColumnIndex = index;
|
|
161
|
-
if (!focusables.length || this._focusToFirstEidtableColumn) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
this._focusToFirstEidtableColumn = true;
|
|
165
|
-
const lastFocusable = focusables[0];
|
|
166
|
-
setTimeout(() => {
|
|
167
|
-
lastFocusable?.focus();
|
|
168
|
-
}, 0);
|
|
169
|
-
}
|
|
170
|
-
onTabKeyDown(e, index) {
|
|
171
|
-
if (index === this._lastEditableColumnIndex) {
|
|
172
|
-
PreventDefaulEvent(e);
|
|
173
|
-
this._saveEditedMo$.next('TAB');
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
onEditFormPanelSave(e) {
|
|
177
|
-
this._saveEditedMo$.next('CTRL+ENTER');
|
|
178
|
-
}
|
|
179
|
-
onEditFormPanelCancel(e) {
|
|
180
|
-
this.escapeKey.emit(this.mo);
|
|
181
|
-
}
|
|
182
|
-
onUlvCommand() {
|
|
183
|
-
this.ulvCommand.emit({ mo: this.mo, index: this.index });
|
|
184
|
-
}
|
|
185
|
-
onAction(commandBody) {
|
|
186
|
-
this.action.emit(commandBody);
|
|
187
|
-
}
|
|
188
|
-
onExpandClick() {
|
|
189
|
-
this.expandClick.emit(this.mo);
|
|
190
|
-
}
|
|
191
|
-
onDynamicComponentEvents(e) {
|
|
192
|
-
switch (e.title) {
|
|
193
|
-
case 'rowCheck':
|
|
194
|
-
this.onRowCheck();
|
|
195
|
-
break;
|
|
196
|
-
case 'rowClick':
|
|
197
|
-
this.onRowClick();
|
|
198
|
-
break;
|
|
199
|
-
case 'ulvCommand':
|
|
200
|
-
this.onUlvCommand();
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
onCartableFormClosed() {
|
|
205
|
-
this.cartableFormClosed.emit({ mo: this.mo, index: this.index });
|
|
206
|
-
}
|
|
207
|
-
onCartableBruleAction(bruleAction) {
|
|
208
|
-
this._handleBruleShowMessageAction(bruleAction);
|
|
209
|
-
}
|
|
210
|
-
onCartableAfterTansition(e) {
|
|
211
|
-
this.workflowState = {
|
|
212
|
-
error: this.bruleActionMessage ? this.bruleActionMessage : e.error,
|
|
213
|
-
state: 'Finish'
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
onCartableBeforeTansition() {
|
|
217
|
-
this.workflowState = { state: 'Pending', error: null };
|
|
218
|
-
// this.workflowStateChanged.emit(this.workflowState);
|
|
219
|
-
}
|
|
220
|
-
onResetWorkflowState() {
|
|
221
|
-
this._handleResetWorkflowState();
|
|
222
|
-
}
|
|
223
|
-
_trackByColumn(index, column) {
|
|
224
|
-
return `${column.Name}${index}`;
|
|
225
|
-
}
|
|
226
|
-
_handleResetWorkflowState() {
|
|
227
|
-
this.bruleActionMessage = null;
|
|
228
|
-
this.workflowState = { state: '', error: null };
|
|
229
|
-
}
|
|
230
|
-
_updateCartableMo(serializeMo) {
|
|
231
|
-
if (serializeMo && this._cartableMo) {
|
|
232
|
-
serializeMo = `${serializeMo}`;
|
|
233
|
-
const mo = BarsaApi.Ext.decode(serializeMo);
|
|
234
|
-
this._cartableMo = { ...this._cartableMo, ...mo };
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
_createCartableParams() {
|
|
238
|
-
let cartableTemplate = this._cartableTemplate;
|
|
239
|
-
const cartableMo = this._cartableMo;
|
|
240
|
-
const cartableWorkflowData = this._cartableWorkflowData;
|
|
241
|
-
if (this.hasCartableTemplate) {
|
|
242
|
-
// TODO update cartable mo;
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (cartableTemplate &&
|
|
246
|
-
cartableMo &&
|
|
247
|
-
typeof cartableWorkflowData !== 'undefined' &&
|
|
248
|
-
this._serializedRelatedMo) {
|
|
249
|
-
cartableTemplate = JSON.parse(JSON.stringify(cartableTemplate));
|
|
250
|
-
const view = cartableTemplate.View;
|
|
251
|
-
cartableTemplate.Data = { Mo: { ...cartableMo } };
|
|
252
|
-
cartableTemplate.Workflow = cartableWorkflowData === '' ? null : JSON.parse(cartableWorkflowData);
|
|
253
|
-
if (!view.ExtraJsonProp) {
|
|
254
|
-
view.ExtraJsonProp = {};
|
|
255
|
-
}
|
|
256
|
-
view.ExtraJsonProp.IsSimple = true;
|
|
257
|
-
this.cartableParams = {
|
|
258
|
-
formSetting: cartableTemplate,
|
|
259
|
-
moId: cartableMo.Id,
|
|
260
|
-
typeDefId: cartableMo.$TypeDefId,
|
|
261
|
-
viewId: view.TypeViewId,
|
|
262
|
-
inDialog: false,
|
|
263
|
-
loadActivityView: true
|
|
264
|
-
};
|
|
265
|
-
this.hasCartableTemplate = true;
|
|
266
|
-
this._cdr.markForCheck();
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
_needToSave() {
|
|
270
|
-
// if (!this.isChecked) {
|
|
271
|
-
// return false;
|
|
272
|
-
// }
|
|
273
|
-
// const isChildNode = (this._el.nativeElement as HTMLElement).contains(e.target);
|
|
274
|
-
// if (isChildNode) {
|
|
275
|
-
// return false;
|
|
276
|
-
// }
|
|
277
|
-
const t = this.inlineEditMode && this._hasFormPanelService;
|
|
278
|
-
if (!t) {
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
return this.formPanelCtrlr && this.formPanelCtrlr.IsMoChanged();
|
|
282
|
-
}
|
|
283
|
-
_checkfocusOutFromRow(target) {
|
|
284
|
-
// const focusable: NodeList = this._focusableControls;
|
|
285
|
-
// let foundInFocusable = false;
|
|
286
|
-
// focusable.forEach((c) => {
|
|
287
|
-
// if (c === target) {
|
|
288
|
-
// foundInFocusable = true;
|
|
289
|
-
// }
|
|
290
|
-
// });
|
|
291
|
-
// if (!foundInFocusable) {
|
|
292
|
-
// this._saveEditedMo$.next('TAB');
|
|
293
|
-
// }
|
|
294
|
-
}
|
|
295
|
-
_rowCheck(onlyCheck) {
|
|
296
|
-
this.rowCheck.emit({ mo: this.mo, index: this.index, onlyCheck });
|
|
297
|
-
}
|
|
298
|
-
_raiseWorkflowShareButtons(isChecked) {
|
|
299
|
-
if (this.cartableParams) {
|
|
300
|
-
const choiceList = this.cartableParams.formSetting?.Workflow?.ChoiceList;
|
|
301
|
-
if (choiceList?.length) {
|
|
302
|
-
setTimeout(() => {
|
|
303
|
-
this.workflowShareButtons.emit({
|
|
304
|
-
formPanelCtrlr: this._cartableFormRef.formPanelCtrl,
|
|
305
|
-
mo: this.mo,
|
|
306
|
-
choiceList,
|
|
307
|
-
add: isChecked
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
_handleValueChange(formPanelCtrl, fieldCtrlr) {
|
|
314
|
-
if (!this.isChecked) {
|
|
315
|
-
this.onRowCheck();
|
|
316
|
-
}
|
|
317
|
-
this._formpanelValueChanged$.next(fieldCtrlr?.Setting?.ControlName);
|
|
318
|
-
}
|
|
319
|
-
_syncMo() {
|
|
320
|
-
const syncWithFormpanelMo = this.mo;
|
|
321
|
-
const _isChecked = this.mo.$IsChecked;
|
|
322
|
-
const formPanelCtrlrMo = this.formPanelCtrlr.Mo;
|
|
323
|
-
this._updateWithOriginalValues(formPanelCtrlrMo, syncWithFormpanelMo);
|
|
324
|
-
syncWithFormpanelMo['$OriginalValues'] = formPanelCtrlrMo['$OriginalValues'];
|
|
325
|
-
syncWithFormpanelMo['$FieldDict'] = formPanelCtrlrMo['$FieldDict'];
|
|
326
|
-
syncWithFormpanelMo['$State'] = formPanelCtrlrMo['$State']; // this add because if we edit unchanged mo it does not reflect to mo of ulv.
|
|
327
|
-
this.mo = { ...syncWithFormpanelMo };
|
|
328
|
-
this.mo.$IsChecked = _isChecked;
|
|
329
|
-
return from(Promise.resolve());
|
|
330
|
-
}
|
|
331
|
-
_updateWithOriginalValues(source, dest) {
|
|
332
|
-
Object.keys(source.$OriginalValues).forEach((c) => {
|
|
333
|
-
dest[c] = source[c];
|
|
334
|
-
if (source[c + '$Caption']) {
|
|
335
|
-
dest[c + '$Caption'] = source[c + '$Caption'];
|
|
336
|
-
}
|
|
337
|
-
if (source[c + '$Icon']) {
|
|
338
|
-
dest[c + '$Icon'] = source[c + '$Icon'];
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
_raiseFormPanelValueChanged() {
|
|
343
|
-
this.editFormPanelValueChange.emit({ mo: this.mo });
|
|
344
|
-
}
|
|
345
|
-
_handleBruleShowMessageAction(action) {
|
|
346
|
-
action.MessageExpressionHtml = this._domSanitizer.bypassSecurityTrustHtml(action.MessageExpression);
|
|
347
|
-
this.bruleActionMessage = action;
|
|
348
|
-
}
|
|
349
|
-
_createFormPanelCtrlr(mo, typeDefId) {
|
|
350
|
-
if (!this.formPanelCtrlr) {
|
|
351
|
-
this.formPanelCtrlr = createGridEditorFormPanel(this.formSetting, { ...mo }, typeDefId, this.extraRelation, this.inRow, this.UlvMainCtrlr
|
|
352
|
-
// BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation')
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
this.formPanelCtrlr.InlineEditInReport = true;
|
|
356
|
-
this.formPanelCtrlr.on({
|
|
357
|
-
bruleShowMessageAction: this._handleBruleShowMessageAction.bind(this),
|
|
358
|
-
valueChange: this._handleValueChange.bind(this)
|
|
359
|
-
});
|
|
360
|
-
return this.formPanelCtrlr;
|
|
361
|
-
}
|
|
362
|
-
_loadAndCreateFormPanelCtrlr() {
|
|
363
|
-
const formSettingData = this.formSetting.Data;
|
|
364
|
-
const formMo = {
|
|
365
|
-
...this.mo,
|
|
366
|
-
$FieldDict: formSettingData.Mo.$FieldDict,
|
|
367
|
-
$TypeDefId: formSettingData.Mo.$TypeDefId,
|
|
368
|
-
$OriginalValues: {}
|
|
369
|
-
};
|
|
370
|
-
if (this._formPanelLoaded) {
|
|
371
|
-
this.formPanelCtrlr.SetValue(formMo);
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
this._createFormPanelCtrlr(formMo, this.typeDefId);
|
|
375
|
-
this._formPanelLoaded = true;
|
|
376
|
-
const formPanelCtrlr = this.formPanelCtrlr;
|
|
377
|
-
this.formPanelCtrlr.UlvMoDataListCount = this.moDataListCount - 1;
|
|
378
|
-
formPanelCtrlr.LoadAndCreate(null, false, false, () => {
|
|
379
|
-
const customFormPanelUi = formPanelCtrlr.Adapter.Control;
|
|
380
|
-
const parentMo = this._parentFormPanelService ? this._parentFormPanelService.mo : null;
|
|
381
|
-
if (this.extraRelation && parentMo && this.extraRelation.RelationType === 'Composition') {
|
|
382
|
-
formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo);
|
|
383
|
-
// newFormSettings.Data.Mo[relation.ParentFdName] = parentMo.GetChangedObject();
|
|
384
|
-
// newFormSettings.Data.Mo[relation.ParentFdName].$State = parentMo.$State;
|
|
385
|
-
}
|
|
386
|
-
customFormPanelUi.Refresh = () => { };
|
|
387
|
-
this._formPanelService.context = formPanelCtrlr.Adapter.Control;
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
_resetSavingStates() {
|
|
391
|
-
this.hasError = false;
|
|
392
|
-
this.bruleActionMessage = null;
|
|
393
|
-
this.saved = false;
|
|
394
|
-
this._cdr.markForCheck();
|
|
395
|
-
}
|
|
396
|
-
_setSavingState(err) {
|
|
397
|
-
if (err) {
|
|
398
|
-
this.hasError = true;
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
this.hasError = false;
|
|
402
|
-
this.saved = true;
|
|
403
|
-
}
|
|
404
|
-
_inlineEditSaveFormPanel(reason) {
|
|
405
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
406
|
-
return new Promise((resolve, _) => {
|
|
407
|
-
if (!this.formPanelCtrlr.IsMoChanged()) {
|
|
408
|
-
// if state of mo is new or modidfied then it needs to update
|
|
409
|
-
resolve({ reason, succeed: true, saved: false });
|
|
410
|
-
}
|
|
411
|
-
const formPanelCtrlrMo = this.formPanelCtrlr.Mo;
|
|
412
|
-
delete formPanelCtrlrMo.json;
|
|
413
|
-
// this.saving = true;
|
|
414
|
-
this.mo.$InlineMoChanged = false;
|
|
415
|
-
this.editFormPanelSave.emit(this.mo);
|
|
416
|
-
this.bruleActionMessage = null;
|
|
417
|
-
if (this.noSaveInlineEditInServer) {
|
|
418
|
-
resolve({ reason, succeed: true, saved: true });
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
this.formPanelCtrlr.Save(false, (err) => {
|
|
422
|
-
// this.saving = false;
|
|
423
|
-
this.formPanelCtrlr.SetIsChanged(false);
|
|
424
|
-
this._setSavingState(err);
|
|
425
|
-
resolve({ reason, succeed: true, saved: true });
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseViewItemPropsComponent, deps: [{ token: i0.ElementRef }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i2.MoReportValuePipe }, { token: i3.FormPanelService, optional: true, skipSelf: true }, { token: i3.FormPanelService, optional: true, self: true }, { token: i3.UlvMainService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
430
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BaseViewItemPropsComponent, selector: "bnrc-base-view-item-props", inputs: { checkboxComponent: "checkboxComponent", disableEllapsis: "disableEllapsis", detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", mo: "mo", moDataListCount: "moDataListCount", index: "index", last: "last", isdirty: "isdirty", isChecked: "isChecked", hideDetailsText: "hideDetailsText", showViewButton: "showViewButton", isNewInlineMo: "isNewInlineMo", extraRelation: "extraRelation", hideOpenIcon: "hideOpenIcon", inDialog: "inDialog", isMobile: "isMobile", isMultiSelect: "isMultiSelect", rowIndicator: "rowIndicator", groupSummary: "groupSummary", isLastChildGroup: "isLastChildGroup", showRowNumber: "showRowNumber", rowNumber: "rowNumber", coloringRow: "coloringRow", noSaveInlineEditInServer: "noSaveInlineEditInServer", rowIndicatorColor: "rowIndicatorColor", UlvMainCtrlr: "UlvMainCtrlr", fieldDict: "fieldDict", actionList: "actionList", serializedRelatedMo: "serializedRelatedMo", cartableTemplate: "cartableTemplate", cartableMo: "cartableMo", cartableWorkflowData: "cartableWorkflowData" }, outputs: { actionListClick: "actionListClick", events: "events" }, viewQueries: [{ propertyName: "_cartableFormRef", first: true, predicate: ["cartableFormRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
431
|
-
}
|
|
432
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseViewItemPropsComponent, decorators: [{
|
|
433
|
-
type: Component,
|
|
434
|
-
args: [{
|
|
435
|
-
selector: 'bnrc-base-view-item-props',
|
|
436
|
-
template: ``,
|
|
437
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
438
|
-
}]
|
|
439
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i2.MoReportValuePipe }, { type: i3.FormPanelService, decorators: [{
|
|
440
|
-
type: Optional
|
|
441
|
-
}, {
|
|
442
|
-
type: SkipSelf
|
|
443
|
-
}] }, { type: i3.FormPanelService, decorators: [{
|
|
444
|
-
type: Optional
|
|
445
|
-
}, {
|
|
446
|
-
type: Self
|
|
447
|
-
}] }, { type: i3.UlvMainService, decorators: [{
|
|
448
|
-
type: Optional
|
|
449
|
-
}] }], propDecorators: { actionListClick: [{
|
|
450
|
-
type: Output
|
|
451
|
-
}], events: [{
|
|
452
|
-
type: Output
|
|
453
|
-
}], _cartableFormRef: [{
|
|
454
|
-
type: ViewChild,
|
|
455
|
-
args: ['cartableFormRef', { static: false }]
|
|
456
|
-
}], checkboxComponent: [{
|
|
457
|
-
type: Input
|
|
458
|
-
}], disableEllapsis: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], detailsComponent: [{
|
|
461
|
-
type: Input
|
|
462
|
-
}], detailsColumns: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], detailsText: [{
|
|
465
|
-
type: Input
|
|
466
|
-
}], mo: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], moDataListCount: [{
|
|
469
|
-
type: Input
|
|
470
|
-
}], index: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}], last: [{
|
|
473
|
-
type: Input
|
|
474
|
-
}], isdirty: [{
|
|
475
|
-
type: Input
|
|
476
|
-
}], isChecked: [{
|
|
477
|
-
type: Input
|
|
478
|
-
}], hideDetailsText: [{
|
|
479
|
-
type: Input
|
|
480
|
-
}], showViewButton: [{
|
|
481
|
-
type: Input
|
|
482
|
-
}], isNewInlineMo: [{
|
|
483
|
-
type: Input
|
|
484
|
-
}], extraRelation: [{
|
|
485
|
-
type: Input
|
|
486
|
-
}], hideOpenIcon: [{
|
|
487
|
-
type: Input
|
|
488
|
-
}], inDialog: [{
|
|
489
|
-
type: Input
|
|
490
|
-
}], isMobile: [{
|
|
491
|
-
type: Input
|
|
492
|
-
}], isMultiSelect: [{
|
|
493
|
-
type: Input
|
|
494
|
-
}], rowIndicator: [{
|
|
495
|
-
type: Input
|
|
496
|
-
}], groupSummary: [{
|
|
497
|
-
type: Input
|
|
498
|
-
}], isLastChildGroup: [{
|
|
499
|
-
type: Input
|
|
500
|
-
}], showRowNumber: [{
|
|
501
|
-
type: Input
|
|
502
|
-
}], rowNumber: [{
|
|
503
|
-
type: Input
|
|
504
|
-
}], coloringRow: [{
|
|
505
|
-
type: Input
|
|
506
|
-
}], noSaveInlineEditInServer: [{
|
|
507
|
-
type: Input
|
|
508
|
-
}], rowIndicatorColor: [{
|
|
509
|
-
type: Input
|
|
510
|
-
}], UlvMainCtrlr: [{
|
|
511
|
-
type: Input
|
|
512
|
-
}], fieldDict: [{
|
|
513
|
-
type: Input
|
|
514
|
-
}], actionList: [{
|
|
515
|
-
type: Input
|
|
516
|
-
}], serializedRelatedMo: [{
|
|
517
|
-
type: Input
|
|
518
|
-
}], cartableTemplate: [{
|
|
519
|
-
type: Input
|
|
520
|
-
}], cartableMo: [{
|
|
521
|
-
type: Input
|
|
522
|
-
}], cartableWorkflowData: [{
|
|
523
|
-
type: Input
|
|
524
|
-
}] } });
|
|
525
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS12aWV3LWl0ZW0tcHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL2R5bmFtaWMtY29tcG9uZW50L2Jhc2Utdmlldy1pdGVtLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosUUFBUSxFQUNSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsSCxPQUFPLEVBSUgsUUFBUSxFQUtYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7OztBQVMzRCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsc0JBQXNCO0lBb0NsRSxJQUFhLG1CQUFtQixDQUFDLEdBQVc7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELElBQWEsZ0JBQWdCLENBQUMsR0FBZ0I7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztRQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBYSxVQUFVLENBQUMsR0FBd0I7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QkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFLTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFNTyxvQkFBb0I7c0JBQWhDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmcm9tLCB0YXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0aHJvd0Vycm9yLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIFJlcG9ydFZpZXdDb2x1bW4sXG4gICAgRm9ybVNldHRpbmcsXG4gICAgQmFyc2FBcGksXG4gICAgQ2hvaWNlRGVmLFxuICAgIFR5cGVVbHZNYWluQ3RybHIsXG4gICAgQnJ1bGVBY3Rpb25NZXNzYWdlLFxuICAgIEVqcmF5T2xnb1xufSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzJztcbmltcG9ydCB7IFByZXZlbnREZWZhdWxFdmVudCwgY3JlYXRlR3JpZEVkaXRvckZvcm1QYW5lbCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtUGFuZWxTZXJ2aWNlLCBVbHZNYWluU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEJhc2VWaWV3UHJvcHNDb21wb25lbnQgfSBmcm9tICcuL2Jhc2Utdmlldy1wcm9wcyc7XG5pbXBvcnQgeyBNb1JlcG9ydFZhbHVlUGlwZSB9IGZyb20gJy4uL3BpcGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbnR5cGUgUmVhc29uVG9TYXZlID0gJ1RBQicgfCAnQ1RSTCtFTlRFUicgfCAnQ0hFQ0tfQ0hBTkdFRCcgfCAnRVNDJyB8ICdNT1VTRURPV05fT1VUU0lERSc7XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JucmMtYmFzZS12aWV3LWl0ZW0tcHJvcHMnLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBCYXNlVmlld0l0ZW1Qcm9wc0NvbXBvbmVudCBleHRlbmRzIEJhc2VWaWV3UHJvcHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQE91dHB1dCgpIGFjdGlvbkxpc3RDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGl0bGU6IHN0cmluZzsgZGF0YT86IGFueSB9PigpO1xuICAgIEBWaWV3Q2hpbGQoJ2NhcnRhYmxlRm9ybVJlZicsIHsgc3RhdGljOiBmYWxzZSB9KSBfY2FydGFibGVGb3JtUmVmOiBGb3JtQ29tcG9uZW50O1xuICAgIEBJbnB1dCgpIGNoZWNrYm94Q29tcG9uZW50OiBFanJheU9sZ287XG4gICAgQElucHV0KCkgZGlzYWJsZUVsbGFwc2lzOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgZGV0YWlsc0NvbXBvbmVudD86IEVqcmF5T2xnbztcbiAgICBASW5wdXQoKSBkZXRhaWxzQ29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdO1xuICAgIEBJbnB1dCgpIGRldGFpbHNUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbW86IE1ldGFvYmplY3REYXRhTW9kZWw7XG4gICAgQElucHV0KCkgbW9EYXRhTGlzdENvdW50OiBudW1iZXI7XG4gICAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBsYXN0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzZGlydHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNDaGVja2VkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVEZXRhaWxzVGV4dDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93Vmlld0J1dHRvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc05ld0lubGluZU1vOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhUmVsYXRpb246IGFueTtcbiAgICBASW5wdXQoKSBoaWRlT3Blbkljb246IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5EaWFsb2c6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNNb2JpbGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByb3dJbmRpY2F0b3I6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZ3JvdXBTdW1tYXJ5OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzTGFzdENoaWxkR3JvdXA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1Jvd051bWJlcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByb3dOdW1iZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBjb2xvcmluZ1JvdzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBub1NhdmVJbmxpbmVFZGl0SW5TZXJ2ZXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcm93SW5kaWNhdG9yQ29sb3I6IHN0cmluZztcbiAgICBASW5wdXQoKSBVbHZNYWluQ3RybHI6IFR5cGVVbHZNYWluQ3RybHI7XG4gICAgQElucHV0KCkgZmllbGREaWN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGFjdGlvbkxpc3Q6IGFueVtdO1xuXG4gICAgQElucHV0KCkgc2V0IHNlcmlhbGl6ZWRSZWxhdGVkTW8odmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc2VyaWFsaXplZFJlbGF0ZWRNbyA9IHZhbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FydGFibGVNbyh2YWwpO1xuICAgICAgICB0aGlzLl9jcmVhdGVDYXJ0YWJsZVBhcmFtcygpO1xuICAgIH1cbiAgICBASW5wdXQoKSBzZXQgY2FydGFibGVUZW1wbGF0ZSh2YWw6IEZvcm1TZXR0aW5nKSB7XG4gICAgICAgIHRoaXMuX2NhcnRhYmxlVGVtcGxhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUNhcnRhYmxlUGFyYW1zKCk7XG4gICAgfVxuICAgIEBJbnB1dCgpIHNldCBjYXJ0YWJsZU1vKHZhbDogTWV0YW9iamVjdERhdGFNb2RlbCkge1xuICAgICAgICB0aGlzLl9jYXJ0YWJsZU1vID0gdmFsO1xuICAgICAgICB0aGlzLl91cGRhdGVDYXJ0YWJsZU1vKHRoaXMuX3NlcmlhbGl6ZWRSZWxhdGVkTW8pO1xuXG4gICAgICAgIHRoaXMuX2NyZWF0ZUNhcnRhYmxlUGFyYW1zKCk7XG4gICAgfVxuICAgIEBJbnB1dCgpIHNldCBjYXJ0YWJsZVdvcmtmbG93RGF0YSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jYXJ0YWJsZVdvcmtmbG93RGF0YSA9IHZhbDtcbiAgICAgICAgdGhpcy5fY3JlYXRlQ2FydGFibGVQYXJhbXMoKTtcbiAgICB9XG4gICAgLy8gQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICAvLyBvbk1vdXNlRG93bihlKTogdm9pZCB7XG4gICAgLy8gICAgIC8vIHdlIG1ha2Ugc3VyZSBvbmx5IGRyYWdnYWJsZXMgb24gdGhlIGRvY3VtZW50IGVsZW1lbnRzIGFyZSBzZWxlY3RlZFxuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgICAhdGhpcy5fZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuYWxsb3dJbmxpbmVFZGl0ICYmXG4gICAgLy8gICAgICAgICB0aGlzLmlzQ2hlY2tlZCAmJlxuICAgIC8vICAgICAgICAgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnV0dG9uJ1xuICAgIC8vICAgICApIHtcbiAgICAvLyAgICAgICAgIHRoaXMuZGVzZWxlY3RBbGwuZW1pdCgpO1xuICAgIC8vICAgICAgICAgLy8gdGhpcy5fc2F2ZUVkaXRlZE1vJC5uZXh0KCdNT1VTRURPV05fT1VUU0lERScpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgX2ZvY3VzVG9GaXJzdEVpZHRhYmxlQ29sdW1uID0gZmFsc2U7XG4gICAgX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4OiBudW1iZXI7XG4gICAgaW5saW5lRWRpdEluUmVwb3J0ID0gdHJ1ZTtcbiAgICBsYXlvdXQkOiBPYnNlcnZhYmxlPGFueT47XG4gICAgZm9ybVBhbmVsQ3RybHI6IGFueTtcbiAgICBzYXZpbmc6IGJvb2xlYW47XG4gICAgc2F2ZWQ6IGJvb2xlYW47XG4gICAgaW5Sb3cgPSB0cnVlO1xuICAgIGhhc0NhcnRhYmxlVGVtcGxhdGUgPSBmYWxzZTtcbiAgICBjYXJ0YWJsZVBhcmFtczoge1xuICAgICAgICBmb3JtU2V0dGluZzogRm9ybVNldHRpbmc7XG4gICAgICAgIG1vSWQ6IHN0cmluZztcbiAgICAgICAgdHlwZURlZklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHZpZXdJZDogYW55O1xuICAgICAgICBpbkRpYWxvZzogYm9vbGVhbjtcbiAgICAgICAgbG9hZEFjdGl2aXR5VmlldzogYm9vbGVhbjtcbiAgICB9O1xuICAgIHdvcmtmbG93U3RhdGU6IHsgZXJyb3I6IGFueTsgc3RhdGU6ICdQZW5kaW5nJyB8ICdGaW5pc2gnIHwgJycgfTtcbiAgICBicnVsZUFjdGlvbk1lc3NhZ2U6IEJydWxlQWN0aW9uTWVzc2FnZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NhdmVFZGl0ZWRNbyQgPSBuZXcgU3ViamVjdDxSZWFzb25Ub1NhdmU+KCk7XG4gICAgcHJpdmF0ZSBfZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9mb3JtUGFuZWxMb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfY2FydGFibGVNbzogTWV0YW9iamVjdERhdGFNb2RlbDtcbiAgICBwcml2YXRlIF9jYXJ0YWJsZVRlbXBsYXRlOiBGb3JtU2V0dGluZztcbiAgICBwcml2YXRlIF9jYXJ0YWJsZVdvcmtmbG93RGF0YTogc3RyaW5nO1xuICAgIHByaXZhdGUgX3NlcmlhbGl6ZWRSZWxhdGVkTW86IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIF9lbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9kb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgcHJvdGVjdGVkIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlcG9ydFZhbHVlUGlwZTogTW9SZXBvcnRWYWx1ZVBpcGUsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByb3RlY3RlZCBfcGFyZW50Rm9ybVBhbmVsU2VydmljZTogRm9ybVBhbmVsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwcm90ZWN0ZWQgX2Zvcm1QYW5lbFNlcnZpY2U6IEZvcm1QYW5lbFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdWx2TWFpblNlcnZpY2U6IFVsdk1haW5TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3NhdmVFZGl0ZWRNbyRcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVhc29uOiBSZWFzb25Ub1NhdmUpID0+IHRoaXMuX2lubGluZUVkaXRTYXZlRm9ybVBhbmVsKHJlYXNvbikpLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gdGhyb3dFcnJvcigoKSA9PiBlcnIpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzOiB7IHJlYXNvbjogUmVhc29uVG9TYXZlOyBzdWNjZWVkOiBib29sZWFuOyBzYXZlZDogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vLiRJc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJC5uZXh0KCcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzLnJlYXNvbiA9PT0gJ1RBQicgfHwgcmVzLnJlYXNvbiA9PT0gJ0NUUkwrRU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dElubGluZVJlY29yZC5lbWl0KHRoaXMubW8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnJlYXNvbiA9PT0gJ0VTQycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsQ2FuY2VsLmVtaXQodGhpcy5tbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2Zvcm1wYW5lbFZhbHVlQ2hhbmdlZCRcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIC8vIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9zeW5jTW8oKSksXG4gICAgICAgICAgICAgICAgdGFwKChjKSA9PiB0aGlzLl9zeW5jTW8oKSksXG4gICAgICAgICAgICAgICAgdGFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5tby4kSW5saW5lTW9DaGFuZ2VkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tby4kSW5saW5lTW9DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsVmFsdWVDaGFuZ2UuZW1pdCh7IG1vOiB0aGlzLm1vLCBmaWVsZERiTmFtZTogYyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldCBfaGFzRm9ybVBhbmVsU2VydmljZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1QYW5lbFNlcnZpY2UgIT09IG51bGwgJiYgdGhpcy5mb3JtU2V0dGluZztcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5faGFzRm9ybVBhbmVsU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybVBhbmVsU2VydmljZS5jb250ZXh0JC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLnZpZXckLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0JCA9IHRoaXMuX2Zvcm1QYW5lbFNlcnZpY2UubGF5b3V0JDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICBjb25zdCB7IGlzQ2hlY2tlZCwgaW5saW5lRWRpdE1vZGUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGxldCBuZWVkVG9Mb2FkRm9ybSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmxpbmVFZGl0TW9kZSkge1xuICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNDaGVja2VkLmN1cnJlbnRWYWx1ZSAmJiBpc0NoZWNrZWQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmVlZFRvU2F2ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ0NIRUNLX0NIQU5HRUQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2VkLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBuZWVkVG9Mb2FkRm9ybSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NoZWNrZWQgJiYgIWlzQ2hlY2tlZC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFpc2VXb3JrZmxvd1NoYXJlQnV0dG9ucyhpc0NoZWNrZWQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5saW5lRWRpdE1vZGU/LmN1cnJlbnRWYWx1ZSAmJiAhaW5saW5lRWRpdE1vZGU/LnByZXZpb3VzVmFsdWUgJiYgdGhpcy5pc0NoZWNrZWQpIHtcbiAgICAgICAgICAgIG5lZWRUb0xvYWRGb3JtID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghaW5saW5lRWRpdE1vZGU/LmN1cnJlbnRWYWx1ZSAmJiBpbmxpbmVFZGl0TW9kZT8ucHJldmlvdXNWYWx1ZSAmJiB0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2F2ZUVkaXRlZE1vJC5uZXh0KCdFU0MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVlZFRvTG9hZEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRBbmRDcmVhdGVGb3JtUGFuZWxDdHJscigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm1vICYmICFjaGFuZ2VzLm1vLmZpcnN0Q2hhbmdlICYmIHRoaXMuaW5saW5lRWRpdE1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb3JtUGFuZWxMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGNoYW5nZXMubW8uY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiAobW8gJiYgIW1vLmZpcnN0Q2hhbmdlICYmIHRoaXMuX2hhc0Zvcm1QYW5lbFNlcnZpY2UgJiYgdGhpcy5pc0NoZWNrZWQgJiYgdGhpcy5pbmxpbmVFZGl0TW9kZSkge1xuICAgICAgICAvLyAgICAgLy90aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGNoYW5nZXMubW8uY3VycmVudFZhbHVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVBhbmVsQ3RybHIpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVBhbmVsQ3RybHIudW4oJ2JydWxlU2hvd01lc3NhZ2VBY3Rpb24nLCB0aGlzLl9oYW5kbGVCcnVsZVNob3dNZXNzYWdlQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPbkNhcnRhYmxlRm9ybUNsaWNrKGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGVja2VkKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dDaGVjayhvbmx5Q2hlY2s/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jvd0NoZWNrKG9ubHlDaGVjayk7XG4gICAgfVxuICAgIG9uUm93Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm93Q2xpY2suZW1pdCh7IG1vOiB0aGlzLm1vLCBpbmRleDogdGhpcy5pbmRleCB9KTtcbiAgICB9XG4gICAgb25Db2x1bW5DaGFuZ2VUb0VkaXRNb2RlKGVsRG9tOiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVzID0gZWxEb20ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgIGBidXR0b24sYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxbaHJlZl0saW5wdXQ6bm90KFtkaXNhYmxlZF0pLGlucHV0LFxuICAgICAgICAgICAgICAgIHNlbGVjdCxzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLHRleHRhcmVhLHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSlgXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gaW5kZXg7XG4gICAgICAgIGlmICghZm9jdXNhYmxlcy5sZW5ndGggfHwgdGhpcy5fZm9jdXNUb0ZpcnN0RWlkdGFibGVDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb2N1c1RvRmlyc3RFaWR0YWJsZUNvbHVtbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IGxhc3RGb2N1c2FibGUgPSBmb2N1c2FibGVzWzBdO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIChsYXN0Rm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIG9uVGFiS2V5RG93bihlLCBpbmRleCk6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICBQcmV2ZW50RGVmYXVsRXZlbnQoZSk7XG4gICAgICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ1RBQicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uRWRpdEZvcm1QYW5lbFNhdmUoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ0NUUkwrRU5URVInKTtcbiAgICB9XG4gICAgb25FZGl0Rm9ybVBhbmVsQ2FuY2VsKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lc2NhcGVLZXkuZW1pdCh0aGlzLm1vKTtcbiAgICB9XG4gICAgb25VbHZDb21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVsdkNvbW1hbmQuZW1pdCh7IG1vOiB0aGlzLm1vLCBpbmRleDogdGhpcy5pbmRleCB9KTtcbiAgICB9XG4gICAgb25BY3Rpb24oY29tbWFuZEJvZHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGlvbi5lbWl0KGNvbW1hbmRCb2R5KTtcbiAgICB9XG4gICAgb25FeHBhbmRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5leHBhbmRDbGljay5lbWl0KHRoaXMubW8pO1xuICAgIH1cbiAgICBvbkR5bmFtaWNDb21wb25lbnRFdmVudHMoZTogeyB0aXRsZTogc3RyaW5nOyBkYXRhPzogYW55IH0pOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChlLnRpdGxlKSB7XG4gICAgICAgICAgICBjYXNlICdyb3dDaGVjayc6XG4gICAgICAgICAgICAgICAgdGhpcy5vblJvd0NoZWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyb3dDbGljayc6XG4gICAgICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd1bHZDb21tYW5kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uVWx2Q29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DYXJ0YWJsZUZvcm1DbG9zZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FydGFibGVGb3JtQ2xvc2VkLmVtaXQoeyBtbzogdGhpcy5tbywgaW5kZXg6IHRoaXMuaW5kZXggfSk7XG4gICAgfVxuXG4gICAgb25DYXJ0YWJsZUJydWxlQWN0aW9uKGJydWxlQWN0aW9uOiBCcnVsZUFjdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQnJ1bGVTaG93TWVzc2FnZUFjdGlvbihicnVsZUFjdGlvbik7XG4gICAgfVxuICAgIG9uQ2FydGFibGVBZnRlclRhbnNpdGlvbihlKTogdm9pZCB7XG4gICAgICAgIHRoaXMud29ya2Zsb3dTdGF0ZSA9IHtcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmJydWxlQWN0aW9uTWVzc2FnZSA/IHRoaXMuYnJ1bGVBY3Rpb25NZXNzYWdlIDogZS5lcnJvcixcbiAgICAgICAgICAgIHN0YXRlOiAnRmluaXNoJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBvbkNhcnRhYmxlQmVmb3JlVGFuc2l0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLndvcmtmbG93U3RhdGUgPSB7IHN0YXRlOiAnUGVuZGluZycsIGVycm9yOiBudWxsIH07XG4gICAgICAgIC8vIHRoaXMud29ya2Zsb3dTdGF0ZUNoYW5nZWQuZW1pdCh0aGlzLndvcmtmbG93U3RhdGUpO1xuICAgIH1cbiAgICBvblJlc2V0V29ya2Zsb3dTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVzZXRXb3JrZmxvd1N0YXRlKCk7XG4gICAgfVxuICAgIF90cmFja0J5Q29sdW1uKGluZGV4OiBudW1iZXIsIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtjb2x1bW4uTmFtZX0ke2luZGV4fWA7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaGFuZGxlUmVzZXRXb3JrZmxvd1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJydWxlQWN0aW9uTWVzc2FnZSA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya2Zsb3dTdGF0ZSA9IHsgc3RhdGU6ICcnLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUNhcnRhYmxlTW8oc2VyaWFsaXplTW86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoc2VyaWFsaXplTW8gJiYgdGhpcy5fY2FydGFibGVNbykge1xuICAgICAgICAgICAgc2VyaWFsaXplTW8gPSBgJHtzZXJpYWxpemVNb31gO1xuICAgICAgICAgICAgY29uc3QgbW8gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKHNlcmlhbGl6ZU1vKTtcbiAgICAgICAgICAgIHRoaXMuX2NhcnRhYmxlTW8gPSB7IC4uLnRoaXMuX2NhcnRhYmxlTW8sIC4uLm1vIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jcmVhdGVDYXJ0YWJsZVBhcmFtcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGNhcnRhYmxlVGVtcGxhdGUgPSB0aGlzLl9jYXJ0YWJsZVRlbXBsYXRlO1xuICAgICAgICBjb25zdCBjYXJ0YWJsZU1vID0gdGhpcy5fY2FydGFibGVNbztcbiAgICAgICAgY29uc3QgY2FydGFibGVXb3JrZmxvd0RhdGEgPSB0aGlzLl9jYXJ0YWJsZVdvcmtmbG93RGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2FydGFibGVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgLy8gVE9ETyB1cGRhdGUgY2FydGFibGUgbW87XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FydGFibGVUZW1wbGF0ZSAmJlxuICAgICAgICAgICAgY2FydGFibGVNbyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhcnRhYmxlV29ya2Zsb3dEYXRhICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZFJlbGF0ZWRNb1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhcnRhYmxlVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBjYXJ0YWJsZVRlbXBsYXRlLlZpZXc7XG4gICAgICAgICAgICBjYXJ0YWJsZVRlbXBsYXRlLkRhdGEgPSB7IE1vOiB7IC4uLmNhcnRhYmxlTW8gfSB9O1xuICAgICAgICAgICAgY2FydGFibGVUZW1wbGF0ZS5Xb3JrZmxvdyA9IGNhcnRhYmxlV29ya2Zsb3dEYXRhID09PSAnJyA/IG51bGwgOiBKU09OLnBhcnNlKGNhcnRhYmxlV29ya2Zsb3dEYXRhKTtcbiAgICAgICAgICAgIGlmICghdmlldy5FeHRyYUpzb25Qcm9wKSB7XG4gICAgICAgICAgICAgICAgdmlldy5FeHRyYUpzb25Qcm9wID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LkV4dHJhSnNvblByb3AuSXNTaW1wbGUgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmNhcnRhYmxlUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGZvcm1TZXR0aW5nOiBjYXJ0YWJsZVRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG1vSWQ6IGNhcnRhYmxlTW8uSWQsXG4gICAgICAgICAgICAgICAgdHlwZURlZklkOiBjYXJ0YWJsZU1vLiRUeXBlRGVmSWQsXG4gICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3LlR5cGVWaWV3SWQsXG4gICAgICAgICAgICAgICAgaW5EaWFsb2c6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxvYWRBY3Rpdml0eVZpZXc6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmhhc0NhcnRhYmxlVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbmVlZFRvU2F2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKCF0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnN0IGlzQ2hpbGROb2RlID0gKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNvbnRhaW5zKGUudGFyZ2V0KTtcbiAgICAgICAgLy8gaWYgKGlzQ2hpbGROb2RlKSB7XG4gICAgICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIH1cbiAgICAgICAgY29uc3QgdCA9IHRoaXMuaW5saW5lRWRpdE1vZGUgJiYgdGhpcy5faGFzRm9ybVBhbmVsU2VydmljZTtcbiAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtUGFuZWxDdHJsciAmJiB0aGlzLmZvcm1QYW5lbEN0cmxyLklzTW9DaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaGVja2ZvY3VzT3V0RnJvbVJvdyh0YXJnZXQpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc3QgZm9jdXNhYmxlOiBOb2RlTGlzdCA9IHRoaXMuX2ZvY3VzYWJsZUNvbnRyb2xzO1xuICAgICAgICAvLyBsZXQgZm91bmRJbkZvY3VzYWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBmb2N1c2FibGUuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKGMgPT09IHRhcmdldCkge1xuICAgICAgICAvLyAgICAgICAgIGZvdW5kSW5Gb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gaWYgKCFmb3VuZEluRm9jdXNhYmxlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ1RBQicpO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBfcm93Q2hlY2sob25seUNoZWNrPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJvd0NoZWNrLmVtaXQoeyBtbzogdGhpcy5tbywgaW5kZXg6IHRoaXMuaW5kZXgsIG9ubHlDaGVjayB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaXNlV29ya2Zsb3dTaGFyZUJ1dHRvbnMoaXNDaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRhYmxlUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VMaXN0OiBDaG9pY2VEZWZbXSA9IHRoaXMuY2FydGFibGVQYXJhbXMuZm9ybVNldHRpbmc/LldvcmtmbG93Py5DaG9pY2VMaXN0O1xuICAgICAgICAgICAgaWYgKGNob2ljZUxpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtmbG93U2hhcmVCdXR0b25zLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVBhbmVsQ3RybHI6IHRoaXMuX2NhcnRhYmxlRm9ybVJlZi5mb3JtUGFuZWxDdHJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW86IHRoaXMubW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiBpc0NoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVZhbHVlQ2hhbmdlKGZvcm1QYW5lbEN0cmwsIGZpZWxkQ3RybHIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJvd0NoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJC5uZXh0KGZpZWxkQ3RybHI/LlNldHRpbmc/LkNvbnRyb2xOYW1lKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zeW5jTW8oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN5bmNXaXRoRm9ybXBhbmVsTW8gPSB0aGlzLm1vO1xuICAgICAgICBjb25zdCBfaXNDaGVja2VkID0gdGhpcy5tby4kSXNDaGVja2VkO1xuICAgICAgICBjb25zdCBmb3JtUGFuZWxDdHJsck1vID0gdGhpcy5mb3JtUGFuZWxDdHJsci5NbztcbiAgICAgICAgdGhpcy5fdXBkYXRlV2l0aE9yaWdpbmFsVmFsdWVzKGZvcm1QYW5lbEN0cmxyTW8sIHN5bmNXaXRoRm9ybXBhbmVsTW8pO1xuICAgICAgICBzeW5jV2l0aEZvcm1wYW5lbE1vWyckT3JpZ2luYWxWYWx1ZXMnXSA9IGZvcm1QYW5lbEN0cmxyTW9bJyRPcmlnaW5hbFZhbHVlcyddO1xuICAgICAgICBzeW5jV2l0aEZvcm1wYW5lbE1vWyckRmllbGREaWN0J10gPSBmb3JtUGFuZWxDdHJsck1vWyckRmllbGREaWN0J107XG4gICAgICAgIHN5bmNXaXRoRm9ybXBhbmVsTW9bJyRTdGF0ZSddID0gZm9ybVBhbmVsQ3RybHJNb1snJFN0YXRlJ107IC8vIHRoaXMgYWRkIGJlY2F1c2UgaWYgd2UgZWRpdCB1bmNoYW5nZWQgbW8gaXQgZG9lcyBub3QgcmVmbGVjdCB0byBtbyBvZiB1bHYuXG4gICAgICAgIHRoaXMubW8gPSB7IC4uLnN5bmNXaXRoRm9ybXBhbmVsTW8gfTtcbiAgICAgICAgdGhpcy5tby4kSXNDaGVja2VkID0gX2lzQ2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIGZyb20oUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdXBkYXRlV2l0aE9yaWdpbmFsVmFsdWVzKHNvdXJjZTogTWV0YW9iamVjdERhdGFNb2RlbCwgZGVzdDogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UuJE9yaWdpbmFsVmFsdWVzKS5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRlc3RbY10gPSBzb3VyY2VbY107XG4gICAgICAgICAgICBpZiAoc291cmNlW2MgKyAnJENhcHRpb24nXSkge1xuICAgICAgICAgICAgICAgIGRlc3RbYyArICckQ2FwdGlvbiddID0gc291cmNlW2MgKyAnJENhcHRpb24nXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VbYyArICckSWNvbiddKSB7XG4gICAgICAgICAgICAgICAgZGVzdFtjICsgJyRJY29uJ10gPSBzb3VyY2VbYyArICckSWNvbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaXNlRm9ybVBhbmVsVmFsdWVDaGFuZ2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRGb3JtUGFuZWxWYWx1ZUNoYW5nZS5lbWl0KHsgbW86IHRoaXMubW8gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVCcnVsZVNob3dNZXNzYWdlQWN0aW9uKGFjdGlvbjogQnJ1bGVBY3Rpb25NZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbi5NZXNzYWdlRXhwcmVzc2lvbkh0bWwgPSB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoYWN0aW9uLk1lc3NhZ2VFeHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5icnVsZUFjdGlvbk1lc3NhZ2UgPSBhY3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBfY3JlYXRlRm9ybVBhbmVsQ3RybHIobW86IE1ldGFvYmplY3REYXRhTW9kZWwsIHR5cGVEZWZJZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1QYW5lbEN0cmxyKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyID0gY3JlYXRlR3JpZEVkaXRvckZvcm1QYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1TZXR0aW5nLFxuICAgICAgICAgICAgICAgIHsgLi4ubW8gfSxcbiAgICAgICAgICAgICAgICB0eXBlRGVmSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuaW5Sb3csXG4gICAgICAgICAgICAgICAgdGhpcy5VbHZNYWluQ3RybHJcbiAgICAgICAgICAgICAgICAvLyBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZSh0aGlzLmNvbnRleHQuU2V0dGluZywgJ0V4dHJhLlJlbGF0aW9uJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5JbmxpbmVFZGl0SW5SZXBvcnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLm9uKHtcbiAgICAgICAgICAgIGJydWxlU2hvd01lc3NhZ2VBY3Rpb246IHRoaXMuX2hhbmRsZUJydWxlU2hvd01lc3NhZ2VBY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlOiB0aGlzLl9oYW5kbGVWYWx1ZUNoYW5nZS5iaW5kKHRoaXMpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1QYW5lbEN0cmxyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbG9hZEFuZENyZWF0ZUZvcm1QYW5lbEN0cmxyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtU2V0dGluZ0RhdGEgPSB0aGlzLmZvcm1TZXR0aW5nLkRhdGE7XG4gICAgICAgIGNvbnN0IGZvcm1NbyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMubW8sXG4gICAgICAgICAgICAkRmllbGREaWN0OiBmb3JtU2V0dGluZ0RhdGEuTW8uJEZpZWxkRGljdCxcbiAgICAgICAgICAgICRUeXBlRGVmSWQ6IGZvcm1TZXR0aW5nRGF0YS5Nby4kVHlwZURlZklkLFxuICAgICAgICAgICAgJE9yaWdpbmFsVmFsdWVzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fZm9ybVBhbmVsTG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGZvcm1Nbyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jcmVhdGVGb3JtUGFuZWxDdHJscihmb3JtTW8sIHRoaXMudHlwZURlZklkKTtcbiAgICAgICAgdGhpcy5fZm9ybVBhbmVsTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZm9ybVBhbmVsQ3RybHIgPSB0aGlzLmZvcm1QYW5lbEN0cmxyO1xuICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlVsdk1vRGF0YUxpc3RDb3VudCA9IHRoaXMubW9EYXRhTGlzdENvdW50IC0gMTtcbiAgICAgICAgZm9ybVBhbmVsQ3RybHIuTG9hZEFuZENyZWF0ZShudWxsLCBmYWxzZSwgZmFsc2UsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvcm1QYW5lbFVpID0gZm9ybVBhbmVsQ3RybHIuQWRhcHRlci5Db250cm9sO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TW8gPSB0aGlzLl9wYXJlbnRGb3JtUGFuZWxTZXJ2aWNlID8gdGhpcy5fcGFyZW50Rm9ybVBhbmVsU2VydmljZS5tbyA6IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5leHRyYVJlbGF0aW9uICYmIHBhcmVudE1vICYmIHRoaXMuZXh0cmFSZWxhdGlvbi5SZWxhdGlvblR5cGUgPT09ICdDb21wb3NpdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3JtUGFuZWxDdHJsci5Nby5TZXRGVmFsdWUodGhpcy5leHRyYVJlbGF0aW9uLlBhcmVudEZkTmFtZSwgcGFyZW50TW8pO1xuICAgICAgICAgICAgICAgIC8vIG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vW3JlbGF0aW9uLlBhcmVudEZkTmFtZV0gPSBwYXJlbnRNby5HZXRDaGFuZ2VkT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgLy8gbmV3Rm9ybVNldHRpbmdzLkRhdGEuTW9bcmVsYXRpb24uUGFyZW50RmROYW1lXS4kU3RhdGUgPSBwYXJlbnRNby4kU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXN0b21Gb3JtUGFuZWxVaS5SZWZyZXNoID0gKCkgPT4ge307XG4gICAgICAgICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLmNvbnRleHQgPSBmb3JtUGFuZWxDdHJsci5BZGFwdGVyLkNvbnRyb2w7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0U2F2aW5nU3RhdGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJ1bGVBY3Rpb25NZXNzYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfc2V0U2F2aW5nU3RhdGUoZXJyKTogdm9pZCB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlZCA9IHRydWU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5saW5lRWRpdFNhdmVGb3JtUGFuZWwocmVhc29uKTogUHJvbWlzZTx7IHJlYXNvbjogUmVhc29uVG9TYXZlOyBzdWNjZWVkOiBib29sZWFuOyBzYXZlZDogYm9vbGVhbiB9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHsgcmVhc29uOiBSZWFzb25Ub1NhdmU7IHN1Y2NlZWQ6IGJvb2xlYW47IHNhdmVkOiBib29sZWFuIH0+KChyZXNvbHZlLCBfKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybVBhbmVsQ3RybHIuSXNNb0NoYW5nZWQoKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHN0YXRlIG9mIG1vIGlzIG5ldyBvciBtb2RpZGZpZWQgdGhlbiBpdCBuZWVkcyB0byB1cGRhdGVcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgcmVhc29uLCBzdWNjZWVkOiB0cnVlLCBzYXZlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmb3JtUGFuZWxDdHJsck1vID0gdGhpcy5mb3JtUGFuZWxDdHJsci5NbztcbiAgICAgICAgICAgIGRlbGV0ZSBmb3JtUGFuZWxDdHJsck1vLmpzb247XG4gICAgICAgICAgICAvLyB0aGlzLnNhdmluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMubW8uJElubGluZU1vQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsU2F2ZS5lbWl0KHRoaXMubW8pO1xuICAgICAgICAgICAgdGhpcy5icnVsZUFjdGlvbk1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMubm9TYXZlSW5saW5lRWRpdEluU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHJlYXNvbiwgc3VjY2VlZDogdHJ1ZSwgc2F2ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5TYXZlKGZhbHNlLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldElzQ2hhbmdlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U2F2aW5nU3RhdGUoZXJyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgcmVhc29uLCBzdWNjZWVkOiB0cnVlLCBzYXZlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|