barsa-novin-ray-core 2.2.73 → 2.2.75

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.
Files changed (233) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +630 -651
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/lib/abstract-classes/field-base.d.ts +1 -1
  4. package/lib/abstract-classes/number-base.d.ts +1 -1
  5. package/lib/date-services/date-hijri.service.d.ts +1 -1
  6. package/lib/date-services/date.service.d.ts +1 -1
  7. package/lib/directives/base.directive.d.ts +1 -1
  8. package/lib/dynamic-component/base-view-item-props.d.ts +4 -4
  9. package/lib/resolvers/login-settings.resolver.d.ts +1 -1
  10. package/lib/resolvers/tile-group-breadcrumb.resolver.d.ts +1 -1
  11. package/lib/services/notification.service.d.ts +2 -2
  12. package/lib/services/portal.service.d.ts +1 -1
  13. package/package.json +3 -5
  14. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  15. package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
  16. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  17. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
  18. package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
  19. package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
  20. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  21. package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
  22. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  23. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
  24. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  25. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
  26. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
  27. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  28. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
  29. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
  30. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  31. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  32. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  33. package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
  34. package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
  35. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
  36. package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
  37. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
  38. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
  39. package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
  40. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
  41. package/esm2022/lib/auth-guard.mjs +0 -48
  42. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
  43. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
  44. package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
  45. package/esm2022/lib/base.module.mjs +0 -28
  46. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
  47. package/esm2022/lib/constants.mjs +0 -963
  48. package/esm2022/lib/container.component.mjs +0 -100
  49. package/esm2022/lib/controllers/base-controller.mjs +0 -9
  50. package/esm2022/lib/controllers/base-view.mjs +0 -24
  51. package/esm2022/lib/controllers/index.mjs +0 -4
  52. package/esm2022/lib/controllers/models.mjs +0 -2
  53. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  54. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  55. package/esm2022/lib/date-services/date-info.mjs +0 -2
  56. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  57. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  58. package/esm2022/lib/date-services/date.service.mjs +0 -149
  59. package/esm2022/lib/date-services/index.mjs +0 -6
  60. package/esm2022/lib/device.mjs +0 -663
  61. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
  62. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
  63. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
  64. package/esm2022/lib/directives/base.directive.mjs +0 -55
  65. package/esm2022/lib/directives/body-click.directive.mjs +0 -36
  66. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
  67. package/esm2022/lib/directives/copy.directive.mjs +0 -60
  68. package/esm2022/lib/directives/count-down.directive.mjs +0 -109
  69. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
  70. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
  71. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
  72. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
  73. package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
  74. package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
  75. package/esm2022/lib/directives/form-close.directive.mjs +0 -33
  76. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
  77. package/esm2022/lib/directives/index.mjs +0 -42
  78. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
  79. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
  80. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
  81. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
  82. package/esm2022/lib/directives/mobile.directive.mjs +0 -30
  83. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
  84. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
  85. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
  86. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
  87. package/esm2022/lib/directives/print-files.directive.mjs +0 -39
  88. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
  89. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
  90. package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
  91. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
  92. package/esm2022/lib/directives/save-image.directive.mjs +0 -28
  93. package/esm2022/lib/directives/splide-slider.directive.mjs +0 -113
  94. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
  95. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
  96. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
  97. package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
  98. package/esm2022/lib/directives/webotp.directive.mjs +0 -49
  99. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
  100. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
  101. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
  102. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
  103. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
  104. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
  105. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
  106. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  107. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
  108. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
  109. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
  110. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  111. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
  112. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  113. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
  114. package/esm2022/lib/form/form.component.mjs +0 -212
  115. package/esm2022/lib/form-new/form-new.component.mjs +0 -31
  116. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  117. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  118. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  119. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  120. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  121. package/esm2022/lib/global-error-handler.mjs +0 -26
  122. package/esm2022/lib/injdection-tokens.mjs +0 -8
  123. package/esm2022/lib/modal-root.component.mjs +0 -34
  124. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  125. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  126. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
  127. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
  128. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
  129. package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
  130. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
  131. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
  132. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
  133. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
  134. package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
  135. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
  136. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
  137. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
  138. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
  139. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
  140. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
  141. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
  142. package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
  143. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
  144. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
  145. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
  146. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
  147. package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
  148. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
  149. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
  150. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
  151. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
  152. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
  153. package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
  154. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
  155. package/esm2022/lib/pipes/index.mjs +0 -55
  156. package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
  157. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
  158. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
  159. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
  161. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
  162. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
  163. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
  164. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
  165. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
  166. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
  167. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
  168. package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
  169. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
  170. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
  171. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
  172. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
  173. package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
  174. package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
  175. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  176. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
  177. package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
  178. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
  179. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
  180. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
  181. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
  182. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
  183. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  184. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  185. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  186. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  187. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
  188. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  189. package/esm2022/lib/resolvers/index.mjs +0 -7
  190. package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
  191. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  192. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  193. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  194. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  195. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  196. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  197. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -236
  198. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  199. package/esm2022/lib/services/api.service.mjs +0 -63
  200. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  201. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  202. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  203. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  204. package/esm2022/lib/services/column.service.mjs +0 -20
  205. package/esm2022/lib/services/container.service.mjs +0 -69
  206. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  207. package/esm2022/lib/services/form-panel.service.mjs +0 -394
  208. package/esm2022/lib/services/form.service.mjs +0 -14
  209. package/esm2022/lib/services/groupby.service.mjs +0 -21
  210. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  211. package/esm2022/lib/services/index.mjs +0 -32
  212. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  213. package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
  214. package/esm2022/lib/services/layout.service.mjs +0 -42
  215. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  216. package/esm2022/lib/services/log.service.mjs +0 -50
  217. package/esm2022/lib/services/network-status.service.mjs +0 -15
  218. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  219. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  220. package/esm2022/lib/services/notification.service.mjs +0 -189
  221. package/esm2022/lib/services/portal.service.mjs +0 -950
  222. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  223. package/esm2022/lib/services/routing.service.mjs +0 -60
  224. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  225. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  226. package/esm2022/lib/services/tabpage.service.mjs +0 -13
  227. package/esm2022/lib/services/toast.service.mjs +0 -2
  228. package/esm2022/lib/services/ui.service.mjs +0 -23
  229. package/esm2022/lib/services/ulvmain.service.mjs +0 -824
  230. package/esm2022/lib/services/upload.service.mjs +0 -166
  231. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  232. package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
  233. package/esm2022/public-api.mjs +0 -42
@@ -1,950 +0,0 @@
1
- import { Inject, Injectable, NgModuleFactory } from '@angular/core';
2
- import { DOCUMENT } from '@angular/common';
3
- import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject, combineLatest } from 'rxjs';
4
- import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime, filter } from 'rxjs/operators';
5
- import { BarsaApi } from '../abstract-classes/barsa-api';
6
- import { ExecuteDynamicCommand, getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
7
- import { PortalPageResolver } from '../resolvers/portal-page.resolver';
8
- import { AuthGuard } from '../auth-guard';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./dynamic-component.service";
11
- import * as i2 from "./api.service";
12
- import * as i3 from "./log.service";
13
- import * as i4 from "./barsa-dialog.service";
14
- import * as i5 from "@angular/router";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "./local-storage.service";
17
- export class PortalService {
18
- constructor(dcm, apiService, logService, dialogService, compiler, _router, _location, _localStorage, _document) {
19
- this.dcm = dcm;
20
- this.apiService = apiService;
21
- this.logService = logService;
22
- this.dialogService = dialogService;
23
- this.compiler = compiler;
24
- this._router = _router;
25
- this._location = _location;
26
- this._localStorage = _localStorage;
27
- this._document = _document;
28
- this.offsetTop = 0;
29
- this.loginLoading = new BehaviorSubject(false);
30
- this.loaded = false;
31
- this.formPanels = {};
32
- this.cachedImages = {};
33
- this.cachedPageData = {};
34
- this.pages = [];
35
- this.rtlSource = new BehaviorSubject(true);
36
- this.dictionary = {};
37
- this.portalDataSource = new BehaviorSubject(null);
38
- this.openForm$ = new Subject();
39
- this._isAnonumousSource = new BehaviorSubject(true);
40
- this._pushAction$ = new BehaviorSubject(null);
41
- this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
42
- this._loggedInSource = new BehaviorSubject(false);
43
- this.routeInitializedSource = new BehaviorSubject(false);
44
- this.dateTextSource = new BehaviorSubject('');
45
- this._navigationStart$ = new BehaviorSubject(null);
46
- this._navigationEnd$ = new BehaviorSubject(null);
47
- this._userPortalSettings$ = new BehaviorSubject({});
48
- this._cssUrlSource = new BehaviorSubject(null);
49
- this._cssVariableUrlSource = new BehaviorSubject(null);
50
- this._cssCustomUrlSource = new BehaviorSubject(null);
51
- this._searchTerm$ = new BehaviorSubject('');
52
- this._windowResize$ = new Subject();
53
- this._deviceLandscape$ = new BehaviorSubject(!window.matchMedia('(orientation: portrait)').matches);
54
- this._standalone$ = new BehaviorSubject(window.matchMedia('(display-mode: standalone)').matches);
55
- this._documentVisibilitychange$ = new Subject();
56
- this.initialize();
57
- this._initLandscape();
58
- this._initStandalone();
59
- this._initVisibilityChange();
60
- this._initPushActions();
61
- }
62
- get isRtl() {
63
- return this.rtlSource.getValue();
64
- }
65
- get userLoggedIn() {
66
- return this._loggedInSource.getValue();
67
- }
68
- get pushAction$() {
69
- return this._pushAction$.asObservable().pipe();
70
- }
71
- get documentVisibilitychange$() {
72
- return this._documentVisibilitychange$.asObservable();
73
- }
74
- get isStandalone() {
75
- return this._standalone$.getValue();
76
- }
77
- get standalone$() {
78
- return this._standalone$.asObservable();
79
- }
80
- get landscape$() {
81
- return this._deviceLandscape$.asObservable();
82
- }
83
- get windowResize$() {
84
- return this._windowResize$.asObservable().pipe(debounceTime(300));
85
- }
86
- get portalData() {
87
- return this.portalDataSource.getValue();
88
- }
89
- get searchTerm$() {
90
- return this._searchTerm$.asObservable();
91
- }
92
- get cssUrl$() {
93
- return this._cssUrlSource.asObservable().pipe(distinctUntilChanged());
94
- }
95
- get cssVariableUrl$() {
96
- return this._cssVariableUrlSource.asObservable().pipe(distinctUntilChanged());
97
- }
98
- get cssCustomUrl$() {
99
- return this._cssCustomUrlSource.asObservable();
100
- }
101
- get userPortalSettings() {
102
- return this._userPortalSettings$.getValue();
103
- }
104
- get userPortalSettings$() {
105
- return this._userPortalSettings$.asObservable();
106
- }
107
- get deviceSize() {
108
- return this._deviceSizeSource.getValue();
109
- }
110
- get isAnonymous$() {
111
- return this._isAnonumousSource.asObservable();
112
- }
113
- get navigationEnd$() {
114
- return this._navigationEnd$.asObservable();
115
- }
116
- get navigationStart$() {
117
- return this._navigationStart$.asObservable();
118
- }
119
- loadMo(id, typedefId) {
120
- return this.apiService.loadPortalPageData(id, typedefId);
121
- }
122
- setSiteImageUrl(backgroundColor, imageUrl) {
123
- this.imageUrl = imageUrl;
124
- this.backgroundColor = backgroundColor;
125
- }
126
- pushActionNext(pushAction) {
127
- this._localStorage.setItem('pushAction', JSON.stringify(pushAction));
128
- this._pushAction$.next(pushAction);
129
- }
130
- setSearchTerm(term) {
131
- this._searchTerm$.next(term);
132
- }
133
- windowResize() {
134
- this._windowResize$.next();
135
- }
136
- naviationEnd(event) {
137
- this._navigationEnd$.next(event);
138
- }
139
- naviationStart(event) {
140
- this._navigationStart$.next(event);
141
- }
142
- setUserPortalSettings(userPortalSettings) {
143
- const value = this._userPortalSettings$.getValue();
144
- if (userPortalSettings.$TypeDefName) {
145
- value[userPortalSettings.$TypeDefName] = userPortalSettings;
146
- this._userPortalSettings$.next({ ...value });
147
- }
148
- }
149
- setCssUrlTheme(themeUrl, cssVariableUrl) {
150
- this._cssUrlSource.next(themeUrl);
151
- this._cssCustomUrlSource.next(themeUrl);
152
- if (cssVariableUrl) {
153
- this._cssVariableUrlSource.next(cssVariableUrl);
154
- }
155
- }
156
- setData(key, data) {
157
- if (!this.dictionary[key]) {
158
- this.dictionary[key] = new BehaviorSubject(data);
159
- this.dictionary[key].next(data);
160
- }
161
- else {
162
- const oldVal = this.dictionary[key].getValue();
163
- if (oldVal !== data) {
164
- this.dictionary[key].next(data);
165
- }
166
- }
167
- }
168
- getData(key, defaultValue = null) {
169
- if (!this.dictionary[key]) {
170
- this.dictionary[key] = new BehaviorSubject(defaultValue);
171
- }
172
- return this.dictionary[key].asObservable();
173
- }
174
- getDataSync(key, defaultValue = null) {
175
- if (!this.dictionary[key]) {
176
- return defaultValue;
177
- }
178
- return this.dictionary[key].getValue();
179
- }
180
- createForReport(navItem) {
181
- return from(new Promise((resolve, reject) => {
182
- BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
183
- if (err) {
184
- reject(err);
185
- }
186
- else {
187
- resolve(result);
188
- }
189
- });
190
- }));
191
- }
192
- renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
193
- return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
194
- }
195
- getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
196
- const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
197
- const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
198
- return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
199
- const componentInstance = component.instance;
200
- componentInstance.id = customUlvMainUi.id;
201
- componentInstance.context = customUlvMainUi;
202
- componentInstance.isReportPage = isReportPage;
203
- customUlvMainUi.controlUi = componentInstance;
204
- return component;
205
- }));
206
- }
207
- initialize() {
208
- this.deviceSize$ = this._deviceSizeSource.asObservable();
209
- this.portalData$ = this.portalDataSource.asObservable();
210
- this.rtl$ = this.rtlSource.asObservable();
211
- this.userLoggedIn$ = this._loggedInSource
212
- .asObservable()
213
- .pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
214
- this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
215
- this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
216
- this._standalone$.asObservable().subscribe((c) => {
217
- if (c) {
218
- this._document.body.classList.add('standalone');
219
- }
220
- else {
221
- this._document.body.classList.add('noStandalone');
222
- }
223
- });
224
- this._deviceLandscape$.asObservable().subscribe((c) => {
225
- if (c) {
226
- this._document.body.classList.add('landscape');
227
- }
228
- });
229
- this._deviceSizeSource.asObservable().subscribe((c) => {
230
- if (c === 's') {
231
- this._document.body.classList.add('smalldevice');
232
- }
233
- });
234
- this.dateText$ = this.dateTextSource.asObservable();
235
- this.portalSettings$ = this.portalDataSource
236
- .asObservable()
237
- .pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
238
- fromEvent(window, 'resize')
239
- .pipe(startWith(null), debounceTime(1000))
240
- .subscribe((c) => {
241
- this._windowResize$.next();
242
- this._setDeviceSize();
243
- });
244
- }
245
- _setDeviceSize() {
246
- const deviceSize = this._initalizeDeviceSize();
247
- this._deviceSizeSource.next(deviceSize);
248
- }
249
- _initalizeDeviceSize() {
250
- const _ismobile = getDeviceIsMobile();
251
- if (_ismobile) {
252
- BarsaApi.Bw.IsMobile = true;
253
- }
254
- const _isTablet = getDeviceIsTablet();
255
- let _windoWSize = 's';
256
- if (window.innerWidth <= 600) {
257
- _windoWSize = 's';
258
- }
259
- else if (window.innerWidth > 600 && window.innerWidth <= 992) {
260
- _windoWSize = 'm';
261
- }
262
- else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
263
- _windoWSize = 'l';
264
- }
265
- else {
266
- _windoWSize = 'xl';
267
- }
268
- if (_ismobile && _windoWSize !== 'l' && _windoWSize !== 'xl' && _windoWSize !== 'm') {
269
- return 's';
270
- }
271
- if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
272
- return 'm';
273
- }
274
- return _windoWSize;
275
- }
276
- compileModule(dependency) {
277
- const module$ = this.getModule(dependency);
278
- return module$.pipe(concatMap((modules) => {
279
- const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
280
- return of(moduleFactory);
281
- }));
282
- }
283
- getModule(dependency) {
284
- const { name, kebabName, umd, exportAs } = dependency;
285
- const base = `/assets/modules/${kebabName}/bundles`;
286
- const date = BarsaApi.LoginFormData.abc;
287
- const path = `${base}/${kebabName}.umd.js?t=${date}`;
288
- return of(true).pipe(concatMap(() => {
289
- const modules = this.getRegisteredModules(umd, exportAs, name);
290
- if (modules) {
291
- return of(modules);
292
- }
293
- return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
294
- }));
295
- }
296
- setValueOnObject(path, index, modules, object) {
297
- const splited = path.split('.');
298
- const prop = splited[index];
299
- if (typeof object[prop] === typeof undefined) {
300
- object[prop] = {};
301
- }
302
- if (index === splited.length - 1) {
303
- object[prop] = modules;
304
- return;
305
- }
306
- this.setValueOnObject(path, index + 1, modules, object[prop]);
307
- }
308
- getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
309
- return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
310
- }
311
- loadJs$(path) {
312
- return from(new Promise((resolve, reject) => {
313
- const script = document.createElement('script');
314
- script.setAttribute('type', 'text/javascript');
315
- script.setAttribute('src', path);
316
- script.onload = () => {
317
- resolve(path);
318
- };
319
- document.getElementsByTagName('head')[0].appendChild(script);
320
- setTimeout(() => {
321
- reject();
322
- }, 5000);
323
- }));
324
- }
325
- ReportExecuteById(reportId) {
326
- const ulvParams = this._getUlvParamsBy('', reportId);
327
- return from(this._reportExecutePromise(ulvParams));
328
- }
329
- ReportExecute(reportName) {
330
- return from(this.ReportExecutePromise(reportName));
331
- }
332
- ReportExecutePromise(reportName) {
333
- const ulvParams = this._getUlvParamsBy(reportName);
334
- return this._reportExecutePromise(ulvParams);
335
- }
336
- _getUlvParamsBy(reportName, reportId) {
337
- return {
338
- Flags: {
339
- Data: 'True',
340
- Extra: 'False',
341
- Search: 'False',
342
- View: 'False'
343
- // General:"False", // ulvmainctrl does not craete ui control raise error
344
- },
345
- ReportName: reportName,
346
- ReportId: reportId,
347
- UsageEnum: 'SystemContainer'
348
- };
349
- }
350
- _reportExecutePromise(ulvParams) {
351
- return new Promise((resolve, reject) => {
352
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
353
- resolve(result.Data);
354
- }, (err) => {
355
- reject(err);
356
- });
357
- });
358
- }
359
- addFormPanelCtrlr(id, formpanelCtrlr) {
360
- this.formPanels[id] = formpanelCtrlr;
361
- }
362
- setUserLoginStatus(status) {
363
- this._loggedInSource.next(status);
364
- }
365
- extractAllPages(portalData) {
366
- if (!portalData) {
367
- return;
368
- }
369
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
370
- this.addChildPages(pageData);
371
- });
372
- }
373
- extractAllPages_Old(portalData) {
374
- if (!portalData) {
375
- return;
376
- }
377
- const config = this._router.config;
378
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
379
- const path = pageData.Route.replace('/', '');
380
- config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
381
- if (pageData.IsDefaultRoute || pageData.IsDefaultRoute === 'True') {
382
- this.defaultRoute = path;
383
- config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
384
- }
385
- this.addChildPages(pageData);
386
- });
387
- this._router.resetConfig(config);
388
- if (this._location.path() === '') {
389
- // this._router.navigate([this.defaultRoute]);
390
- this._router.navigate(['']);
391
- }
392
- // this.routeInitialized();
393
- }
394
- ssoLogin() {
395
- AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
396
- // console.log(response);
397
- }, () => {
398
- alert('error in sso login.');
399
- }, null);
400
- }
401
- ssoLogout() {
402
- AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
403
- // console.log(response);
404
- }, () => {
405
- alert('error in sso logout.');
406
- }, null);
407
- }
408
- addChildPages(pageData) {
409
- this.pages.push(pageData);
410
- if (!pageData.ChildPageList?.MoDataList?.length) {
411
- return;
412
- }
413
- pageData.ChildPageList.MoDataList.forEach((childPage) => {
414
- this.addChildPages(childPage);
415
- });
416
- }
417
- /* eslint-disable */
418
- createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
419
- return {};
420
- }
421
- createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
422
- let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
423
- const umd = moduleName;
424
- modulePath = modulePath.substring(1, modulePath.length);
425
- const dynamicRoute = {};
426
- dynamicRoute.path = path;
427
- dynamicRoute.data = { pageData };
428
- if (!isDynamicRoute) {
429
- dynamicRoute.resolve = {
430
- pageData: PortalPageResolver
431
- };
432
- }
433
- if (path === '') {
434
- dynamicRoute.pathMatch = 'full';
435
- }
436
- if (redirectTo) {
437
- dynamicRoute.redirectTo = redirectTo;
438
- }
439
- else {
440
- if (hasAuthorized) {
441
- dynamicRoute.canActivate = [AuthGuard];
442
- }
443
- dynamicRoute.loadChildren = () => {
444
- const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
445
- const pageLibrary = {
446
- name: moduleName,
447
- kebabName: modulePath,
448
- umd,
449
- exportAs: [moduleName]
450
- };
451
- const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
452
- return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
453
- };
454
- }
455
- return dynamicRoute;
456
- }
457
- routeInitialized() {
458
- this.routeInitializedSource.next(true);
459
- }
460
- loginByAnonymous() {
461
- this.loginLoading.next(true);
462
- return this.apiService.loginPortal().pipe(map((result) => {
463
- if (typeof result === 'object' && result !== null) {
464
- this.logService.debug(result);
465
- window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
466
- return true;
467
- }
468
- else {
469
- return false;
470
- }
471
- }), finalize(() => {
472
- this.loginLoading.next(false);
473
- }));
474
- }
475
- getPageData(url, isRoot) {
476
- if (isRoot || url === '' || url === '/') {
477
- return this.portalData$;
478
- }
479
- if (url.indexOf('?') > -1) {
480
- url = url.substr(0, url.indexOf('?'));
481
- }
482
- if (this.cachedPageData[url]) {
483
- return this.cachedPageData[url];
484
- }
485
- const pageData = this.findPageByRoute(url);
486
- this.cachedPageData[url] = this.apiService
487
- .loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
488
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
489
- this.addChildRoute(pageMo, pageMo.ChildPageList);
490
- this.addChildPages(pageMo);
491
- }), publishReplay(1), refCount());
492
- // this.cachedPageData[url] = this.portalData$.pipe(
493
- // filter((portalData) => portalData != null),
494
- // map((portalData) => ),
495
- // concatMap((pageData) => {
496
- // return
497
- // }),
498
- // tap(pageData=>{})
499
- // );
500
- return this.cachedPageData[url];
501
- }
502
- resolveData(routePageData) {
503
- // const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
504
- const pageData = this.pages.find((c) => c.Route === routePageData.Route);
505
- if (!pageData) {
506
- return of(null);
507
- }
508
- const id = pageData.Id;
509
- if (this.cachedPageData[id]) {
510
- return this.cachedPageData[id];
511
- }
512
- this.cachedPageData[id] = this.apiService
513
- .loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
514
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
515
- this.addChildRoute(pageMo, pageMo.ChildPageList);
516
- this.addChildPages(pageMo);
517
- }), publishReplay(1), refCount());
518
- // this.cachedPageData[url] = this.portalData$.pipe(
519
- // filter((portalData) => portalData != null),
520
- // map((portalData) => ),
521
- // concatMap((pageData) => {
522
- // return
523
- // }),
524
- // tap(pageData=>{})
525
- // );
526
- return this.cachedPageData[id];
527
- }
528
- addChildRoute(pageMo, ChildPageList) {
529
- return;
530
- }
531
- addChildRoute_Old(pageMo, ChildPageList) {
532
- if (!ChildPageList?.MoDataList?.length) {
533
- return;
534
- }
535
- const config = this._router.config;
536
- const parentPath = pageMo.Route.replace('/', '');
537
- const parentRoute = config.find((c) => (c.path = parentPath));
538
- const children = [];
539
- if (parentRoute) {
540
- ChildPageList.MoDataList.forEach((child) => {
541
- const path = child.Route.replace('/', '');
542
- const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
543
- children.push(childroute);
544
- });
545
- // debugger;
546
- parentRoute._loadedConfig.routes[0].children = children;
547
- this._router.resetConfig(config);
548
- }
549
- }
550
- loadPortalData_Old1() {
551
- return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
552
- const portalData = portalSetting.Data.Mo;
553
- this.extractAllPages(portalData);
554
- this.portalDataSource.next(portalData);
555
- }), concatMap(() => from(this.loadSystem())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
556
- }
557
- loadPortalDataSync_Old2() {
558
- const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
559
- const portalData = portalSetting.Data.Mo;
560
- this.extractAllPages(portalData);
561
- this.portalDataSource.next(portalData);
562
- this.loadSystem();
563
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
564
- }
565
- _getDefaultPage(c) {
566
- if (!c || !c.length) {
567
- return null;
568
- }
569
- let x = c.find((c) => c.IsDefaultRoute === 'True');
570
- if (x) {
571
- return x;
572
- }
573
- let x2 = null;
574
- c.forEach((element) => {
575
- if (x2) {
576
- return;
577
- }
578
- x2 = this._getDefaultPage(element.ChildPageList?.MoDataList);
579
- });
580
- return x2;
581
- }
582
- loadPortalDataSync() {
583
- if (BarsaApi.LoginFormData?.error?.userMessage) {
584
- return;
585
- }
586
- const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
587
- const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
588
- const portalData = portalSetting;
589
- if (portalData) {
590
- const defaultPage = this._getDefaultPage(portalData.ChildPageList.MoDataList);
591
- this.DefaultPage = defaultPage;
592
- let configRoute = this._router.config;
593
- const removePaged = [];
594
- configRoute.forEach((c, index) => {
595
- const route = '/' + c.path;
596
- if (c.path !== '' && portalData.ChildPageList.MoDataList.findIndex((d) => d.Route === route) === -1) {
597
- removePaged.push(c);
598
- }
599
- });
600
- const pathToRemove = removePaged.map((d) => d.path);
601
- configRoute = configRoute.filter((c) => pathToRemove.indexOf(c.path) === -1);
602
- if (defaultPage != null) {
603
- const defaultPageRoute = defaultPage.Route.replace('/', '');
604
- const defaultPath = configRoute.find((c) => c.path === '');
605
- defaultPath && (defaultPath.redirectTo = defaultPageRoute);
606
- configRoute.push({ path: '**', redirectTo: defaultPageRoute });
607
- // const notFoundPath = configRoute.find((c) => c.path === '**');
608
- // notFoundPath && (notFoundPath.redirectTo = defaultPage.Route.replace('/', ''));
609
- this._router.resetConfig(configRoute);
610
- }
611
- }
612
- this.extractAllPages(portalData);
613
- this.portalDataSource.next(portalData);
614
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
615
- }
616
- ShowForm(e) {
617
- BarsaApi.Bw.Form.Show({
618
- Mo: e.mo,
619
- MoContext: {
620
- ViewName: e.nama
621
- },
622
- EventHandlers: {
623
- AfterReady: function (sender, ee) {
624
- //do something here
625
- e.afterReady?.(ee);
626
- }
627
- }
628
- });
629
- }
630
- get loginRoute$() {
631
- return this.portalData$.pipe(map((portalData) => {
632
- const loginPage = portalData?.ChildPageList.MoDataList.find((c) => c.IsLoginRoute === 'True');
633
- return loginPage?.Route || 'login';
634
- }));
635
- }
636
- RunBlMethodAsync(methodName, parameters) {
637
- return new Promise((resolve, reject) => {
638
- BarsaApi.Bw.RunBlMethodAsync({
639
- Parameters: parameters,
640
- Method: methodName,
641
- SuccessFn: (data) => {
642
- resolve(data);
643
- },
644
- FailFn: (err) => {
645
- reject(err);
646
- }
647
- });
648
- });
649
- }
650
- ExecuteNotificationAction(id, actionTitle) {
651
- BarsaApi.Bw.RunBlMethodAsync({
652
- Parameters: [id, actionTitle],
653
- Method: 'ExecuteNotificationAction',
654
- SuccessFn: (e) => {
655
- this._removePushAction();
656
- if (e.DynamicCommandId) {
657
- ExecuteDynamicCommand({ Id: e.DynamicCommandId }, e.Mo);
658
- }
659
- else if (e.ShowFormSetting) {
660
- const { MoId, ViewName } = e.ShowFormSetting;
661
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId, MoContext: { ViewName } }), 500);
662
- }
663
- },
664
- FailFn: (e) => {
665
- this._removePushAction();
666
- this.logService.error(e);
667
- }
668
- });
669
- }
670
- loadUserPortalSetting() {
671
- if (BarsaApi.LoginFormData?.error?.userMessage) {
672
- return;
673
- }
674
- const ulvParams = {
675
- Flags: {
676
- Data: 'True',
677
- Extra: 'False',
678
- Search: 'False',
679
- View: 'False'
680
- // General:"False", // ulvmainctrl does not craete ui control raise error
681
- },
682
- ReportName: '_تنظيمات_پايه_پورتال',
683
- UsageEnum: 'SystemContainer'
684
- };
685
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
686
- const molist = result.Data.MoDataList;
687
- const userPortalSetting = {};
688
- molist.forEach((mo) => {
689
- if (mo.Inheritance && mo.Inheritance.$TypeDefName) {
690
- userPortalSetting[mo.Inheritance.$TypeDefName] = mo.Inheritance;
691
- }
692
- });
693
- this._userPortalSettings$.next(userPortalSetting);
694
- }, (err) => {
695
- this.logService.error(err);
696
- });
697
- // BarsaApi.Bw.RunBlMethodAsync({
698
- // Parameters: [],
699
- // Method: 'GetUserPortalSettings',
700
- // SuccessFn: (userPortalSetting: MetaobjectDataModel) => {
701
- // },
702
- // FailFn: (e) => {
703
- // this.logService.error(e);
704
- // }
705
- // });
706
- }
707
- loadServerStartupData() {
708
- return new Promise((resolve, reject) => {
709
- if (!BarsaApi.Offline.hasInit) {
710
- BarsaApi.Offline.afterInitCallback = () => {
711
- this._loadServerStartupData(resolve, reject);
712
- };
713
- }
714
- else
715
- this._loadServerStartupData(resolve, reject);
716
- });
717
- }
718
- _loadServerStartupData(resolve, reject) {
719
- const ajaxHelper = typeof AjaxHelper2 === 'undefined' ? AjaxHelper : AjaxHelper2;
720
- ajaxHelper.AjaxRequest('/api/base/ServerStartupData', {}, false, (response) => {
721
- let dataText = response.responseText;
722
- dataText = dataText.replace(/'/g, '"');
723
- dataText = BarsaApi.Common.Util.ReplaceArabicCharchter(dataText);
724
- BarsaApi.LoginForm.PortalInitialize(dataText);
725
- if (typeof BarsaApi.LoginFormData.IsAnonymous === 'undefined') {
726
- if (BarsaApi.LoginFormData?.error?.userMessage) {
727
- BarsaApi.Bw.Msg.Error(BarsaApi.LoginFormData?.error?.userMessage);
728
- }
729
- else {
730
- BarsaApi.Bw.Msg.Error('امکان ورود با کاربر پورتال وجود ندارد.');
731
- }
732
- }
733
- if (BarsaApi.LoginFormData.IsServiceDesk) {
734
- const config = this._router.config;
735
- config[0].redirectTo = 'servicedesk';
736
- this._router.resetConfig(config);
737
- }
738
- this._initAfterLoginFormData();
739
- resolve(BarsaApi.LoginFormData);
740
- }, () => {
741
- alert('error in get server startup data.');
742
- reject('error in get server startup data.');
743
- }, null);
744
- }
745
- ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
746
- if (!formpanelCtrlr) {
747
- console.warn('form panel controler is undefined!');
748
- return;
749
- }
750
- const mo = formpanelCtrlr.Mo;
751
- const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
752
- let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
753
- isModal =
754
- isModal ||
755
- BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.IsModal', false);
756
- const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
757
- if (modalSetting) {
758
- isModal = true;
759
- }
760
- formpanelCtrlr.Setting.IsModal = isModal;
761
- formpanelCtrlr.IsModal = isModal;
762
- const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
763
- const queryParams = {
764
- id: mo.$State === 'New' ? '0' : mo.Id,
765
- tyid: mo.$TypeDefId,
766
- tycp: mo.$Caption ? mo.$Caption : null,
767
- repid: mo.$ReportId,
768
- vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
769
- bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
770
- };
771
- const id = getUniqueId(4);
772
- this.addFormPanelCtrlr(id, formpanelCtrlr);
773
- this.openForm$.next(); // event emit for other components to know form open
774
- if (isModal) {
775
- this.dialogService.showForm(dialogComponent, {
776
- ...queryParams,
777
- formpanelCtrlr
778
- }, vcr);
779
- }
780
- else {
781
- const state = { formPanelCtrlrId: id };
782
- if (isPage) {
783
- router.navigate([
784
- 'form',
785
- {
786
- outlets: {
787
- main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
788
- }
789
- }
790
- ], {
791
- state,
792
- relativeTo: activatedRoute,
793
- skipLocationChange: isReload
794
- });
795
- }
796
- else {
797
- router.navigate([
798
- 'popup',
799
- {
800
- outlets: {
801
- main: ['show', { ...queryParams, formPanelCtrlrId: id }]
802
- }
803
- }
804
- ], {
805
- relativeTo: activatedRoute,
806
- state,
807
- queryParamsHandling: 'preserve',
808
- skipLocationChange: isReload
809
- });
810
- }
811
- }
812
- }
813
- loadSystem(id = 0) {
814
- if (BarsaApi.LoginFormData?.error?.userMessage) {
815
- return Promise.reject(BarsaApi.LoginFormData?.error?.userMessage);
816
- }
817
- if (id === 0) {
818
- BarsaApi.Ul.ApplicationCtrlr.DefaultSystemId = null;
819
- }
820
- return new Promise((resolve, reject) => {
821
- BarsaApi.Ul.ApplicationCtrlr._loadSystem(id, true, (data) => {
822
- resolve(data);
823
- }, (err) => {
824
- reject(err);
825
- });
826
- });
827
- }
828
- _removePushAction() {
829
- const pushActionStr = this._localStorage.getItem('pushAction');
830
- if (pushActionStr) {
831
- this._localStorage.remove('pushAction');
832
- const pushAction = JSON.parse(pushActionStr);
833
- this._pushAction$.next(pushAction);
834
- }
835
- }
836
- _checkLocalStoragePushAction() {
837
- const pushActionStr = this._localStorage.getItem('pushAction');
838
- if (pushActionStr) {
839
- this._localStorage.remove('pushAction');
840
- const pushAction = JSON.parse(pushActionStr);
841
- this._pushAction$.next(pushAction);
842
- }
843
- }
844
- _initAfterLoginFormData() {
845
- this.rtlSource.next(BarsaApi.LoginFormData.IsRtl);
846
- this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
847
- this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
848
- this._loggedInSource.next(this._loggedInSource.getValue() && BarsaApi.LoginFormData.IsAnonymous === false);
849
- }
850
- _initVisibilityChange() {
851
- document.addEventListener('visibilitychange', () => {
852
- if (document.visibilityState === 'visible') {
853
- this._documentVisibilitychange$.next(false);
854
- }
855
- else {
856
- this._documentVisibilitychange$.next(true);
857
- }
858
- });
859
- }
860
- _initStandalone() {
861
- window.matchMedia('(display-mode: standalone)').addEventListener('change', (e) => {
862
- const isMatch = e.matches;
863
- if (isMatch) {
864
- this._standalone$.next(true);
865
- }
866
- else {
867
- this._standalone$.next(false);
868
- }
869
- });
870
- }
871
- _initPushActions() {
872
- this._checkLocalStoragePushAction();
873
- combineLatest([this.userLoggedIn$, this.pushAction$])
874
- .pipe(
875
- // withLatestFrom(this._portalService.pushAction$),
876
- // filter(([userLoggedin, action]) => userLoggedin)
877
- filter(([userLoggedin, pushAction]) => userLoggedin))
878
- .subscribe(([userLoggedin, pushAction]) => {
879
- if (pushAction != null) {
880
- if (!pushAction.notificationTag) {
881
- if (pushAction.moid && pushAction.tpid && pushAction.action == 'show') {
882
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId: pushAction.moid }), 500);
883
- }
884
- }
885
- else {
886
- this.ExecuteNotificationAction(pushAction.notificationTag, pushAction.action);
887
- }
888
- }
889
- });
890
- }
891
- _initLandscape() {
892
- window.matchMedia('(orientation: portrait)').addEventListener('change', (e) => {
893
- const isMatch = e.matches;
894
- if (isMatch) {
895
- this._deviceLandscape$.next(false); // portrait
896
- }
897
- else {
898
- this._deviceLandscape$.next(true); // landscape
899
- }
900
- });
901
- }
902
- findPageByRoute(url) {
903
- const findedPage = this.pages.find((c) => c.Route === url);
904
- return findedPage || null;
905
- }
906
- getNgModuleFactory(modules, moduleName) {
907
- const moduleClass = modules[moduleName + 'Module'];
908
- let moduleFactory;
909
- if (moduleClass instanceof NgModuleFactory) {
910
- moduleFactory = moduleClass;
911
- }
912
- else {
913
- const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
914
- moduleFactory = compiled.ngModuleFactory;
915
- }
916
- return moduleFactory;
917
- }
918
- getRegisteredModules(umd, exportAs, moduleName) {
919
- let modules;
920
- if (umd !== '') {
921
- modules = window;
922
- umd.split('.').forEach((c) => {
923
- if (typeof modules !== typeof undefined) {
924
- modules = modules[c];
925
- }
926
- });
927
- }
928
- else {
929
- modules = window[moduleName];
930
- }
931
- if (exportAs.length > 0 && modules) {
932
- exportAs.forEach((c) => {
933
- this.setValueOnObject(c, 0, modules, window);
934
- });
935
- }
936
- return modules;
937
- }
938
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, deps: [{ token: i1.DynamicComponentService }, { token: i2.ApiService }, { token: i3.LogService }, { token: i4.BarsaDialogService }, { token: i0.Compiler }, { token: i5.Router }, { token: i6.Location }, { token: i7.LocalStorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
939
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, providedIn: 'root' }); }
940
- }
941
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, decorators: [{
942
- type: Injectable,
943
- args: [{
944
- providedIn: 'root'
945
- }]
946
- }], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }, { type: i7.LocalStorageService }, { type: Document, decorators: [{
947
- type: Inject,
948
- args: [DOCUMENT]
949
- }] }] });
950
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxNQUFNLEVBQ04sVUFBVSxFQUVWLGVBQWUsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sRUFBYyxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUcsT0FBTyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsU0FBUyxFQUNULFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxFQUNSLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQWN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sYUFBYTtJQTRDdEIsWUFDWSxHQUE0QixFQUM1QixVQUFzQixFQUN0QixVQUFzQixFQUN0QixhQUFpQyxFQUNqQyxRQUFrQixFQUNsQixPQUFlLEVBQ2YsU0FBbUIsRUFDbkIsYUFBa0MsRUFDaEIsU0FBbUI7UUFS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TSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzsrR0E3akNRLGFBQWEsd1BBcURWLFFBQVE7bUhBckRYLGFBQWEsY0FGVixNQUFNOzs0RkFFVCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBc0RRLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21waWxlcixcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIEluamVjdCxcclxuICAgIEluamVjdGFibGUsXHJcbiAgICBJbmplY3RvcixcclxuICAgIE5nTW9kdWxlRmFjdG9yeSxcclxuICAgIFR5cGUsXHJcbiAgICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERPQ1VNRU5ULCBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mLCBmcm9tLCBmb3JrSm9pbiwgZnJvbUV2ZW50LCBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgICB0YXAsXHJcbiAgICBtYXAsXHJcbiAgICBjb25jYXRNYXAsXHJcbiAgICBmaW5hbGl6ZSxcclxuICAgIHB1Ymxpc2hSZXBsYXksXHJcbiAgICByZWZDb3VudCxcclxuICAgIGV4aGF1c3RNYXAsXHJcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICAgIHN0YXJ0V2l0aCxcclxuICAgIGRlYm91bmNlVGltZSxcclxuICAgIGZpbHRlclxyXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXHJcbiAgICBMb2dpblJlc3VsdCxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBNb0ZvclJlcG9ydE1vZGVsLFxyXG4gICAgUGFnZURhdGFNb2RlbCxcclxuICAgIFBvcnRhbERhdGFNb2RlbCxcclxuICAgIFJlcG9ydE1vZGVsLFxyXG4gICAgVWx2UGFyYW1UeXBlXHJcbn0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFyc2FBcGkgfSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzL2JhcnNhLWFwaSc7XHJcbmltcG9ydCB7IEJhcnNhRGlhbG9nU2VydmljZSB9IGZyb20gJy4vYmFyc2EtZGlhbG9nLnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEV4ZWN1dGVEeW5hbWljQ29tbWFuZCxcclxuICAgIGdldENvbXBvbmVudERlZmluZWQsXHJcbiAgICBnZXREZXZpY2VJc01vYmlsZSxcclxuICAgIGdldERldmljZUlzVGFibGV0LFxyXG4gICAgZ2V0SGVhZGVyVmFsdWUsXHJcbiAgICBnZXRVbmlxdWVJZFxyXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XHJcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4uL2F1dGgtZ3VhcmQnO1xyXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4vZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSBsZXQgQWpheEhlbHBlcjogYW55O1xyXG5kZWNsYXJlIGxldCBBamF4SGVscGVyMjogYW55O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3J0YWxTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvZmZzZXRUb3AgPSAwO1xyXG5cclxuICAgIGxvZ2luTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgaW1hZ2VVcmw6IHN0cmluZztcclxuICAgIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG4gICAgbG9hZGVkID0gZmFsc2U7XHJcbiAgICBmb3JtUGFuZWxzOiBhbnkgPSB7fTtcclxuICAgIGNhY2hlZEltYWdlczogYW55ID0ge307XHJcbiAgICBkYXRlVGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuICAgIGRlZmF1bHRSb3V0ZTogc3RyaW5nO1xyXG4gICAgY2FjaGVkUGFnZURhdGE6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxQYWdlRGF0YU1vZGVsPiB9ID0ge307XHJcbiAgICBwYWdlczogUGFnZURhdGFNb2RlbFtdID0gW107XHJcbiAgICBydGxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xyXG4gICAgdXNlckxvZ2dlZEluJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGRpY3Rpb25hcnk6IHsgW2tleTogc3RyaW5nXTogQmVoYXZpb3JTdWJqZWN0PGFueT4gfSA9IHt9O1xyXG4gICAgcG9ydGFsRGF0YVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UG9ydGFsRGF0YU1vZGVsIHwgbnVsbD4obnVsbCk7XHJcbiAgICBwb3J0YWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD47XHJcbiAgICBwb3J0YWxEYXRhJDogT2JzZXJ2YWJsZTxQb3J0YWxEYXRhTW9kZWwgfCBudWxsPjtcclxuICAgIGRldmljZVNpemUkOiBPYnNlcnZhYmxlPEFiYnJldmF0aW9uRGV2aWNlU2l6ZT47XHJcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgZGlyVmFsdWUkOiBPYnNlcnZhYmxlPCdydGwnIHwgJ2x0cic+O1xyXG4gICAgcm91dGVJbml0aWFsaXplZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBvcGVuRm9ybSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgX2lzQW5vbnVtb3VzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICAgIF9wdXNoQWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBub3RpZmljYXRpb25UYWc6IHN0cmluZzsgYWN0aW9uOiBzdHJpbmc7IG1vaWQ6IHN0cmluZzsgdHBpZDogc3RyaW5nIH0gfCBudWxsPihcclxuICAgICAgICBudWxsXHJcbiAgICApO1xyXG4gICAgcHJpdmF0ZSBfZGV2aWNlU2l6ZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWJicmV2YXRpb25EZXZpY2VTaXplPih0aGlzLl9pbml0YWxpemVEZXZpY2VTaXplKCkpO1xyXG4gICAgcHJpdmF0ZSBfbG9nZ2VkSW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgcm91dGVJbml0aWFsaXplZFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBkYXRlVGV4dFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XHJcbiAgICBwcml2YXRlIF9uYXZpZ2F0aW9uU3RhcnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXZpZ2F0aW9uU3RhcnQgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX25hdmlnYXRpb25FbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXZpZ2F0aW9uRW5kIHwgbnVsbD4obnVsbCk7XHJcbiAgICBwcml2YXRlIF91c2VyUG9ydGFsU2V0dGluZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPj4oe30pO1xyXG4gICAgcHJpdmF0ZSBfY3NzVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX2Nzc1ZhcmlhYmxlVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX2Nzc0N1c3RvbVVybFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4obnVsbCk7XHJcbiAgICBwcml2YXRlIF9zZWFyY2hUZXJtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XHJcbiAgICBwcml2YXRlIF93aW5kb3dSZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2RldmljZUxhbmRzY2FwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KCF3aW5kb3cubWF0Y2hNZWRpYSgnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknKS5tYXRjaGVzKTtcclxuICAgIHByaXZhdGUgX3N0YW5kYWxvbmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih3aW5kb3cubWF0Y2hNZWRpYSgnKGRpc3BsYXktbW9kZTogc3RhbmRhbG9uZSknKS5tYXRjaGVzKTtcclxuICAgIHByaXZhdGUgX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgRGVmYXVsdFBhZ2U6IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBkY206IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBCYXJzYURpYWxvZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb21waWxlcjogQ29tcGlsZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgX2xvY2FsU3RvcmFnZTogTG9jYWxTdG9yYWdlU2VydmljZSxcclxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnRcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgIHRoaXMuX2luaXRMYW5kc2NhcGUoKTtcclxuICAgICAgICB0aGlzLl9pbml0U3RhbmRhbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuX2luaXRWaXNpYmlsaXR5Q2hhbmdlKCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFB1c2hBY3Rpb25zKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNSdGwoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnRsU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlckxvZ2dlZEluKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2dnZWRJblNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHB1c2hBY3Rpb24kKCk6IE9ic2VydmFibGU8eyBub3RpZmljYXRpb25UYWc6IHN0cmluZzsgbW9pZDogc3RyaW5nOyB0cGlkOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nIH0gfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hBY3Rpb24kLmFzT2JzZXJ2YWJsZSgpLnBpcGUoKTtcclxuICAgIH1cclxuICAgIGdldCBkb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzU3RhbmRhbG9uZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbmRhbG9uZSQuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGdldCBzdGFuZGFsb25lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbmRhbG9uZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgbGFuZHNjYXBlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCB3aW5kb3dSZXNpemUkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aW5kb3dSZXNpemUkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBvcnRhbERhdGEoKTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHNlYXJjaFRlcm0kKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFRlcm0kLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNzc1VybCQoKTogT2JzZXJ2YWJsZTxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc1VybFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNzc1ZhcmlhYmxlVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3NzVmFyaWFibGVVcmxTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgIH1cclxuICAgIGdldCBjc3NDdXN0b21VcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jc3NDdXN0b21VcmxTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlclBvcnRhbFNldHRpbmdzKCk6IFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHVzZXJQb3J0YWxTZXR0aW5ncyQoKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRldmljZVNpemUoKTogQWJicmV2YXRpb25EZXZpY2VTaXplIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzQW5vbnltb3VzJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNBbm9udW1vdXNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgbmF2aWdhdGlvbkVuZCQoKTogT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uRW5kIHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uRW5kJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBuYXZpZ2F0aW9uU3RhcnQkKCk6IE9ic2VydmFibGU8TmF2aWdhdGlvblN0YXJ0IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU3RhcnQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkTW8oaWQ6IHN0cmluZywgdHlwZWRlZklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbFBhZ2VEYXRhKGlkLCB0eXBlZGVmSWQpO1xyXG4gICAgfVxyXG4gICAgc2V0U2l0ZUltYWdlVXJsKGJhY2tncm91bmRDb2xvcjogc3RyaW5nLCBpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVVybCA9IGltYWdlVXJsO1xyXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xyXG4gICAgfVxyXG4gICAgcHVzaEFjdGlvbk5leHQocHVzaEFjdGlvbjogeyBub3RpZmljYXRpb25UYWc7IG1vaWQ7IHRwaWQ7IGFjdGlvbiB9KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3B1c2hBY3Rpb24nLCBKU09OLnN0cmluZ2lmeShwdXNoQWN0aW9uKSk7XHJcbiAgICAgICAgdGhpcy5fcHVzaEFjdGlvbiQubmV4dChwdXNoQWN0aW9uKTtcclxuICAgIH1cclxuICAgIHNldFNlYXJjaFRlcm0odGVybTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybSQubmV4dCh0ZXJtKTtcclxuICAgIH1cclxuICAgIHdpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcclxuICAgIH1cclxuICAgIG5hdmlhdGlvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25FbmQkLm5leHQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgbmF2aWF0aW9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TdGFydCQubmV4dChldmVudCk7XHJcbiAgICB9XHJcbiAgICBzZXRVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHVzZXJQb3J0YWxTZXR0aW5ncy4kVHlwZURlZk5hbWUpIHtcclxuICAgICAgICAgICAgdmFsdWVbdXNlclBvcnRhbFNldHRpbmdzLiRUeXBlRGVmTmFtZV0gPSB1c2VyUG9ydGFsU2V0dGluZ3M7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQubmV4dCh7IC4uLnZhbHVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldENzc1VybFRoZW1lKHRoZW1lVXJsOiBTYWZlUmVzb3VyY2VVcmwsIGNzc1ZhcmlhYmxlVXJsPzogU2FmZVJlc291cmNlVXJsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY3NzVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xyXG4gICAgICAgIHRoaXMuX2Nzc0N1c3RvbVVybFNvdXJjZS5uZXh0KHRoZW1lVXJsKTtcclxuICAgICAgICBpZiAoY3NzVmFyaWFibGVVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fY3NzVmFyaWFibGVVcmxTb3VyY2UubmV4dChjc3NWYXJpYWJsZVVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGEoa2V5LCBkYXRhKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25hcnlba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0ubmV4dChkYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSB0aGlzLmRpY3Rpb25hcnlba2V5XS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICBpZiAob2xkVmFsICE9PSBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XS5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0RGF0YShrZXksIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25hcnlba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihkZWZhdWx0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5W2tleV0uYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXREYXRhU3luYzxUPihrZXksIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCk6IFQgfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlRm9yUmVwb3J0KG5hdkl0ZW0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5VbC5VbHZNYWluQ3RybHIuQ3JlYXRlRm9yUmVwb3J0KHt9LCBuYXZJdGVtLCAoZXJyLCByZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyVWx2TWFpblVpKFxyXG4gICAgICAgIG5hdkl0ZW0sXHJcbiAgICAgICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBpc1JlcG9ydFBhZ2U6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGb3JSZXBvcnQobmF2SXRlbSkucGlwZShcclxuICAgICAgICAgICAgZXhoYXVzdE1hcCgodWx2TWFpbkN0cmxyKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVbHZNYWluVWlDb21wb25lbnQodWx2TWFpbkN0cmxyLkFkYXB0ZXIuQ29udHJvbCwgaW5qZWN0b3IsIGlzUmVwb3J0UGFnZSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YXAoKHVsdk1hbmlVaUNvbXBvbmVudCkgPT4gdmNyLmluc2VydCh1bHZNYW5pVWlDb21wb25lbnQuaG9zdFZpZXcpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdWx2TWFpbkN0cmxyKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGdldFVsdk1haW5VaUNvbXBvbmVudChjdXN0b21VbHZNYWluVWksIGluamVjdG9yOiBJbmplY3RvciwgaXNSZXBvcnRQYWdlKTogT2JzZXJ2YWJsZTxDb21wb25lbnRSZWY8YW55Pj4ge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbVVpU2V0dGluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGN1c3RvbVVsdk1haW5VaS5TZXR0aW5nLCAnQ3VzdG9tVWknLCBudWxsKTtcclxuICAgICAgICBjb25zdCB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yIH0gPSBnZXRDb21wb25lbnREZWZpbmVkKFxyXG4gICAgICAgICAgICBjdXN0b21VbHZNYWluVWksXHJcbiAgICAgICAgICAgIGN1c3RvbVVpU2V0dGluZ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yLCBpbmplY3RvcikucGlwZShcclxuICAgICAgICAgICAgbWFwKChjb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50Lmluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaWQgPSBjdXN0b21VbHZNYWluVWkuaWQ7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jb250ZXh0ID0gY3VzdG9tVWx2TWFpblVpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaXNSZXBvcnRQYWdlID0gaXNSZXBvcnRQYWdlO1xyXG4gICAgICAgICAgICAgICAgY3VzdG9tVWx2TWFpblVpLmNvbnRyb2xVaSA9IGNvbXBvbmVudEluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRldmljZVNpemUkID0gdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnBvcnRhbERhdGEkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucnRsJCA9IHRoaXMucnRsU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMudXNlckxvZ2dlZEluJCA9IHRoaXMuX2xvZ2dlZEluU291cmNlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShtYXAoKGlzTG9nZ2VkSW4pID0+IGlzTG9nZ2VkSW4gJiYgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc0Fub255bW91cyA9PT0gZmFsc2UpKTtcclxuICAgICAgICB0aGlzLmRpclZhbHVlJCA9IHRoaXMucnRsJC5waXBlKG1hcCgoaXNSdGwpID0+IChpc1J0bCA/ICdydGwnIDogJ2x0cicpKSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZUluaXRpYWxpemVkJCA9IHRoaXMucm91dGVJbml0aWFsaXplZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgICAgIHRoaXMuX3N0YW5kYWxvbmUkLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzdGFuZGFsb25lJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ25vU3RhbmRhbG9uZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RldmljZUxhbmRzY2FwZSQuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xhbmRzY2FwZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGMgPT09ICdzJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzbWFsbGRldmljZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kYXRlVGV4dCQgPSB0aGlzLmRhdGVUZXh0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucG9ydGFsU2V0dGluZ3MkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShtYXAoKHBvcnRhbERhdGEpID0+IChwb3J0YWxEYXRhID8gcG9ydGFsRGF0YS5Qb3J0YWxTZXR0aW5ncyA6ICh7fSBhcyBhbnkpKSkpO1xyXG4gICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxyXG4gICAgICAgICAgICAucGlwZShzdGFydFdpdGgobnVsbCksIGRlYm91bmNlVGltZSgxMDAwKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2luZG93UmVzaXplJC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXREZXZpY2VTaXplKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX3NldERldmljZVNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGV2aWNlU2l6ZSA9IHRoaXMuX2luaXRhbGl6ZURldmljZVNpemUoKTtcclxuICAgICAgICB0aGlzLl9kZXZpY2VTaXplU291cmNlLm5leHQoZGV2aWNlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICBfaW5pdGFsaXplRGV2aWNlU2l6ZSgpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xyXG4gICAgICAgIGNvbnN0IF9pc21vYmlsZSA9IGdldERldmljZUlzTW9iaWxlKCk7XHJcbiAgICAgICAgaWYgKF9pc21vYmlsZSkge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5Jc01vYmlsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9pc1RhYmxldCA9IGdldERldmljZUlzVGFibGV0KCk7XHJcbiAgICAgICAgbGV0IF93aW5kb1dTaXplOiBBYmJyZXZhdGlvbkRldmljZVNpemUgPSAncyc7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDYwMCkge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdzJztcclxuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gNjAwICYmIHdpbmRvdy5pbm5lcldpZHRoIDw9IDk5Mikge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdtJztcclxuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gOTkyICYmIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEyMDApIHtcclxuICAgICAgICAgICAgX3dpbmRvV1NpemUgPSAnbCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX3dpbmRvV1NpemUgPSAneGwnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoX2lzbW9iaWxlICYmIF93aW5kb1dTaXplICE9PSAnbCcgJiYgX3dpbmRvV1NpemUgIT09ICd4bCcgJiYgX3dpbmRvV1NpemUgIT09ICdtJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3MnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoX2lzVGFibGV0ICYmIF93aW5kb1dTaXplICE9PSAnbCcgJiYgX3dpbmRvV1NpemUgIT09ICd4bCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF93aW5kb1dTaXplO1xyXG4gICAgfVxyXG4gICAgY29tcGlsZU1vZHVsZShkZXBlbmRlbmN5OiBMaWJyYXJ5RGVwZW5lY3kpOiBPYnNlcnZhYmxlPE5nTW9kdWxlRmFjdG9yeTxhbnk+PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlJCA9IHRoaXMuZ2V0TW9kdWxlKGRlcGVuZGVuY3kpO1xyXG4gICAgICAgIHJldHVybiBtb2R1bGUkLnBpcGUoXHJcbiAgICAgICAgICAgIGNvbmNhdE1hcCgobW9kdWxlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlRmFjdG9yeSA9IHRoaXMuZ2V0TmdNb2R1bGVGYWN0b3J5KG1vZHVsZXMsIGRlcGVuZGVuY3kubmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobW9kdWxlRmFjdG9yeSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGdldE1vZHVsZShkZXBlbmRlbmN5OiBMaWJyYXJ5RGVwZW5lY3kpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHsgbmFtZSwga2ViYWJOYW1lLCB1bWQsIGV4cG9ydEFzIH0gPSBkZXBlbmRlbmN5O1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBgL2Fzc2V0cy9tb2R1bGVzLyR7a2ViYWJOYW1lfS9idW5kbGVzYDtcclxuICAgICAgICBjb25zdCBkYXRlID0gQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5hYmM7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IGAke2Jhc2V9LyR7a2ViYWJOYW1lfS51bWQuanM/dD0ke2RhdGV9YDtcclxuICAgICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcclxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLmdldFJlZ2lzdGVyZWRNb2R1bGVzKHVtZCwgZXhwb3J0QXMsIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobW9kdWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkSnMkKHBhdGgpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSkpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbHVlT25PYmplY3QocGF0aCwgaW5kZXgsIG1vZHVsZXMsIG9iamVjdCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0ZWQgPSBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHNwbGl0ZWRbaW5kZXhdO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9iamVjdFtwcm9wXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5kZXggPT09IHNwbGl0ZWQubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICBvYmplY3RbcHJvcF0gPSBtb2R1bGVzO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCArIDEsIG1vZHVsZXMsIG9iamVjdFtwcm9wXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50KFxyXG4gICAgICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcclxuICAgICAgICBtb2R1bGVQYXRoOiBzdHJpbmcsXHJcbiAgICAgICAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHNlbGVjdG9yOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyZW50SW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGNtLmdldENvbXBvbmVudEJ5U2VsZWN0b3Ioc2VsZWN0b3IsIG1vZHVsZU5hbWUsIHBhcmVudEluamVjdG9yKTtcclxuICAgIH1cclxuICAgIGxvYWRKcyQocGF0aCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xyXG4gICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgUmVwb3J0RXhlY3V0ZUJ5SWQocmVwb3J0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TW9Gb3JSZXBvcnRNb2RlbD4ge1xyXG4gICAgICAgIGNvbnN0IHVsdlBhcmFtcyA9IHRoaXMuX2dldFVsdlBhcmFtc0J5KCcnLCByZXBvcnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5fcmVwb3J0RXhlY3V0ZVByb21pc2UodWx2UGFyYW1zKSk7XHJcbiAgICB9XHJcbiAgICBSZXBvcnRFeGVjdXRlKHJlcG9ydE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TW9Gb3JSZXBvcnRNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKHRoaXMuUmVwb3J0RXhlY3V0ZVByb21pc2UocmVwb3J0TmFtZSkpO1xyXG4gICAgfVxyXG4gICAgUmVwb3J0RXhlY3V0ZVByb21pc2UocmVwb3J0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0gdGhpcy5fZ2V0VWx2UGFyYW1zQnkocmVwb3J0TmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcG9ydEV4ZWN1dGVQcm9taXNlKHVsdlBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9nZXRVbHZQYXJhbXNCeShyZXBvcnROYW1lOiBzdHJpbmcsIHJlcG9ydElkPzogc3RyaW5nKTogVWx2UGFyYW1UeXBlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBGbGFnczoge1xyXG4gICAgICAgICAgICAgICAgRGF0YTogJ1RydWUnLFxyXG4gICAgICAgICAgICAgICAgRXh0cmE6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBWaWV3OiAnRmFsc2UnXHJcbiAgICAgICAgICAgICAgICAvLyBHZW5lcmFsOlwiRmFsc2VcIiwgLy8gdWx2bWFpbmN0cmwgZG9lcyBub3QgY3JhZXRlIHVpIGNvbnRyb2wgcmFpc2UgZXJyb3JcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgUmVwb3J0TmFtZTogcmVwb3J0TmFtZSxcclxuICAgICAgICAgICAgUmVwb3J0SWQ6IHJlcG9ydElkLFxyXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yZXBvcnRFeGVjdXRlUHJvbWlzZSh1bHZQYXJhbXM6IFVsdlBhcmFtVHlwZSk6IFByb21pc2U8TW9Gb3JSZXBvcnRNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LkV4ZWN1dGVSZXBvcnQoXHJcbiAgICAgICAgICAgICAgICB7IHVsdlBhcmFtcyB9LFxyXG4gICAgICAgICAgICAgICAgKHJlc3VsdDogUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdC5EYXRhKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRm9ybVBhbmVsQ3RybHIoaWQsIGZvcm1wYW5lbEN0cmxyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvcm1QYW5lbHNbaWRdID0gZm9ybXBhbmVsQ3RybHI7XHJcbiAgICB9XHJcbiAgICBzZXRVc2VyTG9naW5TdGF0dXMoc3RhdHVzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dChzdGF0dXMpO1xyXG4gICAgfVxyXG4gICAgZXh0cmFjdEFsbFBhZ2VzKHBvcnRhbERhdGE6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMocGFnZURhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZXh0cmFjdEFsbFBhZ2VzX09sZChwb3J0YWxEYXRhOiBQb3J0YWxEYXRhTW9kZWwgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFwb3J0YWxEYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XHJcbiAgICAgICAgcG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgocGFnZURhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHBhZ2VEYXRhLlJvdXRlLnJlcGxhY2UoJy8nLCAnJyk7XHJcbiAgICAgICAgICAgIGNvbmZpZy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSb3V0ZShwYWdlRGF0YSwgcGF0aCwgcGFnZURhdGEuSGFzQXV0aG9yaXplLCBwYWdlRGF0YS5QYWdlTW9kdWxlPy4kQ2FwdGlvbiwgbnVsbCwgbnVsbClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHBhZ2VEYXRhLklzRGVmYXVsdFJvdXRlIHx8IHBhZ2VEYXRhLklzRGVmYXVsdFJvdXRlID09PSAnVHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJvdXRlID0gcGF0aDtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5wdXNoKHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsICcnLCBmYWxzZSwgcG9ydGFsRGF0YS5QYWdlTW9kdWxlPy4kQ2FwdGlvbiwgcGF0aCwgbnVsbCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMocGFnZURhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3JvdXRlci5yZXNldENvbmZpZyhjb25maWcpO1xyXG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbi5wYXRoKCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbdGhpcy5kZWZhdWx0Um91dGVdKTtcclxuICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLnJvdXRlSW5pdGlhbGl6ZWQoKTtcclxuICAgIH1cclxuICAgIHNzb0xvZ2luKCk6IHZvaWQge1xyXG4gICAgICAgIEFqYXhIZWxwZXIuQWpheFJlcXVlc3QoXHJcbiAgICAgICAgICAgICcvYXBpL2Jhc2Uvc3NvbG9naW4nLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhbGVydCgnZXJyb3IgaW4gc3NvIGxvZ2luLicpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBudWxsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHNzb0xvZ291dCgpOiB2b2lkIHtcclxuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxyXG4gICAgICAgICAgICAnL2FwaS9iYXNlL3Nzb2xvZ291dCcsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBzc28gbG9nb3V0LicpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBudWxsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGFkZENoaWxkUGFnZXMocGFnZURhdGE6IFBhZ2VEYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZURhdGEpO1xyXG4gICAgICAgIGlmICghcGFnZURhdGEuQ2hpbGRQYWdlTGlzdD8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFnZURhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKGNoaWxkUGFnZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMoY2hpbGRQYWdlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXHJcbiAgICBjcmVhdGVSb3V0ZShwYWdlRGF0YSwgcGF0aCwgaGFzQXV0aG9yaXplZCwgbW9kdWxlTmFtZSwgcmVkaXJlY3RUbywgaXNEeW5hbWljUm91dGUpOiBSb3V0ZSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgY3JlYXRlUm91dGUyKFxyXG4gICAgICAgIHBhZ2VEYXRhLFxyXG4gICAgICAgIHBhdGgsXHJcbiAgICAgICAgaGFzQXV0aG9yaXplZCxcclxuICAgICAgICBtb2R1bGVOYW1lLFxyXG4gICAgICAgIHJlZGlyZWN0VG86IHN0cmluZyB8IG51bGwgPSBudWxsLFxyXG4gICAgICAgIGlzRHluYW1pY1JvdXRlOiBib29sZWFuID0gZmFsc2VcclxuICAgICk6IFJvdXRlIHtcclxuICAgICAgICBsZXQgbW9kdWxlUGF0aDogc3RyaW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuR2V0S2ViYWJDYXNlKG1vZHVsZU5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHVtZCA9IG1vZHVsZU5hbWU7XHJcbiAgICAgICAgbW9kdWxlUGF0aCA9IG1vZHVsZVBhdGguc3Vic3RyaW5nKDEsIG1vZHVsZVBhdGgubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBkeW5hbWljUm91dGU6IFJvdXRlID0ge307XHJcbiAgICAgICAgZHluYW1pY1JvdXRlLnBhdGggPSBwYXRoO1xyXG4gICAgICAgIGR5bmFtaWNSb3V0ZS5kYXRhID0geyBwYWdlRGF0YSB9O1xyXG4gICAgICAgIGlmICghaXNEeW5hbWljUm91dGUpIHtcclxuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnJlc29sdmUgPSB7XHJcbiAgICAgICAgICAgICAgICBwYWdlRGF0YTogUG9ydGFsUGFnZVJlc29sdmVyXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXRoID09PSAnJykge1xyXG4gICAgICAgICAgICBkeW5hbWljUm91dGUucGF0aE1hdGNoID0gJ2Z1bGwnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVkaXJlY3RUbykge1xyXG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVkaXJlY3RUbyA9IHJlZGlyZWN0VG87XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGhhc0F1dGhvcml6ZWQpIHtcclxuICAgICAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5jYW5BY3RpdmF0ZSA9IFtBdXRoR3VhcmRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5sb2FkQ2hpbGRyZW4gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXM6IExpYnJhcnlEZXBlbmVjeVtdID0gSlNPTi5wYXJzZShwYWdlRGF0YS5EZXBlbmRlbmNpZXMpOyAvLyBldmFsKHBhZ2VEYXRhLkRlcGVuZGVuY2llcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlTGlicmFyeSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGtlYmFiTmFtZTogbW9kdWxlUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICB1bWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IFttb2R1bGVOYW1lXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyQgPSBmcm9tKGRlcGVuZGVuY2llcykucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSkgPT4gdGhpcy5jb21waWxlTW9kdWxlKGRlcGVuZGVuY3kpKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihbZGVwZW5kZW5jaWVzJF0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0TW9kdWxlKHBhZ2VMaWJyYXJ5KSksXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwKChtb2R1bGVzKSA9PiBtb2R1bGVzW21vZHVsZU5hbWUgKyAnTW9kdWxlJ10pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJvdXRlSW5pdGlhbGl6ZWQoKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZHluYW1pY1JvdXRlO1xyXG4gICAgfVxyXG4gICAgcm91dGVJbml0aWFsaXplZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvdXRlSW5pdGlhbGl6ZWRTb3VyY2UubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2dpbkJ5QW5vbnltb3VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHRoaXMubG9naW5Mb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2dpblBvcnRhbCgpLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgocmVzdWx0OiBMb2dpblJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZyhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShCYXJzYUFwaS5Mb2dpbkFjdGlvbi50b2tlbjJTdG9yYWdlS2V5LCByZXN1bHQuZGF0YS5zdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFBhZ2VEYXRhKHVybDogc3RyaW5nLCBpc1Jvb3Q6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFBhZ2VEYXRhTW9kZWwgfCBudWxsPiB7XHJcbiAgICAgICAgaWYgKGlzUm9vdCB8fCB1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcnRhbERhdGEkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPiAtMSkge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIHVybC5pbmRleE9mKCc/JykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhZ2VEYXRhID0gdGhpcy5maW5kUGFnZUJ5Um91dGUodXJsKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkUG9ydGFsUGFnZURhdGEocGFnZURhdGE/LklkLCB0aGlzLnBvcnRhbERhdGFTb3VyY2UuZ2V0VmFsdWUoKT8uQ2hpbGRQYWdlTGlzdC5UeXBlRGVmSWQpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcclxuICAgICAgICAgICAgICAgIHRhcCgocGFnZU1vKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFJvdXRlKHBhZ2VNbywgcGFnZU1vLkNoaWxkUGFnZUxpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBwdWJsaXNoUmVwbGF5KDEpLFxyXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIC8vIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXSA9IHRoaXMucG9ydGFsRGF0YSQucGlwZShcclxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcclxuICAgICAgICAvLyAgIG1hcCgocG9ydGFsRGF0YSkgPT4gKSxcclxuICAgICAgICAvLyAgIGNvbmNhdE1hcCgocGFnZURhdGEpID0+IHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuXHJcbiAgICAgICAgLy8gICB9KSxcclxuXHJcbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxyXG4gICAgICAgIC8vICk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyByZXNvbHZlRGF0YShyb3V0ZVBhZ2VEYXRhKTogT2JzZXJ2YWJsZTxQYWdlRGF0YU1vZGVsIHwgbnVsbD4ge1xyXG4gICAgICAgIC8vIGNvbnN0IHBhZ2VEYXRhID0gdGhpcy5wYWdlcy5maW5kKChjKSA9PiBjLlJvdXRlID09PSByb3V0ZVBhZ2VEYXRhLlJvdXRlICYmIGMuTW9kdWxlID09PSByb3V0ZVBhZ2VEYXRhLk1vZHVsZSk7XHJcbiAgICAgICAgY29uc3QgcGFnZURhdGEgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHJvdXRlUGFnZURhdGEuUm91dGUpO1xyXG4gICAgICAgIGlmICghcGFnZURhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHBhZ2VEYXRhLklkO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRQYWdlRGF0YVtpZF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSA9IHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAgICAgICAubG9hZFBvcnRhbFBhZ2VEYXRhKGlkLCB0aGlzLnBvcnRhbERhdGFTb3VyY2UuZ2V0VmFsdWUoKT8uQ2hpbGRQYWdlTGlzdC5UeXBlRGVmSWQpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcclxuICAgICAgICAgICAgICAgIHRhcCgocGFnZU1vKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFJvdXRlKHBhZ2VNbywgcGFnZU1vLkNoaWxkUGFnZUxpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBwdWJsaXNoUmVwbGF5KDEpLFxyXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIC8vIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXSA9IHRoaXMucG9ydGFsRGF0YSQucGlwZShcclxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcclxuICAgICAgICAvLyAgIG1hcCgocG9ydGFsRGF0YSkgPT4gKSxcclxuICAgICAgICAvLyAgIGNvbmNhdE1hcCgocGFnZURhdGEpID0+IHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuXHJcbiAgICAgICAgLy8gICB9KSxcclxuXHJcbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxyXG4gICAgICAgIC8vICk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENoaWxkUm91dGUocGFnZU1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBDaGlsZFBhZ2VMaXN0OiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYWRkQ2hpbGRSb3V0ZV9PbGQocGFnZU1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBDaGlsZFBhZ2VMaXN0OiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFDaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGFnZU1vLlJvdXRlLnJlcGxhY2UoJy8nLCAnJyk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Um91dGUgPSBjb25maWcuZmluZCgoYykgPT4gKGMucGF0aCA9IHBhcmVudFBhdGgpKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbjogUm91dGVbXSA9IFtdO1xyXG4gICAgICAgIGlmIChwYXJlbnRSb3V0ZSkge1xyXG4gICAgICAgICAgICBDaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBjaGlsZC5Sb3V0ZS5yZXBsYWNlKCcvJywgJycpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyb3V0ZSA9IHRoaXMuY3JlYXRlUm91dGUoXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5IYXNBdXRob3JpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFnZU1vZHVsZT8uJENhcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZHJvdXRlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xyXG5cclxuICAgICAgICAgICAgKHBhcmVudFJvdXRlIGFzIGFueSkuX2xvYWRlZENvbmZpZy5yb3V0ZXNbMF0uY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5yZXNldENvbmZpZyhjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZFBvcnRhbERhdGFfT2xkMSgpOiBPYnNlcnZhYmxlPFBvcnRhbERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbFR5cGVEZWZJZCkucGlwZShcclxuICAgICAgICAgICAgdGFwKChwb3J0YWxTZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0YWxEYXRhID0gcG9ydGFsU2V0dGluZy5EYXRhLk1vO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKHRoaXMubG9hZFN5c3RlbSgpKSksXHJcbiAgICAgICAgICAgIHRhcCgoYWxsKSA9PiB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YVN5bmNfT2xkMigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwb3J0YWxTZXR0aW5nID0gdGhpcy5hcGlTZXJ2aWNlLmxvYWRQb3J0YWxTeW5jKFxyXG4gICAgICAgICAgICBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLFxyXG4gICAgICAgICAgICBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbFR5cGVEZWZJZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgcG9ydGFsRGF0YSA9IHBvcnRhbFNldHRpbmcuRGF0YS5NbztcclxuXHJcbiAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5uZXh0KHBvcnRhbERhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRTeXN0ZW0oKTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRlVGV4dFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGF0ZVRleHQpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfZ2V0RGVmYXVsdFBhZ2UoYzogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICghYyB8fCAhYy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB4ID0gYy5maW5kKChjKSA9PiBjLklzRGVmYXVsdFJvdXRlID09PSAnVHJ1ZScpO1xyXG4gICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgeDI6IGFueSA9IG51bGw7XHJcbiAgICAgICAgYy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4Mikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHgyID0gdGhpcy5fZ2V0RGVmYXVsdFBhZ2UoZWxlbWVudC5DaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4geDI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbG9hZFBvcnRhbERhdGFTeW5jKCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhPy5lcnJvcj8udXNlck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3J0YWxTZXR0aW5nU3RyID0gQmFyc2FBcGkuQncuUnVuQmxNZXRob2QoJ0dldFBvcnRhbCcsIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWQpO1xyXG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSBCYXJzYUFwaS5FeHQuZGVjb2RlKHBvcnRhbFNldHRpbmdTdHIpO1xyXG4gICAgICAgIGNvbnN0IHBvcnRhbERhdGE6IFBhZ2VEYXRhTW9kZWwgPSBwb3J0YWxTZXR0aW5nO1xyXG4gICAgICAgIGlmIChwb3J0YWxEYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYWdlID0gdGhpcy5fZ2V0RGVmYXVsdFBhZ2UocG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QpO1xyXG4gICAgICAgICAgICB0aGlzLkRlZmF1bHRQYWdlID0gZGVmYXVsdFBhZ2U7XHJcbiAgICAgICAgICAgIGxldCBjb25maWdSb3V0ZSA9IHRoaXMuX3JvdXRlci5jb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZVBhZ2VkOiBSb3V0ZVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbmZpZ1JvdXRlLmZvckVhY2goKGMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9ICcvJyArIGMucGF0aDtcclxuICAgICAgICAgICAgICAgIGlmIChjLnBhdGggIT09ICcnICYmIHBvcnRhbERhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZpbmRJbmRleCgoZCkgPT4gZC5Sb3V0ZSA9PT0gcm91dGUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVBhZ2VkLnB1c2goYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoVG9SZW1vdmUgPSByZW1vdmVQYWdlZC5tYXAoKGQpID0+IGQucGF0aCk7XHJcbiAgICAgICAgICAgIGNvbmZpZ1JvdXRlID0gY29uZmlnUm91dGUuZmlsdGVyKChjKSA9PiBwYXRoVG9SZW1vdmUuaW5kZXhPZihjLnBhdGgpID09PSAtMSk7XHJcbiAgICAgICAgICAgIGlmIChkZWZhdWx0UGFnZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0UGFnZVJvdXRlID0gZGVmYXVsdFBhZ2UuUm91dGUucmVwbGFjZSgnLycsICcnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gY29uZmlnUm91dGUuZmluZCgoYykgPT4gYy5wYXRoID09PSAnJyk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0UGF0aCAmJiAoZGVmYXVsdFBhdGgucmVkaXJlY3RUbyA9IGRlZmF1bHRQYWdlUm91dGUpO1xyXG4gICAgICAgICAgICAgICAgY29uZmlnUm91dGUucHVzaCh7IHBhdGg6ICcqKicsIHJlZGlyZWN0VG86IGRlZmF1bHRQYWdlUm91dGUgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBub3RGb3VuZFBhdGggPSBjb25maWdSb3V0ZS5maW5kKChjKSA9PiBjLnBhdGggPT09ICcqKicpO1xyXG4gICAgICAgICAgICAgICAgLy8gbm90Rm91bmRQYXRoICYmIChub3RGb3VuZFBhdGgucmVkaXJlY3RUbyA9IGRlZmF1bHRQYWdlLlJvdXRlLnJlcGxhY2UoJy8nLCAnJykpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlci5yZXNldENvbmZpZyhjb25maWdSb3V0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSBhcyBQb3J0YWxEYXRhTW9kZWwpO1xyXG5cclxuICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhIGFzIFBvcnRhbERhdGFNb2RlbCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0ZVRleHRTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRhdGVUZXh0KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBTaG93Rm9ybShlOiB7IG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsOyBuYW1hOiBzdHJpbmc7IGFmdGVyUmVhZHk/OiAoZTogYW55KSA9PiB2b2lkIH0pOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5Gb3JtLlNob3coe1xyXG4gICAgICAgICAgICBNbzogZS5tbyxcclxuICAgICAgICAgICAgTW9Db250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBWaWV3TmFtZTogZS5uYW1hXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlcnM6IHtcclxuICAgICAgICAgICAgICAgIEFmdGVyUmVhZHk6IGZ1bmN0aW9uIChzZW5kZXIsIGVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kbyBzb21ldGhpbmcgaGVyZVxyXG4gICAgICAgICAgICAgICAgICAgIGUuYWZ0ZXJSZWFkeT8uKGVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBsb2dpblJvdXRlJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvcnRhbERhdGEkLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgocG9ydGFsRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9naW5QYWdlID0gcG9ydGFsRGF0YT8uQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZpbmQoKGMpID0+IGMuSXNMb2dpblJvdXRlID09PSAnVHJ1ZScpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2luUGFnZT8uUm91dGUgfHwgJ2xvZ2luJztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFJ1bkJsTWV0aG9kQXN5bmM8VD4obWV0aG9kTmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJzOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICAgICAgTWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoZGF0YTogVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgRmFpbEZuOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEV4ZWN1dGVOb3RpZmljYXRpb25BY3Rpb24oaWQ6IHN0cmluZywgYWN0aW9uVGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbaWQsIGFjdGlvblRpdGxlXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnRXhlY3V0ZU5vdGlmaWNhdGlvbkFjdGlvbicsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGU6IHtcclxuICAgICAgICAgICAgICAgIE1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsO1xyXG4gICAgICAgICAgICAgICAgRHluYW1pY0NvbW1hbmRJZDogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgU2hvd0Zvcm1TZXR0aW5nOiB7IE1vSWQ6IHN0cmluZzsgVmlld05hbWU6IHN0cmluZyB9O1xyXG4gICAgICAgICAgICB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVQdXNoQWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5EeW5hbWljQ29tbWFuZElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZUR5bmFtaWNDb21tYW5kKHsgSWQ6IGUuRHluYW1pY0NvbW1hbmRJZCB9LCBlLk1vKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5TaG93Rm9ybVNldHRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IE1vSWQsIFZpZXdOYW1lIH0gPSBlLlNob3dGb3JtU2V0dGluZztcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IEJhcnNhQXBpLkJ3LkZvcm0uU2hvdyh7IE1vSWQsIE1vQ29udGV4dDogeyBWaWV3TmFtZSB9IH0pLCA1MDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBGYWlsRm46IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVQdXNoQWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkVXNlclBvcnRhbFNldHRpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVsdlBhcmFtcyA9IHtcclxuICAgICAgICAgICAgRmxhZ3M6IHtcclxuICAgICAgICAgICAgICAgIERhdGE6ICdUcnVlJyxcclxuICAgICAgICAgICAgICAgIEV4dHJhOiAnRmFsc2UnLFxyXG4gICAgICAgICAgICAgICAgU2VhcmNoOiAnRmFsc2UnLFxyXG4gICAgICAgICAgICAgICAgVmlldzogJ0ZhbHNlJ1xyXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhbDpcIkZhbHNlXCIsIC8vIHVsdm1haW5jdHJsIGRvZXMgbm90IGNyYWV0ZSB1aSBjb250cm9sIHJhaXNlIGVycm9yXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFJlcG9ydE5hbWU6ICdf2KrZhti42YrZhdin2Kpf2b7Yp9mK2Ydf2b7ZiNix2KrYp9mEJyxcclxuICAgICAgICAgICAgVXNhZ2VFbnVtOiAnU3lzdGVtQ29udGFpbmVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgQmFyc2FBcGkuQncuRXhlY3V0ZVJlcG9ydChcclxuICAgICAgICAgICAgeyB1bHZQYXJhbXMgfSxcclxuICAgICAgICAgICAgKHJlc3VsdDogUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vbGlzdCA9IHJlc3VsdC5EYXRhLk1vRGF0YUxpc3Q7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyUG9ydGFsU2V0dGluZzogUmVjb3JkPHN0cmluZywgTWV0YW9iamVjdERhdGFNb2RlbD4gPSB7fTtcclxuICAgICAgICAgICAgICAgIG1vbGlzdC5mb3JFYWNoKChtbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtby5Jbmhlcml0YW5jZSAmJiBtby5Jbmhlcml0YW5jZS4kVHlwZURlZk5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlclBvcnRhbFNldHRpbmdbbW8uSW5oZXJpdGFuY2UuJFR5cGVEZWZOYW1lXSA9IG1vLkluaGVyaXRhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5uZXh0KHVzZXJQb3J0YWxTZXR0aW5nKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgIC8vICAgICBQYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICAvLyAgICAgTWV0aG9kOiAnR2V0VXNlclBvcnRhbFNldHRpbmdzJyxcclxuICAgICAgICAvLyAgICAgU3VjY2Vzc0ZuOiAodXNlclBvcnRhbFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcclxuICAgICAgICAvLyAgICAgfSxcclxuICAgICAgICAvLyAgICAgRmFpbEZuOiAoZSkgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcbiAgICBsb2FkU2VydmVyU3RhcnR1cERhdGEoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFCYXJzYUFwaS5PZmZsaW5lLmhhc0luaXQpIHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLk9mZmxpbmUuYWZ0ZXJJbml0Q2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZFNlcnZlclN0YXJ0dXBEYXRhKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5fbG9hZFNlcnZlclN0YXJ0dXBEYXRhKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfbG9hZFNlcnZlclN0YXJ0dXBEYXRhKHJlc29sdmUsIHJlamVjdCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFqYXhIZWxwZXIgPSB0eXBlb2YgQWpheEhlbHBlcjIgPT09ICd1bmRlZmluZWQnID8gQWpheEhlbHBlciA6IEFqYXhIZWxwZXIyO1xyXG4gICAgICAgIGFqYXhIZWxwZXIuQWpheFJlcXVlc3QoXHJcbiAgICAgICAgICAgICcvYXBpL2Jhc2UvU2VydmVyU3RhcnR1cERhdGEnLFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFUZXh0ID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICAgICAgZGF0YVRleHQgPSBkYXRhVGV4dC5yZXBsYWNlKC8nL2csICdcIicpO1xyXG4gICAgICAgICAgICAgICAgZGF0YVRleHQgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5SZXBsYWNlQXJhYmljQ2hhcmNodGVyKGRhdGFUZXh0KTtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybS5Qb3J0YWxJbml0aWFsaXplKGRhdGFUZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc0Fub255bW91cyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3Lk1zZy5FcnJvcihCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhPy5lcnJvcj8udXNlck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3Lk1zZy5FcnJvcign2KfZhdqp2KfZhiDZiNix2YjYryDYqNinINqp2KfYsdio2LEg2b7ZiNix2KrYp9mEINmI2KzZiNivINmG2K/Yp9ix2K8uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzU2VydmljZURlc2spIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1swXS5yZWRpcmVjdFRvID0gJ3NlcnZpY2VkZXNrJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0QWZ0ZXJMb2dpbkZvcm1EYXRhKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhbGVydCgnZXJyb3IgaW4gZ2V0IHNlcnZlciBzdGFydHVwIGRhdGEuJyk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoJ2Vycm9yIGluIGdldCBzZXJ2ZXIgc3RhcnR1cCBkYXRhLicpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBudWxsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBTaG93Rm9ybVBhbmVsQ29udHJvbChcclxuICAgICAgICBmb3JtcGFuZWxDdHJscjogYW55LFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBkaWFsb2dDb21wb25lbnQ6IFR5cGU8YW55PixcclxuICAgICAgICBpc1BhZ2U6IGJvb2xlYW4sXHJcbiAgICAgICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIGlzUmVsb2FkOiBib29sZWFuID0gZmFsc2VcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZm9ybXBhbmVsQ3RybHIpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdmb3JtIHBhbmVsIGNvbnRyb2xlciBpcyB1bmRlZmluZWQhJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW8gPSBmb3JtcGFuZWxDdHJsci5NbztcclxuICAgICAgICBjb25zdCBoZWFkZXJMYXlvdXQgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShmb3JtcGFuZWxDdHJsciwgJ1NldHRpbmcuVmlldy5IZWFkZXJMYXlvdXQnLCBudWxsKTtcclxuICAgICAgICBsZXQgaXNNb2RhbCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkV4dHJhSnNvblByb3AuTW9kYWwnLCBmYWxzZSk7XHJcbiAgICAgICAgaXNNb2RhbCA9XHJcbiAgICAgICAgICAgIGlzTW9kYWwgfHxcclxuICAgICAgICAgICAgQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoZm9ybXBhbmVsQ3RybHIsICdTZXR0aW5nLlZpZXcuQ3VzdG9tVWkuUGFyYW1ldGVycy5Jc01vZGFsJywgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vZGFsU2V0dGluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxyXG4gICAgICAgICAgICBmb3JtcGFuZWxDdHJscixcclxuICAgICAgICAgICAgJ1NldHRpbmcuVmlldy5DdXN0b21VaS5QYXJhbWV0ZXJzLk1vZGFsU2V0dGluZycsXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChtb2RhbFNldHRpbmcpIHtcclxuICAgICAgICAgICAgaXNNb2RhbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcm1wYW5lbEN0cmxyLlNldHRpbmcuSXNNb2RhbCA9IGlzTW9kYWw7XHJcbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuSXNNb2RhbCA9IGlzTW9kYWw7XHJcbiAgICAgICAgY29uc3QgYnJlYWRDcnVtYiA9IGdldEhlYWRlclZhbHVlKGhlYWRlckxheW91dD8uQnJlYWRDcnVtYik7XHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGlkOiBtby4kU3RhdGUgPT09ICdOZXcnID8gJzAnIDogbW8uSWQsXHJcbiAgICAgICAgICAgIHR5aWQ6IG1vLiRUeXBlRGVmSWQsXHJcbiAgICAgICAgICAgIHR5Y3A6IG1vLiRDYXB0aW9uID8gbW8uJENhcHRpb24gOiBudWxsLFxyXG4gICAgICAgICAgICByZXBpZDogbW8uJFJlcG9ydElkLFxyXG4gICAgICAgICAgICB2aWQ6IGZvcm1wYW5lbEN0cmxyPy5TZXR0aW5nPy5WaWV3Py5UeXBlVmlld0lkLFxyXG4gICAgICAgICAgICBiYzogYnJlYWRDcnVtYiA/IGJyZWFkQ3J1bWIgOiBtby4kU3RhdGUgPT09ICdOZXcnID8gbW8uJFR5cGVEZWZOYW1lIDogbW8uJENhcHRpb25cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGlkID0gZ2V0VW5pcXVlSWQoNCk7XHJcbiAgICAgICAgdGhpcy5hZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHIpO1xyXG4gICAgICAgIHRoaXMub3BlbkZvcm0kLm5leHQoKTsgLy8gZXZlbnQgZW1pdCBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBrbm93IGZvcm0gb3BlblxyXG4gICAgICAgIGlmIChpc01vZGFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Rm9ybShcclxuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5xdWVyeVBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICBmb3JtcGFuZWxDdHJsclxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHZjclxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0geyBmb3JtUGFuZWxDdHJscklkOiBpZCB9O1xyXG4gICAgICAgICAgICBpZiAoaXNQYWdlKSB7XHJcbiAgICAgICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZm9ybScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxldHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCwgaXNGaXJzdDogdHJ1ZSB9XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlOiBpc1JlbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAncG9wdXAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogWydzaG93JywgeyAuLi5xdWVyeVBhcmFtcywgZm9ybVBhbmVsQ3RybHJJZDogaWQgfV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdwcmVzZXJ2ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogaXNSZWxvYWRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGxvYWRTeXN0ZW0oaWQ6IG51bWJlciA9IDApOiBQcm9taXNlPFBvcnRhbERhdGFNb2RlbD4ge1xyXG4gICAgICAgIGlmIChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhPy5lcnJvcj8udXNlck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkRlZmF1bHRTeXN0ZW1JZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLlVsLkFwcGxpY2F0aW9uQ3RybHIuX2xvYWRTeXN0ZW0oXHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfcmVtb3ZlUHVzaEFjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwdXNoQWN0aW9uU3RyID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICBpZiAocHVzaEFjdGlvblN0cikge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlKCdwdXNoQWN0aW9uJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHB1c2hBY3Rpb24gPSBKU09OLnBhcnNlKHB1c2hBY3Rpb25TdHIpO1xyXG4gICAgICAgICAgICB0aGlzLl9wdXNoQWN0aW9uJC5uZXh0KHB1c2hBY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgX2NoZWNrTG9jYWxTdG9yYWdlUHVzaEFjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwdXNoQWN0aW9uU3RyID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICBpZiAocHVzaEFjdGlvblN0cikge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlKCdwdXNoQWN0aW9uJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHB1c2hBY3Rpb24gPSBKU09OLnBhcnNlKHB1c2hBY3Rpb25TdHIpO1xyXG4gICAgICAgICAgICB0aGlzLl9wdXNoQWN0aW9uJC5uZXh0KHB1c2hBY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRBZnRlckxvZ2luRm9ybURhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ydGxTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzUnRsKTtcclxuICAgICAgICB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMpO1xyXG4gICAgICAgIHRoaXMuc2V0VXNlckxvZ2luU3RhdHVzKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNVc2VyTG9nZ2VkSW4pO1xyXG4gICAgICAgIHRoaXMuX2xvZ2dlZEluU291cmNlLm5leHQodGhpcy5fbG9nZ2VkSW5Tb3VyY2UuZ2V0VmFsdWUoKSAmJiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9pbml0VmlzaWJpbGl0eUNoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRTdGFuZGFsb25lKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5tYXRjaE1lZGlhKCcoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTWF0Y2ggPSBlLm1hdGNoZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YW5kYWxvbmUkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9pbml0UHVzaEFjdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY2hlY2tMb2NhbFN0b3JhZ2VQdXNoQWN0aW9uKCk7XHJcbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy51c2VyTG9nZ2VkSW4kLCB0aGlzLnB1c2hBY3Rpb24kXSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRoTGF0ZXN0RnJvbSh0aGlzLl9wb3J0YWxTZXJ2aWNlLnB1c2hBY3Rpb24kKSxcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlcigoW3VzZXJMb2dnZWRpbiwgYWN0aW9uXSkgPT4gdXNlckxvZ2dlZGluKVxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKChbdXNlckxvZ2dlZGluLCBwdXNoQWN0aW9uXSkgPT4gdXNlckxvZ2dlZGluKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKFt1c2VyTG9nZ2VkaW4sIHB1c2hBY3Rpb25dKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHVzaEFjdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwdXNoQWN0aW9uLm5vdGlmaWNhdGlvblRhZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVzaEFjdGlvbi5tb2lkICYmIHB1c2hBY3Rpb24udHBpZCAmJiBwdXNoQWN0aW9uLmFjdGlvbiA9PSAnc2hvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gQmFyc2FBcGkuQncuRm9ybS5TaG93KHsgTW9JZDogcHVzaEFjdGlvbi5tb2lkIH0pLCA1MDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FeGVjdXRlTm90aWZpY2F0aW9uQWN0aW9uKHB1c2hBY3Rpb24ubm90aWZpY2F0aW9uVGFnLCBwdXNoQWN0aW9uLmFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRMYW5kc2NhcGUoKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNNYXRjaCA9IGUubWF0Y2hlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLm5leHQoZmFsc2UpOyAvLyBwb3J0cmFpdFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5uZXh0KHRydWUpOyAvLyBsYW5kc2NhcGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBmaW5kUGFnZUJ5Um91dGUodXJsOiBzdHJpbmcpOiBQYWdlRGF0YU1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgZmluZGVkUGFnZSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gdXJsKTtcclxuICAgICAgICByZXR1cm4gZmluZGVkUGFnZSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXROZ01vZHVsZUZhY3RvcnkobW9kdWxlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgbW9kdWxlTmFtZTogc3RyaW5nKTogTmdNb2R1bGVGYWN0b3J5PGFueT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gbW9kdWxlc1ttb2R1bGVOYW1lICsgJ01vZHVsZSddO1xyXG4gICAgICAgIGxldCBtb2R1bGVGYWN0b3J5OiBOZ01vZHVsZUZhY3Rvcnk8YW55PjtcclxuICAgICAgICBpZiAobW9kdWxlQ2xhc3MgaW5zdGFuY2VvZiBOZ01vZHVsZUZhY3RvcnkpIHtcclxuICAgICAgICAgICAgbW9kdWxlRmFjdG9yeSA9IG1vZHVsZUNsYXNzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkID0gdGhpcy5jb21waWxlci5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMobW9kdWxlQ2xhc3MpO1xyXG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gY29tcGlsZWQubmdNb2R1bGVGYWN0b3J5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbW9kdWxlRmFjdG9yeTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFJlZ2lzdGVyZWRNb2R1bGVzKHVtZDogc3RyaW5nLCBleHBvcnRBczogc3RyaW5nW10sIG1vZHVsZU5hbWU6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgICAgIGxldCBtb2R1bGVzO1xyXG4gICAgICAgIGlmICh1bWQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXMgPSB3aW5kb3c7XHJcbiAgICAgICAgICAgIHVtZC5zcGxpdCgnLicpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlcyAhPT0gdHlwZW9mIHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgPSBtb2R1bGVzW2NdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtb2R1bGVzID0gd2luZG93W21vZHVsZU5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXhwb3J0QXMubGVuZ3RoID4gMCAmJiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGV4cG9ydEFzLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChjLCAwLCBtb2R1bGVzLCB3aW5kb3cpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZXM7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5RGVwZW5lY3kge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAga2ViYWJOYW1lOiBzdHJpbmc7XHJcbiAgICB1bWQ6IHN0cmluZztcclxuICAgIGV4cG9ydEFzOiBzdHJpbmdbXTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkQ3J1bWJJbmZvIHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcclxufVxyXG4iXX0=