barsa-novin-ray-core 0.0.2

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 (270) hide show
  1. package/README.md +25 -0
  2. package/esm2020/barsa-novin-ray-core.mjs +5 -0
  3. package/esm2020/lib/abstract-classes/application-base.mjs +24 -0
  4. package/esm2020/lib/abstract-classes/barsa-api.mjs +40 -0
  5. package/esm2020/lib/abstract-classes/field-base.mjs +167 -0
  6. package/esm2020/lib/abstract-classes/files-validation-helper.mjs +71 -0
  7. package/esm2020/lib/abstract-classes/form-base.mjs +101 -0
  8. package/esm2020/lib/abstract-classes/form-props.base.mjs +79 -0
  9. package/esm2020/lib/abstract-classes/form-toolbar-base.mjs +45 -0
  10. package/esm2020/lib/abstract-classes/index.mjs +21 -0
  11. package/esm2020/lib/abstract-classes/layout-item-base.mjs +33 -0
  12. package/esm2020/lib/abstract-classes/layout-panel-base.mjs +80 -0
  13. package/esm2020/lib/abstract-classes/models.mjs +172 -0
  14. package/esm2020/lib/abstract-classes/module-with-dynamic-components.mjs +2 -0
  15. package/esm2020/lib/abstract-classes/number-base.mjs +117 -0
  16. package/esm2020/lib/abstract-classes/page-base.mjs +97 -0
  17. package/esm2020/lib/abstract-classes/report-base.mjs +231 -0
  18. package/esm2020/lib/abstract-classes/report-item-base.mjs +53 -0
  19. package/esm2020/lib/abstract-classes/report-view-base.component.mjs +262 -0
  20. package/esm2020/lib/abstract-classes/system-base.mjs +24 -0
  21. package/esm2020/lib/auth-guard.mjs +37 -0
  22. package/esm2020/lib/barsa-novin-ray-core-routing.module.mjs +18 -0
  23. package/esm2020/lib/barsa-novin-ray-core.module.mjs +271 -0
  24. package/esm2020/lib/base-ulv-setting.component.mjs +37 -0
  25. package/esm2020/lib/base.component.mjs +59 -0
  26. package/esm2020/lib/base.module.mjs +28 -0
  27. package/esm2020/lib/constants.mjs +441 -0
  28. package/esm2020/lib/container.component.mjs +76 -0
  29. package/esm2020/lib/custom-route-reuse-strategy.mjs +32 -0
  30. package/esm2020/lib/date-services/date-hijri.service.mjs +127 -0
  31. package/esm2020/lib/date-services/date-info.mjs +2 -0
  32. package/esm2020/lib/date-services/date-miladi.service.mjs +124 -0
  33. package/esm2020/lib/date-services/date-shamsi.service.mjs +129 -0
  34. package/esm2020/lib/date-services/date.service.mjs +139 -0
  35. package/esm2020/lib/date-services/index.mjs +6 -0
  36. package/esm2020/lib/device.mjs +663 -0
  37. package/esm2020/lib/directives/anchor-scroll.directive.mjs +24 -0
  38. package/esm2020/lib/directives/attr-rtl.directive.mjs +35 -0
  39. package/esm2020/lib/directives/base.directive.mjs +51 -0
  40. package/esm2020/lib/directives/column-resizer.directive.mjs +39 -0
  41. package/esm2020/lib/directives/dynamic-command.directive.mjs +43 -0
  42. package/esm2020/lib/directives/ellipsify.directive.mjs +72 -0
  43. package/esm2020/lib/directives/field-binding.directive.mjs +17 -0
  44. package/esm2020/lib/directives/img-lazy.directive.mjs +75 -0
  45. package/esm2020/lib/directives/index.mjs +19 -0
  46. package/esm2020/lib/directives/intersection-observer.directive.mjs +49 -0
  47. package/esm2020/lib/directives/items-renderer.directive.mjs +59 -0
  48. package/esm2020/lib/directives/numbers-only-input.directive.mjs +26 -0
  49. package/esm2020/lib/directives/placeHolder.directive.mjs +15 -0
  50. package/esm2020/lib/directives/render-ulv-paging.directive.mjs +58 -0
  51. package/esm2020/lib/directives/render-ulv-viewer.directive.mjs +60 -0
  52. package/esm2020/lib/directives/table-resizer.directive.mjs +235 -0
  53. package/esm2020/lib/directives/ulv-command.directive.mjs +41 -0
  54. package/esm2020/lib/directives/until-inview.directive.mjs +51 -0
  55. package/esm2020/lib/dynamic-component/base-dynamic.component.mjs +89 -0
  56. package/esm2020/lib/dynamic-component/base-form-toolbaritem-props.mjs +50 -0
  57. package/esm2020/lib/dynamic-component/base-item-content-props.mjs +70 -0
  58. package/esm2020/lib/dynamic-component/base-view-content-props.mjs +26 -0
  59. package/esm2020/lib/dynamic-component/base-view-item-props.mjs +374 -0
  60. package/esm2020/lib/dynamic-component/base-view-props.mjs +127 -0
  61. package/esm2020/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +36 -0
  62. package/esm2020/lib/dynamic-component/dynamic-form.component.mjs +62 -0
  63. package/esm2020/lib/dynamic-component/dynamic-item.component.mjs +60 -0
  64. package/esm2020/lib/dynamic-component/index.mjs +10 -0
  65. package/esm2020/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +16 -0
  66. package/esm2020/lib/field-ui/field-ui.component.mjs +116 -0
  67. package/esm2020/lib/form/form.component.mjs +151 -0
  68. package/esm2020/lib/form-new/form-new.component.mjs +30 -0
  69. package/esm2020/lib/from-intersection-observer.mjs +53 -0
  70. package/esm2020/lib/global-error-handler.mjs +26 -0
  71. package/esm2020/lib/modal-root.component.mjs +31 -0
  72. package/esm2020/lib/not-found/not-found.component.mjs +16 -0
  73. package/esm2020/lib/pipes/barsa-icon-dict.pipe.mjs +18 -0
  74. package/esm2020/lib/pipes/bbb-translate.pipe.mjs +29 -0
  75. package/esm2020/lib/pipes/can-upload.pipe.mjs +30 -0
  76. package/esm2020/lib/pipes/context-menu.pipe.mjs +40 -0
  77. package/esm2020/lib/pipes/control-ui.pipe.mjs +31 -0
  78. package/esm2020/lib/pipes/convert-to-style.pipe.mjs +32 -0
  79. package/esm2020/lib/pipes/date-time-to-caption.pipe.mjs +34 -0
  80. package/esm2020/lib/pipes/fileinfo-count.pipe.mjs +20 -0
  81. package/esm2020/lib/pipes/filter-columns-by-details.pipe.mjs +20 -0
  82. package/esm2020/lib/pipes/filter-string.pipe.mjs +44 -0
  83. package/esm2020/lib/pipes/filter-tab.pipe.mjs +19 -0
  84. package/esm2020/lib/pipes/filter-toolbar-control.pipe.mjs +16 -0
  85. package/esm2020/lib/pipes/filter.pipe.mjs +33 -0
  86. package/esm2020/lib/pipes/find-column-by-db-name.pipe.mjs +17 -0
  87. package/esm2020/lib/pipes/fiori-icon.pipe.mjs +42 -0
  88. package/esm2020/lib/pipes/groupby.pipe.mjs +48 -0
  89. package/esm2020/lib/pipes/header-facet-value.pipe.mjs +22 -0
  90. package/esm2020/lib/pipes/index.mjs +33 -0
  91. package/esm2020/lib/pipes/list-count.pipe.mjs +17 -0
  92. package/esm2020/lib/pipes/merge-fields-to-columns.pipe.mjs +42 -0
  93. package/esm2020/lib/pipes/mo-info-ulv-data.pipe.mjs +24 -0
  94. package/esm2020/lib/pipes/mo-report-value-concat.pipe.mjs +35 -0
  95. package/esm2020/lib/pipes/mo-report-value.pipe.mjs +28 -0
  96. package/esm2020/lib/pipes/mo-value.pipe.mjs +31 -0
  97. package/esm2020/lib/pipes/multiple-groupby.pipe.mjs +97 -0
  98. package/esm2020/lib/pipes/numeral.pipe.mjs +40 -0
  99. package/esm2020/lib/pipes/picture-field-source.pipe.mjs +22 -0
  100. package/esm2020/lib/pipes/remove-newline.pipe.mjs +20 -0
  101. package/esm2020/lib/pipes/seperator-fix.pipe.mjs +23 -0
  102. package/esm2020/lib/pipes/sort.pipe.mjs +48 -0
  103. package/esm2020/lib/pipes/tlbButtons.pipe.mjs +58 -0
  104. package/esm2020/lib/pipes/total-summary.pipe.mjs +16 -0
  105. package/esm2020/lib/pipes/visible-value.pipe.mjs +24 -0
  106. package/esm2020/lib/portal-page/portal-page.component.mjs +13 -0
  107. package/esm2020/lib/redirect-home-guard.mjs +28 -0
  108. package/esm2020/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +33 -0
  109. package/esm2020/lib/report-container/report-container.component.mjs +52 -0
  110. package/esm2020/lib/resolvers/index.mjs +5 -0
  111. package/esm2020/lib/resolvers/portal-dynamic-page.resolver.mjs +49 -0
  112. package/esm2020/lib/resolvers/portal-form-page.resolver.mjs +18 -0
  113. package/esm2020/lib/resolvers/portal-page.resolver.mjs +30 -0
  114. package/esm2020/lib/resolvers/portal-report-page.resolver.mjs +37 -0
  115. package/esm2020/lib/root-page/root-page.component.mjs +21 -0
  116. package/esm2020/lib/root-portal/root-portal.component.mjs +51 -0
  117. package/esm2020/lib/services/api.service.mjs +60 -0
  118. package/esm2020/lib/services/barsa-dialog.service.mjs +80 -0
  119. package/esm2020/lib/services/breadcrumb.service.mjs +60 -0
  120. package/esm2020/lib/services/container.service.mjs +36 -0
  121. package/esm2020/lib/services/dynamic-component.service.mjs +55 -0
  122. package/esm2020/lib/services/form-panel.service.mjs +235 -0
  123. package/esm2020/lib/services/form.service.mjs +14 -0
  124. package/esm2020/lib/services/horizontal-layout.service.mjs +16 -0
  125. package/esm2020/lib/services/index.mjs +16 -0
  126. package/esm2020/lib/services/layout.service.mjs +42 -0
  127. package/esm2020/lib/services/log.service.mjs +50 -0
  128. package/esm2020/lib/services/network-status.service.mjs +15 -0
  129. package/esm2020/lib/services/portal.service.mjs +638 -0
  130. package/esm2020/lib/services/ui.service.mjs +23 -0
  131. package/esm2020/lib/services/ulvmain.service.mjs +594 -0
  132. package/esm2020/lib/services/upload.service.mjs +75 -0
  133. package/esm2020/public-api.mjs +33 -0
  134. package/fesm2015/barsa-novin-ray-core.mjs +9047 -0
  135. package/fesm2015/barsa-novin-ray-core.mjs.map +1 -0
  136. package/fesm2020/barsa-novin-ray-core.mjs +8945 -0
  137. package/fesm2020/barsa-novin-ray-core.mjs.map +1 -0
  138. package/index.d.ts +5 -0
  139. package/lib/abstract-classes/application-base.d.ts +53 -0
  140. package/lib/abstract-classes/barsa-api.d.ts +28 -0
  141. package/lib/abstract-classes/field-base.d.ts +81 -0
  142. package/lib/abstract-classes/files-validation-helper.d.ts +15 -0
  143. package/lib/abstract-classes/form-base.d.ts +59 -0
  144. package/lib/abstract-classes/form-props.base.d.ts +45 -0
  145. package/lib/abstract-classes/form-toolbar-base.d.ts +17 -0
  146. package/lib/abstract-classes/index.d.ts +20 -0
  147. package/lib/abstract-classes/layout-item-base.d.ts +15 -0
  148. package/lib/abstract-classes/layout-panel-base.d.ts +24 -0
  149. package/lib/abstract-classes/models.d.ts +660 -0
  150. package/lib/abstract-classes/module-with-dynamic-components.d.ts +4 -0
  151. package/lib/abstract-classes/number-base.d.ts +20 -0
  152. package/lib/abstract-classes/page-base.d.ts +31 -0
  153. package/lib/abstract-classes/report-base.d.ts +97 -0
  154. package/lib/abstract-classes/report-item-base.d.ts +33 -0
  155. package/lib/abstract-classes/report-view-base.component.d.ts +130 -0
  156. package/lib/abstract-classes/system-base.d.ts +45 -0
  157. package/lib/auth-guard.d.ts +12 -0
  158. package/lib/barsa-novin-ray-core-routing.module.d.ts +7 -0
  159. package/lib/barsa-novin-ray-core.module.d.ts +88 -0
  160. package/lib/base-ulv-setting.component.d.ts +18 -0
  161. package/lib/base.component.d.ts +15 -0
  162. package/lib/base.module.d.ts +13 -0
  163. package/lib/constants.d.ts +89 -0
  164. package/lib/container.component.d.ts +33 -0
  165. package/lib/custom-route-reuse-strategy.d.ts +11 -0
  166. package/lib/date-services/date-hijri.service.d.ts +40 -0
  167. package/lib/date-services/date-info.d.ts +15 -0
  168. package/lib/date-services/date-miladi.service.d.ts +39 -0
  169. package/lib/date-services/date-shamsi.service.d.ts +40 -0
  170. package/lib/date-services/date.service.d.ts +54 -0
  171. package/lib/date-services/index.d.ts +5 -0
  172. package/lib/device.d.ts +15 -0
  173. package/lib/directives/anchor-scroll.directive.d.ts +7 -0
  174. package/lib/directives/attr-rtl.directive.d.ts +13 -0
  175. package/lib/directives/base.directive.d.ts +13 -0
  176. package/lib/directives/column-resizer.directive.d.ts +13 -0
  177. package/lib/directives/dynamic-command.directive.d.ts +12 -0
  178. package/lib/directives/ellipsify.directive.d.ts +17 -0
  179. package/lib/directives/field-binding.directive.d.ts +7 -0
  180. package/lib/directives/img-lazy.directive.d.ts +20 -0
  181. package/lib/directives/index.d.ts +18 -0
  182. package/lib/directives/intersection-observer.directive.d.ts +17 -0
  183. package/lib/directives/items-renderer.directive.d.ts +17 -0
  184. package/lib/directives/numbers-only-input.directive.d.ts +9 -0
  185. package/lib/directives/placeHolder.directive.d.ts +6 -0
  186. package/lib/directives/render-ulv-paging.directive.d.ts +19 -0
  187. package/lib/directives/render-ulv-viewer.directive.d.ts +19 -0
  188. package/lib/directives/table-resizer.directive.d.ts +47 -0
  189. package/lib/directives/ulv-command.directive.d.ts +11 -0
  190. package/lib/directives/until-inview.directive.d.ts +17 -0
  191. package/lib/dynamic-component/base-dynamic.component.d.ts +26 -0
  192. package/lib/dynamic-component/base-form-toolbaritem-props.d.ts +28 -0
  193. package/lib/dynamic-component/base-item-content-props.d.ts +40 -0
  194. package/lib/dynamic-component/base-view-content-props.d.ts +11 -0
  195. package/lib/dynamic-component/base-view-item-props.d.ts +95 -0
  196. package/lib/dynamic-component/base-view-props.d.ts +65 -0
  197. package/lib/dynamic-component/dynamic-form-toolbar-item.component.d.ts +18 -0
  198. package/lib/dynamic-component/dynamic-form.component.d.ts +33 -0
  199. package/lib/dynamic-component/dynamic-item.component.d.ts +30 -0
  200. package/lib/dynamic-component/index.d.ts +9 -0
  201. package/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.d.ts +7 -0
  202. package/lib/field-ui/field-ui.component.d.ts +27 -0
  203. package/lib/form/form.component.d.ts +36 -0
  204. package/lib/form-new/form-new.component.d.ts +23 -0
  205. package/lib/from-intersection-observer.d.ts +7 -0
  206. package/lib/global-error-handler.d.ts +8 -0
  207. package/lib/modal-root.component.d.ts +15 -0
  208. package/lib/not-found/not-found.component.d.ts +8 -0
  209. package/lib/pipes/barsa-icon-dict.pipe.d.ts +9 -0
  210. package/lib/pipes/bbb-translate.pipe.d.ts +7 -0
  211. package/lib/pipes/can-upload.pipe.d.ts +8 -0
  212. package/lib/pipes/context-menu.pipe.d.ts +11 -0
  213. package/lib/pipes/control-ui.pipe.d.ts +9 -0
  214. package/lib/pipes/convert-to-style.pipe.d.ts +8 -0
  215. package/lib/pipes/date-time-to-caption.pipe.d.ts +9 -0
  216. package/lib/pipes/fileinfo-count.pipe.d.ts +10 -0
  217. package/lib/pipes/filter-columns-by-details.pipe.d.ts +8 -0
  218. package/lib/pipes/filter-string.pipe.d.ts +11 -0
  219. package/lib/pipes/filter-tab.pipe.d.ts +7 -0
  220. package/lib/pipes/filter-toolbar-control.pipe.d.ts +8 -0
  221. package/lib/pipes/filter.pipe.d.ts +10 -0
  222. package/lib/pipes/find-column-by-db-name.pipe.d.ts +8 -0
  223. package/lib/pipes/fiori-icon.pipe.d.ts +7 -0
  224. package/lib/pipes/groupby.pipe.d.ts +7 -0
  225. package/lib/pipes/header-facet-value.pipe.d.ts +8 -0
  226. package/lib/pipes/index.d.ts +32 -0
  227. package/lib/pipes/list-count.pipe.d.ts +8 -0
  228. package/lib/pipes/merge-fields-to-columns.pipe.d.ts +10 -0
  229. package/lib/pipes/mo-info-ulv-data.pipe.d.ts +7 -0
  230. package/lib/pipes/mo-report-value-concat.pipe.d.ts +9 -0
  231. package/lib/pipes/mo-report-value.pipe.d.ts +12 -0
  232. package/lib/pipes/mo-value.pipe.d.ts +9 -0
  233. package/lib/pipes/multiple-groupby.pipe.d.ts +23 -0
  234. package/lib/pipes/numeral.pipe.d.ts +9 -0
  235. package/lib/pipes/picture-field-source.pipe.d.ts +8 -0
  236. package/lib/pipes/remove-newline.pipe.d.ts +8 -0
  237. package/lib/pipes/seperator-fix.pipe.d.ts +7 -0
  238. package/lib/pipes/sort.pipe.d.ts +9 -0
  239. package/lib/pipes/tlbButtons.pipe.d.ts +9 -0
  240. package/lib/pipes/total-summary.pipe.d.ts +8 -0
  241. package/lib/pipes/visible-value.pipe.d.ts +8 -0
  242. package/lib/portal-page/portal-page.component.d.ts +6 -0
  243. package/lib/redirect-home-guard.d.ts +13 -0
  244. package/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.d.ts +14 -0
  245. package/lib/report-container/report-container.component.d.ts +24 -0
  246. package/lib/resolvers/index.d.ts +4 -0
  247. package/lib/resolvers/portal-dynamic-page.resolver.d.ts +12 -0
  248. package/lib/resolvers/portal-form-page.resolver.d.ts +8 -0
  249. package/lib/resolvers/portal-page.resolver.d.ts +12 -0
  250. package/lib/resolvers/portal-report-page.resolver.d.ts +12 -0
  251. package/lib/root-page/root-page.component.d.ts +10 -0
  252. package/lib/root-portal/root-portal.component.d.ts +14 -0
  253. package/lib/services/api.service.d.ts +18 -0
  254. package/lib/services/barsa-dialog.service.d.ts +31 -0
  255. package/lib/services/breadcrumb.service.d.ts +14 -0
  256. package/lib/services/container.service.d.ts +14 -0
  257. package/lib/services/dynamic-component.service.d.ts +13 -0
  258. package/lib/services/form-panel.service.d.ts +83 -0
  259. package/lib/services/form.service.d.ts +8 -0
  260. package/lib/services/horizontal-layout.service.d.ts +7 -0
  261. package/lib/services/index.d.ts +15 -0
  262. package/lib/services/layout.service.d.ts +23 -0
  263. package/lib/services/log.service.d.ts +17 -0
  264. package/lib/services/network-status.service.d.ts +7 -0
  265. package/lib/services/portal.service.d.ts +130 -0
  266. package/lib/services/ui.service.d.ts +14 -0
  267. package/lib/services/ulvmain.service.d.ts +178 -0
  268. package/lib/services/upload.service.d.ts +18 -0
  269. package/package.json +38 -0
  270. package/public-api.d.ts +29 -0
@@ -0,0 +1,638 @@
1
+ import { Injectable, NgModuleFactory } from '@angular/core';
2
+ import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject } from 'rxjs';
3
+ import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime } from 'rxjs/operators';
4
+ import { BarsaApi } from '../abstract-classes/barsa-api';
5
+ import { getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
6
+ import { PortalPageResolver } from '../resolvers/portal-page.resolver';
7
+ import { AuthGuard } from '../auth-guard';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./dynamic-component.service";
10
+ import * as i2 from "./api.service";
11
+ import * as i3 from "./log.service";
12
+ import * as i4 from "./barsa-dialog.service";
13
+ import * as i5 from "@angular/router";
14
+ import * as i6 from "@angular/common";
15
+ export class PortalService {
16
+ constructor(dcm, apiService, logService, dialogService, compiler, _router, _location) {
17
+ this.dcm = dcm;
18
+ this.apiService = apiService;
19
+ this.logService = logService;
20
+ this.dialogService = dialogService;
21
+ this.compiler = compiler;
22
+ this._router = _router;
23
+ this._location = _location;
24
+ this.offsetTop = 0;
25
+ this.loginLoading = new BehaviorSubject(false);
26
+ this.loaded = false;
27
+ this.formPanels = {};
28
+ this.cachedImages = {};
29
+ this.cachedPageData = {};
30
+ this.pages = [];
31
+ this.rtlSource = new BehaviorSubject(BarsaApi.LoginFormData.IsRtl);
32
+ this.dictionary = {};
33
+ this.portalDataSource = new BehaviorSubject(null);
34
+ this._isAnonumousSource = new BehaviorSubject(true);
35
+ this._deviceSizeSource = new BehaviorSubject('l');
36
+ this._loggedInSource = new BehaviorSubject(false);
37
+ this.routeInitializedSource = new BehaviorSubject(false);
38
+ this.dateTextSource = new BehaviorSubject('');
39
+ this._navigationStart$ = new BehaviorSubject(null);
40
+ this._navigationEnd$ = new BehaviorSubject(null);
41
+ this._userPortalSettings$ = new BehaviorSubject(null);
42
+ this._notifications$ = new BehaviorSubject([]);
43
+ this._cssUrlSource = new BehaviorSubject(null);
44
+ this._cssCustomUrlSource = new BehaviorSubject(null);
45
+ this._searchTerm$ = new BehaviorSubject('');
46
+ this._windowResize$ = new Subject();
47
+ this.initialize();
48
+ this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
49
+ }
50
+ get windowResize$() {
51
+ return this._windowResize$.asObservable();
52
+ }
53
+ get notifications$() {
54
+ return this._notifications$.asObservable();
55
+ }
56
+ get notificationsCount$() {
57
+ return this._notifications$.asObservable().pipe(map((items) => items.filter((c) => c.Unread).length));
58
+ }
59
+ get portalData() {
60
+ return this.portalDataSource.getValue();
61
+ }
62
+ get searchTerm$() {
63
+ return this._searchTerm$.asObservable();
64
+ }
65
+ get cssUrl$() {
66
+ return this._cssUrlSource.asObservable();
67
+ }
68
+ get cssCustomUrl$() {
69
+ return this._cssCustomUrlSource.asObservable();
70
+ }
71
+ get userPortalSettings() {
72
+ return this._userPortalSettings$.getValue();
73
+ }
74
+ get userPortalSettings$() {
75
+ return this._userPortalSettings$.asObservable();
76
+ }
77
+ get deviceSize() {
78
+ return this._deviceSizeSource.getValue();
79
+ }
80
+ get isAnonymous$() {
81
+ return this._isAnonumousSource.asObservable();
82
+ }
83
+ get navigationEnd$() {
84
+ return this._navigationEnd$.asObservable();
85
+ }
86
+ get navigationStart$() {
87
+ return this._navigationStart$.asObservable();
88
+ }
89
+ loadNotifications() {
90
+ BarsaApi.Bw.RunBlMethodAsync({
91
+ Parameters: [],
92
+ Method: 'GetShellbarNotifications',
93
+ SuccessFn: (moList) => {
94
+ this._notifications$.next(moList);
95
+ },
96
+ FailFn: (e) => {
97
+ this.logService.error(e);
98
+ }
99
+ });
100
+ }
101
+ setSearchTerm(term) {
102
+ this._searchTerm$.next(term);
103
+ }
104
+ windowResize() {
105
+ this._windowResize$.next();
106
+ }
107
+ naviationEnd(event) {
108
+ this._navigationEnd$.next(event);
109
+ }
110
+ naviationStart(event) {
111
+ this._navigationStart$.next(event);
112
+ }
113
+ setUserPortalSettings(userPortalSettings) {
114
+ this._userPortalSettings$.next(userPortalSettings);
115
+ }
116
+ setTheme(themeUrl) {
117
+ this._cssUrlSource.next(themeUrl);
118
+ this._cssCustomUrlSource.next(themeUrl);
119
+ }
120
+ setData(key, data) {
121
+ if (!this.dictionary[key]) {
122
+ this.dictionary[key] = new BehaviorSubject(data);
123
+ this.dictionary[key].next(data);
124
+ }
125
+ else {
126
+ const oldVal = this.dictionary[key].getValue();
127
+ if (oldVal !== data) {
128
+ this.dictionary[key].next(data);
129
+ }
130
+ }
131
+ }
132
+ getData(key, defaultValue = null) {
133
+ if (!this.dictionary[key]) {
134
+ this.dictionary[key] = new BehaviorSubject(defaultValue);
135
+ }
136
+ return this.dictionary[key].asObservable();
137
+ }
138
+ getDataSync(key, defaultValue = null) {
139
+ if (!this.dictionary[key]) {
140
+ return defaultValue;
141
+ }
142
+ return this.dictionary[key].getValue();
143
+ }
144
+ createForReport(navItem) {
145
+ return from(new Promise((resolve, reject) => {
146
+ BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
147
+ if (err) {
148
+ reject(err);
149
+ }
150
+ else {
151
+ resolve(result);
152
+ }
153
+ });
154
+ }));
155
+ }
156
+ renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
157
+ return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
158
+ }
159
+ getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
160
+ const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
161
+ const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
162
+ return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
163
+ const componentInstance = component.instance;
164
+ componentInstance.id = customUlvMainUi.id;
165
+ componentInstance.context = customUlvMainUi;
166
+ componentInstance.isReportPage = isReportPage;
167
+ customUlvMainUi.controlUi = componentInstance;
168
+ return component;
169
+ }));
170
+ }
171
+ initialize() {
172
+ this.deviceSize$ = this._deviceSizeSource.asObservable().pipe(distinctUntilChanged());
173
+ this.portalData$ = this.portalDataSource.asObservable();
174
+ this.rtl$ = this.rtlSource.asObservable().pipe(distinctUntilChanged());
175
+ this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
176
+ this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
177
+ this.dateText$ = this.dateTextSource.asObservable();
178
+ this.portalSettings$ = this.portalDataSource
179
+ .asObservable()
180
+ .pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
181
+ fromEvent(window, 'resize')
182
+ .pipe(startWith(null), debounceTime(1000), map(() => this._initalizeDeviceSize()))
183
+ .subscribe((c) => {
184
+ this._windowResize$.next();
185
+ this._deviceSizeSource.next(c);
186
+ });
187
+ this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
188
+ this.userLoggedIn$ = this._loggedInSource
189
+ .asObservable()
190
+ .pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
191
+ }
192
+ _setDeviceSize() {
193
+ const deviceSize = this._initalizeDeviceSize();
194
+ this._deviceSizeSource.next(deviceSize);
195
+ }
196
+ _initalizeDeviceSize() {
197
+ const _ismobile = getDeviceIsMobile();
198
+ const _isTablet = getDeviceIsTablet();
199
+ let _windoWSize = 's';
200
+ if (window.innerWidth <= 600) {
201
+ _windoWSize = 's';
202
+ }
203
+ else if (window.innerWidth > 600 && window.innerWidth <= 992) {
204
+ _windoWSize = 'm';
205
+ }
206
+ else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
207
+ _windoWSize = 'l';
208
+ }
209
+ else {
210
+ _windoWSize = 'xl';
211
+ }
212
+ if (_ismobile) {
213
+ return 's';
214
+ }
215
+ if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
216
+ return 'm';
217
+ }
218
+ return _windoWSize;
219
+ }
220
+ compileModule(dependency) {
221
+ const module$ = this.getModule(dependency);
222
+ return module$.pipe(concatMap((modules) => {
223
+ const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
224
+ return of(moduleFactory);
225
+ }));
226
+ }
227
+ getModule(dependency) {
228
+ const { name, kebabName, umd, exportAs } = dependency;
229
+ const base = `/assets/modules/${kebabName}/bundles`;
230
+ const date = BarsaApi.LoginFormData.abc;
231
+ const path = `${base}/${kebabName}.umd.js?t=${date}`;
232
+ return of(true).pipe(concatMap(() => {
233
+ const modules = this.getRegisteredModules(umd, exportAs, name);
234
+ if (modules) {
235
+ return of(modules);
236
+ }
237
+ return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
238
+ }));
239
+ }
240
+ setValueOnObject(path, index, modules, object) {
241
+ const splited = path.split('.');
242
+ const prop = splited[index];
243
+ if (typeof object[prop] === typeof undefined) {
244
+ object[prop] = {};
245
+ }
246
+ if (index === splited.length - 1) {
247
+ object[prop] = modules;
248
+ return;
249
+ }
250
+ this.setValueOnObject(path, index + 1, modules, object[prop]);
251
+ }
252
+ getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
253
+ return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
254
+ }
255
+ loadJs$(path) {
256
+ return from(new Promise((resolve, reject) => {
257
+ const script = document.createElement('script');
258
+ script.setAttribute('type', 'text/javascript');
259
+ script.setAttribute('src', path);
260
+ script.onload = () => {
261
+ resolve(path);
262
+ };
263
+ document.getElementsByTagName('head')[0].appendChild(script);
264
+ setTimeout(() => {
265
+ reject();
266
+ }, 5000);
267
+ }));
268
+ }
269
+ ReportExecute(reportName) {
270
+ return from(this.ReportExecutePromise(reportName));
271
+ }
272
+ ReportExecutePromise(reportName) {
273
+ const ulvParams = {
274
+ Flags: {
275
+ Data: 'True',
276
+ Extra: 'False',
277
+ Search: 'False',
278
+ View: 'False'
279
+ // General:"False", // ulvmainctrl does not craete ui control raise error
280
+ },
281
+ ReportName: reportName,
282
+ UsageEnum: 'SystemContainer'
283
+ };
284
+ return new Promise((resolve, reject) => {
285
+ BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
286
+ resolve(result.Data);
287
+ }, (err) => {
288
+ reject(err);
289
+ });
290
+ });
291
+ }
292
+ addFormPanelCtrlr(id, formpanelCtrlr) {
293
+ this.formPanels[id] = formpanelCtrlr;
294
+ }
295
+ setUserLoginStatus(status) {
296
+ this._loggedInSource.next(status);
297
+ }
298
+ extractAllPages(portalData) {
299
+ if (!portalData) {
300
+ return;
301
+ }
302
+ portalData.ChildPageList.MoDataList.forEach((pageData) => {
303
+ this.addChildPages(pageData);
304
+ });
305
+ }
306
+ extractAllPages_Old(portalData) {
307
+ if (!portalData) {
308
+ return;
309
+ }
310
+ const config = this._router.config;
311
+ portalData.ChildPageList.MoDataList.forEach((pageData) => {
312
+ const path = pageData.Route.replace('/', '');
313
+ config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
314
+ if (pageData.IsDefaultRoute) {
315
+ this.defaultRoute = path;
316
+ config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
317
+ }
318
+ this.addChildPages(pageData);
319
+ });
320
+ this._router.resetConfig(config);
321
+ if (this._location.path() === '') {
322
+ // this._router.navigate([this.defaultRoute]);
323
+ this._router.navigate(['']);
324
+ }
325
+ // this.routeInitialized();
326
+ }
327
+ ssoLogin() {
328
+ AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
329
+ // console.log(response);
330
+ }, () => {
331
+ alert('error in sso login.');
332
+ }, null);
333
+ }
334
+ ssoLogout() {
335
+ AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
336
+ // console.log(response);
337
+ }, () => {
338
+ alert('error in sso logout.');
339
+ }, null);
340
+ }
341
+ addChildPages(pageData) {
342
+ this.pages.push(pageData);
343
+ if (!pageData.ChildPageList?.MoDataList?.length) {
344
+ return;
345
+ }
346
+ pageData.ChildPageList.MoDataList.forEach((childPage) => {
347
+ this.addChildPages(childPage);
348
+ });
349
+ }
350
+ /* eslint-disable */
351
+ createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
352
+ return {};
353
+ }
354
+ createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
355
+ let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
356
+ const umd = moduleName;
357
+ modulePath = modulePath.substring(1, modulePath.length);
358
+ const dynamicRoute = {};
359
+ dynamicRoute.path = path;
360
+ dynamicRoute.data = { pageData };
361
+ if (!isDynamicRoute) {
362
+ dynamicRoute.resolve = {
363
+ pageData: PortalPageResolver
364
+ };
365
+ }
366
+ if (path === '') {
367
+ dynamicRoute.pathMatch = 'full';
368
+ }
369
+ if (redirectTo) {
370
+ dynamicRoute.redirectTo = redirectTo;
371
+ }
372
+ else {
373
+ if (hasAuthorized) {
374
+ dynamicRoute.canActivate = [AuthGuard];
375
+ }
376
+ dynamicRoute.loadChildren = () => {
377
+ const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
378
+ const pageLibrary = {
379
+ name: moduleName,
380
+ kebabName: modulePath,
381
+ umd,
382
+ exportAs: [moduleName]
383
+ };
384
+ const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
385
+ return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
386
+ };
387
+ }
388
+ return dynamicRoute;
389
+ }
390
+ routeInitialized() {
391
+ this.routeInitializedSource.next(true);
392
+ }
393
+ loginByAnonymous() {
394
+ this.loginLoading.next(true);
395
+ return this.apiService.loginPortal().pipe(map((result) => {
396
+ if (typeof result === 'object' && result !== null) {
397
+ this.logService.debug(result);
398
+ window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
399
+ return true;
400
+ }
401
+ else {
402
+ return false;
403
+ }
404
+ }), finalize(() => {
405
+ this.loginLoading.next(false);
406
+ }));
407
+ }
408
+ getPageData(url, isRoot) {
409
+ if (isRoot || url === '' || url === '/') {
410
+ return this.portalData$;
411
+ }
412
+ if (url.indexOf('?') > -1) {
413
+ url = url.substr(0, url.indexOf('?'));
414
+ }
415
+ if (this.cachedPageData[url]) {
416
+ return this.cachedPageData[url];
417
+ }
418
+ const pageData = this.findPageByRoute(url);
419
+ AjaxHelper.UseCache = !pageData?.HasAuthorize;
420
+ this.cachedPageData[url] = this.apiService
421
+ .loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
422
+ .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
423
+ this.addChildRoute(pageMo, pageMo.ChildPageList);
424
+ this.addChildPages(pageMo);
425
+ }), publishReplay(1), refCount());
426
+ // this.cachedPageData[url] = this.portalData$.pipe(
427
+ // filter((portalData) => portalData != null),
428
+ // map((portalData) => ),
429
+ // concatMap((pageData) => {
430
+ // return
431
+ // }),
432
+ // tap(pageData=>{})
433
+ // );
434
+ return this.cachedPageData[url];
435
+ }
436
+ resolveData(routePageData) {
437
+ // const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
438
+ const pageData = this.pages.find((c) => c.Route === routePageData.Route);
439
+ if (!pageData) {
440
+ return of(null);
441
+ }
442
+ const id = pageData.Id;
443
+ if (this.cachedPageData[id]) {
444
+ return this.cachedPageData[id];
445
+ }
446
+ AjaxHelper.UseCache = !pageData?.HasAuthorize;
447
+ this.cachedPageData[id] = this.apiService
448
+ .loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
449
+ .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
450
+ this.addChildRoute(pageMo, pageMo.ChildPageList);
451
+ this.addChildPages(pageMo);
452
+ }), publishReplay(1), refCount());
453
+ // this.cachedPageData[url] = this.portalData$.pipe(
454
+ // filter((portalData) => portalData != null),
455
+ // map((portalData) => ),
456
+ // concatMap((pageData) => {
457
+ // return
458
+ // }),
459
+ // tap(pageData=>{})
460
+ // );
461
+ return this.cachedPageData[id];
462
+ }
463
+ addChildRoute(pageMo, ChildPageList) {
464
+ return;
465
+ }
466
+ addChildRoute_Old(pageMo, ChildPageList) {
467
+ if (!ChildPageList?.MoDataList?.length) {
468
+ return;
469
+ }
470
+ const config = this._router.config;
471
+ const parentPath = pageMo.Route.replace('/', '');
472
+ const parentRoute = config.find((c) => (c.path = parentPath));
473
+ const children = [];
474
+ if (parentRoute) {
475
+ ChildPageList.MoDataList.forEach((child) => {
476
+ const path = child.Route.replace('/', '');
477
+ const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
478
+ children.push(childroute);
479
+ });
480
+ // debugger;
481
+ parentRoute._loadedConfig.routes[0].children = children;
482
+ this._router.resetConfig(config);
483
+ }
484
+ }
485
+ loadPortalData_Old1() {
486
+ return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
487
+ const portalData = portalSetting.Data.Mo;
488
+ this.extractAllPages(portalData);
489
+ this.portalDataSource.next(portalData);
490
+ }), concatMap(() => from(this.loadSystems())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
491
+ }
492
+ loadPortalDataSync_Old2() {
493
+ const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
494
+ const portalData = portalSetting.Data.Mo;
495
+ this.extractAllPages(portalData);
496
+ this.portalDataSource.next(portalData);
497
+ this.loadSystems();
498
+ this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
499
+ }
500
+ loadPortalDataSync() {
501
+ const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
502
+ const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
503
+ const portalData = portalSetting;
504
+ this.extractAllPages(portalData);
505
+ this.portalDataSource.next(portalData);
506
+ this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
507
+ }
508
+ loadUserPortalSetting() {
509
+ BarsaApi.Bw.RunBlMethodAsync({
510
+ Parameters: [],
511
+ Method: 'GetUserPortalSettings',
512
+ SuccessFn: (userPortalSetting) => {
513
+ this._userPortalSettings$.next(userPortalSetting);
514
+ },
515
+ FailFn: (e) => {
516
+ this.logService.error(e);
517
+ }
518
+ });
519
+ }
520
+ ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, isReload = false) {
521
+ if (!formpanelCtrlr) {
522
+ console.warn('form panel controler is undefined!');
523
+ return;
524
+ }
525
+ const mo = formpanelCtrlr.Mo;
526
+ const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
527
+ let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
528
+ const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
529
+ if (modalSetting) {
530
+ isModal = true;
531
+ }
532
+ formpanelCtrlr.Setting.IsModal = isModal;
533
+ formpanelCtrlr.IsModal = isModal;
534
+ const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
535
+ const queryParams = {
536
+ id: mo.$State === 'New' ? '0' : mo.Id,
537
+ tyid: mo.$TypeDefId,
538
+ tycp: mo.$Caption ? mo.$Caption : null,
539
+ repid: mo.$ReportId,
540
+ vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
541
+ bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
542
+ };
543
+ const id = getUniqueId(4);
544
+ this.addFormPanelCtrlr(id, formpanelCtrlr);
545
+ if (isModal) {
546
+ this.dialogService.showForm(dialogComponent, {
547
+ ...queryParams,
548
+ formpanelCtrlr
549
+ });
550
+ }
551
+ else {
552
+ const state = { formPanelCtrlrId: id };
553
+ if (isPage) {
554
+ router.navigate([
555
+ 'form',
556
+ {
557
+ outlets: {
558
+ main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
559
+ }
560
+ }
561
+ ], {
562
+ state,
563
+ relativeTo: activatedRoute,
564
+ skipLocationChange: isReload
565
+ });
566
+ }
567
+ else {
568
+ router.navigate([
569
+ 'popup',
570
+ {
571
+ outlets: {
572
+ main: ['show', { ...queryParams, formPanelCtrlrId: id }]
573
+ }
574
+ }
575
+ ], {
576
+ relativeTo: activatedRoute,
577
+ state,
578
+ queryParamsHandling: 'preserve',
579
+ skipLocationChange: isReload
580
+ });
581
+ }
582
+ }
583
+ }
584
+ loadSystems() {
585
+ return new Promise((resolve, reject) => {
586
+ BarsaApi.Ul.ApplicationCtrlr._loadSystem(0, true, (data) => {
587
+ resolve(data);
588
+ }, (err) => {
589
+ reject(err);
590
+ });
591
+ });
592
+ }
593
+ findPageByRoute(url) {
594
+ const findedPage = this.pages.find((c) => c.Route === url);
595
+ return findedPage || null;
596
+ }
597
+ getNgModuleFactory(modules, moduleName) {
598
+ const moduleClass = modules[moduleName + 'Module'];
599
+ let moduleFactory;
600
+ if (moduleClass instanceof NgModuleFactory) {
601
+ moduleFactory = moduleClass;
602
+ }
603
+ else {
604
+ const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
605
+ moduleFactory = compiled.ngModuleFactory;
606
+ }
607
+ return moduleFactory;
608
+ }
609
+ getRegisteredModules(umd, exportAs, moduleName) {
610
+ let modules;
611
+ if (umd !== '') {
612
+ modules = window;
613
+ umd.split('.').forEach((c) => {
614
+ if (typeof modules !== typeof undefined) {
615
+ modules = modules[c];
616
+ }
617
+ });
618
+ }
619
+ else {
620
+ modules = window[moduleName];
621
+ }
622
+ if (exportAs.length > 0 && modules) {
623
+ exportAs.forEach((c) => {
624
+ this.setValueOnObject(c, 0, modules, window);
625
+ });
626
+ }
627
+ return modules;
628
+ }
629
+ }
630
+ PortalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", 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 }], target: i0.ɵɵFactoryTarget.Injectable });
631
+ PortalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: PortalService, providedIn: 'root' });
632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: PortalService, decorators: [{
633
+ type: Injectable,
634
+ args: [{
635
+ providedIn: 'root'
636
+ }]
637
+ }], ctorParameters: function () { return [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }]; } });
638
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEIsVUFBVSxFQUFZLGVBQWUsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFHdEgsT0FBTyxFQUFjLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNGLE9BQU8sRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQWF4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFTMUMsTUFBTSxPQUFPLGFBQWE7SUFrQ3RCLFlBQ1ksR0FBNEIsRUFDNUIsVUFBc0IsRUFDdEIsVUFBc0IsRUFDdEIsYUFBaUMsRUFDakMsUUFBa0IsRUFDbEIsT0FBZSxFQUNmLFNBQW1CO1FBTm5CLFFBQUcsR0FBSCxHQUFHLENBQXlCO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBb0I7UUFDakMsYUFB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QUFJLE9BQU8sT0FBTyxLQUFLLE9BQU8sU0FBUyxFQUFFO29CQUNyQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7MEdBdnZCUSxhQUFhOzhHQUFiLGFBQWEsY0FGVixNQUFNOzJGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZXIsIENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nTW9kdWxlRmFjdG9yeSwgVHlwZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mLCBmcm9tLCBmb3JrSm9pbiwgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIHRhcCxcbiAgICBtYXAsXG4gICAgY29uY2F0TWFwLFxuICAgIGZpbmFsaXplLFxuICAgIHB1Ymxpc2hSZXBsYXksXG4gICAgcmVmQ291bnQsXG4gICAgZXhoYXVzdE1hcCxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBzdGFydFdpdGgsXG4gICAgZGVib3VuY2VUaW1lXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXG4gICAgTG9naW5SZXN1bHQsXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBNb0ZvclJlcG9ydE1vZGVsLFxuICAgIFBhZ2VEYXRhTW9kZWwsXG4gICAgUG9ydGFsRGF0YU1vZGVsLFxuICAgIFJlcG9ydE1vZGVsXG59IGZyb20gJy4uL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhcnNhQXBpIH0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9iYXJzYS1hcGknO1xuaW1wb3J0IHsgQmFyc2FEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9iYXJzYS1kaWFsb2cuc2VydmljZSc7XG5cbmltcG9ydCB7IGdldENvbXBvbmVudERlZmluZWQsIGdldERldmljZUlzTW9iaWxlLCBnZXREZXZpY2VJc1RhYmxldCwgZ2V0SGVhZGVyVmFsdWUsIGdldFVuaXF1ZUlkIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICcuLi9hdXRoLWd1YXJkJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5kZWNsYXJlIGxldCBBamF4SGVscGVyOiBhbnk7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUG9ydGFsU2VydmljZSB7XG4gICAgcHVibGljIG9mZnNldFRvcCA9IDA7XG5cbiAgICBsb2dpbkxvYWRpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBsb2FkZWQgPSBmYWxzZTtcbiAgICBmb3JtUGFuZWxzOiBhbnkgPSB7fTtcbiAgICBjYWNoZWRJbWFnZXM6IGFueSA9IHt9O1xuICAgIGRhdGVUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIGRlZmF1bHRSb3V0ZTogc3RyaW5nO1xuICAgIGNhY2hlZFBhZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbD4gfSA9IHt9O1xuICAgIHBhZ2VzOiBQYWdlRGF0YU1vZGVsW10gPSBbXTtcbiAgICBydGxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xuICAgIHVzZXJMb2dnZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgZGljdGlvbmFyeTogeyBba2V5OiBzdHJpbmddOiBCZWhhdmlvclN1YmplY3Q8YW55PiB9ID0ge307XG4gICAgcG9ydGFsRGF0YVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UG9ydGFsRGF0YU1vZGVsIHwgbnVsbD4obnVsbCk7XG4gICAgcG9ydGFsU2V0dGluZ3MkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xuICAgIHBvcnRhbERhdGEkOiBPYnNlcnZhYmxlPFBvcnRhbERhdGFNb2RlbCB8IG51bGw+O1xuICAgIGRldmljZVNpemUkOiBPYnNlcnZhYmxlPEFiYnJldmF0aW9uRGV2aWNlU2l6ZT47XG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBkaXJWYWx1ZSQ6IE9ic2VydmFibGU8J3J0bCcgfCAnbHRyJz47XG4gICAgcm91dGVJbml0aWFsaXplZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgX2lzQW5vbnVtb3VzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIF9kZXZpY2VTaXplU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBYmJyZXZhdGlvbkRldmljZVNpemU+KCdsJyk7XG4gICAgcHJpdmF0ZSBfbG9nZ2VkSW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIHJvdXRlSW5pdGlhbGl6ZWRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIGRhdGVUZXh0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF9uYXZpZ2F0aW9uU3RhcnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXZpZ2F0aW9uU3RhcnQgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9uYXZpZ2F0aW9uRW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TmF2aWdhdGlvbkVuZCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX3VzZXJQb3J0YWxTZXR0aW5ncyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9ub3RpZmljYXRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbFtdPihbXSk7XG4gICAgcHJpdmF0ZSBfY3NzVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9jc3NDdXN0b21VcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX3NlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF93aW5kb3dSZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkY206IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBCYXJzYURpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29tcGlsZXI6IENvbXBpbGVyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMpO1xuICAgIH1cbiAgICBnZXQgd2luZG93UmVzaXplJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd1Jlc2l6ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25zJCgpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9ucyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBub3RpZmljYXRpb25zQ291bnQkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25zJC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoaXRlbXMpID0+IGl0ZW1zLmZpbHRlcigoYykgPT4gYy5VbnJlYWQpLmxlbmd0aCkpO1xuICAgIH1cblxuICAgIGdldCBwb3J0YWxEYXRhKCk6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBzZWFyY2hUZXJtJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGVybSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBjc3NVcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3NzVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgY3NzQ3VzdG9tVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0N1c3RvbVVybFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IHVzZXJQb3J0YWxTZXR0aW5ncygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCB1c2VyUG9ydGFsU2V0dGluZ3MkKCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBkZXZpY2VTaXplKCk6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VTaXplU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBpc0Fub255bW91cyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IG5hdmlnYXRpb25FbmQkKCk6IE9ic2VydmFibGU8TmF2aWdhdGlvbkVuZCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25FbmQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgbmF2aWdhdGlvblN0YXJ0JCgpOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25TdGFydCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TdGFydCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkTm90aWZpY2F0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIE1ldGhvZDogJ0dldFNoZWxsYmFyTm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgICBTdWNjZXNzRm46IChtb0xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMkLm5leHQobW9MaXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybSQubmV4dCh0ZXJtKTtcbiAgICB9XG4gICAgd2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcbiAgICB9XG4gICAgbmF2aWF0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25FbmQkLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgICBuYXZpYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TdGFydCQubmV4dChldmVudCk7XG4gICAgfVxuICAgIHNldFVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5uZXh0KHVzZXJQb3J0YWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIHNldFRoZW1lKHRoZW1lVXJsOiBTYWZlUmVzb3VyY2VVcmwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3NzVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xuICAgICAgICB0aGlzLl9jc3NDdXN0b21VcmxTb3VyY2UubmV4dCh0aGVtZVVybCk7XG4gICAgfVxuICAgIHNldERhdGEoa2V5LCBkYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5W2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0ubmV4dChkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAob2xkVmFsICE9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0ubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREYXRhKGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25hcnlba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5W2tleV0uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldERhdGFTeW5jPFQ+KGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogVCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjcmVhdGVGb3JSZXBvcnQobmF2SXRlbSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEJhcnNhQXBpLlVsLlVsdk1haW5DdHJsci5DcmVhdGVGb3JSZXBvcnQoe30sIG5hdkl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmVuZGVyVWx2TWFpblVpKFxuICAgICAgICBuYXZJdGVtLFxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgaXNSZXBvcnRQYWdlOiBib29sZWFuID0gZmFsc2VcbiAgICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGb3JSZXBvcnQobmF2SXRlbSkucGlwZShcbiAgICAgICAgICAgIGV4aGF1c3RNYXAoKHVsdk1haW5DdHJscikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmdldFVsdk1haW5VaUNvbXBvbmVudCh1bHZNYWluQ3RybHIuQWRhcHRlci5Db250cm9sLCBpbmplY3RvciwgaXNSZXBvcnRQYWdlKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoKHVsdk1hbmlVaUNvbXBvbmVudCkgPT4gdmNyLmluc2VydCh1bHZNYW5pVWlDb21wb25lbnQuaG9zdFZpZXcpKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHVsdk1haW5DdHJscilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIGdldFVsdk1haW5VaUNvbXBvbmVudChjdXN0b21VbHZNYWluVWksIGluamVjdG9yOiBJbmplY3RvciwgaXNSZXBvcnRQYWdlKTogT2JzZXJ2YWJsZTxDb21wb25lbnRSZWY8YW55Pj4ge1xuICAgICAgICBjb25zdCBjdXN0b21VaVNldHRpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjdXN0b21VbHZNYWluVWkuU2V0dGluZywgJ0N1c3RvbVVpJywgbnVsbCk7XG4gICAgICAgIGNvbnN0IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IgfSA9IGdldENvbXBvbmVudERlZmluZWQoXG4gICAgICAgICAgICBjdXN0b21VbHZNYWluVWksXG4gICAgICAgICAgICBjdXN0b21VaVNldHRpbmdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yLCBpbmplY3RvcikucGlwZShcbiAgICAgICAgICAgIG1hcCgoY29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaWQgPSBjdXN0b21VbHZNYWluVWkuaWQ7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY29udGV4dCA9IGN1c3RvbVVsdk1haW5VaTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pc1JlcG9ydFBhZ2UgPSBpc1JlcG9ydFBhZ2U7XG4gICAgICAgICAgICAgICAgY3VzdG9tVWx2TWFpblVpLmNvbnRyb2xVaSA9IGNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRldmljZVNpemUkID0gdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLnBvcnRhbERhdGEkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJ0bCQgPSB0aGlzLnJ0bFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLmRpclZhbHVlJCA9IHRoaXMucnRsJC5waXBlKG1hcCgoaXNSdGwpID0+IChpc1J0bCA/ICdydGwnIDogJ2x0cicpKSk7XG4gICAgICAgIHRoaXMucm91dGVJbml0aWFsaXplZCQgPSB0aGlzLnJvdXRlSW5pdGlhbGl6ZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgICAgICB0aGlzLmRhdGVUZXh0JCA9IHRoaXMuZGF0ZVRleHRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMucG9ydGFsU2V0dGluZ3MkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcCgocG9ydGFsRGF0YSkgPT4gKHBvcnRhbERhdGEgPyBwb3J0YWxEYXRhLlBvcnRhbFNldHRpbmdzIDogKHt9IGFzIGFueSkpKSk7XG4gICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgxMDAwKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RldmljZVNpemVTb3VyY2UubmV4dChjKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0VXNlckxvZ2luU3RhdHVzKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNVc2VyTG9nZ2VkSW4pO1xuXG4gICAgICAgIHRoaXMudXNlckxvZ2dlZEluJCA9IHRoaXMuX2xvZ2dlZEluU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcCgoaXNMb2dnZWRJbikgPT4gaXNMb2dnZWRJbiAmJiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSBmYWxzZSkpO1xuICAgIH1cbiAgICBfc2V0RGV2aWNlU2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGV2aWNlU2l6ZSA9IHRoaXMuX2luaXRhbGl6ZURldmljZVNpemUoKTtcbiAgICAgICAgdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5uZXh0KGRldmljZVNpemUpO1xuICAgIH1cbiAgICBfaW5pdGFsaXplRGV2aWNlU2l6ZSgpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xuICAgICAgICBjb25zdCBfaXNtb2JpbGUgPSBnZXREZXZpY2VJc01vYmlsZSgpO1xuICAgICAgICBjb25zdCBfaXNUYWJsZXQgPSBnZXREZXZpY2VJc1RhYmxldCgpO1xuICAgICAgICBsZXQgX3dpbmRvV1NpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSA9ICdzJztcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDYwMCkge1xuICAgICAgICAgICAgX3dpbmRvV1NpemUgPSAncyc7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA2MDAgJiYgd2luZG93LmlubmVyV2lkdGggPD0gOTkyKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdtJztcbiAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDk5MiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMjAwKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ3hsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2lzbW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3MnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaXNUYWJsZXQgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJykge1xuICAgICAgICAgICAgcmV0dXJuICdtJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3dpbmRvV1NpemU7XG4gICAgfVxuICAgIGNvbXBpbGVNb2R1bGUoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KTogT2JzZXJ2YWJsZTxOZ01vZHVsZUZhY3Rvcnk8YW55Pj4ge1xuICAgICAgICBjb25zdCBtb2R1bGUkID0gdGhpcy5nZXRNb2R1bGUoZGVwZW5kZW5jeSk7XG4gICAgICAgIHJldHVybiBtb2R1bGUkLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKG1vZHVsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVGYWN0b3J5ID0gdGhpcy5nZXROZ01vZHVsZUZhY3RvcnkobW9kdWxlcywgZGVwZW5kZW5jeS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobW9kdWxlRmFjdG9yeSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBnZXRNb2R1bGUoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBrZWJhYk5hbWUsIHVtZCwgZXhwb3J0QXMgfSA9IGRlcGVuZGVuY3k7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBgL2Fzc2V0cy9tb2R1bGVzLyR7a2ViYWJOYW1lfS9idW5kbGVzYDtcbiAgICAgICAgY29uc3QgZGF0ZSA9IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuYWJjO1xuICAgICAgICBjb25zdCBwYXRoID0gYCR7YmFzZX0vJHtrZWJhYk5hbWV9LnVtZC5qcz90PSR7ZGF0ZX1gO1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG1vZHVsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkSnMkKHBhdGgpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSkpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCwgbW9kdWxlcywgb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNwbGl0ZWQgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHByb3AgPSBzcGxpdGVkW2luZGV4XTtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9iamVjdFtwcm9wXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gc3BsaXRlZC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBvYmplY3RbcHJvcF0gPSBtb2R1bGVzO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCArIDEsIG1vZHVsZXMsIG9iamVjdFtwcm9wXSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50KFxuICAgICAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgICAgICAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuICAgICAgICBzZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICBwYXJlbnRJbmplY3RvcjogSW5qZWN0b3JcbiAgICApOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRjbS5nZXRDb21wb25lbnRCeVNlbGVjdG9yKHNlbGVjdG9yLCBtb2R1bGVOYW1lLCBwYXJlbnRJbmplY3Rvcik7XG4gICAgfVxuICAgIGxvYWRKcyQocGF0aCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgUmVwb3J0RXhlY3V0ZShyZXBvcnROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1vRm9yUmVwb3J0TW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5SZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lKSk7XG4gICAgfVxuICAgIFJlcG9ydEV4ZWN1dGVQcm9taXNlKHJlcG9ydE5hbWU6IHN0cmluZyk6IFByb21pc2U8TW9Gb3JSZXBvcnRNb2RlbD4ge1xuICAgICAgICBjb25zdCB1bHZQYXJhbXMgPSB7XG4gICAgICAgICAgICBGbGFnczoge1xuICAgICAgICAgICAgICAgIERhdGE6ICdUcnVlJyxcbiAgICAgICAgICAgICAgICBFeHRyYTogJ0ZhbHNlJyxcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXG4gICAgICAgICAgICAgICAgVmlldzogJ0ZhbHNlJ1xuICAgICAgICAgICAgICAgIC8vIEdlbmVyYWw6XCJGYWxzZVwiLCAvLyB1bHZtYWluY3RybCBkb2VzIG5vdCBjcmFldGUgdWkgY29udHJvbCByYWlzZSBlcnJvclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFJlcG9ydE5hbWU6IHJlcG9ydE5hbWUsXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5FeGVjdXRlUmVwb3J0KFxuICAgICAgICAgICAgICAgIHsgdWx2UGFyYW1zIH0sXG4gICAgICAgICAgICAgICAgKHJlc3VsdDogUmVwb3J0TW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQuRGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHI6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1QYW5lbHNbaWRdID0gZm9ybXBhbmVsQ3RybHI7XG4gICAgfVxuICAgIHNldFVzZXJMb2dpblN0YXR1cyhzdGF0dXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dChzdGF0dXMpO1xuICAgIH1cbiAgICBleHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4dHJhY3RBbGxQYWdlc19PbGQocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgIHBvcnRhbERhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKHBhZ2VEYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gcGFnZURhdGEuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgIGNvbmZpZy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsIHBhdGgsIHBhZ2VEYXRhLkhhc0F1dGhvcml6ZSwgcGFnZURhdGEuUGFnZU1vZHVsZT8uJENhcHRpb24sIG51bGwsIG51bGwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhZ2VEYXRhLklzRGVmYXVsdFJvdXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Um91dGUgPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5wdXNoKHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsICcnLCBmYWxzZSwgcG9ydGFsRGF0YS5QYWdlTW9kdWxlPy4kQ2FwdGlvbiwgcGF0aCwgbnVsbCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMocGFnZURhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbi5wYXRoKCkgPT09ICcnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGVmYXVsdFJvdXRlXSk7XG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycnXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5yb3V0ZUluaXRpYWxpemVkKCk7XG4gICAgfVxuICAgIHNzb0xvZ2luKCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dpbicsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBhbGVydCgnZXJyb3IgaW4gc3NvIGxvZ2luLicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgc3NvTG9nb3V0KCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dvdXQnLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGluIHNzbyBsb2dvdXQuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgIH1cbiAgICBhZGRDaGlsZFBhZ2VzKHBhZ2VEYXRhOiBQYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlRGF0YSk7XG4gICAgICAgIGlmICghcGFnZURhdGEuQ2hpbGRQYWdlTGlzdD8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGFnZURhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKGNoaWxkUGFnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKGNoaWxkUGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBoYXNBdXRob3JpemVkLCBtb2R1bGVOYW1lLCByZWRpcmVjdFRvLCBpc0R5bmFtaWNSb3V0ZSk6IFJvdXRlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjcmVhdGVSb3V0ZTIoXG4gICAgICAgIHBhZ2VEYXRhLFxuICAgICAgICBwYXRoLFxuICAgICAgICBoYXNBdXRob3JpemVkLFxuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICByZWRpcmVjdFRvOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICAgICAgaXNEeW5hbWljUm91dGU6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IFJvdXRlIHtcbiAgICAgICAgbGV0IG1vZHVsZVBhdGg6IHN0cmluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLkdldEtlYmFiQ2FzZShtb2R1bGVOYW1lKTtcbiAgICAgICAgY29uc3QgdW1kID0gbW9kdWxlTmFtZTtcbiAgICAgICAgbW9kdWxlUGF0aCA9IG1vZHVsZVBhdGguc3Vic3RyaW5nKDEsIG1vZHVsZVBhdGgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZHluYW1pY1JvdXRlOiBSb3V0ZSA9IHt9O1xuICAgICAgICBkeW5hbWljUm91dGUucGF0aCA9IHBhdGg7XG4gICAgICAgIGR5bmFtaWNSb3V0ZS5kYXRhID0geyBwYWdlRGF0YSB9O1xuICAgICAgICBpZiAoIWlzRHluYW1pY1JvdXRlKSB7XG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVzb2x2ZSA9IHtcbiAgICAgICAgICAgICAgICBwYWdlRGF0YTogUG9ydGFsUGFnZVJlc29sdmVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnBhdGhNYXRjaCA9ICdmdWxsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVkaXJlY3RUbykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnJlZGlyZWN0VG8gPSByZWRpcmVjdFRvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhhc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljUm91dGUuY2FuQWN0aXZhdGUgPSBbQXV0aEd1YXJkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5sb2FkQ2hpbGRyZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzOiBMaWJyYXJ5RGVwZW5lY3lbXSA9IEpTT04ucGFyc2UocGFnZURhdGEuRGVwZW5kZW5jaWVzKTsgLy8gZXZhbChwYWdlRGF0YS5EZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VMaWJyYXJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBrZWJhYk5hbWU6IG1vZHVsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHVtZCxcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IFttb2R1bGVOYW1lXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzJCA9IGZyb20oZGVwZW5kZW5jaWVzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSkgPT4gdGhpcy5jb21waWxlTW9kdWxlKGRlcGVuZGVuY3kpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkZXBlbmRlbmNpZXMkXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0TW9kdWxlKHBhZ2VMaWJyYXJ5KSksXG4gICAgICAgICAgICAgICAgICAgIG1hcCgobW9kdWxlcykgPT4gbW9kdWxlc1ttb2R1bGVOYW1lICsgJ01vZHVsZSddKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucm91dGVJbml0aWFsaXplZCgpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNSb3V0ZTtcbiAgICB9XG4gICAgcm91dGVJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZUluaXRpYWxpemVkU291cmNlLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2dpbkJ5QW5vbnltb3VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmxvZ2luTG9hZGluZy5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmxvZ2luUG9ydGFsKCkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzdWx0OiBMb2dpblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShCYXJzYUFwaS5Mb2dpbkFjdGlvbi50b2tlbjJTdG9yYWdlS2V5LCByZXN1bHQuZGF0YS5zdGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkxvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UGFnZURhdGEodXJsOiBzdHJpbmcsIGlzUm9vdDogYm9vbGVhbik6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgaWYgKGlzUm9vdCB8fCB1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhJDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmluZGV4T2YoJz8nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMuZmluZFBhZ2VCeVJvdXRlKHVybCk7XG4gICAgICAgIEFqYXhIZWxwZXIuVXNlQ2FjaGUgPSAhcGFnZURhdGE/Lkhhc0F1dGhvcml6ZTtcblxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLmFwaVNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkUG9ydGFsUGFnZURhdGEocGFnZURhdGE/LklkLCB0aGlzLnBvcnRhbERhdGFTb3VyY2UuZ2V0VmFsdWUoKT8uQ2hpbGRQYWdlTGlzdC5UeXBlRGVmSWQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxuICAgICAgICAgICAgICAgIHRhcCgocGFnZU1vKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRSb3V0ZShwYWdlTW8sIHBhZ2VNby5DaGlsZFBhZ2VMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcHVibGlzaFJlcGxheSgxKSxcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAvLyB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLnBvcnRhbERhdGEkLnBpcGUoXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxuICAgICAgICAvLyAgIG1hcCgocG9ydGFsRGF0YSkgPT4gKSxcbiAgICAgICAgLy8gICBjb25jYXRNYXAoKHBhZ2VEYXRhKSA9PiB7XG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gICB9KSxcblxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXG4gICAgICAgIC8vICk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF07XG4gICAgfVxuICAgIHB1YmxpYyByZXNvbHZlRGF0YShyb3V0ZVBhZ2VEYXRhKTogT2JzZXJ2YWJsZTxQYWdlRGF0YU1vZGVsIHwgbnVsbD4ge1xuICAgICAgICAvLyBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSAmJiBjLk1vZHVsZSA9PT0gcm91dGVQYWdlRGF0YS5Nb2R1bGUpO1xuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSk7XG4gICAgICAgIGlmICghcGFnZURhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHBhZ2VEYXRhLklkO1xuXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgQWpheEhlbHBlci5Vc2VDYWNoZSA9ICFwYWdlRGF0YT8uSGFzQXV0aG9yaXplO1xuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSA9IHRoaXMuYXBpU2VydmljZVxuICAgICAgICAgICAgLmxvYWRQb3J0YWxQYWdlRGF0YShpZCwgdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk/LkNoaWxkUGFnZUxpc3QuVHlwZURlZklkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcbiAgICAgICAgICAgICAgICB0YXAoKHBhZ2VNbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcbiAgICAgICAgLy8gICBtYXAoKHBvcnRhbERhdGEpID0+ICksXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfSksXG5cbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XG4gICAgfVxuXG4gICAgYWRkQ2hpbGRSb3V0ZShwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRDaGlsZFJvdXRlX09sZChwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFDaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYWdlTW8uUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgY29uc3QgcGFyZW50Um91dGUgPSBjb25maWcuZmluZCgoYykgPT4gKGMucGF0aCA9IHBhcmVudFBhdGgpKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IFJvdXRlW10gPSBbXTtcbiAgICAgICAgaWYgKHBhcmVudFJvdXRlKSB7XG4gICAgICAgICAgICBDaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY2hpbGQuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJvdXRlID0gdGhpcy5jcmVhdGVSb3V0ZShcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLkhhc0F1dGhvcml6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFnZU1vZHVsZT8uJENhcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRyb3V0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuXG4gICAgICAgICAgICAocGFyZW50Um91dGUgYXMgYW55KS5fbG9hZGVkQ29uZmlnLnJvdXRlc1swXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YV9PbGQxKCk6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbFR5cGVEZWZJZCkucGlwZShcbiAgICAgICAgICAgIHRhcCgocG9ydGFsU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKHRoaXMubG9hZFN5c3RlbXMoKSkpLFxuICAgICAgICAgICAgdGFwKChhbGwpID0+IHRoaXMuZGF0ZVRleHRTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRhdGVUZXh0KSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHVibGljIGxvYWRQb3J0YWxEYXRhU3luY19PbGQyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb3J0YWxTZXR0aW5nID0gdGhpcy5hcGlTZXJ2aWNlLmxvYWRQb3J0YWxTeW5jKFxuICAgICAgICAgICAgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCxcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XG5cbiAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XG5cbiAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XG5cbiAgICAgICAgdGhpcy5sb2FkU3lzdGVtcygpO1xuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YVN5bmMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmdTdHIgPSBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZCgnR2V0UG9ydGFsJywgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCk7XG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSBCYXJzYUFwaS5FeHQuZGVjb2RlKHBvcnRhbFNldHRpbmdTdHIpO1xuICAgICAgICBjb25zdCBwb3J0YWxEYXRhID0gcG9ydGFsU2V0dGluZztcblxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkVXNlclBvcnRhbFNldHRpbmcoKTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW10sXG4gICAgICAgICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAodXNlclBvcnRhbFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLm5leHQodXNlclBvcnRhbFNldHRpbmcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIFNob3dGb3JtUGFuZWxDb250cm9sKFxuICAgICAgICBmb3JtcGFuZWxDdHJscjogYW55LFxuICAgICAgICByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBkaWFsb2dDb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICAgICAgaXNQYWdlOiBib29sZWFuLFxuICAgICAgICBpc1JlbG9hZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybXBhbmVsQ3RybHIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignZm9ybSBwYW5lbCBjb250cm9sZXIgaXMgdW5kZWZpbmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vID0gZm9ybXBhbmVsQ3RybHIuTW87XG4gICAgICAgIGNvbnN0IGhlYWRlckxheW91dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkhlYWRlckxheW91dCcsIG51bGwpO1xuICAgICAgICBsZXQgaXNNb2RhbCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkV4dHJhSnNvblByb3AuTW9kYWwnLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG1vZGFsU2V0dGluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICAgICAgZm9ybXBhbmVsQ3RybHIsXG4gICAgICAgICAgICAnU2V0dGluZy5WaWV3LkN1c3RvbVVpLlBhcmFtZXRlcnMuTW9kYWxTZXR0aW5nJyxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1vZGFsU2V0dGluZykge1xuICAgICAgICAgICAgaXNNb2RhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuU2V0dGluZy5Jc01vZGFsID0gaXNNb2RhbDtcbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuSXNNb2RhbCA9IGlzTW9kYWw7XG4gICAgICAgIGNvbnN0IGJyZWFkQ3J1bWIgPSBnZXRIZWFkZXJWYWx1ZShoZWFkZXJMYXlvdXQ/LkJyZWFkQ3J1bWIpO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGlkOiBtby4kU3RhdGUgPT09ICdOZXcnID8gJzAnIDogbW8uSWQsXG4gICAgICAgICAgICB0eWlkOiBtby4kVHlwZURlZklkLFxuICAgICAgICAgICAgdHljcDogbW8uJENhcHRpb24gPyBtby4kQ2FwdGlvbiA6IG51bGwsXG4gICAgICAgICAgICByZXBpZDogbW8uJFJlcG9ydElkLFxuICAgICAgICAgICAgdmlkOiBmb3JtcGFuZWxDdHJscj8uU2V0dGluZz8uVmlldz8uVHlwZVZpZXdJZCxcbiAgICAgICAgICAgIGJjOiBicmVhZENydW1iID8gYnJlYWRDcnVtYiA6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyBtby4kVHlwZURlZk5hbWUgOiBtby4kQ2FwdGlvblxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpZCA9IGdldFVuaXF1ZUlkKDQpO1xuICAgICAgICB0aGlzLmFkZEZvcm1QYW5lbEN0cmxyKGlkLCBmb3JtcGFuZWxDdHJscik7XG4gICAgICAgIGlmIChpc01vZGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0Zvcm0oZGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgLi4ucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgZm9ybXBhbmVsQ3RybHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGZvcm1QYW5lbEN0cmxySWQ6IGlkIH07XG4gICAgICAgICAgICBpZiAoaXNQYWdlKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZm9ybScsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGV0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCwgaXNGaXJzdDogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogaXNSZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46IFsnc2hvdycsIHsgLi4ucXVlcnlQYXJhbXMsIGZvcm1QYW5lbEN0cmxySWQ6IGlkIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ3ByZXNlcnZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogaXNSZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGxvYWRTeXN0ZW1zKCk6IFByb21pc2U8UG9ydGFsRGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLl9sb2FkU3lzdGVtKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBmaW5kUGFnZUJ5Um91dGUodXJsOiBzdHJpbmcpOiBQYWdlRGF0YU1vZGVsIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZpbmRlZFBhZ2UgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHVybCk7XG4gICAgICAgIHJldHVybiBmaW5kZWRQYWdlIHx8IG51bGw7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0TmdNb2R1bGVGYWN0b3J5KG1vZHVsZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIG1vZHVsZU5hbWU6IHN0cmluZyk6IE5nTW9kdWxlRmFjdG9yeTxhbnk+IHtcbiAgICAgICAgY29uc3QgbW9kdWxlQ2xhc3MgPSBtb2R1bGVzW21vZHVsZU5hbWUgKyAnTW9kdWxlJ107XG4gICAgICAgIGxldCBtb2R1bGVGYWN0b3J5OiBOZ01vZHVsZUZhY3Rvcnk8YW55PjtcbiAgICAgICAgaWYgKG1vZHVsZUNsYXNzIGluc3RhbmNlb2YgTmdNb2R1bGVGYWN0b3J5KSB7XG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gbW9kdWxlQ2xhc3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21waWxlZCA9IHRoaXMuY29tcGlsZXIuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jKG1vZHVsZUNsYXNzKTtcbiAgICAgICAgICAgIG1vZHVsZUZhY3RvcnkgPSBjb21waWxlZC5uZ01vZHVsZUZhY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUZhY3Rvcnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWdpc3RlcmVkTW9kdWxlcyh1bWQ6IHN0cmluZywgZXhwb3J0QXM6IHN0cmluZ1tdLCBtb2R1bGVOYW1lOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgbGV0IG1vZHVsZXM7XG4gICAgICAgIGlmICh1bWQgIT09ICcnKSB7XG4gICAgICAgICAgICBtb2R1bGVzID0gd2luZG93O1xuICAgICAgICAgICAgdW1kLnNwbGl0KCcuJykuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlcyAhPT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVzID0gbW9kdWxlc1tjXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZHVsZXMgPSB3aW5kb3dbbW9kdWxlTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9ydEFzLmxlbmd0aCA+IDAgJiYgbW9kdWxlcykge1xuICAgICAgICAgICAgZXhwb3J0QXMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVPbk9iamVjdChjLCAwLCBtb2R1bGVzLCB3aW5kb3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZXM7XG4gICAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5RGVwZW5lY3kge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBrZWJhYk5hbWU6IHN0cmluZztcbiAgICB1bWQ6IHN0cmluZztcbiAgICBleHBvcnRBczogc3RyaW5nW107XG59XG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkQ3J1bWJJbmZvIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcbn1cbiJdfQ==