tnx-shared 5.2.28 → 5.2.29

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 (85) hide show
  1. package/assets/docker/docker-entrypoint.sh +1 -1
  2. package/classes/base/list-component-base.d.ts +19 -5
  3. package/classes/base/list-component-base.d.ts.map +1 -1
  4. package/classes/environment-schema.d.ts +23 -20
  5. package/classes/environment-schema.d.ts.map +1 -1
  6. package/classes/public-function.d.ts +1 -0
  7. package/classes/public-function.d.ts.map +1 -1
  8. package/components/chat/chat-box/chat-box.component.d.ts.map +1 -1
  9. package/components/common-app-component/common-app-component.d.ts +1 -3
  10. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  11. package/components/crud/advance-search/advance-search.component.d.ts +6 -6
  12. package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
  13. package/components/crud/crud-form/crud-form.component.d.ts +6 -0
  14. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  15. package/components/dropdown/dropdown.component.d.ts +5 -3
  16. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  17. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  18. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts +3 -0
  19. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts.map +1 -1
  20. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
  21. package/components/tn-tinymce/tn-tinymce.component.d.ts +2 -0
  22. package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
  23. package/congviec/congviec/congviec-form/congviec-form.component.d.ts +1 -0
  24. package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
  25. package/directives/primeng/tn-table.directive.d.ts +7 -6
  26. package/directives/primeng/tn-table.directive.d.ts.map +1 -1
  27. package/esm2020/classes/base/list-component-base.mjs +56 -32
  28. package/esm2020/classes/environment-schema.mjs +10 -1
  29. package/esm2020/classes/public-function.mjs +3 -1
  30. package/esm2020/components/add-news/add-news.component.mjs +3 -3
  31. package/esm2020/components/autocomplete-picker/autocomplete-picker.component.mjs +2 -2
  32. package/esm2020/components/chat/chat-box/chat-box.component.mjs +3 -4
  33. package/esm2020/components/chat/chat-send-message-box/chat-send-message-box.component.mjs +2 -2
  34. package/esm2020/components/common-app-component/common-app-component.mjs +57 -57
  35. package/esm2020/components/common-dashboard/common-dashboard.component.mjs +3 -3
  36. package/esm2020/components/crud/advance-search/advance-search.component.mjs +28 -19
  37. package/esm2020/components/crud/crud-form/crud-form.component.mjs +12 -4
  38. package/esm2020/components/crud/crud-list/crud-list.component.mjs +3 -3
  39. package/esm2020/components/crud/tree-table/tree-table.component.mjs +3 -3
  40. package/esm2020/components/dropdown/dropdown.component.mjs +29 -24
  41. package/esm2020/components/entity-permission/entity-permission.component.mjs +3 -3
  42. package/esm2020/components/entity-picker/entity-picker-box/entity-picker-box.component.mjs +3 -3
  43. package/esm2020/components/entity-picker/entity-picker-dialog/entity-picker-dialog.component.mjs +3 -3
  44. package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +3 -3
  45. package/esm2020/components/main-list/main-list.component.mjs +3 -3
  46. package/esm2020/components/query-builders/query-builder-rule/query-builder-rule.component.mjs +8 -3
  47. package/esm2020/components/radio-button-list/radio-button-list.component.mjs +3 -3
  48. package/esm2020/components/report-queue/report-queue.component.mjs +2 -2
  49. package/esm2020/components/settings/settings.component.mjs +3 -3
  50. package/esm2020/components/tn-app-help/tn-app-help.component.mjs +3 -3
  51. package/esm2020/components/tn-app-notification/tn-app-notification.component.mjs +3 -3
  52. package/esm2020/components/tn-custom-scrollbar/tn-custom-scrollbar.component.mjs +5 -4
  53. package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +7 -3
  54. package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +3 -3
  55. package/esm2020/components/user-picker/user-picker.component.mjs +2 -2
  56. package/esm2020/components/workflow/workflow-picker/workflow-picker.component.mjs +3 -3
  57. package/esm2020/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.mjs +3 -3
  58. package/esm2020/congviec/congviec/congviec-form/congviec-form.component.mjs +6 -3
  59. package/esm2020/congviec/congviec/congviec.component.mjs +3 -3
  60. package/esm2020/directives/primeng/tn-table.directive.mjs +28 -13
  61. package/esm2020/services/common.service.mjs +11 -3
  62. package/esm2020/services/environment.service.mjs +48 -7
  63. package/esm2020/services/permission.service.mjs +12 -15
  64. package/esm2020/services/position.service.mjs +2 -2
  65. package/esm2020/services/signalr.service.mjs +3 -3
  66. package/esm2020/services/tn-client.service.mjs +30 -25
  67. package/esm2020/tnx-shared.module.mjs +14 -8
  68. package/fesm2015/tnx-shared.mjs +587 -445
  69. package/fesm2015/tnx-shared.mjs.map +1 -1
  70. package/fesm2020/tnx-shared.mjs +587 -445
  71. package/fesm2020/tnx-shared.mjs.map +1 -1
  72. package/package.json +2 -2
  73. package/services/common.service.d.ts +6 -0
  74. package/services/common.service.d.ts.map +1 -1
  75. package/services/environment.service.d.ts +32 -23
  76. package/services/environment.service.d.ts.map +1 -1
  77. package/services/permission.service.d.ts +5 -0
  78. package/services/permission.service.d.ts.map +1 -1
  79. package/services/position.service.d.ts.map +1 -1
  80. package/services/signalr.service.d.ts +1 -1
  81. package/services/signalr.service.d.ts.map +1 -1
  82. package/services/tn-client.service.d.ts +3 -1
  83. package/services/tn-client.service.d.ts.map +1 -1
  84. package/tnx-shared.module.d.ts +12 -11
  85. package/tnx-shared.module.d.ts.map +1 -1
@@ -25,58 +25,59 @@ import * as i11 from "../../services/storage-updated.service";
25
25
  import * as i12 from "../../app-context/application-context.service";
26
26
  import * as i13 from "../../app-context/component-context.service";
27
27
  import * as i14 from "ngx-device-detector";
28
- import * as i15 from "../../services/tn-client.service";
29
- import * as i16 from "../../services/notifier.service";
30
- import * as i17 from "../../services/entity-metadata.service";
31
- import * as i18 from "../../services/environment.service";
32
- import * as i19 from "../../services/menu.service";
33
- import * as i20 from "tn-custom-primeng/api";
34
- import * as i21 from "../../services/storage.service";
35
- import * as i22 from "../../services/permission.service";
36
- import * as i23 from "../../services/customize-ui.service";
37
- import * as i24 from "@angular/common";
38
- import * as i25 from "tn-custom-primeng/button";
39
- import * as i26 from "tn-custom-primeng/toast";
40
- import * as i27 from "tn-custom-primeng/confirmdialog";
41
- import * as i28 from "@angular/forms";
42
- import * as i29 from "tn-custom-primeng/autocomplete";
43
- import * as i30 from "../address/address.component";
44
- import * as i31 from "../crud/advance-search/advance-search.component";
45
- import * as i32 from "./app-root-menu/app-root-menu.component";
46
- import * as i33 from "./app.topbar.component";
47
- import * as i34 from "./app.profile.component";
48
- import * as i35 from "./app.menu.component";
49
- import * as i36 from "../autocomplete-picker/autocomplete-picker.component";
50
- import * as i37 from "../cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component";
51
- import * as i38 from "../../congviec/congviec/congviec.component";
52
- import * as i39 from "../../congviec/congviec/congviec-form/congviec-form.component";
53
- import * as i40 from "../dropdown/dropdown-setting-form/dropdown-setting-form.component";
54
- import * as i41 from "../file-upload/file-upload.component";
55
- import * as i42 from "../service-file-upload/service-file-upload.component";
56
- import * as i43 from "../vanban-picker/vanban-picker.component";
57
- import * as i44 from "../congviec-picker/congviec-picker.component";
58
- import * as i45 from "../report-queue/report-queue.component";
59
- import * as i46 from "../settings/settings.component";
60
- import * as i47 from "../settings/settings-row/settings-row.component";
61
- import * as i48 from "../workflow/process-workflow-form/process-workflow-form.component";
62
- import * as i49 from "../workflow/cho-y-kien-form/cho-y-kien-form.component";
63
- import * as i50 from "../workflow/start-workflow/start-workflow.component";
64
- import * as i51 from "../share-link-by-permission/share-link-by-permission.component";
65
- import * as i52 from "../workflow/workflow-setting-new/workflow-setting-new.component";
66
- import * as i53 from "../workflow/permission-sharing/permission-sharing.component";
67
- import * as i54 from "../tn-custom-scrollbar/tn-custom-scrollbar.component";
68
- import * as i55 from "../crud/table-detail-form/table-detail-form.component";
69
- import * as i56 from "../dropdown/quick-add-form/quick-add-form.component";
70
- import * as i57 from "../user-picker/user-picker.component";
71
- import * as i58 from "../file-explorer/file-manager/file-manager.component";
72
- import * as i59 from "../workflow/workflow-history-new/workflow-history-new.component";
73
- import * as i60 from "../workflow/workflow-permission/workflow-permission.component";
74
- import * as i61 from "../permission-utils/permission-utils.component";
75
- import * as i62 from "../file-explorer/file-picker-dialog/file-picker-dialog.component";
76
- import * as i63 from "../add-news/add-news.component";
77
- import * as i64 from "../../pipes/highlight.pipe";
28
+ import * as i15 from "../../services/notifier.service";
29
+ import * as i16 from "../../services/entity-metadata.service";
30
+ import * as i17 from "../../services/environment.service";
31
+ import * as i18 from "../../services/menu.service";
32
+ import * as i19 from "tn-custom-primeng/api";
33
+ import * as i20 from "../../services/storage.service";
34
+ import * as i21 from "../../services/permission.service";
35
+ import * as i22 from "../../services/customize-ui.service";
36
+ import * as i23 from "@angular/common";
37
+ import * as i24 from "tn-custom-primeng/button";
38
+ import * as i25 from "tn-custom-primeng/toast";
39
+ import * as i26 from "tn-custom-primeng/confirmdialog";
40
+ import * as i27 from "@angular/forms";
41
+ import * as i28 from "tn-custom-primeng/autocomplete";
42
+ import * as i29 from "../address/address.component";
43
+ import * as i30 from "../crud/advance-search/advance-search.component";
44
+ import * as i31 from "./app-root-menu/app-root-menu.component";
45
+ import * as i32 from "./app.topbar.component";
46
+ import * as i33 from "./app.profile.component";
47
+ import * as i34 from "./app.menu.component";
48
+ import * as i35 from "../autocomplete-picker/autocomplete-picker.component";
49
+ import * as i36 from "../cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component";
50
+ import * as i37 from "../../congviec/congviec/congviec.component";
51
+ import * as i38 from "../../congviec/congviec/congviec-form/congviec-form.component";
52
+ import * as i39 from "../dropdown/dropdown-setting-form/dropdown-setting-form.component";
53
+ import * as i40 from "../file-upload/file-upload.component";
54
+ import * as i41 from "../service-file-upload/service-file-upload.component";
55
+ import * as i42 from "../vanban-picker/vanban-picker.component";
56
+ import * as i43 from "../congviec-picker/congviec-picker.component";
57
+ import * as i44 from "../report-queue/report-queue.component";
58
+ import * as i45 from "../settings/settings.component";
59
+ import * as i46 from "../settings/settings-row/settings-row.component";
60
+ import * as i47 from "../workflow/process-workflow-form/process-workflow-form.component";
61
+ import * as i48 from "../workflow/cho-y-kien-form/cho-y-kien-form.component";
62
+ import * as i49 from "../workflow/start-workflow/start-workflow.component";
63
+ import * as i50 from "../share-link-by-permission/share-link-by-permission.component";
64
+ import * as i51 from "../workflow/workflow-setting-new/workflow-setting-new.component";
65
+ import * as i52 from "../workflow/permission-sharing/permission-sharing.component";
66
+ import * as i53 from "../tn-custom-scrollbar/tn-custom-scrollbar.component";
67
+ import * as i54 from "../crud/table-detail-form/table-detail-form.component";
68
+ import * as i55 from "../dropdown/quick-add-form/quick-add-form.component";
69
+ import * as i56 from "../user-picker/user-picker.component";
70
+ import * as i57 from "../file-explorer/file-manager/file-manager.component";
71
+ import * as i58 from "../workflow/workflow-history-new/workflow-history-new.component";
72
+ import * as i59 from "../workflow/workflow-permission/workflow-permission.component";
73
+ import * as i60 from "../permission-utils/permission-utils.component";
74
+ import * as i61 from "../file-explorer/file-picker-dialog/file-picker-dialog.component";
75
+ import * as i62 from "../add-news/add-news.component";
76
+ import * as i63 from "../../pipes/highlight.pipe";
78
77
  export class CommonAppComponentComponent {
79
- constructor(renderer, _globalService, _commonService, _componentService, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd, _tnClientService, _notifierService, _entityMetadataService, _environmentService, _menuService, _primengConfig, _storageService, _permissionService, _customizeUiService) {
78
+ constructor(renderer, _globalService, _commonService, _componentService, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd,
79
+ // private _tnClientService: TnClientService,
80
+ _notifierService, _entityMetadataService, _environmentService, _menuService, _primengConfig, _storageService, _permissionService, _customizeUiService) {
80
81
  this.renderer = renderer;
81
82
  this._globalService = _globalService;
82
83
  this._commonService = _commonService;
@@ -94,7 +95,6 @@ export class CommonAppComponentComponent {
94
95
  this._activatedRoute = _activatedRoute;
95
96
  this._deviceDetectorService = _deviceDetectorService;
96
97
  this._cd = _cd;
97
- this._tnClientService = _tnClientService;
98
98
  this._notifierService = _notifierService;
99
99
  this._entityMetadataService = _entityMetadataService;
100
100
  this._environmentService = _environmentService;
@@ -793,12 +793,12 @@ export class CommonAppComponentComponent {
793
793
  }
794
794
  }
795
795
  }
796
- CommonAppComponentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CommonAppComponentComponent, deps: [{ token: i0.Renderer2 }, { token: i1.GlobalService }, { token: i2.CommonService }, { token: i3.ComponentService }, { token: i4.TranslateService }, { token: i5.OAuthService }, { token: i6.AuthenService }, { token: i7.UserService }, { token: i8.Router }, { token: i9.Title }, { token: i10.SignalRService }, { token: i11.StorageUpdatedService }, { token: i12.ApplicationContextService }, { token: i13.ComponentContextService }, { token: i8.ActivatedRoute }, { token: i14.DeviceDetectorService }, { token: i0.ChangeDetectorRef }, { token: i15.TnClientService }, { token: i16.NotifierService }, { token: i17.EntityMetadataService }, { token: i18.EnvironmentService }, { token: i19.MenuService }, { token: i20.PrimeNGConfig }, { token: i21.StorageService }, { token: i22.PermissionService }, { token: i23.CustomizeUiService }], target: i0.ɵɵFactoryTarget.Component });
797
- CommonAppComponentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CommonAppComponentComponent, selector: "common-app-component", inputs: { showQuickNote: "showQuickNote", allowAnonymous: "allowAnonymous", autoRenderMenu: "autoRenderMenu" }, host: { listeners: { "document:keypress": "handleShowPopupPermissionUtils($event)" } }, providers: [ComponentContextService, EntityMetadataService], viewQueries: [{ propertyName: "okButton", first: true, predicate: ["okButton"], descendants: true }, { propertyName: "cancelButton", first: true, predicate: ["cancelButton"], descendants: true }, { propertyName: "quickNoteBt", first: true, predicate: ["quickNoteBt"], descendants: true }, { propertyName: "quickNoteBt1", first: true, predicate: ["quickNoteBt1"], descendants: true }, { propertyName: "quickNoteBt2", first: true, predicate: ["quickNoteBt2"], descendants: true }, { propertyName: "pinnedNotes", first: true, predicate: ["pinnedNotes"], descendants: true }, { propertyName: "reportQueue", first: true, predicate: ReportQueueComponent, descendants: true }, { propertyName: "scrollBarMenu", first: true, predicate: ["scrollbar"], descendants: true }, { propertyName: "children", predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div *ngIf=\"pageLoaded\" [style.display]=\"pageLoaded ? '' : 'none'\" class=\"layout-wrapper\"\r\n (click)=\"_commonService.onLayoutClick()\" [ngClass]=\"{'menu-layout-static': !_commonService.isOverlay(),\r\n 'menu-layout-overlay': _commonService.isOverlay(),\r\n 'layout-menu-overlay-active': _commonService.overlayMenuActive,\r\n 'menu-layout-horizontal': _commonService.isHorizontal(),\r\n 'menu-layout-slim': _commonService.isSlim(),\r\n 'layout-menu-static-desktop-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-desktop-active': !_commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-mobile-inactive': !_commonService.staticMenuMobileActive,\r\n 'layout-menu-static-mobile-active': _commonService.staticMenuMobileActive,\r\n 'layout-menu-static-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-active': _commonService.staticMenuMobileActive}\">\r\n\r\n <app-topbar *ngIf=\"_globalService.getHeaderState()\"></app-topbar>\r\n\r\n <div *ngIf=\"_globalService.getMenuState()\" class=\"layout-menu-container\"\r\n [ngClass]=\"{'layout-menu-dark':_commonService.darkMenu}\" (click)=\"_commonService.onMenuClick($event)\">\r\n <app-root-menu></app-root-menu>\r\n <div class=\"layout-menu-block\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'padding-top': '16px'}\">\r\n <app-inline-profile *ngIf=\"_commonService.profileMode == 'inline' &&!_commonService.isHorizontal()\">\r\n </app-inline-profile>\r\n <app-menu [autoRenderMenu]=\"autoRenderMenu\" [reset]=\"_commonService.resetMenu\"\r\n (onMenuActive)=\"handleMenuActive($event)\"></app-menu>\r\n </tn-custom-scrollbar>\r\n </div>\r\n <div class=\"search-area layout-menu-search-area\">\r\n <p-autoComplete [(ngModel)]=\"searchMenuInput\" [style]=\"{'width':'100%'}\" [suggestions]=\"searchMenuResult\"\r\n (completeMethod)=\"onSearchMenu($event)\" [autoHighlight]=\"true\"\r\n [placeholder]=\"'T\u00ECm ki\u1EBFm ch\u1EE9c n\u0103ng' | translate\" [delay]=\"200\" [scrollHeight]=\"'400px'\"\r\n class=\"search-input\" [readonly]=\"!(menuModel && menuModel.length)\"\r\n (onSelect)=\"onSelectMenuSuggestion($event)\" field=\"label\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div innerHTML=\"{{ item.label | highlight : searchMenuInput}}\"></div>\r\n </ng-template>\r\n </p-autoComplete>\r\n <span class=\"icon-search\"><i class=\"pi pi-search\"></i></span>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"'layout-main'\" [ngClass]=\"{'no-header': _globalService.getHeaderState() ? false : true}\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n\r\n <div class=\"layout-mask\"></div>\r\n <div #quickNoteBt *ngIf=\"!onlyShowMainContent && showQuickNote\" class=\"quick-note-button-holder\" cdkDrag\r\n cdkDragBoundary=\".layout-wrapper\" oncontextmenu=\"return false\" (cdkDragEnded)=\"quickNoteDropped($event)\"\r\n (cdkDragStarted)=\"quickNoteStarted($event)\">\r\n <a #quickNoteBt1 href=\"javascript:;\" class=\"all-note-button\" tabindex=\"0\" (click)=\"quickNoteShowAllNotes()\">\r\n <i class=\"fas fa-sticky-note\"></i></a>\r\n <a #quickNoteBt2 href=\"javascript:;\" class=\"setting-note-button\" tabindex=\"0\" (click)=\"quickNoteShowSettings()\">\r\n <i class=\"fas fa-cog\"></i></a>\r\n <a href=\"javascript:;\" (press)=\"quickNotePress($event)\" (pressup)=\"quickNotePressUp($event)\"\r\n class=\"quick-note-button\" tabindex=\"0\" (click)=\"quickNoteAddNote()\">\r\n <i class=\"fas fa-plus\"></i></a>\r\n </div>\r\n <div #pinnedNotes *ngIf=\"!onlyShowMainContent\" class=\"pinned-notes-holder\" cdkDrag cdkDragBoundary=\".layout-wrapper\"\r\n oncontextmenu=\"return false\" (cdkDragEnded)=\"pinnedNotesDropped($event)\"\r\n (cdkDragStarted)=\"pinnedNotesStarted($event)\">\r\n <div class=\"pinned-notes ui-g\" tabindex=\"0\">\r\n <div *ngIf=\"pinnedNotesMinimizeStatus\" class=\"pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-maximize\"></i>\r\n </div>\r\n <div *ngIf=\"pinnedNotesMaximizeStatus\" class=\" pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-minimize\"></i>\r\n </div>\r\n <div *ngFor=\"let note of pinnedNoteData\" class=\"pinned-note ui-g-12\">\r\n <div class=\"pinned-note-header-line\" [style.background-color]=\"note.colorCode\">\r\n </div>\r\n <div class=\"pinned-note-body\">\r\n <span class=\"pinned-note-line-title\" [style.paddingBottom]=\"note.titlePaddingBottom\">\r\n <div class=\"pinned-note-header-right\">\r\n <span class=\"pinned-note-header-time\">{{note.created | date: 'dd/MM'}}</span>\r\n <img src=\"../assets/layout/images/ico/unpin-1.ico\" class=\"pinned-note-header-button-unpin\"\r\n (click)=\"unPinNote(note)\">\r\n <i *ngIf=\"!note.isCompleted\" class=\"far fa-flag pinned-note-header-button-complete\"\r\n (click)=\"completeNote(note)\"></i>\r\n <i *ngIf=\"note.isCompleted\" class=\"fas fa-flag-checkered pinned-note-header-button-complete\"\r\n (click)=\"inCompleteNote(note)\"></i>\r\n </div>\r\n <div>{{note.name}}</div>\r\n </span>\r\n <div class=\"pinned-note-contents\" [style.display]=\"note.contentDisplay\">\r\n <span *ngFor=\"let content of note.contents\" class=\"pinned-note-line\">\r\n {{content}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <report-queue [header]=\"'Xu\u1EA5t d\u1EEF li\u1EC7u'\">\r\n </report-queue>\r\n</div>\r\n<div class=\"waiting-box\" [class.show]=\"waiting\">\r\n <div class=\"overlay\"></div>\r\n <div class=\"content-loading\">\r\n <div class=\"lds-ellipsis\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <div class=\"message-loading\">\r\n <span *ngFor=\"let x of messageWaiting\">{{x}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<p-toast [position]=\"'top-right'\" [autoZIndex]=\"true\"></p-toast>\r\n<p-confirmDialog #cd [closable]=\"false\">\r\n <p-footer>\r\n <button #okButton type=\"button\" pButton icon=\"pi pi-check\" class=\"p-button-rounded p-button-text\" label=\"\u0110\u1ED3ng \u00FD\"\r\n (keydown.shift.tab)=\"focusTrap($event, false)\" (click)=\"cd.accept()\"></button>\r\n <button *ngIf=\"showRejectConfirm\" #cancelButton type=\"button\" pButton\r\n class=\"p-button-rounded p-button-text p-button-secondary\" icon=\"pi pi-times\" label=\"B\u1ECF qua\"\r\n (keydown.tab)=\"focusTrap($event, true)\" (click)=\"cd.reject()\"></button>\r\n </p-footer>\r\n</p-confirmDialog>\r\n<!-- <user-action-manager></user-action-manager> -->\r\n<permission-utils *ngIf=\"rootData.showPermissionUtils\"></permission-utils>\r\n<ng-template #queryBuilderUserPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <user-picker [control]=\"control\" [disabled]=\"disabled\" [multiple]=\"control.multiple\" [(ngModel)]=\"query.value\">\r\n </user-picker>\r\n</ng-template>\r\n<ng-template #queryBuilderCoCauPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"disabled\" [(ngModel)]=\"query.value\">\r\n </cocautochuc-picker-list>\r\n</ng-template>\r\n<ng-template #queryBuilderAutocompletePicker let-control let-disabled=\"disabled\" let-query=\"query\">\r\n <autocomplete-picker *ngSwitchCase=\"'groupuser'\" [control]=\"control\" [disabled]=\"disabled\"\r\n [(ngModel)]=\"query.value\">\r\n </autocomplete-picker>\r\n</ng-template>\r\n\r\n<ng-template #listCongViecCon let-formState=\"formState\" let-loaiDanhSach=\"loaiDanhSach\" let-idCongViec=\"idCongViec\">\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"formState\"\r\n [loaiDanhSach]=\"loaiDanhSach\" [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n</ng-template>\r\n\r\n<ng-template #crudListSettingRow let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings-row>\r\n</ng-template>\r\n<ng-template #crudListSetting let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings>\r\n</ng-template>\r\n<ng-template #crudListAdvanceSearch let-parentSetting=\"parentSetting\" let-searchInfo=\"searchInfo\" let-loading=\"loading\"\r\n let-onSearch=\"onSearch\" let-onInit=\"onInit\">\r\n <advance-search [parentSetting]=\"parentSetting\" [searchInfo]=\"searchInfo\" [loading]=\"loading\"\r\n (onSearch)=\"onSearch($event)\" (onInit)=\"onInit($event)\">\r\n </advance-search>\r\n</ng-template>\r\n<ng-template #crudListWorkflowSetting let-dialogModel=\"dialogModel\" let-parentSetting=\"parentSetting\"\r\n let-onSaved=\"onSaved\">\r\n <workflow-setting-new #formBase [parentSetting]=\"parentSetting\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-setting-new>\r\n</ng-template>\r\n<ng-template #crudListWorkflowHistory let-item let-dialogModel=\"dialogModel\">\r\n <workflow-history-new #formBase [businessSetting]=\"dialogModel.data.setting\"\r\n [tableName]=\"dialogModel.data.tableName\" [item]=\"item\" [workflowSetting]=\"dialogModel.data.workflowSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-history-new>\r\n</ng-template>\r\n<ng-template #crudListStartWorkflow let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <start-workflow #formBase [workflows]=\"dialogModel.data.workflows\"\r\n [defaultWorkflow]=\"dialogModel.data.defaultWorkflow\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onCancel)=\"dialogModel.showEditForm = false\"\r\n (onSaved)=\"onSaved\">\r\n </start-workflow>\r\n</ng-template>\r\n<ng-template #crudListChoYKien let-dialogModel=\"dialogModel\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"dialogModel.data.setting\" [rowItem]=\"dialogModel.data.rowData\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"dialogModel.showEditForm = false\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n</ng-template>\r\n<ng-template #crudListProcessWorkflow let-item let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <process-workflow-form #formBase [businessSetting]=\"dialogModel.data.setting\" [item]=\"item\"\r\n [workflow]=\"dialogModel.data.workflow\" [action]=\"dialogModel.data.action\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </process-workflow-form>\r\n</ng-template>\r\n<ng-template #crudListCongViec let-baseService=\"baseService\" let-itemIdAttach=\"itemIdAttach\">\r\n <base-congviec [serviceCode]=\"baseService.serviceCode\" [entity]=\"baseService.entityName\"\r\n [itemIdAttach]=\"itemIdAttach\"></base-congviec>\r\n</ng-template>\r\n<ng-template #crudListFormCongViec let-dialogModel=\"dialogModel\" let-isFormView=\"isFormView\" let-getData=\"getData\">\r\n <base-congviec-form #formBase [parentSetting]=\"dialogModel.data.congViecSetting\"\r\n [model]=\"dialogModel.data.formModel\" [forceOnlyView]=\"isFormView\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\"\r\n (onSaved)=\"dialogModel.showEditForm = false; getData()\" (onCancel)=\"dialogModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudListPermissionSharing let-item let-baseService=\"baseService\" let-dialogModel=\"dialogModel\">\r\n <permission-sharing #formBase [item]=\"item\" [baseService]=\"baseService\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </permission-sharing>\r\n</ng-template>\r\n<ng-template #crudListWorkflowPermission let-item let-businessSetting=\"businessSetting\" let-dialogModel=\"dialogModel\">\r\n <workflow-permission #formBase [item]=\"item\" [businessSetting]=\"businessSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-permission>\r\n</ng-template>\r\n<ng-template #crudListShareLinkByPermission let-setting=\"setting\" let-dialogModel=\"dialogModel\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"dialogModel.data.lstItem\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</ng-template>\r\n<ng-template #crudListFileUploadColumn let-rowData let-parentContext=\"parentContext\" let-field=\"field\"\r\n let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == fileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == fileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"parentContext\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [control]=\"fileSetting.control\" [fileDataService]=\"fileSetting.control.fileDataService\"\r\n [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudListFileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>\r\n\r\n<ng-template #crudFormTableDetailForm let-schema let-parentSetting=\"parentSetting\" let-dialogModel=\"dialogModel\"\r\n let-onInit=\"onInit\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <table-detail-form #formBase [parentSetting]=\"parentSetting\" [schema]=\"schema\" [data]=\"dialogModel.data\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </table-detail-form>\r\n</ng-template>\r\n<ng-template #crudFormCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudFormAddressComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [disabled]=\"checkDisabled(data, control)\"\r\n [(data)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n</ng-template>\r\n<ng-template #crudFormFileManagerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [(value)]=\"data[control.field]\"\r\n (onSelected)=\"control.onSelected($event)\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n</ng-template>\r\n<ng-template #crudFormServiceFileUploadComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-parentContext=\"parentContext\" let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <service-file-upload [parentContext]=\"parentContext\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudFormCongViecPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n</ng-template>\r\n<ng-template #crudFormVanBanPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n</ng-template>\r\n\r\n<ng-template #tinyMceFilePickerDialog let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-closeForm=\"closeForm\" let-onCancel=\"onCancel\" let-onChanged=\"onChanged\">\r\n <file-picker-dialog #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\" (closeForm)=\"closeForm\"\r\n (onCancel)=\"onCancel\" (onChanged)=\"onChanged\">\r\n </file-picker-dialog>\r\n</ng-template>\r\n<ng-template #tinyMceAddNews let-languageCode=\"languageCode\" let-showChange=\"showChange\">\r\n <add-news #listBase [languageCode]=\"languageCode\" (showChange)=\"showChange($event)\"></add-news>\r\n</ng-template>\r\n\r\n<ng-template #dropdownQuickAddForm let-dialogModel let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-control=\"control\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <quick-add-form #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\"\r\n [model]=\"dialogModel.data.formModel\" [control]=\"control\" [baseService]=\"control.baseService\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </quick-add-form>\r\n</ng-template>\r\n<ng-template #dropdownSettingForm let-dialogModel let-onSaved=\"onSaved\">\r\n <dropdown-setting-form #formBase [model]=\"dialogModel.data.formModel\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </dropdown-setting-form>\r\n</ng-template>\r\n", styles: [".layout-menu-search-area{position:relative}.icon-search{background-color:transparent;box-shadow:none;position:absolute;right:0;top:0;color:#888;width:30px;font-size:14px;height:100%;display:flex;align-items:center;justify-content:center}.layout-menu-static-inactive .search-area{margin-left:-303px}.layout-menu-container{overflow:hidden;display:flex;flex-direction:column;top:60px;bottom:0;height:auto}.layout-menu-block{display:flex;overflow:hidden;flex:1}.layout-menu-block>tn-custom-scrollbar{width:100%}::ng-deep .layout-menu-search-area .ui-inputtext{width:calc(100% + 1px);border-radius:0;border-color:#dadada;padding-right:40px}::ng-deep .layout-menu-search-area .ui-inputtext:not(:focus){box-shadow:none}::ng-deep .layout-menu-search-area input{width:100%;border-radius:0;border-left:0;border-right:0}::ng-deep .layout-menu-search-area .p-autocomplete-panel{max-width:100%}::ng-deep .layout-menu-search-area .p-autocomplete-item{white-space:normal}::ng-deep .layout-menu-search-area .p-autocomplete-item mark{background-color:var(--tn-primary-color);padding:0;color:#fff;border-radius:0}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}.waiting-box .content-loading .lds-ellipsis{display:inline-block;position:relative;width:80px;height:60px}.waiting-box .content-loading .lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.waiting-box .content-loading .lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}.waiting-box .message-loading{font-size:1.75em}.waiting-box .message-loading span{color:#fff;animation:message-opacity 1s infinite;margin-right:1px}.waiting-box .message-loading span:last-child{margin-right:0}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:.1s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:.2s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:.3s}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0/10 s}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:1/10 s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:2/10 s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:3/10 s}.waiting-box .message-loading span:nth-child(16n+5){animation-delay:4/10 s}.waiting-box .message-loading span:nth-child(16n+6){animation-delay:5/10 s}.waiting-box .message-loading span:nth-child(16n+7){animation-delay:6/10 s}.waiting-box .message-loading span:nth-child(16n+8){animation-delay:7/10 s}.waiting-box .message-loading span:nth-child(16n+9){animation-delay:8/10 s}.waiting-box .message-loading span:nth-child(16n+10){animation-delay:9/10 s}.waiting-box .message-loading span:nth-child(16n+11){animation-delay:10/10 s}.waiting-box .message-loading span:nth-child(16n+12){animation-delay:11/10 s}.waiting-box .message-loading span:nth-child(16n+13){animation-delay:12/10 s}.waiting-box .message-loading span:nth-child(16n+14){animation-delay:13/10 s}.waiting-box .message-loading span:nth-child(16n+15){animation-delay:14/10 s}.waiting-box .message-loading span:nth-child(16n+16){animation-delay:15/10 s}.waiting-box.show{display:block}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes message-opacity{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"], dependencies: [{ kind: "component", type: i20.Footer, selector: "p-footer" }, { kind: "directive", type: i20.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i24.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i24.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i24.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i24.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i25.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i8.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i26.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: i27.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i28.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i28.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i28.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i29.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i30.AddressComponent, selector: "address-picker", inputs: ["control", "disabled", "viewMode", "data", "showSubLabel"], outputs: ["onInit", "onSelect", "dataChange", "onReady"] }, { kind: "component", type: i31.AdvanceSearchComponent, selector: "advance-search", inputs: ["parentSetting", "searchInfo", "allowLoadDataWhenParentNull", "loading"], outputs: ["onSearch", "onFormEvent", "onInit"] }, { kind: "component", type: i32.AppRootMenuComponent, selector: "app-root-menu" }, { kind: "component", type: i33.AppTopBarComponent, selector: "app-topbar" }, { kind: "component", type: i34.AppProfileComponent, selector: "app-inline-profile" }, { kind: "component", type: i35.AppMenuComponent, selector: "app-menu", inputs: ["reset", "autoRenderMenu"] }, { kind: "component", type: i36.AutoCompletePickerComponent, selector: "autocomplete-picker", inputs: ["control", "currentNode", "groupKey", "valueInGroup", "disabled", "popupSize", "readOnlyValues"], outputs: ["onInit", "onSelect", "onUnSelect", "onChanged", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i37.CoCauToChucPickerListComponent, selector: "cocautochuc-picker-list", inputs: ["control", "disabled", "readOnlyValues"], outputs: ["onInit", "onChanged", "onSelect", "onUnSelect", "onClear", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i38.BaseCongViecComponent, selector: "base-congviec", inputs: ["itemId", "serviceCode", "entity", "itemIdAttach", "stateCode", "isPicker", "loaiDanhSach", "idCongViec", "ids", "isFromDashboard", "formState", "isChildView"], outputs: ["idsChange"] }, { kind: "component", type: i39.BaseCongViecFormComponent, selector: "base-congviec-form", inputs: ["itemId", "crudList", "control", "tenCongViec"], outputs: ["onInit", "onAfterInserted"] }, { kind: "component", type: i40.DropdownSettingFormComponent, selector: "dropdown-setting-form", inputs: ["control", "baseService"], outputs: ["onInit"] }, { kind: "component", type: i41.FileUploadComponent, selector: "file-upload", inputs: ["chooseLabel", "readonly", "accept", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageSummary", "invalidFileLimitMessageDetail", "sharedFolderType"], outputs: ["onInit", "onSelect", "onRemove", "onChanged"] }, { kind: "component", type: i42.ServiceFileUploadComponent, selector: "service-file-upload", inputs: ["fileDataService", "control", "serviceCode", "entity", "entityKey", "chooseLabel"], outputs: ["onInit", "onSelect", "onRemove", "onChanged"] }, { kind: "component", type: i43.VanBanPickerComponent, selector: "vanban-picker", inputs: ["loaiVanBan", "readOnly", "control"], outputs: ["onInit", "onChanged", "onReady"] }, { kind: "component", type: i44.CongViecPickerComponent, selector: "congviec-picker", inputs: ["control"], outputs: ["onInit", "onChanged"] }, { kind: "component", type: i45.ReportQueueComponent, selector: "report-queue", inputs: ["parentDataModel", "name", "header", "autoDownload"] }, { kind: "component", type: i46.SettingsComponent, selector: "settings", inputs: ["parentModel", "parentSetting", "entityMetadataService"], outputs: ["onCancel", "onSave", "onDelete"] }, { kind: "component", type: i47.SettingsRowComponent, selector: "settings-row", inputs: ["parentModel", "parentSetting", "entityMetadataService"], outputs: ["onSave", "onCancel"] }, { kind: "component", type: i48.ProcessWorkflowFormComponent, selector: "process-workflow-form", inputs: ["businessSetting", "item", "workflow", "action"], outputs: ["onInvalidWorkflow"] }, { kind: "component", type: i49.ChoYKienFormComponent, selector: "cho-y-kien-form", inputs: ["bussinessSetting", "rowItem"] }, { kind: "component", type: i50.StartWorkflowComponent, selector: "start-workflow", inputs: ["workflows", "defaultWorkflow"], outputs: ["onInit", "onSaved", "onCancel"] }, { kind: "component", type: i51.ShareLinkByPermissionComponent, selector: "share-link-by-permission", inputs: ["setting", "lstItem"] }, { kind: "component", type: i52.WorkflowSettingNewComponent, selector: "workflow-setting-new", inputs: ["parentSetting"], outputs: ["onInit", "onSaved", "onCancel", "onSaveSetting"] }, { kind: "component", type: i53.PermissionSharingComponent, selector: "permission-sharing", inputs: ["baseService", "item"] }, { kind: "component", type: i54.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "component", type: i55.TableDetailFormComponent, selector: "table-detail-form", inputs: ["schema", "data"], outputs: ["onInit", "onSaved"] }, { kind: "component", type: i56.QuickAddFormComponent, selector: "quick-add-form", inputs: ["control", "baseService"], outputs: ["onInit"] }, { kind: "component", type: i57.UserPickerComponent, selector: "user-picker", inputs: ["control", "popupSize", "multiple", "disabled", "readOnlyValues"], outputs: ["onInit", "onSelect", "onUnSelect", "onChanged", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i58.FileManagerComponent, selector: "file-manager", inputs: ["control", "fileDataService", "layout", "hiddenCreateFolder", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageSummary", "invalidFileLimitMessageDetail", "dataType", "rootFolderName", "serviceCode", "entity", "entityKey", "readonly", "inTaiLieu", "inTaiLieuChung", "copyToFolderId", "value", "multipleCheckWhenClickRow"], outputs: ["onInit", "onReady", "entityKeyChange", "closePopup", "valueChange", "onChanged", "onSelected"] }, { kind: "component", type: i59.WorkflowHistoryNewComponent, selector: "workflow-history-new", inputs: ["businessSetting", "isRelativeForm", "tableName", "item", "workflowSetting"] }, { kind: "component", type: i60.WorkflowPermissionComponent, selector: "workflow-permission", inputs: ["businessSetting", "item"] }, { kind: "component", type: i61.PermissionUtilsComponent, selector: "permission-utils" }, { kind: "component", type: i62.FilePickerDialogComponent, selector: "file-picker-dialog", inputs: ["isFilePicker", "multipleCheckWhenClickRow", "dataType"], outputs: ["onChanged"] }, { kind: "component", type: i63.AddNewsComponent, selector: "add-news", inputs: ["isShow", "languageCode"], outputs: ["showChange"] }, { kind: "pipe", type: i24.DatePipe, name: "date" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i64.HighlightPipe, name: "highlight" }] });
796
+ CommonAppComponentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CommonAppComponentComponent, deps: [{ token: i0.Renderer2 }, { token: i1.GlobalService }, { token: i2.CommonService }, { token: i3.ComponentService }, { token: i4.TranslateService }, { token: i5.OAuthService }, { token: i6.AuthenService }, { token: i7.UserService }, { token: i8.Router }, { token: i9.Title }, { token: i10.SignalRService }, { token: i11.StorageUpdatedService }, { token: i12.ApplicationContextService }, { token: i13.ComponentContextService }, { token: i8.ActivatedRoute }, { token: i14.DeviceDetectorService }, { token: i0.ChangeDetectorRef }, { token: i15.NotifierService }, { token: i16.EntityMetadataService }, { token: i17.EnvironmentService }, { token: i18.MenuService }, { token: i19.PrimeNGConfig }, { token: i20.StorageService }, { token: i21.PermissionService }, { token: i22.CustomizeUiService }], target: i0.ɵɵFactoryTarget.Component });
797
+ CommonAppComponentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CommonAppComponentComponent, selector: "common-app-component", inputs: { showQuickNote: "showQuickNote", allowAnonymous: "allowAnonymous", autoRenderMenu: "autoRenderMenu" }, host: { listeners: { "document:keypress": "handleShowPopupPermissionUtils($event)" } }, providers: [ComponentContextService, EntityMetadataService], viewQueries: [{ propertyName: "okButton", first: true, predicate: ["okButton"], descendants: true }, { propertyName: "cancelButton", first: true, predicate: ["cancelButton"], descendants: true }, { propertyName: "quickNoteBt", first: true, predicate: ["quickNoteBt"], descendants: true }, { propertyName: "quickNoteBt1", first: true, predicate: ["quickNoteBt1"], descendants: true }, { propertyName: "quickNoteBt2", first: true, predicate: ["quickNoteBt2"], descendants: true }, { propertyName: "pinnedNotes", first: true, predicate: ["pinnedNotes"], descendants: true }, { propertyName: "reportQueue", first: true, predicate: ReportQueueComponent, descendants: true }, { propertyName: "scrollBarMenu", first: true, predicate: ["scrollbar"], descendants: true }, { propertyName: "children", predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div *ngIf=\"pageLoaded\" [style.display]=\"pageLoaded ? '' : 'none'\" class=\"layout-wrapper\"\r\n (click)=\"_commonService.onLayoutClick()\" [ngClass]=\"{'menu-layout-static': !_commonService.isOverlay(),\r\n 'menu-layout-overlay': _commonService.isOverlay(),\r\n 'layout-menu-overlay-active': _commonService.overlayMenuActive,\r\n 'menu-layout-horizontal': _commonService.isHorizontal(),\r\n 'menu-layout-slim': _commonService.isSlim(),\r\n 'layout-menu-static-desktop-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-desktop-active': !_commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-mobile-inactive': !_commonService.staticMenuMobileActive,\r\n 'layout-menu-static-mobile-active': _commonService.staticMenuMobileActive,\r\n 'layout-menu-static-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-active': _commonService.staticMenuMobileActive}\">\r\n\r\n <app-topbar *ngIf=\"_globalService.getHeaderState()\"></app-topbar>\r\n\r\n <div *ngIf=\"_globalService.getMenuState()\" class=\"layout-menu-container\"\r\n [ngClass]=\"{'layout-menu-dark':_commonService.darkMenu}\" (click)=\"_commonService.onMenuClick($event)\">\r\n <app-root-menu></app-root-menu>\r\n <div class=\"layout-menu-block\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'padding-top': '16px'}\">\r\n <app-inline-profile *ngIf=\"_commonService.profileMode == 'inline' &&!_commonService.isHorizontal()\">\r\n </app-inline-profile>\r\n <app-menu [autoRenderMenu]=\"autoRenderMenu\" [reset]=\"_commonService.resetMenu\"\r\n (onMenuActive)=\"handleMenuActive($event)\"></app-menu>\r\n </tn-custom-scrollbar>\r\n </div>\r\n <div class=\"search-area layout-menu-search-area\">\r\n <p-autoComplete [(ngModel)]=\"searchMenuInput\" [style]=\"{'width':'100%'}\" [suggestions]=\"searchMenuResult\"\r\n (completeMethod)=\"onSearchMenu($event)\" [autoHighlight]=\"true\"\r\n [placeholder]=\"'T\u00ECm ki\u1EBFm ch\u1EE9c n\u0103ng' | translate\" [delay]=\"200\" [scrollHeight]=\"'400px'\"\r\n class=\"search-input\" [readonly]=\"!(menuModel && menuModel.length)\"\r\n (onSelect)=\"onSelectMenuSuggestion($event)\" field=\"label\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div innerHTML=\"{{ item.label | highlight : searchMenuInput}}\"></div>\r\n </ng-template>\r\n </p-autoComplete>\r\n <span class=\"icon-search\"><i class=\"pi pi-search\"></i></span>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"'layout-main'\" [ngClass]=\"{'no-header': _globalService.getHeaderState() ? false : true}\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n\r\n <div class=\"layout-mask\"></div>\r\n <div #quickNoteBt *ngIf=\"!onlyShowMainContent && showQuickNote\" class=\"quick-note-button-holder\" cdkDrag\r\n cdkDragBoundary=\".layout-wrapper\" oncontextmenu=\"return false\" (cdkDragEnded)=\"quickNoteDropped($event)\"\r\n (cdkDragStarted)=\"quickNoteStarted($event)\">\r\n <a #quickNoteBt1 href=\"javascript:;\" class=\"all-note-button\" tabindex=\"0\" (click)=\"quickNoteShowAllNotes()\">\r\n <i class=\"fas fa-sticky-note\"></i></a>\r\n <a #quickNoteBt2 href=\"javascript:;\" class=\"setting-note-button\" tabindex=\"0\" (click)=\"quickNoteShowSettings()\">\r\n <i class=\"fas fa-cog\"></i></a>\r\n <a href=\"javascript:;\" (press)=\"quickNotePress($event)\" (pressup)=\"quickNotePressUp($event)\"\r\n class=\"quick-note-button\" tabindex=\"0\" (click)=\"quickNoteAddNote()\">\r\n <i class=\"fas fa-plus\"></i></a>\r\n </div>\r\n <div #pinnedNotes *ngIf=\"!onlyShowMainContent\" class=\"pinned-notes-holder\" cdkDrag cdkDragBoundary=\".layout-wrapper\"\r\n oncontextmenu=\"return false\" (cdkDragEnded)=\"pinnedNotesDropped($event)\"\r\n (cdkDragStarted)=\"pinnedNotesStarted($event)\">\r\n <div class=\"pinned-notes ui-g\" tabindex=\"0\">\r\n <div *ngIf=\"pinnedNotesMinimizeStatus\" class=\"pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-maximize\"></i>\r\n </div>\r\n <div *ngIf=\"pinnedNotesMaximizeStatus\" class=\" pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-minimize\"></i>\r\n </div>\r\n <div *ngFor=\"let note of pinnedNoteData\" class=\"pinned-note ui-g-12\">\r\n <div class=\"pinned-note-header-line\" [style.background-color]=\"note.colorCode\">\r\n </div>\r\n <div class=\"pinned-note-body\">\r\n <span class=\"pinned-note-line-title\" [style.paddingBottom]=\"note.titlePaddingBottom\">\r\n <div class=\"pinned-note-header-right\">\r\n <span class=\"pinned-note-header-time\">{{note.created | date: 'dd/MM'}}</span>\r\n <img src=\"../assets/layout/images/ico/unpin-1.ico\" class=\"pinned-note-header-button-unpin\"\r\n (click)=\"unPinNote(note)\">\r\n <i *ngIf=\"!note.isCompleted\" class=\"far fa-flag pinned-note-header-button-complete\"\r\n (click)=\"completeNote(note)\"></i>\r\n <i *ngIf=\"note.isCompleted\" class=\"fas fa-flag-checkered pinned-note-header-button-complete\"\r\n (click)=\"inCompleteNote(note)\"></i>\r\n </div>\r\n <div>{{note.name}}</div>\r\n </span>\r\n <div class=\"pinned-note-contents\" [style.display]=\"note.contentDisplay\">\r\n <span *ngFor=\"let content of note.contents\" class=\"pinned-note-line\">\r\n {{content}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <report-queue [header]=\"'Xu\u1EA5t d\u1EEF li\u1EC7u'\">\r\n </report-queue>\r\n</div>\r\n<div class=\"waiting-box\" [class.show]=\"waiting\">\r\n <div class=\"overlay\"></div>\r\n <div class=\"content-loading\">\r\n <div class=\"lds-ellipsis\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <div class=\"message-loading\">\r\n <span *ngFor=\"let x of messageWaiting\">{{x}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<p-toast [position]=\"'top-right'\" [autoZIndex]=\"true\"></p-toast>\r\n<p-confirmDialog #cd [closable]=\"false\">\r\n <p-footer>\r\n <button #okButton type=\"button\" pButton icon=\"pi pi-check\" class=\"p-button-rounded p-button-text\" label=\"\u0110\u1ED3ng \u00FD\"\r\n (keydown.shift.tab)=\"focusTrap($event, false)\" (click)=\"cd.accept()\"></button>\r\n <button *ngIf=\"showRejectConfirm\" #cancelButton type=\"button\" pButton\r\n class=\"p-button-rounded p-button-text p-button-secondary\" icon=\"pi pi-times\" label=\"B\u1ECF qua\"\r\n (keydown.tab)=\"focusTrap($event, true)\" (click)=\"cd.reject()\"></button>\r\n </p-footer>\r\n</p-confirmDialog>\r\n<!-- <user-action-manager></user-action-manager> -->\r\n<permission-utils *ngIf=\"rootData.showPermissionUtils\"></permission-utils>\r\n<ng-template #queryBuilderUserPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <user-picker [control]=\"control\" [disabled]=\"disabled\" [multiple]=\"control.multiple\" [(ngModel)]=\"query.value\">\r\n </user-picker>\r\n</ng-template>\r\n<ng-template #queryBuilderCoCauPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"disabled\" [(ngModel)]=\"query.value\">\r\n </cocautochuc-picker-list>\r\n</ng-template>\r\n<ng-template #queryBuilderAutocompletePicker let-control let-disabled=\"disabled\" let-query=\"query\">\r\n <autocomplete-picker *ngSwitchCase=\"'groupuser'\" [control]=\"control\" [disabled]=\"disabled\"\r\n [(ngModel)]=\"query.value\">\r\n </autocomplete-picker>\r\n</ng-template>\r\n\r\n<ng-template #listCongViecCon let-formState=\"formState\" let-loaiDanhSach=\"loaiDanhSach\" let-idCongViec=\"idCongViec\">\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"formState\"\r\n [loaiDanhSach]=\"loaiDanhSach\" [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n</ng-template>\r\n\r\n<ng-template #crudListSettingRow let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings-row>\r\n</ng-template>\r\n<ng-template #crudListSetting let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings>\r\n</ng-template>\r\n<ng-template #crudListAdvanceSearch let-parentSetting=\"parentSetting\" let-searchInfo=\"searchInfo\" let-loading=\"loading\"\r\n let-onSearch=\"onSearch\" let-onInit=\"onInit\">\r\n <advance-search [parentSetting]=\"parentSetting\" [searchInfo]=\"searchInfo\" [loading]=\"loading\"\r\n (onSearch)=\"onSearch($event)\" (onInit)=\"onInit($event)\">\r\n </advance-search>\r\n</ng-template>\r\n<ng-template #crudListWorkflowSetting let-dialogModel=\"dialogModel\" let-parentSetting=\"parentSetting\"\r\n let-onSaved=\"onSaved\">\r\n <workflow-setting-new #formBase [parentSetting]=\"parentSetting\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-setting-new>\r\n</ng-template>\r\n<ng-template #crudListWorkflowHistory let-item let-dialogModel=\"dialogModel\">\r\n <workflow-history-new #formBase [businessSetting]=\"dialogModel.data.setting\"\r\n [tableName]=\"dialogModel.data.tableName\" [item]=\"item\" [workflowSetting]=\"dialogModel.data.workflowSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-history-new>\r\n</ng-template>\r\n<ng-template #crudListStartWorkflow let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <start-workflow #formBase [workflows]=\"dialogModel.data.workflows\"\r\n [defaultWorkflow]=\"dialogModel.data.defaultWorkflow\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onCancel)=\"dialogModel.showEditForm = false\"\r\n (onSaved)=\"onSaved\">\r\n </start-workflow>\r\n</ng-template>\r\n<ng-template #crudListChoYKien let-dialogModel=\"dialogModel\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"dialogModel.data.setting\" [rowItem]=\"dialogModel.data.rowData\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"dialogModel.showEditForm = false\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n</ng-template>\r\n<ng-template #crudListProcessWorkflow let-item let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <process-workflow-form #formBase [businessSetting]=\"dialogModel.data.setting\" [item]=\"item\"\r\n [workflow]=\"dialogModel.data.workflow\" [action]=\"dialogModel.data.action\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </process-workflow-form>\r\n</ng-template>\r\n<ng-template #crudListCongViec let-baseService=\"baseService\" let-itemIdAttach=\"itemIdAttach\">\r\n <base-congviec [serviceCode]=\"baseService.serviceCode\" [entity]=\"baseService.entityName\"\r\n [itemIdAttach]=\"itemIdAttach\"></base-congviec>\r\n</ng-template>\r\n<ng-template #crudListFormCongViec let-dialogModel=\"dialogModel\" let-isFormView=\"isFormView\" let-getData=\"getData\">\r\n <base-congviec-form #formBase [parentSetting]=\"dialogModel.data.congViecSetting\"\r\n [model]=\"dialogModel.data.formModel\" [forceOnlyView]=\"isFormView\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\"\r\n (onSaved)=\"dialogModel.showEditForm = false; getData()\" (onCancel)=\"dialogModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudListPermissionSharing let-item let-baseService=\"baseService\" let-dialogModel=\"dialogModel\">\r\n <permission-sharing #formBase [item]=\"item\" [baseService]=\"baseService\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </permission-sharing>\r\n</ng-template>\r\n<ng-template #crudListWorkflowPermission let-item let-businessSetting=\"businessSetting\" let-dialogModel=\"dialogModel\">\r\n <workflow-permission #formBase [item]=\"item\" [businessSetting]=\"businessSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-permission>\r\n</ng-template>\r\n<ng-template #crudListShareLinkByPermission let-setting=\"setting\" let-dialogModel=\"dialogModel\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"dialogModel.data.lstItem\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</ng-template>\r\n<ng-template #crudListFileUploadColumn let-rowData let-parentContext=\"parentContext\" let-field=\"field\"\r\n let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == fileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == fileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"parentContext\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [control]=\"fileSetting.control\" [fileDataService]=\"fileSetting.control.fileDataService\"\r\n [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudListFileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>\r\n\r\n<ng-template #crudFormTableDetailForm let-schema let-parentSetting=\"parentSetting\" let-dialogModel=\"dialogModel\"\r\n let-onInit=\"onInit\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <table-detail-form #formBase [parentSetting]=\"parentSetting\" [schema]=\"schema\" [data]=\"dialogModel.data\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </table-detail-form>\r\n</ng-template>\r\n<ng-template #crudFormCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudFormAddressComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [disabled]=\"checkDisabled(data, control)\"\r\n [(data)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n</ng-template>\r\n<ng-template #crudFormFileManagerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [(value)]=\"data[control.field]\"\r\n (onSelected)=\"control.onSelected($event)\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n</ng-template>\r\n<ng-template #crudFormServiceFileUploadComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-parentContext=\"parentContext\" let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <service-file-upload [parentContext]=\"parentContext\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudFormCongViecPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n</ng-template>\r\n<ng-template #crudFormVanBanPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n</ng-template>\r\n\r\n<ng-template #tinyMceFilePickerDialog let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-closeForm=\"closeForm\" let-onCancel=\"onCancel\" let-onChanged=\"onChanged\">\r\n <file-picker-dialog #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\" (closeForm)=\"closeForm\"\r\n (onCancel)=\"onCancel\" (onChanged)=\"onChanged\">\r\n </file-picker-dialog>\r\n</ng-template>\r\n<ng-template #tinyMceAddNews let-languageCode=\"languageCode\" let-showChange=\"showChange\">\r\n <add-news #listBase [languageCode]=\"languageCode\" (showChange)=\"showChange($event)\"></add-news>\r\n</ng-template>\r\n\r\n<ng-template #dropdownQuickAddForm let-dialogModel let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-control=\"control\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <quick-add-form #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\"\r\n [model]=\"dialogModel.data.formModel\" [control]=\"control\" [baseService]=\"control.baseService\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </quick-add-form>\r\n</ng-template>\r\n<ng-template #dropdownSettingForm let-dialogModel let-onSaved=\"onSaved\">\r\n <dropdown-setting-form #formBase [model]=\"dialogModel.data.formModel\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </dropdown-setting-form>\r\n</ng-template>", styles: [".layout-menu-search-area{position:relative}.icon-search{background-color:transparent;box-shadow:none;position:absolute;right:0;top:0;color:#888;width:30px;font-size:14px;height:100%;display:flex;align-items:center;justify-content:center}.layout-menu-static-inactive .search-area{margin-left:-303px}.layout-menu-container{overflow:hidden;display:flex;flex-direction:column;top:60px;bottom:0;height:auto}.layout-menu-block{display:flex;overflow:hidden;flex:1}.layout-menu-block>tn-custom-scrollbar{width:100%}::ng-deep .layout-menu-search-area .ui-inputtext{width:calc(100% + 1px);border-radius:0;border-color:#dadada;padding-right:40px}::ng-deep .layout-menu-search-area .ui-inputtext:not(:focus){box-shadow:none}::ng-deep .layout-menu-search-area input{width:100%;border-radius:0;border-left:0;border-right:0}::ng-deep .layout-menu-search-area .p-autocomplete-panel{max-width:100%}::ng-deep .layout-menu-search-area .p-autocomplete-item{white-space:normal}::ng-deep .layout-menu-search-area .p-autocomplete-item mark{background-color:var(--tn-primary-color);padding:0;color:#fff;border-radius:0}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}.waiting-box .content-loading .lds-ellipsis{display:inline-block;position:relative;width:80px;height:60px}.waiting-box .content-loading .lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.waiting-box .content-loading .lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}.waiting-box .message-loading{font-size:1.75em}.waiting-box .message-loading span{color:#fff;animation:message-opacity 1s infinite;margin-right:1px}.waiting-box .message-loading span:last-child{margin-right:0}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:.1s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:.2s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:.3s}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0/10 s}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:1/10 s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:2/10 s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:3/10 s}.waiting-box .message-loading span:nth-child(16n+5){animation-delay:4/10 s}.waiting-box .message-loading span:nth-child(16n+6){animation-delay:5/10 s}.waiting-box .message-loading span:nth-child(16n+7){animation-delay:6/10 s}.waiting-box .message-loading span:nth-child(16n+8){animation-delay:7/10 s}.waiting-box .message-loading span:nth-child(16n+9){animation-delay:8/10 s}.waiting-box .message-loading span:nth-child(16n+10){animation-delay:9/10 s}.waiting-box .message-loading span:nth-child(16n+11){animation-delay:10/10 s}.waiting-box .message-loading span:nth-child(16n+12){animation-delay:11/10 s}.waiting-box .message-loading span:nth-child(16n+13){animation-delay:12/10 s}.waiting-box .message-loading span:nth-child(16n+14){animation-delay:13/10 s}.waiting-box .message-loading span:nth-child(16n+15){animation-delay:14/10 s}.waiting-box .message-loading span:nth-child(16n+16){animation-delay:15/10 s}.waiting-box.show{display:block}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes message-opacity{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"], dependencies: [{ kind: "component", type: i19.Footer, selector: "p-footer" }, { kind: "directive", type: i19.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i23.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i23.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i23.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i23.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i24.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i8.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i25.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: i26.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i27.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i27.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i27.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i28.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i29.AddressComponent, selector: "address-picker", inputs: ["control", "disabled", "viewMode", "data", "showSubLabel"], outputs: ["onInit", "onSelect", "dataChange", "onReady"] }, { kind: "component", type: i30.AdvanceSearchComponent, selector: "advance-search", inputs: ["parentSetting", "searchInfo", "allowLoadDataWhenParentNull", "loading"], outputs: ["onSearch", "onFormEvent", "onInit"] }, { kind: "component", type: i31.AppRootMenuComponent, selector: "app-root-menu" }, { kind: "component", type: i32.AppTopBarComponent, selector: "app-topbar" }, { kind: "component", type: i33.AppProfileComponent, selector: "app-inline-profile" }, { kind: "component", type: i34.AppMenuComponent, selector: "app-menu", inputs: ["reset", "autoRenderMenu"] }, { kind: "component", type: i35.AutoCompletePickerComponent, selector: "autocomplete-picker", inputs: ["control", "currentNode", "groupKey", "valueInGroup", "disabled", "popupSize", "readOnlyValues"], outputs: ["onInit", "onSelect", "onUnSelect", "onChanged", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i36.CoCauToChucPickerListComponent, selector: "cocautochuc-picker-list", inputs: ["control", "disabled", "readOnlyValues"], outputs: ["onInit", "onChanged", "onSelect", "onUnSelect", "onClear", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i37.BaseCongViecComponent, selector: "base-congviec", inputs: ["itemId", "serviceCode", "entity", "itemIdAttach", "stateCode", "isPicker", "loaiDanhSach", "idCongViec", "ids", "isFromDashboard", "formState", "isChildView"], outputs: ["idsChange"] }, { kind: "component", type: i38.BaseCongViecFormComponent, selector: "base-congviec-form", inputs: ["itemId", "crudList", "control", "tenCongViec"], outputs: ["onInit", "onAfterInserted"] }, { kind: "component", type: i39.DropdownSettingFormComponent, selector: "dropdown-setting-form", inputs: ["control", "baseService"], outputs: ["onInit"] }, { kind: "component", type: i40.FileUploadComponent, selector: "file-upload", inputs: ["chooseLabel", "readonly", "accept", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageSummary", "invalidFileLimitMessageDetail", "sharedFolderType"], outputs: ["onInit", "onSelect", "onRemove", "onChanged"] }, { kind: "component", type: i41.ServiceFileUploadComponent, selector: "service-file-upload", inputs: ["fileDataService", "control", "serviceCode", "entity", "entityKey", "chooseLabel"], outputs: ["onInit", "onSelect", "onRemove", "onChanged"] }, { kind: "component", type: i42.VanBanPickerComponent, selector: "vanban-picker", inputs: ["loaiVanBan", "readOnly", "control"], outputs: ["onInit", "onChanged", "onReady"] }, { kind: "component", type: i43.CongViecPickerComponent, selector: "congviec-picker", inputs: ["control"], outputs: ["onInit", "onChanged"] }, { kind: "component", type: i44.ReportQueueComponent, selector: "report-queue", inputs: ["parentDataModel", "name", "header", "autoDownload"] }, { kind: "component", type: i45.SettingsComponent, selector: "settings", inputs: ["parentModel", "parentSetting", "entityMetadataService"], outputs: ["onCancel", "onSave", "onDelete"] }, { kind: "component", type: i46.SettingsRowComponent, selector: "settings-row", inputs: ["parentModel", "parentSetting", "entityMetadataService"], outputs: ["onSave", "onCancel"] }, { kind: "component", type: i47.ProcessWorkflowFormComponent, selector: "process-workflow-form", inputs: ["businessSetting", "item", "workflow", "action"], outputs: ["onInvalidWorkflow"] }, { kind: "component", type: i48.ChoYKienFormComponent, selector: "cho-y-kien-form", inputs: ["bussinessSetting", "rowItem"] }, { kind: "component", type: i49.StartWorkflowComponent, selector: "start-workflow", inputs: ["workflows", "defaultWorkflow"], outputs: ["onInit", "onSaved", "onCancel"] }, { kind: "component", type: i50.ShareLinkByPermissionComponent, selector: "share-link-by-permission", inputs: ["setting", "lstItem"] }, { kind: "component", type: i51.WorkflowSettingNewComponent, selector: "workflow-setting-new", inputs: ["parentSetting"], outputs: ["onInit", "onSaved", "onCancel", "onSaveSetting"] }, { kind: "component", type: i52.PermissionSharingComponent, selector: "permission-sharing", inputs: ["baseService", "item"] }, { kind: "component", type: i53.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "component", type: i54.TableDetailFormComponent, selector: "table-detail-form", inputs: ["schema", "data"], outputs: ["onInit", "onSaved"] }, { kind: "component", type: i55.QuickAddFormComponent, selector: "quick-add-form", inputs: ["control", "baseService"], outputs: ["onInit"] }, { kind: "component", type: i56.UserPickerComponent, selector: "user-picker", inputs: ["control", "popupSize", "multiple", "disabled", "readOnlyValues"], outputs: ["onInit", "onSelect", "onUnSelect", "onChanged", "onFocus", "onBlur", "onReady"] }, { kind: "component", type: i57.FileManagerComponent, selector: "file-manager", inputs: ["control", "fileDataService", "layout", "hiddenCreateFolder", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageSummary", "invalidFileLimitMessageDetail", "dataType", "rootFolderName", "serviceCode", "entity", "entityKey", "readonly", "inTaiLieu", "inTaiLieuChung", "copyToFolderId", "value", "multipleCheckWhenClickRow"], outputs: ["onInit", "onReady", "entityKeyChange", "closePopup", "valueChange", "onChanged", "onSelected"] }, { kind: "component", type: i58.WorkflowHistoryNewComponent, selector: "workflow-history-new", inputs: ["businessSetting", "isRelativeForm", "tableName", "item", "workflowSetting"] }, { kind: "component", type: i59.WorkflowPermissionComponent, selector: "workflow-permission", inputs: ["businessSetting", "item"] }, { kind: "component", type: i60.PermissionUtilsComponent, selector: "permission-utils" }, { kind: "component", type: i61.FilePickerDialogComponent, selector: "file-picker-dialog", inputs: ["isFilePicker", "multipleCheckWhenClickRow", "dataType"], outputs: ["onChanged"] }, { kind: "component", type: i62.AddNewsComponent, selector: "add-news", inputs: ["isShow", "languageCode"], outputs: ["showChange"] }, { kind: "pipe", type: i23.DatePipe, name: "date" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i63.HighlightPipe, name: "highlight" }] });
798
798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CommonAppComponentComponent, decorators: [{
799
799
  type: Component,
800
- args: [{ selector: 'common-app-component', providers: [ComponentContextService, EntityMetadataService], template: "<div *ngIf=\"pageLoaded\" [style.display]=\"pageLoaded ? '' : 'none'\" class=\"layout-wrapper\"\r\n (click)=\"_commonService.onLayoutClick()\" [ngClass]=\"{'menu-layout-static': !_commonService.isOverlay(),\r\n 'menu-layout-overlay': _commonService.isOverlay(),\r\n 'layout-menu-overlay-active': _commonService.overlayMenuActive,\r\n 'menu-layout-horizontal': _commonService.isHorizontal(),\r\n 'menu-layout-slim': _commonService.isSlim(),\r\n 'layout-menu-static-desktop-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-desktop-active': !_commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-mobile-inactive': !_commonService.staticMenuMobileActive,\r\n 'layout-menu-static-mobile-active': _commonService.staticMenuMobileActive,\r\n 'layout-menu-static-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-active': _commonService.staticMenuMobileActive}\">\r\n\r\n <app-topbar *ngIf=\"_globalService.getHeaderState()\"></app-topbar>\r\n\r\n <div *ngIf=\"_globalService.getMenuState()\" class=\"layout-menu-container\"\r\n [ngClass]=\"{'layout-menu-dark':_commonService.darkMenu}\" (click)=\"_commonService.onMenuClick($event)\">\r\n <app-root-menu></app-root-menu>\r\n <div class=\"layout-menu-block\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'padding-top': '16px'}\">\r\n <app-inline-profile *ngIf=\"_commonService.profileMode == 'inline' &&!_commonService.isHorizontal()\">\r\n </app-inline-profile>\r\n <app-menu [autoRenderMenu]=\"autoRenderMenu\" [reset]=\"_commonService.resetMenu\"\r\n (onMenuActive)=\"handleMenuActive($event)\"></app-menu>\r\n </tn-custom-scrollbar>\r\n </div>\r\n <div class=\"search-area layout-menu-search-area\">\r\n <p-autoComplete [(ngModel)]=\"searchMenuInput\" [style]=\"{'width':'100%'}\" [suggestions]=\"searchMenuResult\"\r\n (completeMethod)=\"onSearchMenu($event)\" [autoHighlight]=\"true\"\r\n [placeholder]=\"'T\u00ECm ki\u1EBFm ch\u1EE9c n\u0103ng' | translate\" [delay]=\"200\" [scrollHeight]=\"'400px'\"\r\n class=\"search-input\" [readonly]=\"!(menuModel && menuModel.length)\"\r\n (onSelect)=\"onSelectMenuSuggestion($event)\" field=\"label\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div innerHTML=\"{{ item.label | highlight : searchMenuInput}}\"></div>\r\n </ng-template>\r\n </p-autoComplete>\r\n <span class=\"icon-search\"><i class=\"pi pi-search\"></i></span>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"'layout-main'\" [ngClass]=\"{'no-header': _globalService.getHeaderState() ? false : true}\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n\r\n <div class=\"layout-mask\"></div>\r\n <div #quickNoteBt *ngIf=\"!onlyShowMainContent && showQuickNote\" class=\"quick-note-button-holder\" cdkDrag\r\n cdkDragBoundary=\".layout-wrapper\" oncontextmenu=\"return false\" (cdkDragEnded)=\"quickNoteDropped($event)\"\r\n (cdkDragStarted)=\"quickNoteStarted($event)\">\r\n <a #quickNoteBt1 href=\"javascript:;\" class=\"all-note-button\" tabindex=\"0\" (click)=\"quickNoteShowAllNotes()\">\r\n <i class=\"fas fa-sticky-note\"></i></a>\r\n <a #quickNoteBt2 href=\"javascript:;\" class=\"setting-note-button\" tabindex=\"0\" (click)=\"quickNoteShowSettings()\">\r\n <i class=\"fas fa-cog\"></i></a>\r\n <a href=\"javascript:;\" (press)=\"quickNotePress($event)\" (pressup)=\"quickNotePressUp($event)\"\r\n class=\"quick-note-button\" tabindex=\"0\" (click)=\"quickNoteAddNote()\">\r\n <i class=\"fas fa-plus\"></i></a>\r\n </div>\r\n <div #pinnedNotes *ngIf=\"!onlyShowMainContent\" class=\"pinned-notes-holder\" cdkDrag cdkDragBoundary=\".layout-wrapper\"\r\n oncontextmenu=\"return false\" (cdkDragEnded)=\"pinnedNotesDropped($event)\"\r\n (cdkDragStarted)=\"pinnedNotesStarted($event)\">\r\n <div class=\"pinned-notes ui-g\" tabindex=\"0\">\r\n <div *ngIf=\"pinnedNotesMinimizeStatus\" class=\"pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-maximize\"></i>\r\n </div>\r\n <div *ngIf=\"pinnedNotesMaximizeStatus\" class=\" pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-minimize\"></i>\r\n </div>\r\n <div *ngFor=\"let note of pinnedNoteData\" class=\"pinned-note ui-g-12\">\r\n <div class=\"pinned-note-header-line\" [style.background-color]=\"note.colorCode\">\r\n </div>\r\n <div class=\"pinned-note-body\">\r\n <span class=\"pinned-note-line-title\" [style.paddingBottom]=\"note.titlePaddingBottom\">\r\n <div class=\"pinned-note-header-right\">\r\n <span class=\"pinned-note-header-time\">{{note.created | date: 'dd/MM'}}</span>\r\n <img src=\"../assets/layout/images/ico/unpin-1.ico\" class=\"pinned-note-header-button-unpin\"\r\n (click)=\"unPinNote(note)\">\r\n <i *ngIf=\"!note.isCompleted\" class=\"far fa-flag pinned-note-header-button-complete\"\r\n (click)=\"completeNote(note)\"></i>\r\n <i *ngIf=\"note.isCompleted\" class=\"fas fa-flag-checkered pinned-note-header-button-complete\"\r\n (click)=\"inCompleteNote(note)\"></i>\r\n </div>\r\n <div>{{note.name}}</div>\r\n </span>\r\n <div class=\"pinned-note-contents\" [style.display]=\"note.contentDisplay\">\r\n <span *ngFor=\"let content of note.contents\" class=\"pinned-note-line\">\r\n {{content}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <report-queue [header]=\"'Xu\u1EA5t d\u1EEF li\u1EC7u'\">\r\n </report-queue>\r\n</div>\r\n<div class=\"waiting-box\" [class.show]=\"waiting\">\r\n <div class=\"overlay\"></div>\r\n <div class=\"content-loading\">\r\n <div class=\"lds-ellipsis\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <div class=\"message-loading\">\r\n <span *ngFor=\"let x of messageWaiting\">{{x}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<p-toast [position]=\"'top-right'\" [autoZIndex]=\"true\"></p-toast>\r\n<p-confirmDialog #cd [closable]=\"false\">\r\n <p-footer>\r\n <button #okButton type=\"button\" pButton icon=\"pi pi-check\" class=\"p-button-rounded p-button-text\" label=\"\u0110\u1ED3ng \u00FD\"\r\n (keydown.shift.tab)=\"focusTrap($event, false)\" (click)=\"cd.accept()\"></button>\r\n <button *ngIf=\"showRejectConfirm\" #cancelButton type=\"button\" pButton\r\n class=\"p-button-rounded p-button-text p-button-secondary\" icon=\"pi pi-times\" label=\"B\u1ECF qua\"\r\n (keydown.tab)=\"focusTrap($event, true)\" (click)=\"cd.reject()\"></button>\r\n </p-footer>\r\n</p-confirmDialog>\r\n<!-- <user-action-manager></user-action-manager> -->\r\n<permission-utils *ngIf=\"rootData.showPermissionUtils\"></permission-utils>\r\n<ng-template #queryBuilderUserPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <user-picker [control]=\"control\" [disabled]=\"disabled\" [multiple]=\"control.multiple\" [(ngModel)]=\"query.value\">\r\n </user-picker>\r\n</ng-template>\r\n<ng-template #queryBuilderCoCauPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"disabled\" [(ngModel)]=\"query.value\">\r\n </cocautochuc-picker-list>\r\n</ng-template>\r\n<ng-template #queryBuilderAutocompletePicker let-control let-disabled=\"disabled\" let-query=\"query\">\r\n <autocomplete-picker *ngSwitchCase=\"'groupuser'\" [control]=\"control\" [disabled]=\"disabled\"\r\n [(ngModel)]=\"query.value\">\r\n </autocomplete-picker>\r\n</ng-template>\r\n\r\n<ng-template #listCongViecCon let-formState=\"formState\" let-loaiDanhSach=\"loaiDanhSach\" let-idCongViec=\"idCongViec\">\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"formState\"\r\n [loaiDanhSach]=\"loaiDanhSach\" [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n</ng-template>\r\n\r\n<ng-template #crudListSettingRow let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings-row>\r\n</ng-template>\r\n<ng-template #crudListSetting let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings>\r\n</ng-template>\r\n<ng-template #crudListAdvanceSearch let-parentSetting=\"parentSetting\" let-searchInfo=\"searchInfo\" let-loading=\"loading\"\r\n let-onSearch=\"onSearch\" let-onInit=\"onInit\">\r\n <advance-search [parentSetting]=\"parentSetting\" [searchInfo]=\"searchInfo\" [loading]=\"loading\"\r\n (onSearch)=\"onSearch($event)\" (onInit)=\"onInit($event)\">\r\n </advance-search>\r\n</ng-template>\r\n<ng-template #crudListWorkflowSetting let-dialogModel=\"dialogModel\" let-parentSetting=\"parentSetting\"\r\n let-onSaved=\"onSaved\">\r\n <workflow-setting-new #formBase [parentSetting]=\"parentSetting\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-setting-new>\r\n</ng-template>\r\n<ng-template #crudListWorkflowHistory let-item let-dialogModel=\"dialogModel\">\r\n <workflow-history-new #formBase [businessSetting]=\"dialogModel.data.setting\"\r\n [tableName]=\"dialogModel.data.tableName\" [item]=\"item\" [workflowSetting]=\"dialogModel.data.workflowSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-history-new>\r\n</ng-template>\r\n<ng-template #crudListStartWorkflow let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <start-workflow #formBase [workflows]=\"dialogModel.data.workflows\"\r\n [defaultWorkflow]=\"dialogModel.data.defaultWorkflow\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onCancel)=\"dialogModel.showEditForm = false\"\r\n (onSaved)=\"onSaved\">\r\n </start-workflow>\r\n</ng-template>\r\n<ng-template #crudListChoYKien let-dialogModel=\"dialogModel\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"dialogModel.data.setting\" [rowItem]=\"dialogModel.data.rowData\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"dialogModel.showEditForm = false\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n</ng-template>\r\n<ng-template #crudListProcessWorkflow let-item let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <process-workflow-form #formBase [businessSetting]=\"dialogModel.data.setting\" [item]=\"item\"\r\n [workflow]=\"dialogModel.data.workflow\" [action]=\"dialogModel.data.action\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </process-workflow-form>\r\n</ng-template>\r\n<ng-template #crudListCongViec let-baseService=\"baseService\" let-itemIdAttach=\"itemIdAttach\">\r\n <base-congviec [serviceCode]=\"baseService.serviceCode\" [entity]=\"baseService.entityName\"\r\n [itemIdAttach]=\"itemIdAttach\"></base-congviec>\r\n</ng-template>\r\n<ng-template #crudListFormCongViec let-dialogModel=\"dialogModel\" let-isFormView=\"isFormView\" let-getData=\"getData\">\r\n <base-congviec-form #formBase [parentSetting]=\"dialogModel.data.congViecSetting\"\r\n [model]=\"dialogModel.data.formModel\" [forceOnlyView]=\"isFormView\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\"\r\n (onSaved)=\"dialogModel.showEditForm = false; getData()\" (onCancel)=\"dialogModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudListPermissionSharing let-item let-baseService=\"baseService\" let-dialogModel=\"dialogModel\">\r\n <permission-sharing #formBase [item]=\"item\" [baseService]=\"baseService\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </permission-sharing>\r\n</ng-template>\r\n<ng-template #crudListWorkflowPermission let-item let-businessSetting=\"businessSetting\" let-dialogModel=\"dialogModel\">\r\n <workflow-permission #formBase [item]=\"item\" [businessSetting]=\"businessSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-permission>\r\n</ng-template>\r\n<ng-template #crudListShareLinkByPermission let-setting=\"setting\" let-dialogModel=\"dialogModel\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"dialogModel.data.lstItem\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</ng-template>\r\n<ng-template #crudListFileUploadColumn let-rowData let-parentContext=\"parentContext\" let-field=\"field\"\r\n let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == fileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == fileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"parentContext\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [control]=\"fileSetting.control\" [fileDataService]=\"fileSetting.control.fileDataService\"\r\n [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudListFileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>\r\n\r\n<ng-template #crudFormTableDetailForm let-schema let-parentSetting=\"parentSetting\" let-dialogModel=\"dialogModel\"\r\n let-onInit=\"onInit\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <table-detail-form #formBase [parentSetting]=\"parentSetting\" [schema]=\"schema\" [data]=\"dialogModel.data\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </table-detail-form>\r\n</ng-template>\r\n<ng-template #crudFormCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudFormAddressComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [disabled]=\"checkDisabled(data, control)\"\r\n [(data)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n</ng-template>\r\n<ng-template #crudFormFileManagerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [(value)]=\"data[control.field]\"\r\n (onSelected)=\"control.onSelected($event)\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n</ng-template>\r\n<ng-template #crudFormServiceFileUploadComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-parentContext=\"parentContext\" let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <service-file-upload [parentContext]=\"parentContext\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudFormCongViecPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n</ng-template>\r\n<ng-template #crudFormVanBanPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n</ng-template>\r\n\r\n<ng-template #tinyMceFilePickerDialog let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-closeForm=\"closeForm\" let-onCancel=\"onCancel\" let-onChanged=\"onChanged\">\r\n <file-picker-dialog #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\" (closeForm)=\"closeForm\"\r\n (onCancel)=\"onCancel\" (onChanged)=\"onChanged\">\r\n </file-picker-dialog>\r\n</ng-template>\r\n<ng-template #tinyMceAddNews let-languageCode=\"languageCode\" let-showChange=\"showChange\">\r\n <add-news #listBase [languageCode]=\"languageCode\" (showChange)=\"showChange($event)\"></add-news>\r\n</ng-template>\r\n\r\n<ng-template #dropdownQuickAddForm let-dialogModel let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-control=\"control\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <quick-add-form #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\"\r\n [model]=\"dialogModel.data.formModel\" [control]=\"control\" [baseService]=\"control.baseService\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </quick-add-form>\r\n</ng-template>\r\n<ng-template #dropdownSettingForm let-dialogModel let-onSaved=\"onSaved\">\r\n <dropdown-setting-form #formBase [model]=\"dialogModel.data.formModel\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </dropdown-setting-form>\r\n</ng-template>\r\n", styles: [".layout-menu-search-area{position:relative}.icon-search{background-color:transparent;box-shadow:none;position:absolute;right:0;top:0;color:#888;width:30px;font-size:14px;height:100%;display:flex;align-items:center;justify-content:center}.layout-menu-static-inactive .search-area{margin-left:-303px}.layout-menu-container{overflow:hidden;display:flex;flex-direction:column;top:60px;bottom:0;height:auto}.layout-menu-block{display:flex;overflow:hidden;flex:1}.layout-menu-block>tn-custom-scrollbar{width:100%}::ng-deep .layout-menu-search-area .ui-inputtext{width:calc(100% + 1px);border-radius:0;border-color:#dadada;padding-right:40px}::ng-deep .layout-menu-search-area .ui-inputtext:not(:focus){box-shadow:none}::ng-deep .layout-menu-search-area input{width:100%;border-radius:0;border-left:0;border-right:0}::ng-deep .layout-menu-search-area .p-autocomplete-panel{max-width:100%}::ng-deep .layout-menu-search-area .p-autocomplete-item{white-space:normal}::ng-deep .layout-menu-search-area .p-autocomplete-item mark{background-color:var(--tn-primary-color);padding:0;color:#fff;border-radius:0}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}.waiting-box .content-loading .lds-ellipsis{display:inline-block;position:relative;width:80px;height:60px}.waiting-box .content-loading .lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.waiting-box .content-loading .lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}.waiting-box .message-loading{font-size:1.75em}.waiting-box .message-loading span{color:#fff;animation:message-opacity 1s infinite;margin-right:1px}.waiting-box .message-loading span:last-child{margin-right:0}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:.1s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:.2s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:.3s}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0/10 s}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:1/10 s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:2/10 s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:3/10 s}.waiting-box .message-loading span:nth-child(16n+5){animation-delay:4/10 s}.waiting-box .message-loading span:nth-child(16n+6){animation-delay:5/10 s}.waiting-box .message-loading span:nth-child(16n+7){animation-delay:6/10 s}.waiting-box .message-loading span:nth-child(16n+8){animation-delay:7/10 s}.waiting-box .message-loading span:nth-child(16n+9){animation-delay:8/10 s}.waiting-box .message-loading span:nth-child(16n+10){animation-delay:9/10 s}.waiting-box .message-loading span:nth-child(16n+11){animation-delay:10/10 s}.waiting-box .message-loading span:nth-child(16n+12){animation-delay:11/10 s}.waiting-box .message-loading span:nth-child(16n+13){animation-delay:12/10 s}.waiting-box .message-loading span:nth-child(16n+14){animation-delay:13/10 s}.waiting-box .message-loading span:nth-child(16n+15){animation-delay:14/10 s}.waiting-box .message-loading span:nth-child(16n+16){animation-delay:15/10 s}.waiting-box.show{display:block}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes message-opacity{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"] }]
801
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.GlobalService }, { type: i2.CommonService }, { type: i3.ComponentService }, { type: i4.TranslateService }, { type: i5.OAuthService }, { type: i6.AuthenService }, { type: i7.UserService }, { type: i8.Router }, { type: i9.Title }, { type: i10.SignalRService }, { type: i11.StorageUpdatedService }, { type: i12.ApplicationContextService }, { type: i13.ComponentContextService }, { type: i8.ActivatedRoute }, { type: i14.DeviceDetectorService }, { type: i0.ChangeDetectorRef }, { type: i15.TnClientService }, { type: i16.NotifierService }, { type: i17.EntityMetadataService }, { type: i18.EnvironmentService }, { type: i19.MenuService }, { type: i20.PrimeNGConfig }, { type: i21.StorageService }, { type: i22.PermissionService }, { type: i23.CustomizeUiService }]; }, propDecorators: { okButton: [{
800
+ args: [{ selector: 'common-app-component', providers: [ComponentContextService, EntityMetadataService], template: "<div *ngIf=\"pageLoaded\" [style.display]=\"pageLoaded ? '' : 'none'\" class=\"layout-wrapper\"\r\n (click)=\"_commonService.onLayoutClick()\" [ngClass]=\"{'menu-layout-static': !_commonService.isOverlay(),\r\n 'menu-layout-overlay': _commonService.isOverlay(),\r\n 'layout-menu-overlay-active': _commonService.overlayMenuActive,\r\n 'menu-layout-horizontal': _commonService.isHorizontal(),\r\n 'menu-layout-slim': _commonService.isSlim(),\r\n 'layout-menu-static-desktop-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-desktop-active': !_commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-mobile-inactive': !_commonService.staticMenuMobileActive,\r\n 'layout-menu-static-mobile-active': _commonService.staticMenuMobileActive,\r\n 'layout-menu-static-inactive': _commonService.staticMenuDesktopInactive,\r\n 'layout-menu-static-active': _commonService.staticMenuMobileActive}\">\r\n\r\n <app-topbar *ngIf=\"_globalService.getHeaderState()\"></app-topbar>\r\n\r\n <div *ngIf=\"_globalService.getMenuState()\" class=\"layout-menu-container\"\r\n [ngClass]=\"{'layout-menu-dark':_commonService.darkMenu}\" (click)=\"_commonService.onMenuClick($event)\">\r\n <app-root-menu></app-root-menu>\r\n <div class=\"layout-menu-block\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'padding-top': '16px'}\">\r\n <app-inline-profile *ngIf=\"_commonService.profileMode == 'inline' &&!_commonService.isHorizontal()\">\r\n </app-inline-profile>\r\n <app-menu [autoRenderMenu]=\"autoRenderMenu\" [reset]=\"_commonService.resetMenu\"\r\n (onMenuActive)=\"handleMenuActive($event)\"></app-menu>\r\n </tn-custom-scrollbar>\r\n </div>\r\n <div class=\"search-area layout-menu-search-area\">\r\n <p-autoComplete [(ngModel)]=\"searchMenuInput\" [style]=\"{'width':'100%'}\" [suggestions]=\"searchMenuResult\"\r\n (completeMethod)=\"onSearchMenu($event)\" [autoHighlight]=\"true\"\r\n [placeholder]=\"'T\u00ECm ki\u1EBFm ch\u1EE9c n\u0103ng' | translate\" [delay]=\"200\" [scrollHeight]=\"'400px'\"\r\n class=\"search-input\" [readonly]=\"!(menuModel && menuModel.length)\"\r\n (onSelect)=\"onSelectMenuSuggestion($event)\" field=\"label\">\r\n <ng-template let-item pTemplate=\"item\">\r\n <div innerHTML=\"{{ item.label | highlight : searchMenuInput}}\"></div>\r\n </ng-template>\r\n </p-autoComplete>\r\n <span class=\"icon-search\"><i class=\"pi pi-search\"></i></span>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"'layout-main'\" [ngClass]=\"{'no-header': _globalService.getHeaderState() ? false : true}\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n\r\n <div class=\"layout-mask\"></div>\r\n <div #quickNoteBt *ngIf=\"!onlyShowMainContent && showQuickNote\" class=\"quick-note-button-holder\" cdkDrag\r\n cdkDragBoundary=\".layout-wrapper\" oncontextmenu=\"return false\" (cdkDragEnded)=\"quickNoteDropped($event)\"\r\n (cdkDragStarted)=\"quickNoteStarted($event)\">\r\n <a #quickNoteBt1 href=\"javascript:;\" class=\"all-note-button\" tabindex=\"0\" (click)=\"quickNoteShowAllNotes()\">\r\n <i class=\"fas fa-sticky-note\"></i></a>\r\n <a #quickNoteBt2 href=\"javascript:;\" class=\"setting-note-button\" tabindex=\"0\" (click)=\"quickNoteShowSettings()\">\r\n <i class=\"fas fa-cog\"></i></a>\r\n <a href=\"javascript:;\" (press)=\"quickNotePress($event)\" (pressup)=\"quickNotePressUp($event)\"\r\n class=\"quick-note-button\" tabindex=\"0\" (click)=\"quickNoteAddNote()\">\r\n <i class=\"fas fa-plus\"></i></a>\r\n </div>\r\n <div #pinnedNotes *ngIf=\"!onlyShowMainContent\" class=\"pinned-notes-holder\" cdkDrag cdkDragBoundary=\".layout-wrapper\"\r\n oncontextmenu=\"return false\" (cdkDragEnded)=\"pinnedNotesDropped($event)\"\r\n (cdkDragStarted)=\"pinnedNotesStarted($event)\">\r\n <div class=\"pinned-notes ui-g\" tabindex=\"0\">\r\n <div *ngIf=\"pinnedNotesMinimizeStatus\" class=\"pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-maximize\"></i>\r\n </div>\r\n <div *ngIf=\"pinnedNotesMaximizeStatus\" class=\" pinned-notes-minimize-button\"\r\n (click)=\"pinnedNotesMinimize(pinnedNotesMinimizeStatus)\">\r\n <i class=\"pi pi-window-minimize\"></i>\r\n </div>\r\n <div *ngFor=\"let note of pinnedNoteData\" class=\"pinned-note ui-g-12\">\r\n <div class=\"pinned-note-header-line\" [style.background-color]=\"note.colorCode\">\r\n </div>\r\n <div class=\"pinned-note-body\">\r\n <span class=\"pinned-note-line-title\" [style.paddingBottom]=\"note.titlePaddingBottom\">\r\n <div class=\"pinned-note-header-right\">\r\n <span class=\"pinned-note-header-time\">{{note.created | date: 'dd/MM'}}</span>\r\n <img src=\"../assets/layout/images/ico/unpin-1.ico\" class=\"pinned-note-header-button-unpin\"\r\n (click)=\"unPinNote(note)\">\r\n <i *ngIf=\"!note.isCompleted\" class=\"far fa-flag pinned-note-header-button-complete\"\r\n (click)=\"completeNote(note)\"></i>\r\n <i *ngIf=\"note.isCompleted\" class=\"fas fa-flag-checkered pinned-note-header-button-complete\"\r\n (click)=\"inCompleteNote(note)\"></i>\r\n </div>\r\n <div>{{note.name}}</div>\r\n </span>\r\n <div class=\"pinned-note-contents\" [style.display]=\"note.contentDisplay\">\r\n <span *ngFor=\"let content of note.contents\" class=\"pinned-note-line\">\r\n {{content}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <report-queue [header]=\"'Xu\u1EA5t d\u1EEF li\u1EC7u'\">\r\n </report-queue>\r\n</div>\r\n<div class=\"waiting-box\" [class.show]=\"waiting\">\r\n <div class=\"overlay\"></div>\r\n <div class=\"content-loading\">\r\n <div class=\"lds-ellipsis\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <div class=\"message-loading\">\r\n <span *ngFor=\"let x of messageWaiting\">{{x}}</span>\r\n </div>\r\n </div>\r\n</div>\r\n<p-toast [position]=\"'top-right'\" [autoZIndex]=\"true\"></p-toast>\r\n<p-confirmDialog #cd [closable]=\"false\">\r\n <p-footer>\r\n <button #okButton type=\"button\" pButton icon=\"pi pi-check\" class=\"p-button-rounded p-button-text\" label=\"\u0110\u1ED3ng \u00FD\"\r\n (keydown.shift.tab)=\"focusTrap($event, false)\" (click)=\"cd.accept()\"></button>\r\n <button *ngIf=\"showRejectConfirm\" #cancelButton type=\"button\" pButton\r\n class=\"p-button-rounded p-button-text p-button-secondary\" icon=\"pi pi-times\" label=\"B\u1ECF qua\"\r\n (keydown.tab)=\"focusTrap($event, true)\" (click)=\"cd.reject()\"></button>\r\n </p-footer>\r\n</p-confirmDialog>\r\n<!-- <user-action-manager></user-action-manager> -->\r\n<permission-utils *ngIf=\"rootData.showPermissionUtils\"></permission-utils>\r\n<ng-template #queryBuilderUserPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <user-picker [control]=\"control\" [disabled]=\"disabled\" [multiple]=\"control.multiple\" [(ngModel)]=\"query.value\">\r\n </user-picker>\r\n</ng-template>\r\n<ng-template #queryBuilderCoCauPicker let-control let-disabled=\"disabled\" let-query=\"query\" let-multiple=\"multiple\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"disabled\" [(ngModel)]=\"query.value\">\r\n </cocautochuc-picker-list>\r\n</ng-template>\r\n<ng-template #queryBuilderAutocompletePicker let-control let-disabled=\"disabled\" let-query=\"query\">\r\n <autocomplete-picker *ngSwitchCase=\"'groupuser'\" [control]=\"control\" [disabled]=\"disabled\"\r\n [(ngModel)]=\"query.value\">\r\n </autocomplete-picker>\r\n</ng-template>\r\n\r\n<ng-template #listCongViecCon let-formState=\"formState\" let-loaiDanhSach=\"loaiDanhSach\" let-idCongViec=\"idCongViec\">\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"formState\"\r\n [loaiDanhSach]=\"loaiDanhSach\" [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n</ng-template>\r\n\r\n<ng-template #crudListSettingRow let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings-row>\r\n</ng-template>\r\n<ng-template #crudListSetting let-entityMetadataService=\"entityMetadataService\" let-parentContext=\"parentContext\"\r\n let-parentSetting=\"parentSetting\" let-parentModel=\"parentModel\" let-onSave=\"onSave\" let-onCancel=\"onCancel\">\r\n <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"parentContext\"\r\n [parentSetting]=\"parentSetting\" [parentModel]=\"parentModel\" (onSave)=\"onSave($event)\" (onCancel)=\"onCancel\">\r\n </settings>\r\n</ng-template>\r\n<ng-template #crudListAdvanceSearch let-parentSetting=\"parentSetting\" let-searchInfo=\"searchInfo\" let-loading=\"loading\"\r\n let-onSearch=\"onSearch\" let-onInit=\"onInit\">\r\n <advance-search [parentSetting]=\"parentSetting\" [searchInfo]=\"searchInfo\" [loading]=\"loading\"\r\n (onSearch)=\"onSearch($event)\" (onInit)=\"onInit($event)\">\r\n </advance-search>\r\n</ng-template>\r\n<ng-template #crudListWorkflowSetting let-dialogModel=\"dialogModel\" let-parentSetting=\"parentSetting\"\r\n let-onSaved=\"onSaved\">\r\n <workflow-setting-new #formBase [parentSetting]=\"parentSetting\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-setting-new>\r\n</ng-template>\r\n<ng-template #crudListWorkflowHistory let-item let-dialogModel=\"dialogModel\">\r\n <workflow-history-new #formBase [businessSetting]=\"dialogModel.data.setting\"\r\n [tableName]=\"dialogModel.data.tableName\" [item]=\"item\" [workflowSetting]=\"dialogModel.data.workflowSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-history-new>\r\n</ng-template>\r\n<ng-template #crudListStartWorkflow let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <start-workflow #formBase [workflows]=\"dialogModel.data.workflows\"\r\n [defaultWorkflow]=\"dialogModel.data.defaultWorkflow\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onCancel)=\"dialogModel.showEditForm = false\"\r\n (onSaved)=\"onSaved\">\r\n </start-workflow>\r\n</ng-template>\r\n<ng-template #crudListChoYKien let-dialogModel=\"dialogModel\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"dialogModel.data.setting\" [rowItem]=\"dialogModel.data.rowData\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"dialogModel.showEditForm = false\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n</ng-template>\r\n<ng-template #crudListProcessWorkflow let-item let-dialogModel=\"dialogModel\" let-onSaved=\"onSaved\">\r\n <process-workflow-form #formBase [businessSetting]=\"dialogModel.data.setting\" [item]=\"item\"\r\n [workflow]=\"dialogModel.data.workflow\" [action]=\"dialogModel.data.action\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </process-workflow-form>\r\n</ng-template>\r\n<ng-template #crudListCongViec let-baseService=\"baseService\" let-itemIdAttach=\"itemIdAttach\">\r\n <base-congviec [serviceCode]=\"baseService.serviceCode\" [entity]=\"baseService.entityName\"\r\n [itemIdAttach]=\"itemIdAttach\"></base-congviec>\r\n</ng-template>\r\n<ng-template #crudListFormCongViec let-dialogModel=\"dialogModel\" let-isFormView=\"isFormView\" let-getData=\"getData\">\r\n <base-congviec-form #formBase [parentSetting]=\"dialogModel.data.congViecSetting\"\r\n [model]=\"dialogModel.data.formModel\" [forceOnlyView]=\"isFormView\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\"\r\n (onSaved)=\"dialogModel.showEditForm = false; getData()\" (onCancel)=\"dialogModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudListPermissionSharing let-item let-baseService=\"baseService\" let-dialogModel=\"dialogModel\">\r\n <permission-sharing #formBase [item]=\"item\" [baseService]=\"baseService\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </permission-sharing>\r\n</ng-template>\r\n<ng-template #crudListWorkflowPermission let-item let-businessSetting=\"businessSetting\" let-dialogModel=\"dialogModel\">\r\n <workflow-permission #formBase [item]=\"item\" [businessSetting]=\"businessSetting\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </workflow-permission>\r\n</ng-template>\r\n<ng-template #crudListShareLinkByPermission let-setting=\"setting\" let-dialogModel=\"dialogModel\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"dialogModel.data.lstItem\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</ng-template>\r\n<ng-template #crudListFileUploadColumn let-rowData let-parentContext=\"parentContext\" let-field=\"field\"\r\n let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == fileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == fileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"parentContext\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [control]=\"fileSetting.control\" [fileDataService]=\"fileSetting.control.fileDataService\"\r\n [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudListFileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>\r\n\r\n<ng-template #crudFormTableDetailForm let-schema let-parentSetting=\"parentSetting\" let-dialogModel=\"dialogModel\"\r\n let-onInit=\"onInit\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <table-detail-form #formBase [parentSetting]=\"parentSetting\" [schema]=\"schema\" [data]=\"dialogModel.data\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </table-detail-form>\r\n</ng-template>\r\n<ng-template #crudFormCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<ng-template #crudFormAddressComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [disabled]=\"checkDisabled(data, control)\"\r\n [(data)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n</ng-template>\r\n<ng-template #crudFormFileManagerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [(value)]=\"data[control.field]\"\r\n (onSelected)=\"control.onSelected($event)\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n</ng-template>\r\n<ng-template #crudFormServiceFileUploadComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-parentContext=\"parentContext\" let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <service-file-upload [parentContext]=\"parentContext\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #crudFormCongViecPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n</ng-template>\r\n<ng-template #crudFormVanBanPickerComponent let-data let-control=\"control\" let-parentPath=\"parentPath\"\r\n let-checkDisabled=\"checkDisabled\" let-handleLoadedControl=\"handleLoadedControl\"\r\n let-handleFieldValueChange=\"handleFieldValueChange\" let-handleControlReadyEvent=\"handleControlReadyEvent\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\" [required]=\"control.required\"\r\n [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n</ng-template>\r\n\r\n<ng-template #tinyMceFilePickerDialog let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-closeForm=\"closeForm\" let-onCancel=\"onCancel\" let-onChanged=\"onChanged\">\r\n <file-picker-dialog #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\" (closeForm)=\"closeForm\"\r\n (onCancel)=\"onCancel\" (onChanged)=\"onChanged\">\r\n </file-picker-dialog>\r\n</ng-template>\r\n<ng-template #tinyMceAddNews let-languageCode=\"languageCode\" let-showChange=\"showChange\">\r\n <add-news #listBase [languageCode]=\"languageCode\" (showChange)=\"showChange($event)\"></add-news>\r\n</ng-template>\r\n\r\n<ng-template #dropdownQuickAddForm let-dialogModel let-parentModel=\"parentModel\" let-parentContext=\"parentContext\"\r\n let-control=\"control\" let-onSaved=\"onSaved\" let-onCancel=\"onCancel\">\r\n <quick-add-form #formBase [parentModel]=\"parentModel\" [parentContext]=\"parentContext\"\r\n [model]=\"dialogModel.data.formModel\" [control]=\"control\" [baseService]=\"control.baseService\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\" (onCancel)=\"onCancel\">\r\n </quick-add-form>\r\n</ng-template>\r\n<ng-template #dropdownSettingForm let-dialogModel let-onSaved=\"onSaved\">\r\n <dropdown-setting-form #formBase [model]=\"dialogModel.data.formModel\"\r\n (onInit)=\"dialogModel.buttonTemplate = $event.buttonTemplate\" (onSaved)=\"onSaved\"\r\n (onCancel)=\"dialogModel.showEditForm = false\">\r\n </dropdown-setting-form>\r\n</ng-template>", styles: [".layout-menu-search-area{position:relative}.icon-search{background-color:transparent;box-shadow:none;position:absolute;right:0;top:0;color:#888;width:30px;font-size:14px;height:100%;display:flex;align-items:center;justify-content:center}.layout-menu-static-inactive .search-area{margin-left:-303px}.layout-menu-container{overflow:hidden;display:flex;flex-direction:column;top:60px;bottom:0;height:auto}.layout-menu-block{display:flex;overflow:hidden;flex:1}.layout-menu-block>tn-custom-scrollbar{width:100%}::ng-deep .layout-menu-search-area .ui-inputtext{width:calc(100% + 1px);border-radius:0;border-color:#dadada;padding-right:40px}::ng-deep .layout-menu-search-area .ui-inputtext:not(:focus){box-shadow:none}::ng-deep .layout-menu-search-area input{width:100%;border-radius:0;border-left:0;border-right:0}::ng-deep .layout-menu-search-area .p-autocomplete-panel{max-width:100%}::ng-deep .layout-menu-search-area .p-autocomplete-item{white-space:normal}::ng-deep .layout-menu-search-area .p-autocomplete-item mark{background-color:var(--tn-primary-color);padding:0;color:#fff;border-radius:0}.waiting-box{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;display:none}.waiting-box .overlay{background-color:red;background-color:#6d6d6d80;width:100%;height:100%}.waiting-box .content-loading{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}.waiting-box .content-loading .lds-ellipsis{display:inline-block;position:relative;width:80px;height:60px}.waiting-box .content-loading .lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.waiting-box .content-loading .lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.waiting-box .content-loading .lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}.waiting-box .message-loading{font-size:1.75em}.waiting-box .message-loading span{color:#fff;animation:message-opacity 1s infinite;margin-right:1px}.waiting-box .message-loading span:last-child{margin-right:0}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:.1s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:.2s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:.3s}.waiting-box .message-loading span:nth-child(16n+1){animation-delay:0/10 s}.waiting-box .message-loading span:nth-child(16n+2){animation-delay:1/10 s}.waiting-box .message-loading span:nth-child(16n+3){animation-delay:2/10 s}.waiting-box .message-loading span:nth-child(16n+4){animation-delay:3/10 s}.waiting-box .message-loading span:nth-child(16n+5){animation-delay:4/10 s}.waiting-box .message-loading span:nth-child(16n+6){animation-delay:5/10 s}.waiting-box .message-loading span:nth-child(16n+7){animation-delay:6/10 s}.waiting-box .message-loading span:nth-child(16n+8){animation-delay:7/10 s}.waiting-box .message-loading span:nth-child(16n+9){animation-delay:8/10 s}.waiting-box .message-loading span:nth-child(16n+10){animation-delay:9/10 s}.waiting-box .message-loading span:nth-child(16n+11){animation-delay:10/10 s}.waiting-box .message-loading span:nth-child(16n+12){animation-delay:11/10 s}.waiting-box .message-loading span:nth-child(16n+13){animation-delay:12/10 s}.waiting-box .message-loading span:nth-child(16n+14){animation-delay:13/10 s}.waiting-box .message-loading span:nth-child(16n+15){animation-delay:14/10 s}.waiting-box .message-loading span:nth-child(16n+16){animation-delay:15/10 s}.waiting-box.show{display:block}@keyframes lds-ellipsis1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0)}to{transform:translate(24px)}}@keyframes message-opacity{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"] }]
801
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.GlobalService }, { type: i2.CommonService }, { type: i3.ComponentService }, { type: i4.TranslateService }, { type: i5.OAuthService }, { type: i6.AuthenService }, { type: i7.UserService }, { type: i8.Router }, { type: i9.Title }, { type: i10.SignalRService }, { type: i11.StorageUpdatedService }, { type: i12.ApplicationContextService }, { type: i13.ComponentContextService }, { type: i8.ActivatedRoute }, { type: i14.DeviceDetectorService }, { type: i0.ChangeDetectorRef }, { type: i15.NotifierService }, { type: i16.EntityMetadataService }, { type: i17.EnvironmentService }, { type: i18.MenuService }, { type: i19.PrimeNGConfig }, { type: i20.StorageService }, { type: i21.PermissionService }, { type: i22.CustomizeUiService }]; }, propDecorators: { okButton: [{
802
802
  type: ViewChild,
803
803
  args: ['okButton']
804
804
  }], cancelButton: [{
@@ -835,4 +835,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
835
835
  type: HostListener,
836
836
  args: ['document:keypress', ['$event']]
837
837
  }] } });
838
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWFwcC1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1hcHAtY29tcG9uZW50L2NvbW1vbi1hcHAtY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jb21tb24tYXBwLWNvbXBvbmVudC9jb21tb24tYXBwLWNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQWtCLGVBQWUsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUdqRixPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUc3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFL0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFVM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IEF1dGhDb25maWcsIE9BdXRoU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xyXG5pbXBvcnQgKiBhcyBIYW1tZXIgZnJvbSAnaGFtbWVyanMnO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFByaW1lTkdDb25maWcgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwLWNvbnRleHQvYXBwbGljYXRpb24tY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZExpc3RTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBFdmVudFR5cGUsIEZpbGVVcGxvYWRNb2RlIH0gZnJvbSAnLi4vLi4vZW51bXMvY29tbW9uJztcclxuaW1wb3J0IHsgQXV0aGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbXBvbmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3VzdG9taXplVWlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3VzdG9taXplLXVpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktbWV0YWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmljR3VhcmRDaGlsZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9nZW5lcmljLWd1YXJkLWNoaWxkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmljR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2VuZXJpYy1ndWFyZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2xvYmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dsb2JhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaWduYWxSU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NpZ25hbHIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VVcGRhdGVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2UtdXBkYXRlZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUbkNsaWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90bi1jbGllbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0UXVldWVDb21wb25lbnQgfSBmcm9tICcuLi9yZXBvcnQtcXVldWUvcmVwb3J0LXF1ZXVlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRuQ3VzdG9tU2Nyb2xsYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vdG4tY3VzdG9tLXNjcm9sbGJhci90bi1jdXN0b20tc2Nyb2xsYmFyLmNvbXBvbmVudCc7XHJcblxyXG5kZWNsYXJlIGxldCB0aW55bWNlOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY29tbW9uLWFwcC1jb21wb25lbnQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1vbi1hcHAtY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbW9uLWFwcC1jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2UsIEVudGl0eU1ldGFkYXRhU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1vbkFwcENvbXBvbmVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdva0J1dHRvbicpIG9rQnV0dG9uOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnY2FuY2VsQnV0dG9uJykgY2FuY2VsQnV0dG9uOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgncXVpY2tOb3RlQnQnKSBxdWlja05vdGVCdDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3F1aWNrTm90ZUJ0MScpIHF1aWNrTm90ZUJ0MTogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3F1aWNrTm90ZUJ0MicpIHF1aWNrTm90ZUJ0MjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3Bpbm5lZE5vdGVzJykgcGlubmVkTm90ZXM6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKFJlcG9ydFF1ZXVlQ29tcG9uZW50KSByZXBvcnRRdWV1ZTogUmVwb3J0UXVldWVDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxiYXInKSBzY3JvbGxCYXJNZW51OiBUbkN1c3RvbVNjcm9sbGJhckNvbXBvbmVudDtcclxuICAgIEBWaWV3Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGNoaWxkcmVuOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gICAgQElucHV0KCkgc2hvd1F1aWNrTm90ZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBhbGxvd0Fub255bW91cyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgYXV0b1JlbmRlck1lbnU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlQWxsOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICAvLyByb290VmVyc2lvbkRlcGxveSA9ICcxLjMnO1xyXG4gICAgY3VycmVudFJvdXRlID0gJyc7XHJcbiAgICBwYWdlTG9hZGVkID0gZmFsc2U7XHJcbiAgICBmaXJzdFRpbWVMb2dpbiA9IGZhbHNlO1xyXG4gICAgc2hvd0FkZE5vdGVGb3JtID0gZmFsc2U7XHJcbiAgICBwaW5uZWROb3RlRGF0YTogYW55O1xyXG4gICAgcGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1cyA9IGZhbHNlO1xyXG4gICAgcGlubmVkTm90ZXNNYXhpbWl6ZVN0YXR1cyA9IG51bGw7XHJcbiAgICBjYXB0dXJlTW9kZSA9IGZhbHNlO1xyXG4gICAgcDA6IGFueTtcclxuICAgIHAxOiBhbnk7XHJcbiAgICBsb2dnZWRJbiA9IGZhbHNlO1xyXG4gICAgc3Vic2NyaWJsZTogU3Vic2NyaXB0aW9uO1xyXG4gICAgb25seVNob3dNYWluQ29udGVudCA9IGZhbHNlO1xyXG5cclxuICAgIGFwcENvZGUgPSAnJztcclxuXHJcbiAgICBzZWFyY2hNZW51UmVzdWx0OiBhbnlbXTtcclxuICAgIHNlYXJjaE1lbnVJbnB1dDogc3RyaW5nO1xyXG5cclxuICAgIHNob3dQaW5uZWRNZW51ID0gZmFsc2U7XHJcbiAgICBpc0luUGlubmVkTWVudSA9IGZhbHNlO1xyXG4gICAgaXNTZWFyY2hNZW51SW5wdXRGb2N1cyA9IGZhbHNlO1xyXG4gICAgbWVudU1vZGVsOiBhbnk7XHJcbiAgICB3YWl0aW5nID0gZmFsc2U7XHJcbiAgICBtZXNzYWdlV2FpdGluZzogc3RyaW5nW10gPSBbXTtcclxuICAgIHNob3dSZWplY3RDb25maXJtID0gdHJ1ZTtcclxuXHJcbiAgICBrZXlQcmVzc1Blcm1pc3Npb25VdGlscyA9ICdwcHBwcHBwcHAnO1xyXG4gICAgY3VycmVudEtleVByZXNzSW5kZXggPSAwO1xyXG4gICAgcm9vdERhdGE6IGFueTtcclxuXHJcbiAgICBjb25nVmllY1NldHRpbmc6IENydWRMaXN0U2V0dGluZztcclxuICAgIGV2ZW50VHlwZSA9IEV2ZW50VHlwZTtcclxuICAgIGZpbGVVcGxvYWRNb2RlID0gRmlsZVVwbG9hZE1vZGU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHVibGljIF9nbG9iYWxTZXJ2aWNlOiBHbG9iYWxTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRTZXJ2aWNlOiBDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX29hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2F1dGhlblNlcnZpY2U6IEF1dGhlblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgX3RpdGxlOiBUaXRsZSxcclxuICAgICAgICBwcml2YXRlIF9zaWduYWxSU2VydmljZTogU2lnbmFsUlNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfc3RvcmFnZVVwZGF0ZWRTZXJ2aWNlOiBTdG9yYWdlVXBkYXRlZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfYXBwbGljYXRpb25Db250ZXh0OiBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY29tcG9uZW50Q29udGV4dFNlcnZpY2U6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwdWJsaWMgX2RldmljZURldGVjdG9yU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIF90bkNsaWVudFNlcnZpY2U6IFRuQ2xpZW50U2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2VudGl0eU1ldGFkYXRhU2VydmljZTogRW50aXR5TWV0YWRhdGFTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2Vudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21lbnVTZXJ2aWNlOiBNZW51U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9wcmltZW5nQ29uZmlnOiBQcmltZU5HQ29uZmlnLFxyXG4gICAgICAgIHByaXZhdGUgX3N0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9wZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfY3VzdG9taXplVWlTZXJ2aWNlOiBDdXN0b21pemVVaVNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuYXBwQ29kZSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRBcHBDb2RlKCk7XHJcbiAgICAgICAgY29uc3Qga2V5UHJlc3NQZXJtaXNzaW9uVXRpbHMgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0S2V5UHJlc3NQZXJtaXNzaW9uVXRpbHMoKTtcclxuICAgICAgICBpZiAoa2V5UHJlc3NQZXJtaXNzaW9uVXRpbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5rZXlQcmVzc1Blcm1pc3Npb25VdGlscyA9IGtleVByZXNzUGVybWlzc2lvblV0aWxzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRTdG9yYWdlKCkgPT09ICdzZXNzaW9uU3RvcmFnZScpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0U3RvcmFnZShzZXNzaW9uU3RvcmFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRTdG9yYWdlKGxvY2FsU3RvcmFnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wcmltZW5nQ29uZmlnLnNldFRyYW5zbGF0aW9uKHtcclxuICAgICAgICAgICAgZGF5TmFtZXM6IFsnQ2jhu6cgbmjhuq10JywgJ1Ro4bupIDInLCAnVGjhu6kgMycsICdUaOG7qSA0JywgJ1Ro4bupIDUnLCAnVGjhu6kgNicsICdUaOG7qSA3J10sXHJcbiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsnQ04nLCAnVGgyJywgJ1RoMycsICdUaDQnLCAnVGg1JywgJ1RoNicsICdUaDcnXSxcclxuICAgICAgICAgICAgZGF5TmFtZXNNaW46IFsnQ04nLCAnVGgyJywgJ1RoMycsICdUaDQnLCAnVGg1JywgJ1RoNicsICdUaDcnXSxcclxuICAgICAgICAgICAgbW9udGhOYW1lczogW1xyXG4gICAgICAgICAgICAgICAgJ1Row6FuZyAxJywgJ1Row6FuZyAyJywgJ1Row6FuZyAzJywgJ1Row6FuZyA0JywgJ1Row6FuZyA1JywgJ1Row6FuZyA2JywgJ1Row6FuZyA3JywgJ1Row6FuZyA4JywgJ1Row6FuZyA5JywgJ1Row6FuZyAxMCcsICdUaMOhbmcgMTEnLCAnVGjDoW5nIDEyJ1xyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsnVDEnLCAnVDInLCAnVDMnLCAnVDQnLCAnVDUnLCAnVDYnLCAnVDcnLCAnVDgnLCAnVDknLCAnVDEwJywgJ1QxMScsICdUMTInXSxcclxuICAgICAgICAgICAgdG9kYXk6ICdIw7RtIG5heScsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbVVpID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEN1c3RvbWl6ZVVpKCk7XHJcbiAgICAgICAgaWYgKGN1c3RvbVVpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbWl6ZVVpU2VydmljZS5zZXRDdXN0b21pemUoY3VzdG9tVWkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmFkZFJvb3RDb250ZXh0KFxyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZSxcclxuICAgICAgICAgICAgX2FjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpdGxlLnNldFRpdGxlKHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRUaXRsZSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ3ZuJyk7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKCd2bicpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRUaW55TWNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuZ2V0Q29uZmlnQXV0aGVuKCk7XHJcbiAgICAgICAgLy8gQ2h1eeG7g24gc2FuZyBzZXNzaW9uIHN0b3JhZ2UsIG7hur91IOG7lW4gdGjDrCB4w7NhIGTDsm5nIG7DoHkgxJFpXHJcbiAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLnNldFN0b3JhZ2UodGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0U3RvcmFnZSgpKTtcclxuICAgICAgICB0aGlzLmluamVjdENvbmZpZyhjZmcpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZpZ3VyZVdpdGhOZXdDb25maWdBcGkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5wZXJzb25hbGl6ZSA9IHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldE9iamVjdEFueSgncGVyc29uYWxpemUnKTtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEucGVyc29uYWxpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5wZXJzb25hbGl6ZSA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UucmVwbGF5U3Vic2NyaWJlKFxyXG4gICAgICAgICAgICBDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0xPQURFRCxcclxuICAgICAgICAgICAgYXN5bmMgcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlLnNldHVwU3luY0NhY2hlRW50aXR5TWV0YWRhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIuY29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gocm91dGUgPT4gdGhpcy5hZGRHdWFyZChyb3V0ZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0VGltZUxvZ2luKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbOG6p24gxJHhuqd1IMSRxINuZyBuaOG6rXAgdGjDrCB2w6BvIHRyYW5nIG3hurdjIMSR4buLbmhcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5yb290VmVyc2lvbkRlcGxveSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCd2ZXJzaW9uRGVwbG95JywgdGhpcy5yb290VmVyc2lvbkRlcGxveSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUaMOqbSB2w6BvIMSR4buDIMSRw6FuaCBk4bqldSBs4bqnbiBk4bqndSBsb2dpbiA9PiDEkeG7gyB44butIGzDvVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZXJBIMSRYWcg4bufIG3DoG4gaMOsbmggMSA9PiDEkcSDbmcgeHXhuqV0ID0+IMSRxINuZyBuaOG6rXAgdsOgbyB0w6BpIGtob+G6o24gVXNlckIga2jDtG5nIGPDsyBxdXnhu4FuIG3DoG4gaMOsbmggMSA9PiByZWRpcmVjdCB24buBIFwiL1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSgnY3VycmVudF91c2VyX2luZm8nKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCdmaXJzdFRpbWVMb2dpbicsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFVybCA9IHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ2N1cnJlbnRVcmwnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFVybCAmJiBvbGRVcmwgIT0gdG9wLmxvY2F0aW9uLmhyZWYgKyAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKCdjdXJyZW50VXJsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5sb2NhdGlvbi5ocmVmID0gYCR7b2xkVXJsfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0VGltZUxvZ2luID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ2N1cnJlbnRVcmwnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmx5U2hvd01haW5Db250ZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZWRpcmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciB2ZXJzaW9uRGVwbG95ID0gdGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgndmVyc2lvbkRlcGxveScpO1xyXG4gICAgICAgICAgICAgICAgLy8gbGV0IHZlcnNpb25Gcm9tQXBwbGljYXRpb24gPSB0aGlzLnJvb3RWZXJzaW9uRGVwbG95O1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHZlcnNpb25Gcm9tQXBwbGljYXRpb24gJiYgdmVyc2lvbkRlcGxveSAmJiAoK3ZlcnNpb25EZXBsb3kpIDwgKCt2ZXJzaW9uRnJvbUFwcGxpY2F0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3ZlcnNpb25EZXBsb3knLCB2ZXJzaW9uRnJvbUFwcGxpY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmxvZ291dCgpO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGlubmVkTm90ZXMoKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2lnbmFsUlNlcnZpY2UuaW5pdCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaWduYWxSU2VydmljZS5zdGFydChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb25zaXN0ZW5jeUh1YicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJvYWRjYXN0TWVzc2FnZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQXV0aG9yaXplQ2FjaGUuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2lnbmFsUlNlcnZpY2Uuc3RhcnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm90aWZpY2F0aW9uSHViJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZWZyZXNoRm9yVXBkYXRlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmFwcENvZGVzICYmIGRhdGEuYXBwQ29kZXMuc29tZSh4ID0+IHgudG9VcHBlckNhc2UoKSA9PSB0aGlzLmFwcENvZGUudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uRk9SQ0VfUkVMT0FEKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVmYXVsdE1vZHVsZVBhZ2VzID0gdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5wZXJzb25hbGl6ZS5kZWZhdWx0TW9kdWxlUGFnZXM7XHJcbiAgICAgICAgaWYgKGRlZmF1bHRNb2R1bGVQYWdlcyAmJiBkZWZhdWx0TW9kdWxlUGFnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRMaXN0QXBwKCkuZm9yRWFjaChhcHAgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IGRlZmF1bHRNb2R1bGVQYWdlcy5maW5kKHAgPT4gcC5jb2RlID09IGFwcC5jb2RlKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYWdlICYmIHBhZ2UuZGVmYXVsdFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcHAudXJsID0gcGFnZS5kZWZhdWx0UGFnZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBIYW1tZXIuZGVmYXVsdHMuY3NzUHJvcHMudXNlclNlbGVjdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZSgnUVVJQ0tfTk9URV9QT1BVUC5DTE9TRV9QT1BVUCcsIHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5lZGl0Rm9ybU1vZGVsLnNob3dRdWlja05vdGVGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZSgnR09fSE9NRScsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycpO1xyXG4gICAgICAgICAgICB0aGlzLm9ubHlTaG93TWFpbkNvbnRlbnQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoJ1RPR0dMRV9MQVlPVVQnLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEub25seVNob3dNYWluQ29udGVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9ubHlTaG93TWFpbkNvbnRlbnQgPSBkYXRhLm9ubHlTaG93TWFpbkNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKCdNQUlOX0NPTlRFTlRfT05MWScsIHJzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbmx5U2hvd01haW5Db250ZW50ID0gcnM7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5TSE9XX1JFSkVDVF9DT05GSVJNLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93UmVqZWN0Q29uZmlybSA9IGRhdGE7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpO1xyXG4gICAgICAgIHRoaXMucm9vdERhdGEgPSByb290LmRhdGE7XHJcbiAgICAgICAgcm9vdC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRPYmplY3RBcHAodGhpcy5hcHBDb2RlKTtcclxuICAgICAgICByb290LmRhdGEuYXBwT3JpZ2luID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEVuYWJsZUJhc2VIcmVmKCkgPyBgLyR7cm9vdC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5jb2RlLnRvTG93ZXJDYXNlKCl9L2AgOiAnLyc7XHJcbiAgICAgICAgcm9vdC5kYXRhLmFsbG93QW5vbnltb3VzID0gdGhpcy5hbGxvd0Fub255bW91cztcclxuICAgICAgICAvLyBnZXQgY3VycmVudCBVc2VyXHJcbiAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UucG9wdWxhdGVDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5ORUVEX0NMRUFSX1BFUk1JU1NJT05fQ0FDSEUsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuY2xlYXJQZXJtaXNzaW9uQ2FjaGVBbGwoKTtcclxuICAgICAgICAgICAgaWYgKCFyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdDw7MgbOG7l2kgdHJvbmcgbMO6YyBjbGVhciBjYWNoZSBwaMOibiBxdXnhu4FuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZmlyZVJlcGxheUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVEKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuS0VZX0RPV05fQVJST1dMRUZULCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5va0J1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5va0J1dHRvbi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuS0VZX0RPV05fQVJST1dSSUdIVCwgKGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuY2FuY2VsQnV0dG9uLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2tCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMub2tCdXR0b24ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5QRVJTT05BTElaRV9VUERBVEVELCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5zaG93UXVpY2tOb3RlQnV0dG9uT25TY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHNlbmQgY3VycmVudCB2ZXJzaW9uIHRvIHRuIGNsaWVudFxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyB0aGlzLl90bkNsaWVudFNlcnZpY2Uuc2VuZENvbW1hbmQoPFRuQ2xpZW50Q29tbWFuZD57XHJcbiAgICAgICAgICAgIC8vICAgICBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUuU3luY1ZlcmlvblRuQ2xpZW50LFxyXG4gICAgICAgICAgICAvLyAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHZlcnNpb246IHRoaXMuZW52aXJvbm1lbnQuc2lnbmFsci52ZXJzaW9uLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIGVuZHBvaW50OiB0aGlzLmVudmlyb25tZW50LmNsaWVudERvbWFpbi5hcHBEb21haW4gKyAnLycgKyB0aGlzLmVudmlyb25tZW50LnNpZ25hbHIuZW5kcG9pbnRVcGRhdGVcclxuICAgICAgICAgICAgLy8gICAgIH0sXHJcbiAgICAgICAgICAgIC8vICAgICBrZXk6IHRoaXMuZW52aXJvbm1lbnQuc2lnbmFsci5jbGllbnRLZXlcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcblxyXG5cclxuICAgICAgICAvLyB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5DTE9TRV9FRElUX0ZPUk0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvd0FkZE5vdGVGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnJlcGxheVN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5RVUlDS19OT1RFX1BJTiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBzZXQgcGlubmVkIG5vdGUgbG9jYXRpb24gYWZ0ZXIgY2xpY2sgcGluXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBpbm5lZE5vdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgncGlubmVkTm90ZXNMb2NhdGlvbicsIHtcclxuICAgICAgICAgICAgICAgICAgICBib3R0b206ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIHJlY3QuaGVpZ2h0KSxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAocmVjdC5sZWZ0KSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWl6ZTogdGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGlubmVkTm90ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5yZXBsYXlTdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuUVVJQ0tfTk9URV9VTlBJTiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBzZXQgcGlubmVkIG5vdGUgbG9jYXRpb24gYWZ0ZXIgY2xpY2sgdXBwaW5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGlubmVkTm90ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCdwaW5uZWROb3Rlc0xvY2F0aW9uJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogKHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wIC0gcmVjdC5oZWlnaHQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IChyZWN0LmxlZnQpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXplOiB0aGlzLnBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQaW5uZWROb3RlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZWRpdEZvcm1Nb2RlbCA9IFtdO1xyXG5cclxuICAgICAgICAvLyBzdWJzY3JpYmUgY2hhbmdlIGVudGl0eSBtZXRhZGF0YVxyXG4gICAgICAgIHRoaXMuX3N0b3JhZ2VVcGRhdGVkU2VydmljZS5zdWJzY3JpYmVDaGFuZ2VkTG9jYWxTdG9yYWdlKCdLRVlfRU5USVRZX01FVERBVEFfVVBEQVRFRCcsIChycykgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZW50aXR5IG1ldGFkYXRhIGNoYW5nZWQnLCBycyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRyaWdnZXIgdXBkYXRlIHN0b3JhZ2Uga2V5XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlNIT1dfV0FJVF9CT1gsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRpbmcgPSBkYXRhLnNob3c7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVdhaXRpbmcgPSBbLi4uZGF0YS5tZXNzYWdlXTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3REYXRhLmh0dHBSZXF1ZXN0TGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIG7hur91IGFsbG93IGFub255bW91cyB0aMOsIGxvYWQgcmEgY8OhYyBwaMOibiBo4buHIGNobyBwaMOpcCB2w6BvIGtow7RuZyBj4bqnbiDEkcSDbmcgbmjhuq1wXHJcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdFRpbWVMb2dpbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ubHlTaG93TWFpbkNvbnRlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcm9vdC5zdWJzY3JpYmUoJ0xPR0lOJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudEFuZFRyeUxvZ2luKCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9vYXV0aFNlcnZpY2UuaGFzVmFsaWRBY2Nlc3NUb2tlbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5pbml0TG9naW5GbG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRGb3JHbG9iYWxUZW1wbGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICAvLyBTZXQgZHluYW1pYyBhbGwgY2hpbGRyZW5cclxuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKHRtcDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0bXAuX2RlZiAmJiB0bXAuX2RlZi5yZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBvbGQgdmVyc2lvbiwgbm90IGl2eVxyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRtcC5fZGVmLnJlZmVyZW5jZXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50U2VydmljZS5zZXRUZW1wbGF0ZShrZXlzWzBdLCB0bXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0bXAuX2RlY2xhcmF0aW9uVENvbnRhaW5lciAmJiB0bXAuX2RlY2xhcmF0aW9uVENvbnRhaW5lci5sb2NhbE5hbWVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IHRtcC5fZGVjbGFyYXRpb25UQ29udGFpbmVyLmxvY2FsTmFtZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5cyAmJiBrZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRTZXJ2aWNlLnNldFRlbXBsYXRlKGtleXNbMF0sIHRtcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9jZC5kZXRhY2goKTtcclxuICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcXVpY2tOb3RlQnRMb2NhdGlvbiA9IHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldE9iamVjdEFueSgncXVpY2tOb3RlQnRMb2NhdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAocXVpY2tOb3RlQnRMb2NhdGlvbiAmJiB0aGlzLnF1aWNrTm90ZUJ0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVpY2tOb3RlQnRMb2NhdGlvbi5ib3R0b20gPCB3aW5kb3cuaW5uZXJIZWlnaHQgLSA1MCAmJiBxdWlja05vdGVCdExvY2F0aW9uLnJpZ2h0IDwgd2luZG93LmlubmVyV2lkdGggLSA1MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5ib3R0b20gPSBxdWlja05vdGVCdExvY2F0aW9uLmJvdHRvbSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gcXVpY2tOb3RlQnRMb2NhdGlvbi5yaWdodCArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5wZXJzb25hbGl6ZS5zaG93UXVpY2tOb3RlQnV0dG9uT25TY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnF1aWNrTm90ZUJ0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5wZXJzb25hbGl6ZS5zaG93UXVpY2tOb3RlQnV0dG9uT25TY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcGlubmVkTm90ZXNMb2NhdGlvbiA9IHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldE9iamVjdEFueSgncGlubmVkTm90ZXNMb2NhdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAocGlubmVkTm90ZXNMb2NhdGlvbiAmJiB0aGlzLnBpbm5lZE5vdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBpbm5lZE5vdGVzTG9jYXRpb24uYm90dG9tIDwgd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC5oZWlnaHQgJiYgcGlubmVkTm90ZXNMb2NhdGlvbi5sZWZ0IDwgd2luZG93LmlubmVyV2lkdGggLSAyNTApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm90dG9tID0gcGlubmVkTm90ZXNMb2NhdGlvbi5ib3R0b20gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZXMubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gcGlubmVkTm90ZXNMb2NhdGlvbi5sZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXMgPSBwaW5uZWROb3Rlc0xvY2F0aW9uLm1pbmltaXplO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGlubmVkTm90ZURhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5waW5uZWROb3RlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3RlRGF0YVtrZXldLnRpdGxlUGFkZGluZ0JvdHRvbSA9ICcwcHgnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3RlRGF0YVtrZXldLmNvbnRlbnREaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBpbm5lZE5vdGVEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0udGl0bGVQYWRkaW5nQm90dG9tID0gJzZweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0uY29udGVudERpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGlubmVkTm90ZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG5cclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCk7XHJcbiAgICAgICAgcm9vdC5yZXBvcnRRdWV1ZSA9IHRoaXMucmVwb3J0UXVldWU7XHJcbiAgICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLl9tZW51U2VydmljZS5nZXRNZW51SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Rm9yR2xvYmFsVGVtcGxhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcgPSBuZXcgQ3J1ZExpc3RTZXR0aW5nKCk7XHJcbiAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcuaXNXb3JrZmxvd1RyZWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlZmF1bHRSZWRpcmVjdCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcHBTZXR0aW5nID0gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRSZWRpcmVjdCA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0UmVkaXJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKCFhcHBTZXR0aW5nICYmIGRlZmF1bHRSZWRpcmVjdCAmJiB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SXNQcm9kdWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJlZGlyZWN0XHJcbiAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhUb0NoZWNrID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEVuYWJsZUJhc2VIcmVmKCkgPyBgLyR7YXBwU2V0dGluZy5jb2RlLnRvTG93ZXJDYXNlKCl9L2AgOiAnLyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGxvY2F0aW9uLnBhdGhuYW1lID09PSAnLycgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICcnIHx8IGxvY2F0aW9uLnBhdGhuYW1lID09PSBwYXRoVG9DaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25seVNob3dNYWluQ29udGVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3VzZXIgbm90IHZhbGlkIHRva2VuJywgdGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJykpO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBOYW1OSCBY4butIGzDvSB04bqhbSBjaG8gdHLGsOG7nW5nIGjhu6NwIMSRxINuZyBuaOG6rXAgbOG6p24gxJHhuqd1IG5oxrBuZyBjaOG6oXkgxJHhur9uIMSRw6J5IG3DoCBhY2Nlc3MgdG9rZW4gduG6q24ga2jDtG5nIGjhu6NwIGzhu4dcclxuICAgICAgICAgICAgLy8gWOG7rSBsw70gdHJp4buHdCDEkeG7gyBi4bqxbmcgY8OhY2ggdMOsbSBQQSBi4bqvdCBldmVudCBj4bunYSBhbmd1bGFyMiBvaWRjIMSR4buDIHjhu60gbMO9IHRyxrDhu5tjIGtoaSDEkeG6v24gYsaw4bubYyBkZWZhdWx0IHJlZGlyZWN0XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG9wLmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGV0ZWN0Q2hhbmdlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5fY2RbJ2Rlc3Ryb3llZCddKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdleGNlcHRpb24gb24gZGV0ZWN0IGNoYW5nZScsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2xlYXJBdXRob3JpemVDYWNoZSgpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhzZXNzaW9uU3RvcmFnZSlcclxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IC9eQVVUSE9SSVpBVElPTi8udGVzdChpdGVtKSlcclxuICAgICAgICAgICAgLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1c1RyYXAoZXZlbnQsIGRpcmVjdCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYgKGRpcmVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLm9rQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFRpbnlNY2UoKSB7XHJcbiAgICAgICAgdGlueW1jZS5iYXNlVVJMID0gJy9hc3NldHMvdmVuZG9yL3RpbnltY2UnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlndXJlV2l0aE5ld0NvbmZpZ0FwaSgpIHtcclxuICAgICAgICAvLyBmb3IgZmlyc3QgbG9naW5cclxuICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UuZXZlbnRzLnN1YnNjcmliZShldnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBldnQudHlwZSA9PSAndG9rZW5fcmVjZWl2ZWQnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFRpbWVMb2dpbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmNsZWFudXBMb2NhbFN0b3JhZ2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UuY2xlYW51cFNlc3Npb25TdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlVXBkYXRlZFNlcnZpY2UuY2xlYW51cFN0b3JhZ2VTZXJ2aWNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5maXJlUmVwbGF5RXZlbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9SRUFEWSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0VGltZUxvZ2luXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChldnQudHlwZSA9PT0gJ3Rva2VuX2V4cGlyZXMnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UudHJ5TG9naW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChldnQudHlwZSA9PT0gJ2xvZ291dCcpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNsZWFudXAgc3RvcmFnZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5jbGVhbnVwTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmNsZWFudXBTZXNzaW9uU3RvcmFnZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVVwZGF0ZWRTZXJ2aWNlLmNsZWFudXBTdG9yYWdlU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLnJldm9rZVRva2VuQW5kTG9nb3V0KG51bGwsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2dC50eXBlID09ICdzZXNzaW9uX3Rlcm1pbmF0ZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKCdjdXJyZW50X3VzZXJfaW5mbycpO1xyXG4gICAgICAgICAgICAgICAgLy8gbG9nb3V0XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmxvZ291dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2dC50eXBlID09ICdkaXNjb3ZlcnlfZG9jdW1lbnRfbG9hZGVkJykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2dC50eXBlID09ICd0b2tlbl9yZWZyZXNoZWQnKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZXZlbnQnLCBldnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnQoKTtcclxuICAgICAgICBpZiAodGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5maXJlUmVwbGF5RXZlbnQoXHJcbiAgICAgICAgICAgICAgICBDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX1JFQURZLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFRpbWVMb2dpblxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLnNldHVwQXV0b21hdGljU2lsZW50UmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRJdGVtKCdjdXJyZW50VXJsJykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ2N1cnJlbnRVcmwnLCB0b3AubG9jYXRpb24uaHJlZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudEFuZFRyeUxvZ2luKCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX29hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHThu5VuZyBo4bujcCBiaeG6v24gcG9zaXRpb25cclxuICAgICAgICBpZiAodGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSgnbXlpdGVtJykpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZmlyZUV2ZW50KCdQT1NJVElPTl9MT0FERUQnLCB0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRJdGVtKCdteWl0ZW0nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBn4buNaSBhcGkgxJHhu4MgdOG7lW5nIGjhu6NwIGThu68gbGl1ZWplLi4uXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmZpcmVFdmVudCgnUE9TSVRJT05fTE9BREVEJywge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluamVjdENvbmZpZyhjZmc6IEF1dGhDb25maWcpIHtcclxuICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UuY29uZmlndXJlKGNmZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb25maWdBdXRoZW4oKSB7XHJcbiAgICAgICAgY29uc3QgY2ZnID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEF1dGhDb25maWcoKTtcclxuICAgICAgICBjb25zdCB0eXBlTG9naW4gPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXV0aGVudGljYXRpb25UeXBlKCk7XHJcbiAgICAgICAgaWYgKHR5cGVMb2dpbiAmJiB0eXBlTG9naW4uaW5jbHVkZXMoJ2ltcGxpY2l0JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNmZztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNmZy5yZXNwb25zZVR5cGUgPSAnY29kZSc7XHJcbiAgICAgICAgICAgIHJldHVybiBjZmc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZU1lbnVBY3RpdmUodG9wKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxCYXJNZW51LnNjcm9sbFRvVG9wKHRvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVpY2tOb3RlRHJvcHBlZChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgncXVpY2tOb3RlQnRMb2NhdGlvbicsIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgYm90dG9tOiAod2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSA1MCksIHJpZ2h0OiAod2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgLSA1MClcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZmxhZ3MucXVpY2tOb3RlTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWlja05vdGVTdGFydGVkKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5xdWlja05vdGVNb3ZpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZVByZXNzKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5xdWlja05vdGVQcmVzc2luZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5xdWlja05vdGVUb2dnbGVTdWJCdXR0b25zKHRydWUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZU9uY2UoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQk9EWV9NT1VTRV9ET1dOLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlVG9nZ2xlU3ViQnV0dG9ucyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVpY2tOb3RlUHJlc3NVcChldmVudCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLmZsYWdzLnF1aWNrTm90ZVByZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWlja05vdGVBZGROb3RlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5xdWlja05vdGVNb3ZpbmdcclxuICAgICAgICAgICAgJiYgIXRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZmxhZ3MucXVpY2tOb3RlUHJlc3NpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWlja05vdGVUb2dnbGVTdWJCdXR0b25zKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5ub3RlRGF0YU1vZGVsID0gPGFueT57XHJcbiAgICAgICAgICAgICAgICBlZGl0Rm9ybU1vZGVsOiA8YW55Pnsgc2hvd1F1aWNrTm90ZUZvcm06IHRydWUsIHBvcHVwU2l6ZTogPGFueT57fSwgZGF0YTogPGFueT57fSB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZWRpdEZvcm1Nb2RlbC5zaG93UXVpY2tOb3RlRm9ybSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZVNob3dBbGxOb3RlcygpIHtcclxuICAgICAgICB0aGlzLnF1aWNrTm90ZVRvZ2dsZVN1YkJ1dHRvbnMoZmFsc2UpO1xyXG4gICAgICAgIHRvcC5sb2NhdGlvbi5ocmVmID0gYCR7dGhpcy5nZXRBcHBTd2l0Y2hlclVybCgndXNlcicpfS9tYWluL3F1aWNrLW5vdGVgO1xyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZVNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICB0aGlzLnF1aWNrTm90ZVRvZ2dsZVN1YkJ1dHRvbnMoZmFsc2UpO1xyXG4gICAgICAgIHRvcC5sb2NhdGlvbi5ocmVmID0gYCR7dGhpcy5nZXRBcHBTd2l0Y2hlclVybCgndXNlcicpfS9tYWluL3BlcnNvbmFsaXplYDtcclxuICAgIH1cclxuXHJcbiAgICBxdWlja05vdGVUb2dnbGVTdWJCdXR0b25zKHNob3cpIHtcclxuICAgICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0MS5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzU1cHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdDIubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICcxMDBweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0MS5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzY1cHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdDIubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICcxMjBweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQxLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSAnNXB4JztcclxuICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdDIubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICc1cHgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQaW5uZWQgTm90ZVxyXG4gICAgZ2V0UGlubmVkTm90ZXMoKSB7XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwaW5uZWROb3Rlc0Ryb3BwZWQoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3Bpbm5lZE5vdGVzTG9jYXRpb24nLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGJvdHRvbTogKHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wIC0gcmVjdC5oZWlnaHQpLFxyXG4gICAgICAgICAgICBsZWZ0OiAocmVjdC5sZWZ0KSxcclxuICAgICAgICAgICAgbWluaW1pemU6IHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1c1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZmxhZ3MucGlubmVkTm90ZXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHBpbm5lZE5vdGVzU3RhcnRlZChldmVudCkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZmxhZ3MucGlubmVkTm90ZXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBpbm5lZE5vdGVzTWluaW1pemUoZGF0YTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1cyA9ICFkYXRhO1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3Bpbm5lZE5vdGVzTG9jYXRpb24nLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGJvdHRvbTogKHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wIC0gcmVjdC5oZWlnaHQpLFxyXG4gICAgICAgICAgICBsZWZ0OiAocmVjdC5sZWZ0KSxcclxuICAgICAgICAgICAgbWluaW1pemU6IHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1c1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGlubmVkTm90ZURhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1cyA9PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5waW5uZWROb3RlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZURhdGFba2V5XS50aXRsZVBhZGRpbmdCb3R0b20gPSAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0uY29udGVudERpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBpbm5lZE5vdGVEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3RlRGF0YVtrZXldLnRpdGxlUGFkZGluZ0JvdHRvbSA9ICc2cHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZURhdGFba2V5XS5jb250ZW50RGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5QaW5Ob3RlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHJvd0RhdGEuaXNQaW5uZWQgPSBmYWxzZTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29tcGxldGVOb3RlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHJvd0RhdGEuaXNDb21wbGV0ZWQgPSB0cnVlO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpbkNvbXBsZXRlTm90ZShyb3dEYXRhOiBhbnkpIHtcclxuICAgICAgICByb3dEYXRhLmlzQ29tcGxldGVkID0gZmFsc2U7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlVGFiV2luZG93KCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjbG9zZVRhYldpbmRvdycpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFwcFN3aXRjaGVyVXJsKGFwcENvZGUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEh0dHBDbGllbnRFbmRwb2ludChhcHBDb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHVzZS1saWZlLWN5Y2xlLWludGVyZmFjZVxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBhbGwgc3Vic2NyaXB0aW9uc1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQoMSk7XHJcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbGwuY29tcGxldGUoKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuREVTVFJPWV9UQVNLX0RFVEFJTF9DT01QT05FTlQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNlYXJjaCBtZW51XHJcbiAgICBvblNlYXJjaE1lbnUoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1lbnVSZXN1bHQgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQucXVlcnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hNZW51UmVzdWx0ID0gdGhpcy5nZXRTZWFyY2hNZW51UmVzdWx0KGV2ZW50LnF1ZXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWFyY2hNZW51UmVzdWx0KGtleXdvcmQpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdyb3VwU2VhcmNoTWVudVJlc3VsdChrZXl3b3JkLCB0aGlzLm1lbnVNb2RlbCwgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZ3JvdXBTZWFyY2hNZW51UmVzdWx0KGtleXdvcmQ6IHN0cmluZywgbGlzdFRvR2V0OiBhbnlbXSwgbGlzdFRvUHVzaDogYW55W10pIHtcclxuICAgICAgICBsaXN0VG9HZXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVncm91cFNlYXJjaE1lbnVSZXN1bHQoa2V5d29yZCwgaXRlbS5pdGVtcywgbGlzdFRvUHVzaCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoKHRoaXMubm9uQWNjZW50VmlldG5hbWVzZShpdGVtLmxhYmVsKS5pbmRleE9mKHRoaXMubm9uQWNjZW50VmlldG5hbWVzZShrZXl3b3JkKSkgPj0gMCkpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RUb1B1c2gucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBub25BY2NlbnRWaWV0bmFtZXNlKHN0cikge1xyXG4gICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIC8vICAgICBXZSBjYW4gYWxzbyB1c2UgdGhpcyBpbnN0ZWFkIG9mIGZyb20gbGluZSAxMSB0byBsaW5lIDE3XHJcbiAgICAgICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMEUwfFxcdTAwRTF8XFx1MUVBMXxcXHUxRUEzfFxcdTAwRTN8XFx1MDBFMnxcXHUxRUE3fFxcdTFFQTV8XFx1MUVBRHxcXHUxRUE5fFxcdTFFQUJ8XFx1MDEwM3xcXHUxRUIxfFxcdTFFQUZ8XFx1MUVCN3xcXHUxRUIzfFxcdTFFQjUvZywgXCJhXCIpO1xyXG4gICAgICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDBFOHxcXHUwMEU5fFxcdTFFQjl8XFx1MUVCQnxcXHUxRUJEfFxcdTAwRUF8XFx1MUVDMXxcXHUxRUJGfFxcdTFFQzd8XFx1MUVDM3xcXHUxRUM1L2csIFwiZVwiKTtcclxuICAgICAgICAvLyAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAwRUN8XFx1MDBFRHxcXHUxRUNCfFxcdTFFQzl8XFx1MDEyOS9nLCBcImlcIik7XHJcbiAgICAgICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMEYyfFxcdTAwRjN8XFx1MUVDRHxcXHUxRUNGfFxcdTAwRjV8XFx1MDBGNHxcXHUxRUQzfFxcdTFFRDF8XFx1MUVEOXxcXHUxRUQ1fFxcdTFFRDd8XFx1MDFBMXxcXHUxRUREfFxcdTFFREJ8XFx1MUVFM3xcXHUxRURGfFxcdTFFRTEvZywgXCJvXCIpO1xyXG4gICAgICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDBGOXxcXHUwMEZBfFxcdTFFRTV8XFx1MUVFN3xcXHUwMTY5fFxcdTAxQjB8XFx1MUVFQnxcXHUxRUU5fFxcdTFFRjF8XFx1MUVFRHxcXHUxRUVGL2csIFwidVwiKTtcclxuICAgICAgICAvLyAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTFFRjN8XFx1MDBGRHxcXHUxRUY1fFxcdTFFRjd8XFx1MUVGOS9nLCBcInlcIik7XHJcbiAgICAgICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMTExL2csIFwiZFwiKTtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvw6B8w6F84bqhfOG6o3zDo3zDonzhuqd84bqlfOG6rXzhuql84bqrfMSDfOG6sXzhuq984bq3fOG6s3zhurUvZywgJ2EnKTtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvw6h8w6l84bq5fOG6u3zhur18w6p84buBfOG6v3zhu4d84buDfOG7hS9nLCAnZScpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/DrHzDrXzhu4t84buJfMSpL2csICdpJyk7XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL8OyfMOzfOG7jXzhu498w7V8w7R84buTfOG7kXzhu5l84buVfOG7l3zGoXzhu5184bubfOG7o3zhu5984buhL2csICdvJyk7XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL8O5fMO6fOG7pXzhu6d8xal8xrB84burfOG7qXzhu7F84butfOG7ry9nLCAndScpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/hu7N8w7184bu1fOG7t3zhu7kvZywgJ3knKTtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvxJEvZywgJ2QnKTtcclxuICAgICAgICAvLyBTb21lIHN5c3RlbSBlbmNvZGUgdmlldG5hbWVzZSBjb21iaW5pbmcgYWNjZW50IGFzIGluZGl2aWR1YWwgdXRmLTggY2hhcmFjdGVyc1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMzAwfFxcdTAzMDF8XFx1MDMwM3xcXHUwMzA5fFxcdTAzMjMvZywgJycpOyAvLyBIdXnhu4FuIHPhuq9jIGjhu49pIG5nw6MgbuG6t25nXHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAyQzZ8XFx1MDMwNnxcXHUwMzFCL2csICcnKTsgLy8gw4IsIMOKLCDEgiwgxqAsIMavXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdE1lbnVTdWdnZXN0aW9uKG1lbnVJdGVtT2JqKSB7XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwobWVudUl0ZW1PYmoucm91dGVyTGluayk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hNZW51SW5wdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5zaG93UGlubmVkTWVudSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmx1clNlYXJjaE1lbnVJbnB1dChldmVudCkge1xyXG4gICAgICAgIHRoaXMuaXNTZWFyY2hNZW51SW5wdXRGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5QaW5uZWRNZW51KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VhcmNoTWVudUlucHV0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5zaG93UGlubmVkTWVudSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9jdXNTZWFyY2hNZW51SW5wdXQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmlzU2VhcmNoTWVudUlucHV0Rm9jdXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd1Bpbm5lZE1lbnUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXByZXNzJywgWyckZXZlbnQnXSlcclxuICAgIGhhbmRsZVNob3dQb3B1cFBlcm1pc3Npb25VdGlscyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmtleVByZXNzUGVybWlzc2lvblV0aWxzW3RoaXMuY3VycmVudEtleVByZXNzSW5kZXhdID09PSBldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEtleVByZXNzSW5kZXggPT0gdGhpcy5rZXlQcmVzc1Blcm1pc3Npb25VdGlscy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRLZXlQcmVzc0luZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERhdGEuc2hvd1Blcm1pc3Npb25VdGlscyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50S2V5UHJlc3NJbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRLZXlQcmVzc0luZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRHdWFyZChyb3V0ZTogUm91dGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAocm91dGUucGF0aCA9PT0gJycgfHwgcm91dGUucGF0aCA9PT0gJy8nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyb3V0ZS5sb2FkQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlLmNhbkFjdGl2YXRlQ2hpbGQgPSByb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkID8gcm91dGUuY2FuQWN0aXZhdGVDaGlsZCA6IFtHZW5lcmljR3VhcmRDaGlsZFNlcnZpY2VdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcm91dGUuY2FuQWN0aXZhdGUgPSByb3V0ZS5jYW5BY3RpdmF0ZSA/IHJvdXRlLmNhbkFjdGl2YXRlIDogW0dlbmVyaWNHdWFyZFNlcnZpY2VdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJwYWdlTG9hZGVkXCIgW3N0eWxlLmRpc3BsYXldPVwicGFnZUxvYWRlZCA/ICcnIDogJ25vbmUnXCIgY2xhc3M9XCJsYXlvdXQtd3JhcHBlclwiXHJcbiAgICAoY2xpY2spPVwiX2NvbW1vblNlcnZpY2Uub25MYXlvdXRDbGljaygpXCIgW25nQ2xhc3NdPVwieydtZW51LWxheW91dC1zdGF0aWMnOiAhX2NvbW1vblNlcnZpY2UuaXNPdmVybGF5KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVudS1sYXlvdXQtb3ZlcmxheSc6IF9jb21tb25TZXJ2aWNlLmlzT3ZlcmxheSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xheW91dC1tZW51LW92ZXJsYXktYWN0aXZlJzogX2NvbW1vblNlcnZpY2Uub3ZlcmxheU1lbnVBY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVudS1sYXlvdXQtaG9yaXpvbnRhbCc6IF9jb21tb25TZXJ2aWNlLmlzSG9yaXpvbnRhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lbnUtbGF5b3V0LXNsaW0nOiBfY29tbW9uU2VydmljZS5pc1NsaW0oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXlvdXQtbWVudS1zdGF0aWMtZGVza3RvcC1pbmFjdGl2ZSc6IF9jb21tb25TZXJ2aWNlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF5b3V0LW1lbnUtc3RhdGljLWRlc2t0b3AtYWN0aXZlJzogIV9jb21tb25TZXJ2aWNlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF5b3V0LW1lbnUtc3RhdGljLW1vYmlsZS1pbmFjdGl2ZSc6ICFfY29tbW9uU2VydmljZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xheW91dC1tZW51LXN0YXRpYy1tb2JpbGUtYWN0aXZlJzogX2NvbW1vblNlcnZpY2Uuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXlvdXQtbWVudS1zdGF0aWMtaW5hY3RpdmUnOiBfY29tbW9uU2VydmljZS5zdGF0aWNNZW51RGVza3RvcEluYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xheW91dC1tZW51LXN0YXRpYy1hY3RpdmUnOiBfY29tbW9uU2VydmljZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlfVwiPlxyXG5cclxuICAgIDxhcHAtdG9wYmFyICpuZ0lmPVwiX2dsb2JhbFNlcnZpY2UuZ2V0SGVhZGVyU3RhdGUoKVwiPjwvYXBwLXRvcGJhcj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiX2dsb2JhbFNlcnZpY2UuZ2V0TWVudVN0YXRlKClcIiBjbGFzcz1cImxheW91dC1tZW51LWNvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydsYXlvdXQtbWVudS1kYXJrJzpfY29tbW9uU2VydmljZS5kYXJrTWVudX1cIiAoY2xpY2spPVwiX2NvbW1vblNlcnZpY2Uub25NZW51Q2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgIDxhcHAtcm9vdC1tZW51PjwvYXBwLXJvb3QtbWVudT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LW1lbnUtYmxvY2tcIj5cclxuICAgICAgICAgICAgPHRuLWN1c3RvbS1zY3JvbGxiYXIgI3Njcm9sbGJhciBbc3R5bGVdPVwieydwYWRkaW5nLXRvcCc6ICcxNnB4J31cIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtaW5saW5lLXByb2ZpbGUgKm5nSWY9XCJfY29tbW9uU2VydmljZS5wcm9maWxlTW9kZSA9PSAnaW5saW5lJyAmJiFfY29tbW9uU2VydmljZS5pc0hvcml6b250YWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtaW5saW5lLXByb2ZpbGU+XHJcbiAgICAgICAgICAgICAgICA8YXBwLW1lbnUgW2F1dG9SZW5kZXJNZW51XT1cImF1dG9SZW5kZXJNZW51XCIgW3Jlc2V0XT1cIl9jb21tb25TZXJ2aWNlLnJlc2V0TWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uTWVudUFjdGl2ZSk9XCJoYW5kbGVNZW51QWN0aXZlKCRldmVudClcIj48L2FwcC1tZW51PlxyXG4gICAgICAgICAgICA8L3RuLWN1c3RvbS1zY3JvbGxiYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hcmVhIGxheW91dC1tZW51LXNlYXJjaC1hcmVhXCI+XHJcbiAgICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSBbKG5nTW9kZWwpXT1cInNlYXJjaE1lbnVJbnB1dFwiIFtzdHlsZV09XCJ7J3dpZHRoJzonMTAwJSd9XCIgW3N1Z2dlc3Rpb25zXT1cInNlYXJjaE1lbnVSZXN1bHRcIlxyXG4gICAgICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cIm9uU2VhcmNoTWVudSgkZXZlbnQpXCIgW2F1dG9IaWdobGlnaHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1TDrG0ga2nhur9tIGNo4bupYyBuxINuZycgfCB0cmFuc2xhdGVcIiBbZGVsYXldPVwiMjAwXCIgW3Njcm9sbEhlaWdodF09XCInNDAwcHgnXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgW3JlYWRvbmx5XT1cIiEobWVudU1vZGVsICYmIG1lbnVNb2RlbC5sZW5ndGgpXCJcclxuICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJvblNlbGVjdE1lbnVTdWdnZXN0aW9uKCRldmVudClcIiBmaWVsZD1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaW5uZXJIVE1MPVwie3sgaXRlbS5sYWJlbCB8IGhpZ2hsaWdodCA6IHNlYXJjaE1lbnVJbnB1dH19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tc2VhcmNoXCI+PGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBbY2xhc3NdPVwiJ2xheW91dC1tYWluJ1wiIFtuZ0NsYXNzXT1cInsnbm8taGVhZGVyJzogX2dsb2JhbFNlcnZpY2UuZ2V0SGVhZGVyU3RhdGUoKSA/IGZhbHNlIDogdHJ1ZX1cIj5cclxuICAgICAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LW1hc2tcIj48L2Rpdj5cclxuICAgIDxkaXYgI3F1aWNrTm90ZUJ0ICpuZ0lmPVwiIW9ubHlTaG93TWFpbkNvbnRlbnQgJiYgc2hvd1F1aWNrTm90ZVwiIGNsYXNzPVwicXVpY2stbm90ZS1idXR0b24taG9sZGVyXCIgY2RrRHJhZ1xyXG4gICAgICAgIGNka0RyYWdCb3VuZGFyeT1cIi5sYXlvdXQtd3JhcHBlclwiIG9uY29udGV4dG1lbnU9XCJyZXR1cm4gZmFsc2VcIiAoY2RrRHJhZ0VuZGVkKT1cInF1aWNrTm90ZURyb3BwZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cInF1aWNrTm90ZVN0YXJ0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxhICNxdWlja05vdGVCdDEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYWxsLW5vdGUtYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cInF1aWNrTm90ZVNob3dBbGxOb3RlcygpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXN0aWNreS1ub3RlXCI+PC9pPjwvYT5cclxuICAgICAgICA8YSAjcXVpY2tOb3RlQnQyIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cInNldHRpbmctbm90ZS1idXR0b25cIiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwicXVpY2tOb3RlU2hvd1NldHRpbmdzKClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY29nXCI+PC9pPjwvYT5cclxuICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgKHByZXNzKT1cInF1aWNrTm90ZVByZXNzKCRldmVudClcIiAocHJlc3N1cCk9XCJxdWlja05vdGVQcmVzc1VwKCRldmVudClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInF1aWNrLW5vdGUtYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cInF1aWNrTm90ZUFkZE5vdGUoKVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPjwvYT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAjcGlubmVkTm90ZXMgKm5nSWY9XCIhb25seVNob3dNYWluQ29udGVudFwiIGNsYXNzPVwicGlubmVkLW5vdGVzLWhvbGRlclwiIGNka0RyYWcgY2RrRHJhZ0JvdW5kYXJ5PVwiLmxheW91dC13cmFwcGVyXCJcclxuICAgICAgICBvbmNvbnRleHRtZW51PVwicmV0dXJuIGZhbHNlXCIgKGNka0RyYWdFbmRlZCk9XCJwaW5uZWROb3Rlc0Ryb3BwZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cInBpbm5lZE5vdGVzU3RhcnRlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBpbm5lZC1ub3RlcyB1aS1nXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwaW5uZWROb3Rlc01pbmltaXplU3RhdHVzXCIgY2xhc3M9XCJwaW5uZWQtbm90ZXMtbWluaW1pemUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwaW5uZWROb3Rlc01pbmltaXplKHBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXMpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXdpbmRvdy1tYXhpbWl6ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwaW5uZWROb3Rlc01heGltaXplU3RhdHVzXCIgY2xhc3M9XCIgcGlubmVkLW5vdGVzLW1pbmltaXplLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlubmVkTm90ZXNNaW5pbWl6ZShwaW5uZWROb3Rlc01pbmltaXplU3RhdHVzKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS13aW5kb3ctbWluaW1pemVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBub3RlIG9mIHBpbm5lZE5vdGVEYXRhXCIgY2xhc3M9XCJwaW5uZWQtbm90ZSB1aS1nLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlubmVkLW5vdGUtaGVhZGVyLWxpbmVcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJub3RlLmNvbG9yQ29kZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlubmVkLW5vdGUtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlubmVkLW5vdGUtbGluZS10aXRsZVwiIFtzdHlsZS5wYWRkaW5nQm90dG9tXT1cIm5vdGUudGl0bGVQYWRkaW5nQm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaW5uZWQtbm90ZS1oZWFkZXItcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlubmVkLW5vdGUtaGVhZGVyLXRpbWVcIj57e25vdGUuY3JlYXRlZCB8IGRhdGU6ICdkZC9NTSd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2xheW91dC9pbWFnZXMvaWNvL3VucGluLTEuaWNvXCIgY2xhc3M9XCJwaW5uZWQtbm90ZS1oZWFkZXItYnV0dG9uLXVucGluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5QaW5Ob3RlKG5vdGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFub3RlLmlzQ29tcGxldGVkXCIgY2xhc3M9XCJmYXIgZmEtZmxhZyBwaW5uZWQtbm90ZS1oZWFkZXItYnV0dG9uLWNvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29tcGxldGVOb3RlKG5vdGUpXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJub3RlLmlzQ29tcGxldGVkXCIgY2xhc3M9XCJmYXMgZmEtZmxhZy1jaGVja2VyZWQgcGlubmVkLW5vdGUtaGVhZGVyLWJ1dHRvbi1jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluQ29tcGxldGVOb3RlKG5vdGUpXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e25vdGUubmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaW5uZWQtbm90ZS1jb250ZW50c1wiIFtzdHlsZS5kaXNwbGF5XT1cIm5vdGUuY29udGVudERpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGNvbnRlbnQgb2Ygbm90ZS5jb250ZW50c1wiIGNsYXNzPVwicGlubmVkLW5vdGUtbGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHJlcG9ydC1xdWV1ZSBbaGVhZGVyXT1cIidYdeG6pXQgZOG7ryBsaeG7h3UnXCI+XHJcbiAgICA8L3JlcG9ydC1xdWV1ZT5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJ3YWl0aW5nLWJveFwiIFtjbGFzcy5zaG93XT1cIndhaXRpbmdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1sb2FkaW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxkcy1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHggb2YgbWVzc2FnZVdhaXRpbmdcIj57e3h9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPHAtdG9hc3QgW3Bvc2l0aW9uXT1cIid0b3AtcmlnaHQnXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiPjwvcC10b2FzdD5cclxuPHAtY29uZmlybURpYWxvZyAjY2QgW2Nsb3NhYmxlXT1cImZhbHNlXCI+XHJcbiAgICA8cC1mb290ZXI+XHJcbiAgICAgICAgPGJ1dHRvbiAjb2tCdXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLWNoZWNrXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBsYWJlbD1cIsSQ4buTbmcgw71cIlxyXG4gICAgICAgICAgICAoa2V5ZG93bi5zaGlmdC50YWIpPVwiZm9jdXNUcmFwKCRldmVudCwgZmFsc2UpXCIgKGNsaWNrKT1cImNkLmFjY2VwdCgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dSZWplY3RDb25maXJtXCIgI2NhbmNlbEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIiBpY29uPVwicGkgcGktdGltZXNcIiBsYWJlbD1cIkLhu48gcXVhXCJcclxuICAgICAgICAgICAgKGtleWRvd24udGFiKT1cImZvY3VzVHJhcCgkZXZlbnQsIHRydWUpXCIgKGNsaWNrKT1cImNkLnJlamVjdCgpXCI+PC9idXR0b24+XHJcbiAgICA8L3AtZm9vdGVyPlxyXG48L3AtY29uZmlybURpYWxvZz5cclxuPCEtLSA8dXNlci1hY3Rpb24tbWFuYWdlcj48L3VzZXItYWN0aW9uLW1hbmFnZXI+IC0tPlxyXG48cGVybWlzc2lvbi11dGlscyAqbmdJZj1cInJvb3REYXRhLnNob3dQZXJtaXNzaW9uVXRpbHNcIj48L3Blcm1pc3Npb24tdXRpbHM+XHJcbjxuZy10ZW1wbGF0ZSAjcXVlcnlCdWlsZGVyVXNlclBpY2tlciBsZXQtY29udHJvbCBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiIGxldC1xdWVyeT1cInF1ZXJ5XCIgbGV0LW11bHRpcGxlPVwibXVsdGlwbGVcIj5cclxuICAgIDx1c2VyLXBpY2tlciBbY29udHJvbF09XCJjb250cm9sXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW211bHRpcGxlXT1cImNvbnRyb2wubXVsdGlwbGVcIiBbKG5nTW9kZWwpXT1cInF1ZXJ5LnZhbHVlXCI+XHJcbiAgICA8L3VzZXItcGlja2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3F1ZXJ5QnVpbGRlckNvQ2F1UGlja2VyIGxldC1jb250cm9sIGxldC1kaXNhYmxlZD1cImRpc2FibGVkXCIgbGV0LXF1ZXJ5PVwicXVlcnlcIiBsZXQtbXVsdGlwbGU9XCJtdWx0aXBsZVwiPlxyXG4gICAgPGNvY2F1dG9jaHVjLXBpY2tlci1saXN0IFtjb250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbKG5nTW9kZWwpXT1cInF1ZXJ5LnZhbHVlXCI+XHJcbiAgICA8L2NvY2F1dG9jaHVjLXBpY2tlci1saXN0PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3F1ZXJ5QnVpbGRlckF1dG9jb21wbGV0ZVBpY2tlciBsZXQtY29udHJvbCBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiIGxldC1xdWVyeT1cInF1ZXJ5XCI+XHJcbiAgICA8YXV0b2NvbXBsZXRlLXBpY2tlciAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwdXNlcidcIiBbY29udHJvbF09XCJjb250cm9sXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInF1ZXJ5LnZhbHVlXCI+XHJcbiAgICA8L2F1dG9jb21wbGV0ZS1waWNrZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2xpc3RDb25nVmllY0NvbiBsZXQtZm9ybVN0YXRlPVwiZm9ybVN0YXRlXCIgbGV0LWxvYWlEYW5oU2FjaD1cImxvYWlEYW5oU2FjaFwiIGxldC1pZENvbmdWaWVjPVwiaWRDb25nVmllY1wiPlxyXG4gICAgPGJhc2UtY29uZ3ZpZWMgW2xvYWREZXRhaWxGcm9tUXVlcnlQYXJhbV09XCJmYWxzZVwiIFtpc0NoaWxkVmlld109XCJ0cnVlXCIgW2Zvcm1TdGF0ZV09XCJmb3JtU3RhdGVcIlxyXG4gICAgICAgIFtsb2FpRGFuaFNhY2hdPVwibG9haURhbmhTYWNoXCIgW2lkQ29uZ1ZpZWNdPVwiaWRDb25nVmllY1wiPlxyXG4gICAgPC9iYXNlLWNvbmd2aWVjPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFNldHRpbmdSb3cgbGV0LWVudGl0eU1ldGFkYXRhU2VydmljZT1cImVudGl0eU1ldGFkYXRhU2VydmljZVwiIGxldC1wYXJlbnRDb250ZXh0PVwicGFyZW50Q29udGV4dFwiXHJcbiAgICBsZXQtcGFyZW50U2V0dGluZz1cInBhcmVudFNldHRpbmdcIiBsZXQtcGFyZW50TW9kZWw9XCJwYXJlbnRNb2RlbFwiIGxldC1vblNhdmU9XCJvblNhdmVcIiBsZXQtb25DYW5jZWw9XCJvbkNhbmNlbFwiPlxyXG4gICAgPHNldHRpbmdzLXJvdyBbZW50aXR5TWV0YWRhdGFTZXJ2aWNlXT1cImVudGl0eU1ldGFkYXRhU2VydmljZVwiIFtwYXJlbnRDb250ZXh0XT1cInBhcmVudENvbnRleHRcIlxyXG4gICAgICAgIFtwYXJlbnRTZXR0aW5nXT1cInBhcmVudFNldHRpbmdcIiBbcGFyZW50TW9kZWxdPVwicGFyZW50TW9kZWxcIiAob25TYXZlKT1cIm9uU2F2ZSgkZXZlbnQpXCIgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8L3NldHRpbmdzLXJvdz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFNldHRpbmcgbGV0LWVudGl0eU1ldGFkYXRhU2VydmljZT1cImVudGl0eU1ldGFkYXRhU2VydmljZVwiIGxldC1wYXJlbnRDb250ZXh0PVwicGFyZW50Q29udGV4dFwiXHJcbiAgICBsZXQtcGFyZW50U2V0dGluZz1cInBhcmVudFNldHRpbmdcIiBsZXQtcGFyZW50TW9kZWw9XCJwYXJlbnRNb2RlbFwiIGxldC1vblNhdmU9XCJvblNhdmVcIiBsZXQtb25DYW5jZWw9XCJvbkNhbmNlbFwiPlxyXG4gICAgPHNldHRpbmdzIFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwicGFyZW50Q29udGV4dFwiXHJcbiAgICAgICAgW3BhcmVudFNldHRpbmddPVwicGFyZW50U2V0dGluZ1wiIFtwYXJlbnRNb2RlbF09XCJwYXJlbnRNb2RlbFwiIChvblNhdmUpPVwib25TYXZlKCRldmVudClcIiAob25DYW5jZWwpPVwib25DYW5jZWxcIj5cclxuICAgIDwvc2V0dGluZ3M+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RBZHZhbmNlU2VhcmNoIGxldC1wYXJlbnRTZXR0aW5nPVwicGFyZW50U2V0dGluZ1wiIGxldC1zZWFyY2hJbmZvPVwic2VhcmNoSW5mb1wiIGxldC1sb2FkaW5nPVwibG9hZGluZ1wiXHJcbiAgICBsZXQtb25TZWFyY2g9XCJvblNlYXJjaFwiIGxldC1vbkluaXQ9XCJvbkluaXRcIj5cclxuICAgIDxhZHZhbmNlLXNlYXJjaCBbcGFyZW50U2V0dGluZ109XCJwYXJlbnRTZXR0aW5nXCIgW3NlYXJjaEluZm9dPVwic2VhcmNoSW5mb1wiIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIChvblNlYXJjaCk9XCJvblNlYXJjaCgkZXZlbnQpXCIgKG9uSW5pdCk9XCJvbkluaXQoJGV2ZW50KVwiPlxyXG4gICAgPC9hZHZhbmNlLXNlYXJjaD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFdvcmtmbG93U2V0dGluZyBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiIGxldC1wYXJlbnRTZXR0aW5nPVwicGFyZW50U2V0dGluZ1wiXHJcbiAgICBsZXQtb25TYXZlZD1cIm9uU2F2ZWRcIj5cclxuICAgIDx3b3JrZmxvdy1zZXR0aW5nLW5ldyAjZm9ybUJhc2UgW3BhcmVudFNldHRpbmddPVwicGFyZW50U2V0dGluZ1wiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJkaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZSA9ICRldmVudC5idXR0b25UZW1wbGF0ZVwiIChvblNhdmVkKT1cIm9uU2F2ZWRcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC93b3JrZmxvdy1zZXR0aW5nLW5ldz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFdvcmtmbG93SGlzdG9yeSBsZXQtaXRlbSBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiPlxyXG4gICAgPHdvcmtmbG93LWhpc3RvcnktbmV3ICNmb3JtQmFzZSBbYnVzaW5lc3NTZXR0aW5nXT1cImRpYWxvZ01vZGVsLmRhdGEuc2V0dGluZ1wiXHJcbiAgICAgICAgW3RhYmxlTmFtZV09XCJkaWFsb2dNb2RlbC5kYXRhLnRhYmxlTmFtZVwiIFtpdGVtXT1cIml0ZW1cIiBbd29ya2Zsb3dTZXR0aW5nXT1cImRpYWxvZ01vZGVsLmRhdGEud29ya2Zsb3dTZXR0aW5nXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvd29ya2Zsb3ctaGlzdG9yeS1uZXc+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RTdGFydFdvcmtmbG93IGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCIgbGV0LW9uU2F2ZWQ9XCJvblNhdmVkXCI+XHJcbiAgICA8c3RhcnQtd29ya2Zsb3cgI2Zvcm1CYXNlIFt3b3JrZmxvd3NdPVwiZGlhbG9nTW9kZWwuZGF0YS53b3JrZmxvd3NcIlxyXG4gICAgICAgIFtkZWZhdWx0V29ya2Zsb3ddPVwiZGlhbG9nTW9kZWwuZGF0YS5kZWZhdWx0V29ya2Zsb3dcIlxyXG4gICAgICAgIChvbkluaXQpPVwiZGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGUgPSAkZXZlbnQuYnV0dG9uVGVtcGxhdGVcIiAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIlxyXG4gICAgICAgIChvblNhdmVkKT1cIm9uU2F2ZWRcIj5cclxuICAgIDwvc3RhcnQtd29ya2Zsb3c+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RDaG9ZS2llbiBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiPlxyXG4gICAgPGNoby15LWtpZW4tZm9ybSAjZm9ybUJhc2UgW2J1c3NpbmVzc1NldHRpbmddPVwiZGlhbG9nTW9kZWwuZGF0YS5zZXR0aW5nXCIgW3Jvd0l0ZW1dPVwiZGlhbG9nTW9kZWwuZGF0YS5yb3dEYXRhXCJcclxuICAgICAgICAob25Jbml0KT1cImRpYWxvZ01vZGVsLmJ1dHRvblRlbXBsYXRlID0gJGV2ZW50LmJ1dHRvblRlbXBsYXRlXCIgKG9uU2F2ZWQpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC9jaG8teS1raWVuLWZvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RQcm9jZXNzV29ya2Zsb3cgbGV0LWl0ZW0gbGV0LWRpYWxvZ01vZGVsPVwiZGlhbG9nTW9kZWxcIiBsZXQtb25TYXZlZD1cIm9uU2F2ZWRcIj5cclxuICAgIDxwcm9jZXNzLXdvcmtmbG93LWZvcm0gI2Zvcm1CYXNlIFtidXNpbmVzc1NldHRpbmddPVwiZGlhbG9nTW9kZWwuZGF0YS5zZXR0aW5nXCIgW2l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgW3dvcmtmbG93XT1cImRpYWxvZ01vZGVsLmRhdGEud29ya2Zsb3dcIiBbYWN0aW9uXT1cImRpYWxvZ01vZGVsLmRhdGEuYWN0aW9uXCIgKG9uU2F2ZWQpPVwib25TYXZlZFwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3Byb2Nlc3Mtd29ya2Zsb3ctZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdENvbmdWaWVjIGxldC1iYXNlU2VydmljZT1cImJhc2VTZXJ2aWNlXCIgbGV0LWl0ZW1JZEF0dGFjaD1cIml0ZW1JZEF0dGFjaFwiPlxyXG4gICAgPGJhc2UtY29uZ3ZpZWMgW3NlcnZpY2VDb2RlXT1cImJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlXCIgW2VudGl0eV09XCJiYXNlU2VydmljZS5lbnRpdHlOYW1lXCJcclxuICAgICAgICBbaXRlbUlkQXR0YWNoXT1cIml0ZW1JZEF0dGFjaFwiPjwvYmFzZS1jb25ndmllYz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdEZvcm1Db25nVmllYyBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiIGxldC1pc0Zvcm1WaWV3PVwiaXNGb3JtVmlld1wiIGxldC1nZXREYXRhPVwiZ2V0RGF0YVwiPlxyXG4gICAgPGJhc2UtY29uZ3ZpZWMtZm9ybSAjZm9ybUJhc2UgW3BhcmVudFNldHRpbmddPVwiZGlhbG9nTW9kZWwuZGF0YS5jb25nVmllY1NldHRpbmdcIlxyXG4gICAgICAgIFttb2RlbF09XCJkaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbFwiIFtmb3JjZU9ubHlWaWV3XT1cImlzRm9ybVZpZXdcIlxyXG4gICAgICAgIChvbkluaXQpPVwiZGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGUgPSAkZXZlbnQuYnV0dG9uVGVtcGxhdGVcIlxyXG4gICAgICAgIChvblNhdmVkKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlOyBnZXREYXRhKClcIiAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvYmFzZS1jb25ndmllYy1mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0UGVybWlzc2lvblNoYXJpbmcgbGV0LWl0ZW0gbGV0LWJhc2VTZXJ2aWNlPVwiYmFzZVNlcnZpY2VcIiBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiPlxyXG4gICAgPHBlcm1pc3Npb24tc2hhcmluZyAjZm9ybUJhc2UgW2l0ZW1dPVwiaXRlbVwiIFtiYXNlU2VydmljZV09XCJiYXNlU2VydmljZVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3Blcm1pc3Npb24tc2hhcmluZz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFdvcmtmbG93UGVybWlzc2lvbiBsZXQtaXRlbSBsZXQtYnVzaW5lc3NTZXR0aW5nPVwiYnVzaW5lc3NTZXR0aW5nXCIgbGV0LWRpYWxvZ01vZGVsPVwiZGlhbG9nTW9kZWxcIj5cclxuICAgIDx3b3JrZmxvdy1wZXJtaXNzaW9uICNmb3JtQmFzZSBbaXRlbV09XCJpdGVtXCIgW2J1c2luZXNzU2V0dGluZ109XCJidXNpbmVzc1NldHRpbmdcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC93b3JrZmxvdy1wZXJtaXNzaW9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0U2hhcmVMaW5rQnlQZXJtaXNzaW9uIGxldC1zZXR0aW5nPVwic2V0dGluZ1wiIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCI+XHJcbiAgICA8c2hhcmUtbGluay1ieS1wZXJtaXNzaW9uICNmb3JtQmFzZSBbc2V0dGluZ109XCJzZXR0aW5nXCIgW2xzdEl0ZW1dPVwiZGlhbG9nTW9kZWwuZGF0YS5sc3RJdGVtXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvc2hhcmUtbGluay1ieS1wZXJtaXNzaW9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0RmlsZVVwbG9hZENvbHVtbiBsZXQtcm93RGF0YSBsZXQtcGFyZW50Q29udGV4dD1cInBhcmVudENvbnRleHRcIiBsZXQtZmllbGQ9XCJmaWVsZFwiXHJcbiAgICBsZXQtZmlsZVNldHRpbmc9XCJmaWxlU2V0dGluZ1wiPlxyXG4gICAgPGZpbGUtdXBsb2FkICpuZ0lmPVwiZmlsZVNldHRpbmcubW9kZSA9PSBmaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkXCJcclxuICAgICAgICBbc2hhcmVkRm9sZGVyVHlwZV09XCJmaWxlU2V0dGluZy5jb250cm9sLnNoYXJlZEZvbGRlclR5cGVcIiBbcmVhZG9ubHldPVwiZmlsZVNldHRpbmcuY29udHJvbC5yZWFkb25seVwiXHJcbiAgICAgICAgW2FjY2VwdF09XCJmaWxlU2V0dGluZy5jb250cm9sLmFjY2VwdFwiIFsobmdNb2RlbCldPVwicm93RGF0YVtmaWVsZF1cIj5cclxuICAgIDwvZmlsZS11cGxvYWQ+XHJcbiAgICA8c2VydmljZS1maWxlLXVwbG9hZCAqbmdJZj1cImZpbGVTZXR0aW5nLmNvbnRyb2wubW9kZSA9PSBmaWxlVXBsb2FkTW9kZS51c2luZ1NlcnZpY2VGaWxlXCJcclxuICAgICAgICBbc2VydmljZUNvZGVdPVwiZmlsZVNldHRpbmcuY29udHJvbC5zZXJ2aWNlQ29kZVwiIFtwYXJlbnRDb250ZXh0XT1cInBhcmVudENvbnRleHRcIlxyXG4gICAgICAgIFtlbnRpdHldPVwiZmlsZVNldHRpbmcuY29udHJvbC5lbnRpdHlcIiBbZW50aXR5S2V5XT1cInJvd0RhdGFbZmlsZVNldHRpbmcuY29udHJvbC5lbnRpdHlLZXlGaWVsZF1cIlxyXG4gICAgICAgIFtjb250cm9sXT1cImZpbGVTZXR0aW5nLmNvbnRyb2xcIiBbZmlsZURhdGFTZXJ2aWNlXT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuZmlsZURhdGFTZXJ2aWNlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGEuZmllbGRcIj5cclxuICAgIDwvc2VydmljZS1maWxlLXVwbG9hZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdEZpbGVNYW5hZ2VyQ29sdW1uIGxldC1yb3dEYXRhIGxldC1maWxlU2V0dGluZz1cImZpbGVTZXR0aW5nXCIgbGV0LWZpZWxkPVwiZmllbGRcIj5cclxuICAgIDxmaWxlLW1hbmFnZXIgW2NvbnRyb2xdPVwiZmlsZVNldHRpbmcuY29udHJvbFwiIFtzZXJ2aWNlQ29kZV09XCJmaWxlU2V0dGluZy5jb250cm9sLnNlcnZpY2VDb2RlXCJcclxuICAgICAgICBbZW50aXR5XT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuZW50aXR5XCIgW2VudGl0eUtleV09XCJyb3dEYXRhW2ZpbGVTZXR0aW5nLmNvbnRyb2wuZW50aXR5S2V5RmllbGRdXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiZmlsZVNldHRpbmcuY29udHJvbC5yZWFkb25seVwiIFtsYXlvdXRdPVwiZmlsZVNldHRpbmcuY29udHJvbC5sYXlvdXRcIlxyXG4gICAgICAgIFttYXhGaWxlU2l6ZV09XCJmaWxlU2V0dGluZy5jb250cm9sLm1heEZpbGVTaXplXCIgW2luVGFpTGlldV09XCJmaWxlU2V0dGluZy5jb250cm9sLmluVGFpTGlldVwiXHJcbiAgICAgICAgWyh2YWx1ZSldPVwicm93RGF0YVtmaWVsZF1cIj5cclxuICAgIDwvZmlsZS1tYW5hZ2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjcnVkRm9ybVRhYmxlRGV0YWlsRm9ybSBsZXQtc2NoZW1hIGxldC1wYXJlbnRTZXR0aW5nPVwicGFyZW50U2V0dGluZ1wiIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCJcclxuICAgIGxldC1vbkluaXQ9XCJvbkluaXRcIiBsZXQtb25TYXZlZD1cIm9uU2F2ZWRcIiBsZXQtb25DYW5jZWw9XCJvbkNhbmNlbFwiPlxyXG4gICAgPHRhYmxlLWRldGFpbC1mb3JtICNmb3JtQmFzZSBbcGFyZW50U2V0dGluZ109XCJwYXJlbnRTZXR0aW5nXCIgW3NjaGVtYV09XCJzY2hlbWFcIiBbZGF0YV09XCJkaWFsb2dNb2RlbC5kYXRhXCJcclxuICAgICAgICAob25Jbml0KT1cImRpYWxvZ01vZGVsLmJ1dHRvblRlbXBsYXRlID0gJGV2ZW50LmJ1dHRvblRlbXBsYXRlXCIgKG9uU2F2ZWQpPVwib25TYXZlZFwiIChvbkNhbmNlbCk9XCJvbkNhbmNlbFwiPlxyXG4gICAgPC90YWJsZS1kZXRhaWwtZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkRm9ybUNvbmdWaWVjRm9ybSBsZXQtY29udHJvbD1cImNvbnRyb2xcIj5cclxuICAgIDxiYXNlLWNvbmd2aWVjLWZvcm0gW2NvbnRyb2xdPVwiY29udHJvbFwiIFtwYXJlbnRTZXR0aW5nXT1cImNvbmdWaWVjU2V0dGluZ1wiIFt0ZW5Db25nVmllY109XCJjb250cm9sLmRhdGEudGVuQ29uZ1ZpZWNcIj5cclxuICAgIDwvYmFzZS1jb25ndmllYy1mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtQWRkcmVzc0NvbXBvbmVudCBsZXQtZGF0YSBsZXQtY29udHJvbD1cImNvbnRyb2xcIiBsZXQtcGFyZW50UGF0aD1cInBhcmVudFBhdGhcIlxyXG4gICAgbGV0LWNoZWNrRGlzYWJsZWQ9XCJjaGVja0Rpc2FibGVkXCIgbGV0LWhhbmRsZUxvYWRlZENvbnRyb2w9XCJoYW5kbGVMb2FkZWRDb250cm9sXCJcclxuICAgIGxldC1oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZVwiIGxldC1oYW5kbGVDb250cm9sUmVhZHlFdmVudD1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50XCI+XHJcbiAgICA8YWRkcmVzcy1waWNrZXIgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtzaG93U3ViTGFiZWxdPVwiY29udHJvbC5zaG93U3ViTGFiZWxcIiBbZGlzYWJsZWRdPVwiY2hlY2tEaXNhYmxlZChkYXRhLCBjb250cm9sKVwiXHJcbiAgICAgICAgWyhkYXRhKV09XCJkYXRhW2NvbnRyb2wuZmllbGRdXCIgKG9uSW5pdCk9XCJoYW5kbGVMb2FkZWRDb250cm9sKCRldmVudCwgY29udHJvbCwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvblNlbGVjdCk9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsICRldmVudCwgZXZlbnRUeXBlLkNIQU5HRSwgZGF0YSwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvblJlYWR5KT1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpXCI+XHJcbiAgICA8L2FkZHJlc3MtcGlja2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtRmlsZU1hbmFnZXJDb21wb25lbnQgbGV0LWRhdGEgbGV0LWNvbnRyb2w9XCJjb250cm9sXCIgbGV0LXBhcmVudFBhdGg9XCJwYXJlbnRQYXRoXCJcclxuICAgIGxldC1jaGVja0Rpc2FibGVkPVwiY2hlY2tEaXNhYmxlZFwiIGxldC1oYW5kbGVMb2FkZWRDb250cm9sPVwiaGFuZGxlTG9hZGVkQ29udHJvbFwiXHJcbiAgICBsZXQtaGFuZGxlRmllbGRWYWx1ZUNoYW5nZT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2VcIiBsZXQtaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQ9XCJoYW5kbGVDb250cm9sUmVhZHlFdmVudFwiPlxyXG4gICAgPGZpbGUtbWFuYWdlciBbY29udHJvbF09XCJjb250cm9sXCIgW3NlcnZpY2VDb2RlXT1cImNvbnRyb2wuc2VydmljZUNvZGVcIiBbZW50aXR5XT1cImNvbnRyb2wuZW50aXR5XCJcclxuICAgICAgICBbZW50aXR5S2V5XT1cImNvbnRyb2wuZW50aXR5S2V5ID8gY29udHJvbC5lbnRpdHlLZXkgOiBkYXRhW2NvbnRyb2wuZW50aXR5S2V5RmllbGRdXCIgW3JlYWRvbmx5XT1cImNvbnRyb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgIFtsYXlvdXRdPVwiY29udHJvbC5sYXlvdXRcIiBbbWF4RmlsZVNpemVdPVwiY29udHJvbC5tYXhGaWxlU2l6ZVwiIFtpblRhaUxpZXVdPVwiY29udHJvbC5pblRhaUxpZXVcIlxyXG4gICAgICAgIFtpblRhaUxpZXVDaHVuZ109XCJjb250cm9sLmluVGFpTGlldUNodW5nXCIgW2NvcHlUb0ZvbGRlcklkXT1cImNvbnRyb2wuY29weVRvRm9sZGVySWRcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVNpemVNZXNzYWdlU3VtbWFyeV09XCJjb250cm9sLmludmFsaWRGaWxlU2l6ZU1lc3NhZ2VTdW1tYXJ5XCJcclxuICAgICAgICBbaW52YWxpZEZpbGVTaXplTWVzc2FnZURldGFpbF09XCJjb250cm9sLmludmFsaWRGaWxlU2l6ZU1lc3NhZ2VEZXRhaWxcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVR5cGVNZXNzYWdlU3VtbWFyeV09XCJjb250cm9sLmludmFsaWRGaWxlVHlwZU1lc3NhZ2VTdW1tYXJ5XCJcclxuICAgICAgICBbaW52YWxpZEZpbGVUeXBlTWVzc2FnZURldGFpbF09XCJjb250cm9sLmludmFsaWRGaWxlVHlwZU1lc3NhZ2VEZXRhaWxcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZUxpbWl0TWVzc2FnZVN1bW1hcnldPVwiY29udHJvbC5pbnZhbGlkRmlsZUxpbWl0TWVzc2FnZVN1bW1hcnlcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZUxpbWl0TWVzc2FnZURldGFpbF09XCJjb250cm9sLmludmFsaWRGaWxlTGltaXRNZXNzYWdlRGV0YWlsXCIgWyh2YWx1ZSldPVwiZGF0YVtjb250cm9sLmZpZWxkXVwiXHJcbiAgICAgICAgKG9uU2VsZWN0ZWQpPVwiY29udHJvbC5vblNlbGVjdGVkKCRldmVudClcIiAob25Jbml0KT1cImhhbmRsZUxvYWRlZENvbnRyb2woJGV2ZW50LCBjb250cm9sLCBwYXJlbnRQYXRoKVwiXHJcbiAgICAgICAgKG9uQ2hhbmdlZCk9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsICRldmVudCwgZXZlbnRUeXBlLkNIQU5HRSwgZGF0YSwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvblJlYWR5KT1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpXCI+XHJcbiAgICA8L2ZpbGUtbWFuYWdlcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkRm9ybVNlcnZpY2VGaWxlVXBsb2FkQ29tcG9uZW50IGxldC1kYXRhIGxldC1jb250cm9sPVwiY29udHJvbFwiIGxldC1wYXJlbnRQYXRoPVwicGFyZW50UGF0aFwiXHJcbiAgICBsZXQtcGFyZW50Q29udGV4dD1cInBhcmVudENvbnRleHRcIiBsZXQtY2hlY2tEaXNhYmxlZD1cImNoZWNrRGlzYWJsZWRcIiBsZXQtaGFuZGxlTG9hZGVkQ29udHJvbD1cImhhbmRsZUxvYWRlZENvbnRyb2xcIlxyXG4gICAgbGV0LWhhbmRsZUZpZWxkVmFsdWVDaGFuZ2U9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlXCIgbGV0LWhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50PVwiaGFuZGxlQ29udHJvbFJlYWR5RXZlbnRcIj5cclxuICAgIDxzZXJ2aWNlLWZpbGUtdXBsb2FkIFtwYXJlbnRDb250ZXh0XT1cInBhcmVudENvbnRleHRcIiBbc2VydmljZUNvZGVdPVwiY29udHJvbC5zZXJ2aWNlQ29kZVwiIFtlbnRpdHldPVwiY29udHJvbC5lbnRpdHlcIlxyXG4gICAgICAgIFtlbnRpdHlLZXldPVwiZGF0YVtjb250cm9sLmVudGl0eUtleUZpZWxkXVwiIFtjb250cm9sXT1cImNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImRhdGFbY29udHJvbC5maWVsZF1cIlxyXG4gICAgICAgIChvbkluaXQpPVwiaGFuZGxlTG9hZGVkQ29udHJvbCgkZXZlbnQsIGNvbnRyb2wsIHBhcmVudFBhdGgpXCJcclxuICAgICAgICAob25DaGFuZ2VkKT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgJGV2ZW50LCBldmVudFR5cGUuQ0hBTkdFLCBkYXRhLCBwYXJlbnRQYXRoKVwiPlxyXG4gICAgPC9zZXJ2aWNlLWZpbGUtdXBsb2FkPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtQ29uZ1ZpZWNQaWNrZXJDb21wb25lbnQgbGV0LWRhdGEgbGV0LWNvbnRyb2w9XCJjb250cm9sXCIgbGV0LXBhcmVudFBhdGg9XCJwYXJlbnRQYXRoXCJcclxuICAgIGxldC1jaGVja0Rpc2FibGVkPVwiY2hlY2tEaXNhYmxlZFwiIGxldC1oYW5kbGVMb2FkZWRDb250cm9sPVwiaGFuZGxlTG9hZGVkQ29udHJvbFwiXHJcbiAgICBsZXQtaGFuZGxlRmllbGRWYWx1ZUNoYW5nZT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2VcIiBsZXQtaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQ9XCJoYW5kbGVDb250cm9sUmVhZHlFdmVudFwiPlxyXG4gICAgPGNvbmd2aWVjLXBpY2tlciBbY29udHJvbF09XCJjb250cm9sXCIgW2Rpc2FibGVkXT1cImNoZWNrRGlzYWJsZWQoZGF0YSwgY29udHJvbClcIiBbcmVxdWlyZWRdPVwiY29udHJvbC5yZXF1aXJlZFwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhW2NvbnRyb2wuZmllbGRdXCIgKG9uSW5pdCk9XCJoYW5kbGVMb2FkZWRDb250cm9sKCRldmVudCwgY29udHJvbCwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvbkNoYW5nZWQpPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCAkZXZlbnQsIGV2ZW50VHlwZS5DSEFOR0UsIGRhdGEsIHBhcmVudFBhdGgpXCI+XHJcbiAgICA8L2Nvbmd2aWVjLXBpY2tlcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkRm9ybVZhbkJhblBpY2tlckNvbXBvbmVudCBsZXQtZGF0YSBsZXQtY29udHJvbD1cImNvbnRyb2xcIiBsZXQtcGFyZW50UGF0aD1cInBhcmVudFBhdGhcIlxyXG4gICAgbGV0LWNoZWNrRGlzYWJsZWQ9XCJjaGVja0Rpc2FibGVkXCIgbGV0LWhhbmRsZUxvYWRlZENvbnRyb2w9XCJoYW5kbGVMb2FkZWRDb250cm9sXCJcclxuICAgIGxldC1oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZVwiIGxldC1oYW5kbGVDb250cm9sUmVhZHlFdmVudD1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50XCI+XHJcbiAgICA8dmFuYmFuLXBpY2tlciBbY29udHJvbF09XCJjb250cm9sXCIgW2Rpc2FibGVkXT1cImNoZWNrRGlzYWJsZWQoZGF0YSwgY29udHJvbClcIiBbcmVxdWlyZWRdPVwiY29udHJvbC5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRyb2wucmVhZE9ubHlcIiBbbG9haVZhbkJhbl09XCJjb250cm9sLmxvYWlWYW5CYW5cIiBbKG5nTW9kZWwpXT1cImRhdGFbY29udHJvbC5maWVsZF1cIlxyXG4gICAgICAgIChvbkluaXQpPVwiaGFuZGxlTG9hZGVkQ29udHJvbCgkZXZlbnQsIGNvbnRyb2wsIHBhcmVudFBhdGgpXCJcclxuICAgICAgICAob25DaGFuZ2VkKT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgJGV2ZW50LCBldmVudFR5cGUuQ0hBTkdFLCBkYXRhLCBwYXJlbnRQYXRoKVwiPlxyXG4gICAgPC92YW5iYW4tcGlja2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0aW55TWNlRmlsZVBpY2tlckRpYWxvZyBsZXQtcGFyZW50TW9kZWw9XCJwYXJlbnRNb2RlbFwiIGxldC1wYXJlbnRDb250ZXh0PVwicGFyZW50Q29udGV4dFwiXHJcbiAgICBsZXQtY2xvc2VGb3JtPVwiY2xvc2VGb3JtXCIgbGV0LW9uQ2FuY2VsPVwib25DYW5jZWxcIiBsZXQtb25DaGFuZ2VkPVwib25DaGFuZ2VkXCI+XHJcbiAgICA8ZmlsZS1waWNrZXItZGlhbG9nICNmb3JtQmFzZSBbcGFyZW50TW9kZWxdPVwicGFyZW50TW9kZWxcIiBbcGFyZW50Q29udGV4dF09XCJwYXJlbnRDb250ZXh0XCIgKGNsb3NlRm9ybSk9XCJjbG9zZUZvcm1cIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJvbkNhbmNlbFwiIChvbkNoYW5nZWQpPVwib25DaGFuZ2VkXCI+XHJcbiAgICA8L2ZpbGUtcGlja2VyLWRpYWxvZz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICN0aW55TWNlQWRkTmV3cyBsZXQtbGFuZ3VhZ2VDb2RlPVwibGFuZ3VhZ2VDb2RlXCIgbGV0LXNob3dDaGFuZ2U9XCJzaG93Q2hhbmdlXCI+XHJcbiAgICA8YWRkLW5ld3MgI2xpc3RCYXNlIFtsYW5ndWFnZUNvZGVdPVwibGFuZ3VhZ2VDb2RlXCIgKHNob3dDaGFuZ2UpPVwic2hvd0NoYW5nZSgkZXZlbnQpXCI+PC9hZGQtbmV3cz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25RdWlja0FkZEZvcm0gbGV0LWRpYWxvZ01vZGVsIGxldC1wYXJlbnRNb2RlbD1cInBhcmVudE1vZGVsXCIgbGV0LXBhcmVudENvbnRleHQ9XCJwYXJlbnRDb250ZXh0XCJcclxuICAgIGxldC1jb250cm9sPVwiY29udHJvbFwiIGxldC1vblNhdmVkPVwib25TYXZlZFwiIGxldC1vbkNhbmNlbD1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8cXVpY2stYWRkLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRNb2RlbF09XCJwYXJlbnRNb2RlbFwiIFtwYXJlbnRDb250ZXh0XT1cInBhcmVudENvbnRleHRcIlxyXG4gICAgICAgIFttb2RlbF09XCJkaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbFwiIFtjb250cm9sXT1cImNvbnRyb2xcIiBbYmFzZVNlcnZpY2VdPVwiY29udHJvbC5iYXNlU2VydmljZVwiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJkaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZSA9ICRldmVudC5idXR0b25UZW1wbGF0ZVwiIChvblNhdmVkKT1cIm9uU2F2ZWRcIiAob25DYW5jZWwpPVwib25DYW5jZWxcIj5cclxuICAgIDwvcXVpY2stYWRkLWZvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25TZXR0aW5nRm9ybSBsZXQtZGlhbG9nTW9kZWwgbGV0LW9uU2F2ZWQ9XCJvblNhdmVkXCI+XHJcbiAgICA8ZHJvcGRvd24tc2V0dGluZy1mb3JtICNmb3JtQmFzZSBbbW9kZWxdPVwiZGlhbG9nTW9kZWwuZGF0YS5mb3JtTW9kZWxcIlxyXG4gICAgICAgIChvbkluaXQpPVwiZGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGUgPSAkZXZlbnQuYnV0dG9uVGVtcGxhdGVcIiAob25TYXZlZCk9XCJvblNhdmVkXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvZHJvcGRvd24tc2V0dGluZy1mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
838
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWFwcC1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1hcHAtY29tcG9uZW50L2NvbW1vbi1hcHAtY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jb21tb24tYXBwLWNvbXBvbmVudC9jb21tb24tYXBwLWNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQWtCLGVBQWUsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUdqRixPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUc3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFL0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFTM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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bnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IEF1dGhDb25maWcsIE9BdXRoU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xyXG5pbXBvcnQgKiBhcyBIYW1tZXIgZnJvbSAnaGFtbWVyanMnO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFByaW1lTkdDb25maWcgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwLWNvbnRleHQvYXBwbGljYXRpb24tY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZExpc3RTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBFdmVudFR5cGUsIEZpbGVVcGxvYWRNb2RlIH0gZnJvbSAnLi4vLi4vZW51bXMvY29tbW9uJztcclxuaW1wb3J0IHsgQXV0aGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbXBvbmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3VzdG9taXplVWlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY3VzdG9taXplLXVpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktbWV0YWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmljR3VhcmRDaGlsZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9nZW5lcmljLWd1YXJkLWNoaWxkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmljR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2VuZXJpYy1ndWFyZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2xvYmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dsb2JhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaWduYWxSU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NpZ25hbHIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VVcGRhdGVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2UtdXBkYXRlZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlcG9ydFF1ZXVlQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0LXF1ZXVlL3JlcG9ydC1xdWV1ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUbkN1c3RvbVNjcm9sbGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3RuLWN1c3RvbS1zY3JvbGxiYXIvdG4tY3VzdG9tLXNjcm9sbGJhci5jb21wb25lbnQnO1xyXG5cclxuZGVjbGFyZSBsZXQgdGlueW1jZTogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NvbW1vbi1hcHAtY29tcG9uZW50JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tb24tYXBwLWNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbW1vbi1hcHAtY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlLCBFbnRpdHlNZXRhZGF0YVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21tb25BcHBDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnb2tCdXR0b24nKSBva0J1dHRvbjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2NhbmNlbEJ1dHRvbicpIGNhbmNlbEJ1dHRvbjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3F1aWNrTm90ZUJ0JykgcXVpY2tOb3RlQnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdxdWlja05vdGVCdDEnKSBxdWlja05vdGVCdDE6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdxdWlja05vdGVCdDInKSBxdWlja05vdGVCdDI6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdwaW5uZWROb3RlcycpIHBpbm5lZE5vdGVzOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZChSZXBvcnRRdWV1ZUNvbXBvbmVudCkgcmVwb3J0UXVldWU6IFJlcG9ydFF1ZXVlQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsYmFyJykgc2Nyb2xsQmFyTWVudTogVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBJbnB1dCgpIHNob3dRdWlja05vdGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgYWxsb3dBbm9ueW1vdXMgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGF1dG9SZW5kZXJNZW51OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgLy8gcm9vdFZlcnNpb25EZXBsb3kgPSAnMS4zJztcclxuICAgIGN1cnJlbnRSb3V0ZSA9ICcnO1xyXG4gICAgcGFnZUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgZmlyc3RUaW1lTG9naW4gPSBmYWxzZTtcclxuICAgIHNob3dBZGROb3RlRm9ybSA9IGZhbHNlO1xyXG4gICAgcGlubmVkTm90ZURhdGE6IGFueTtcclxuICAgIHBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXMgPSBmYWxzZTtcclxuICAgIHBpbm5lZE5vdGVzTWF4aW1pemVTdGF0dXMgPSBudWxsO1xyXG4gICAgY2FwdHVyZU1vZGUgPSBmYWxzZTtcclxuICAgIHAwOiBhbnk7XHJcbiAgICBwMTogYW55O1xyXG4gICAgbG9nZ2VkSW4gPSBmYWxzZTtcclxuICAgIHN1YnNjcmlibGU6IFN1YnNjcmlwdGlvbjtcclxuICAgIG9ubHlTaG93TWFpbkNvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgICBhcHBDb2RlID0gJyc7XHJcblxyXG4gICAgc2VhcmNoTWVudVJlc3VsdDogYW55W107XHJcbiAgICBzZWFyY2hNZW51SW5wdXQ6IHN0cmluZztcclxuXHJcbiAgICBzaG93UGlubmVkTWVudSA9IGZhbHNlO1xyXG4gICAgaXNJblBpbm5lZE1lbnUgPSBmYWxzZTtcclxuICAgIGlzU2VhcmNoTWVudUlucHV0Rm9jdXMgPSBmYWxzZTtcclxuICAgIG1lbnVNb2RlbDogYW55O1xyXG4gICAgd2FpdGluZyA9IGZhbHNlO1xyXG4gICAgbWVzc2FnZVdhaXRpbmc6IHN0cmluZ1tdID0gW107XHJcbiAgICBzaG93UmVqZWN0Q29uZmlybSA9IHRydWU7XHJcblxyXG4gICAga2V5UHJlc3NQZXJtaXNzaW9uVXRpbHMgPSAncHBwcHBwcHBwJztcclxuICAgIGN1cnJlbnRLZXlQcmVzc0luZGV4ID0gMDtcclxuICAgIHJvb3REYXRhOiBhbnk7XHJcblxyXG4gICAgY29uZ1ZpZWNTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmc7XHJcbiAgICBldmVudFR5cGUgPSBFdmVudFR5cGU7XHJcbiAgICBmaWxlVXBsb2FkTW9kZSA9IEZpbGVVcGxvYWRNb2RlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHB1YmxpYyBfZ2xvYmFsU2VydmljZTogR2xvYmFsU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50U2VydmljZTogQ29tcG9uZW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9vYXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIF90aXRsZTogVGl0bGUsXHJcbiAgICAgICAgcHJpdmF0ZSBfc2lnbmFsUlNlcnZpY2U6IFNpZ25hbFJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3N0b3JhZ2VVcGRhdGVkU2VydmljZTogU3RvcmFnZVVwZGF0ZWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2FwcGxpY2F0aW9uQ29udGV4dDogQXBwbGljYXRpb25Db250ZXh0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlOiBDb21wb25lbnRDb250ZXh0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgLy8gcHJpdmF0ZSBfdG5DbGllbnRTZXJ2aWNlOiBUbkNsaWVudFNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9lbnRpdHlNZXRhZGF0YVNlcnZpY2U6IEVudGl0eU1ldGFkYXRhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tZW51U2VydmljZTogTWVudVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfcHJpbWVuZ0NvbmZpZzogUHJpbWVOR0NvbmZpZyxcclxuICAgICAgICBwcml2YXRlIF9zdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2N1c3RvbWl6ZVVpU2VydmljZTogQ3VzdG9taXplVWlTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmFwcENvZGUgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBwQ29kZSgpO1xyXG4gICAgICAgIGNvbnN0IGtleVByZXNzUGVybWlzc2lvblV0aWxzID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEtleVByZXNzUGVybWlzc2lvblV0aWxzKCk7XHJcbiAgICAgICAgaWYgKGtleVByZXNzUGVybWlzc2lvblV0aWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5UHJlc3NQZXJtaXNzaW9uVXRpbHMgPSBrZXlQcmVzc1Blcm1pc3Npb25VdGlscztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0U3RvcmFnZSgpID09PSAnc2Vzc2lvblN0b3JhZ2UnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldFN0b3JhZ2Uoc2Vzc2lvblN0b3JhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0U3RvcmFnZShsb2NhbFN0b3JhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcHJpbWVuZ0NvbmZpZy5zZXRUcmFuc2xhdGlvbih7XHJcbiAgICAgICAgICAgIGRheU5hbWVzOiBbJ0No4bunIG5o4bqtdCcsICdUaOG7qSAyJywgJ1Ro4bupIDMnLCAnVGjhu6kgNCcsICdUaOG7qSA1JywgJ1Ro4bupIDYnLCAnVGjhu6kgNyddLFxyXG4gICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbJ0NOJywgJ1RoMicsICdUaDMnLCAnVGg0JywgJ1RoNScsICdUaDYnLCAnVGg3J10sXHJcbiAgICAgICAgICAgIGRheU5hbWVzTWluOiBbJ0NOJywgJ1RoMicsICdUaDMnLCAnVGg0JywgJ1RoNScsICdUaDYnLCAnVGg3J10sXHJcbiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFtcclxuICAgICAgICAgICAgICAgICdUaMOhbmcgMScsICdUaMOhbmcgMicsICdUaMOhbmcgMycsICdUaMOhbmcgNCcsICdUaMOhbmcgNScsICdUaMOhbmcgNicsICdUaMOhbmcgNycsICdUaMOhbmcgOCcsICdUaMOhbmcgOScsICdUaMOhbmcgMTAnLCAnVGjDoW5nIDExJywgJ1Row6FuZyAxMidcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbJ1QxJywgJ1QyJywgJ1QzJywgJ1Q0JywgJ1Q1JywgJ1Q2JywgJ1Q3JywgJ1Q4JywgJ1Q5JywgJ1QxMCcsICdUMTEnLCAnVDEyJ10sXHJcbiAgICAgICAgICAgIHRvZGF5OiAnSMO0bSBuYXknLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21VaSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRDdXN0b21pemVVaSgpO1xyXG4gICAgICAgIGlmIChjdXN0b21VaSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21pemVVaVNlcnZpY2Uuc2V0Q3VzdG9taXplKGN1c3RvbVVpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5hZGRSb290Q29udGV4dChcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UsXHJcbiAgICAgICAgICAgIF9hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl90aXRsZS5zZXRUaXRsZSh0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0VGl0bGUoKSk7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCd2bicpO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZSgndm4nKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0VGlueU1jZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmdldENvbmZpZ0F1dGhlbigpO1xyXG4gICAgICAgIC8vIENodXnhu4NuIHNhbmcgc2Vzc2lvbiBzdG9yYWdlLCBu4bq/dSDhu5VuIHRow6wgeMOzYSBkw7JuZyBuw6B5IMSRaVxyXG4gICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5zZXRTdG9yYWdlKHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldFN0b3JhZ2UoKSk7XHJcbiAgICAgICAgdGhpcy5pbmplY3RDb25maWcoY2ZnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25maWd1cmVXaXRoTmV3Q29uZmlnQXBpKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEucGVyc29uYWxpemUgPSB0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRPYmplY3RBbnkoJ3BlcnNvbmFsaXplJyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLnBlcnNvbmFsaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEucGVyc29uYWxpemUgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnJlcGxheVN1YnNjcmliZShcclxuICAgICAgICAgICAgQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9MT0FERUQsXHJcbiAgICAgICAgICAgIGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZS5zZXR1cFN5bmNDYWNoZUVudGl0eU1ldGFkYXRhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLmNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHJvdXRlID0+IHRoaXMuYWRkR3VhcmQocm91dGUpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maXJzdFRpbWVMb2dpbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGzhuqduIMSR4bqndSDEkcSDbmcgbmjhuq1wIHRow6wgdsOgbyB0cmFuZyBt4bq3YyDEkeG7i25oXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMucm9vdFZlcnNpb25EZXBsb3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgndmVyc2lvbkRlcGxveScsIHRoaXMucm9vdFZlcnNpb25EZXBsb3kpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGjDqm0gdsOgbyDEkeG7gyDEkcOhbmggZOG6pXUgbOG6p24gZOG6p3UgbG9naW4gPT4gxJHhu4MgeOG7rSBsw71cclxuICAgICAgICAgICAgICAgICAgICAvLyBVc2VyQSDEkWFnIOG7nyBtw6BuIGjDrG5oIDEgPT4gxJHEg25nIHh14bqldCA9PiDEkcSDbmcgbmjhuq1wIHbDoG8gdMOgaSBraG/huqNuIFVzZXJCIGtow7RuZyBjw7MgcXV54buBbiBtw6BuIGjDrG5oIDEgPT4gcmVkaXJlY3QgduG7gSBcIi9cIlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ2N1cnJlbnRfdXNlcl9pbmZvJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgnZmlyc3RUaW1lTG9naW4nLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRVcmwgPSB0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRJdGVtKCdjdXJyZW50VXJsJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRVcmwgJiYgb2xkVXJsICE9IHRvcC5sb2NhdGlvbi5ocmVmICsgJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSgnY3VycmVudFVybCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AubG9jYXRpb24uaHJlZiA9IGAke29sZFVybH1gO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdFRpbWVMb2dpbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKCdjdXJyZW50VXJsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25seVNob3dNYWluQ29udGVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVkaXJlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgdmVyc2lvbkRlcGxveSA9IHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ3ZlcnNpb25EZXBsb3knKTtcclxuICAgICAgICAgICAgICAgIC8vIGxldCB2ZXJzaW9uRnJvbUFwcGxpY2F0aW9uID0gdGhpcy5yb290VmVyc2lvbkRlcGxveTtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh2ZXJzaW9uRnJvbUFwcGxpY2F0aW9uICYmIHZlcnNpb25EZXBsb3kgJiYgKCt2ZXJzaW9uRGVwbG95KSA8ICgrdmVyc2lvbkZyb21BcHBsaWNhdGlvbikpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCd2ZXJzaW9uRGVwbG95JywgdmVyc2lvbkZyb21BcHBsaWNhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBpbm5lZE5vdGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NpZ25hbFJTZXJ2aWNlLmluaXQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2lnbmFsUlNlcnZpY2Uuc3RhcnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29uc2lzdGVuY3lIdWInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Jyb2FkY2FzdE1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckF1dGhvcml6ZUNhY2hlLmJpbmQodGhpcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NpZ25hbFJTZXJ2aWNlLnN0YXJ0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbkh1YicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVmcmVzaEZvclVwZGF0ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5hcHBDb2RlcyAmJiBkYXRhLmFwcENvZGVzLnNvbWUoeCA9PiB4LnRvVXBwZXJDYXNlKCkgPT0gdGhpcy5hcHBDb2RlLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLkZPUkNFX1JFTE9BRCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNb2R1bGVQYWdlcyA9IHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEucGVyc29uYWxpemUuZGVmYXVsdE1vZHVsZVBhZ2VzO1xyXG4gICAgICAgIGlmIChkZWZhdWx0TW9kdWxlUGFnZXMgJiYgZGVmYXVsdE1vZHVsZVBhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0TGlzdEFwcCgpLmZvckVhY2goYXBwID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBkZWZhdWx0TW9kdWxlUGFnZXMuZmluZChwID0+IHAuY29kZSA9PSBhcHAuY29kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFnZSAmJiBwYWdlLmRlZmF1bHRQYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwLnVybCA9IHBhZ2UuZGVmYXVsdFBhZ2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICBkZWxldGUgSGFtbWVyLmRlZmF1bHRzLmNzc1Byb3BzLnVzZXJTZWxlY3Q7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKCdRVUlDS19OT1RFX1BPUFVQLkNMT1NFX1BPUFVQJywgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm0gPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKCdHT19IT01FJywgZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJyk7XHJcbiAgICAgICAgICAgIHRoaXMub25seVNob3dNYWluQ29udGVudCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZSgnVE9HR0xFX0xBWU9VVCcsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5vbmx5U2hvd01haW5Db250ZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25seVNob3dNYWluQ29udGVudCA9IGRhdGEub25seVNob3dNYWluQ29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoJ01BSU5fQ09OVEVOVF9PTkxZJywgcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9ubHlTaG93TWFpbkNvbnRlbnQgPSBycztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlNIT1dfUkVKRUNUX0NPTkZJUk0sIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dSZWplY3RDb25maXJtID0gZGF0YTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCk7XHJcbiAgICAgICAgdGhpcy5yb290RGF0YSA9IHJvb3QuZGF0YTtcclxuICAgICAgICByb290LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldE9iamVjdEFwcCh0aGlzLmFwcENvZGUpO1xyXG4gICAgICAgIHJvb3QuZGF0YS5hcHBPcmlnaW4gPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RW5hYmxlQmFzZUhyZWYoKSA/IGAvJHtyb290LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLmNvZGUudG9Mb3dlckNhc2UoKX0vYCA6ICcvJztcclxuICAgICAgICByb290LmRhdGEuYWxsb3dBbm9ueW1vdXMgPSB0aGlzLmFsbG93QW5vbnltb3VzO1xyXG4gICAgICAgIC8vIGdldCBjdXJyZW50IFVzZXJcclxuICAgICAgICB0aGlzLl91c2VyU2VydmljZS5wb3B1bGF0ZUN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULk5FRURfQ0xFQVJfUEVSTUlTU0lPTl9DQUNIRSwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5jbGVhclBlcm1pc3Npb25DYWNoZUFsbCgpO1xyXG4gICAgICAgICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0PDsyBs4buXaSB0cm9uZyBsw7pjIGNsZWFyIGNhY2hlIHBow6JuIHF1eeG7gW4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5maXJlUmVwbGF5RXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9MT0FERUQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5LRVlfRE9XTl9BUlJPV0xFRlQsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmNhbmNlbEJ1dHRvbi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9rQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm9rQnV0dG9uLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5LRVlfRE9XTl9BUlJPV1JJR0hULCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5va0J1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5va0J1dHRvbi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlBFUlNPTkFMSVpFX1VQREFURUQsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnNob3dRdWlja05vdGVCdXR0b25PblNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gc2VuZCBjdXJyZW50IHZlcnNpb24gdG8gdG4gY2xpZW50XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX3RuQ2xpZW50U2VydmljZS5zZW5kQ29tbWFuZCg8VG5DbGllbnRDb21tYW5kPntcclxuICAgICAgICAgICAgLy8gICAgIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZS5TeW5jVmVyaW9uVG5DbGllbnQsXHJcbiAgICAgICAgICAgIC8vICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdmVyc2lvbjogdGhpcy5lbnZpcm9ubWVudC5zaWduYWxyLnZlcnNpb24sXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZW52aXJvbm1lbnQuY2xpZW50RG9tYWluLmFwcERvbWFpbiArICcvJyArIHRoaXMuZW52aXJvbm1lbnQuc2lnbmFsci5lbmRwb2ludFVwZGF0ZVxyXG4gICAgICAgICAgICAvLyAgICAgfSxcclxuICAgICAgICAgICAgLy8gICAgIGtleTogdGhpcy5lbnZpcm9ubWVudC5zaWduYWxyLmNsaWVudEtleVxyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuXHJcblxyXG4gICAgICAgIC8vIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuQ09NTU9OLkNMT1NFX0VESVRfRk9STSwgKGRhdGEpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5zaG93QWRkTm90ZUZvcm0gPSBmYWxzZTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UucmVwbGF5U3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlFVSUNLX05PVEVfUElOLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHNldCBwaW5uZWQgbm90ZSBsb2NhdGlvbiBhZnRlciBjbGljayBwaW5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGlubmVkTm90ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCdwaW5uZWROb3Rlc0xvY2F0aW9uJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogKHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wIC0gcmVjdC5oZWlnaHQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IChyZWN0LmxlZnQpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXplOiB0aGlzLnBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQaW5uZWROb3RlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLnJlcGxheVN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5RVUlDS19OT1RFX1VOUElOLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHNldCBwaW5uZWQgbm90ZSBsb2NhdGlvbiBhZnRlciBjbGljayB1cHBpblxyXG4gICAgICAgICAgICBpZiAodGhpcy5waW5uZWROb3Rlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMucGlubmVkTm90ZXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ3Bpbm5lZE5vdGVzTG9jYXRpb24nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAod2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSByZWN0LmhlaWdodCksXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogKHJlY3QubGVmdCksXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pemU6IHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1c1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBpbm5lZE5vdGVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5lZGl0Rm9ybU1vZGVsID0gW107XHJcblxyXG4gICAgICAgIC8vIHN1YnNjcmliZSBjaGFuZ2UgZW50aXR5IG1ldGFkYXRhXHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZVVwZGF0ZWRTZXJ2aWNlLnN1YnNjcmliZUNoYW5nZWRMb2NhbFN0b3JhZ2UoJ0tFWV9FTlRJVFlfTUVUREFUQV9VUERBVEVEJywgKHJzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlbnRpdHkgbWV0YWRhdGEgY2hhbmdlZCcsIHJzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gdHJpZ2dlciB1cGRhdGUgc3RvcmFnZSBrZXlcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuU0hPV19XQUlUX0JPWCwgZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdGluZyA9IGRhdGEuc2hvdztcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlV2FpdGluZyA9IFsuLi5kYXRhLm1lc3NhZ2VdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERhdGEuaHR0cFJlcXVlc3RMaXN0ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbuG6v3UgYWxsb3cgYW5vbnltb3VzIHRow6wgbG9hZCByYSBjw6FjIHBow6JuIGjhu4cgY2hvIHBow6lwIHbDoG8ga2jDtG5nIGPhuqduIMSRxINuZyBuaOG6rXBcclxuICAgICAgICBpZiAodGhpcy5hbGxvd0Fub255bW91cykge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0VGltZUxvZ2luID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub25seVNob3dNYWluQ29udGVudCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICByb290LnN1YnNjcmliZSgnTE9HSU4nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UubG9hZERpc2NvdmVyeURvY3VtZW50QW5kVHJ5TG9naW4oKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX29hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd0Fub255bW91cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEZvckdsb2JhbFRlbXBsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIC8vIFNldCBkeW5hbWljIGFsbCBjaGlsZHJlblxyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgodG1wOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRtcC5fZGVmICYmIHRtcC5fZGVmLnJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIG9sZCB2ZXJzaW9uLCBub3QgaXZ5XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModG1wLl9kZWYucmVmZXJlbmNlcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRTZXJ2aWNlLnNldFRlbXBsYXRlKGtleXNbMF0sIHRtcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRtcC5fZGVjbGFyYXRpb25UQ29udGFpbmVyICYmIHRtcC5fZGVjbGFyYXRpb25UQ29udGFpbmVyLmxvY2FsTmFtZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gdG1wLl9kZWNsYXJhdGlvblRDb250YWluZXIubG9jYWxOYW1lcztcclxuICAgICAgICAgICAgICAgIGlmIChrZXlzICYmIGtleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFNlcnZpY2Uuc2V0VGVtcGxhdGUoa2V5c1swXSwgdG1wKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NkLmRldGFjaCgpO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBxdWlja05vdGVCdExvY2F0aW9uID0gdGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0T2JqZWN0QW55KCdxdWlja05vdGVCdExvY2F0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChxdWlja05vdGVCdExvY2F0aW9uICYmIHRoaXMucXVpY2tOb3RlQnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChxdWlja05vdGVCdExvY2F0aW9uLmJvdHRvbSA8IHdpbmRvdy5pbm5lckhlaWdodCAtIDUwICYmIHF1aWNrTm90ZUJ0TG9jYXRpb24ucmlnaHQgPCB3aW5kb3cuaW5uZXJXaWR0aCAtIDUwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdC5uYXRpdmVFbGVtZW50LnN0eWxlLmJvdHRvbSA9IHF1aWNrTm90ZUJ0TG9jYXRpb24uYm90dG9tICsgJ3B4JztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSBxdWlja05vdGVCdExvY2F0aW9uLnJpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLnBlcnNvbmFsaXplLnNob3dRdWlja05vdGVCdXR0b25PblNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucXVpY2tOb3RlQnQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLnBlcnNvbmFsaXplLnNob3dRdWlja05vdGVCdXR0b25PblNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwaW5uZWROb3Rlc0xvY2F0aW9uID0gdGhpcy5fc3RvcmFnZVNlcnZpY2UuZ2V0T2JqZWN0QW55KCdwaW5uZWROb3Rlc0xvY2F0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwaW5uZWROb3Rlc0xvY2F0aW9uICYmIHRoaXMucGlubmVkTm90ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGlubmVkTm90ZXNMb2NhdGlvbi5ib3R0b20gPCB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmhlaWdodCAmJiBwaW5uZWROb3Rlc0xvY2F0aW9uLmxlZnQgPCB3aW5kb3cuaW5uZXJXaWR0aCAtIDI1MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZXMubmF0aXZlRWxlbWVudC5zdHlsZS5ib3R0b20gPSBwaW5uZWROb3Rlc0xvY2F0aW9uLmJvdHRvbSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBwaW5uZWROb3Rlc0xvY2F0aW9uLmxlZnQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1cyA9IHBpbm5lZE5vdGVzTG9jYXRpb24ubWluaW1pemU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5waW5uZWROb3RlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBpbm5lZE5vdGVEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0udGl0bGVQYWRkaW5nQm90dG9tID0gJzBweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0uY29udGVudERpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucGlubmVkTm90ZURhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZURhdGFba2V5XS50aXRsZVBhZGRpbmdCb3R0b20gPSAnNnB4JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZURhdGFba2V5XS5jb250ZW50RGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5waW5uZWROb3Rlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3Rlcy5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKTtcclxuICAgICAgICByb290LnJlcG9ydFF1ZXVlID0gdGhpcy5yZXBvcnRRdWV1ZTtcclxuICAgICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMuX21lbnVTZXJ2aWNlLmdldE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JHbG9iYWxUZW1wbGF0ZSgpIHtcclxuICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZyA9IG5ldyBDcnVkTGlzdFNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZy5pc1dvcmtmbG93VHJlZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVmYXVsdFJlZGlyZWN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9vYXV0aFNlcnZpY2UuaGFzVmFsaWRBY2Nlc3NUb2tlbigpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcFNldHRpbmcgPSB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YTtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFJlZGlyZWN0ID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldERlZmF1bHRSZWRpcmVjdCgpO1xyXG4gICAgICAgICAgICBpZiAoIWFwcFNldHRpbmcgJiYgZGVmYXVsdFJlZGlyZWN0ICYmIHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRJc1Byb2R1Y3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UmVkaXJlY3RcclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcGF0aFRvQ2hlY2sgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RW5hYmxlQmFzZUhyZWYoKSA/IGAvJHthcHBTZXR0aW5nLmNvZGUudG9Mb3dlckNhc2UoKX0vYCA6ICcvJztcclxuXHJcbiAgICAgICAgICAgIGlmICgobG9jYXRpb24ucGF0aG5hbWUgPT09ICcvJyB8fCBsb2NhdGlvbi5wYXRobmFtZSA9PT0gJycgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09IHBhdGhUb0NoZWNrKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbmx5U2hvd01haW5Db250ZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndXNlciBub3QgdmFsaWQgdG9rZW4nLCB0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSk7XHJcbiAgICAgICAgICAgIC8vIFRPRE86IE5hbU5IIFjhu60gbMO9IHThuqFtIGNobyB0csaw4budbmcgaOG7o3AgxJHEg25nIG5o4bqtcCBs4bqnbiDEkeG6p3UgbmjGsG5nIGNo4bqheSDEkeG6v24gxJHDonkgbcOgIGFjY2VzcyB0b2tlbiB24bqrbiBraMO0bmcgaOG7o3AgbOG7h1xyXG4gICAgICAgICAgICAvLyBY4butIGzDvSB0cmnhu4d0IMSR4buDIGLhurFuZyBjw6FjaCB0w6xtIFBBIGLhuq90IGV2ZW50IGPhu6dhIGFuZ3VsYXIyIG9pZGMgxJHhu4MgeOG7rSBsw70gdHLGsOG7m2Mga2hpIMSR4bq/biBixrDhu5tjIGRlZmF1bHQgcmVkaXJlY3RcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3AubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZXRlY3RDaGFuZ2VzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jZFsnZGVzdHJveWVkJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2V4Y2VwdGlvbiBvbiBkZXRlY3QgY2hhbmdlJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhckF1dGhvcml6ZUNhY2hlKCkge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHNlc3Npb25TdG9yYWdlKVxyXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gL15BVVRIT1JJWkFUSU9OLy50ZXN0KGl0ZW0pKVxyXG4gICAgICAgICAgICAuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzVHJhcChldmVudCwgZGlyZWN0KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpZiAoZGlyZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMub2tCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0VGlueU1jZSgpIHtcclxuICAgICAgICB0aW55bWNlLmJhc2VVUkwgPSAnL2Fzc2V0cy92ZW5kb3IvdGlueW1jZSc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maWd1cmVXaXRoTmV3Q29uZmlnQXBpKCkge1xyXG4gICAgICAgIC8vIGZvciBmaXJzdCBsb2dpblxyXG4gICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKGV2dCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGV2dC50eXBlID09ICd0b2tlbl9yZWNlaXZlZCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0VGltZUxvZ2luID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UuY2xlYW51cExvY2FsU3RvcmFnZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5jbGVhbnVwU2Vzc2lvblN0b3JhZ2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VVcGRhdGVkU2VydmljZS5jbGVhbnVwU3RvcmFnZVNlcnZpY2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmZpcmVSZXBsYXlFdmVudChcclxuICAgICAgICAgICAgICAgICAgICBDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX1JFQURZLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RUaW1lTG9naW5cclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2dC50eXBlID09PSAndG9rZW5fZXhwaXJlcycpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29hdXRoU2VydmljZS50cnlMb2dpbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2dC50eXBlID09PSAnbG9nb3V0Jykge1xyXG4gICAgICAgICAgICAgICAgLy8gY2xlYW51cCBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmNsZWFudXBMb2NhbFN0b3JhZ2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UuY2xlYW51cFNlc3Npb25TdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlVXBkYXRlZFNlcnZpY2UuY2xlYW51cFN0b3JhZ2VTZXJ2aWNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UucmV2b2tlVG9rZW5BbmRMb2dvdXQobnVsbCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LnR5cGUgPT0gJ3Nlc3Npb25fdGVybWluYXRlZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ2N1cnJlbnRfdXNlcl9pbmZvJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBsb2dvdXRcclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LnR5cGUgPT0gJ2Rpc2NvdmVyeV9kb2N1bWVudF9sb2FkZWQnKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LnR5cGUgPT0gJ3Rva2VuX3JlZnJlc2hlZCcpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBldmVudCcsIGV2dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fb2F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudCgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9vYXV0aFNlcnZpY2UuaGFzVmFsaWRBY2Nlc3NUb2tlbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmZpcmVSZXBsYXlFdmVudChcclxuICAgICAgICAgICAgICAgIENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfUkVBRFksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0VGltZUxvZ2luXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2Uuc2V0dXBBdXRvbWF0aWNTaWxlbnRSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ2N1cnJlbnRVcmwnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgnY3VycmVudFVybCcsIHRvcC5sb2NhdGlvbi5ocmVmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UubG9hZERpc2NvdmVyeURvY3VtZW50QW5kVHJ5TG9naW4oKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd0Fub255bW91cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd0Fub255bW91cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5pbml0TG9naW5GbG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdOG7lW5nIGjhu6NwIGJp4bq/biBwb3NpdGlvblxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9yYWdlU2VydmljZS5nZXRJdGVtKCdteWl0ZW0nKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5maXJlRXZlbnQoJ1BPU0lUSU9OX0xPQURFRCcsIHRoaXMuX3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oJ215aXRlbScpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGfhu41pIGFwaSDEkeG7gyB04buVbmcgaOG7o3AgZOG7ryBsaXVlamUuLi5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZmlyZUV2ZW50KCdQT1NJVElPTl9MT0FERUQnLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5qZWN0Q29uZmlnKGNmZzogQXV0aENvbmZpZykge1xyXG4gICAgICAgIHRoaXMuX29hdXRoU2VydmljZS5jb25maWd1cmUoY2ZnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbmZpZ0F1dGhlbigpIHtcclxuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXV0aENvbmZpZygpO1xyXG4gICAgICAgIGNvbnN0IHR5cGVMb2dpbiA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRBdXRoZW50aWNhdGlvblR5cGUoKTtcclxuICAgICAgICBpZiAodHlwZUxvZ2luICYmIHR5cGVMb2dpbi5pbmNsdWRlcygnaW1wbGljaXQnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2ZnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY2ZnLnJlc3BvbnNlVHlwZSA9ICdjb2RlJztcclxuICAgICAgICAgICAgcmV0dXJuIGNmZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlTWVudUFjdGl2ZSh0b3ApIHtcclxuICAgICAgICB0aGlzLnNjcm9sbEJhck1lbnUuc2Nyb2xsVG9Ub3AodG9wKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWlja05vdGVEcm9wcGVkKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMucXVpY2tOb3RlQnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLl9zdG9yYWdlU2VydmljZS5zZXRJdGVtKCdxdWlja05vdGVCdExvY2F0aW9uJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBib3R0b206ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIDUwKSwgcmlnaHQ6ICh3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCAtIDUwKVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5xdWlja05vdGVNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZVN0YXJ0ZWQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLmZsYWdzLnF1aWNrTm90ZU1vdmluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcXVpY2tOb3RlUHJlc3MoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLmZsYWdzLnF1aWNrTm90ZVByZXNzaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnF1aWNrTm90ZVRvZ2dsZVN1YkJ1dHRvbnModHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2Uuc3Vic2NyaWJlT25jZShDb21DdHhDb25zdGFudHMuUk9PVC5CT0RZX01PVVNFX0RPV04sICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5xdWlja05vdGVUb2dnbGVTdWJCdXR0b25zKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBxdWlja05vdGVQcmVzc1VwKGV2ZW50KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmRhdGEuZmxhZ3MucXVpY2tOb3RlUHJlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZUFkZE5vdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLmZsYWdzLnF1aWNrTm90ZU1vdmluZ1xyXG4gICAgICAgICAgICAmJiAhdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5xdWlja05vdGVQcmVzc2luZykge1xyXG4gICAgICAgICAgICB0aGlzLnF1aWNrTm90ZVRvZ2dsZVN1YkJ1dHRvbnMoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRDb250ZXh0U2VydmljZS5kYXRhLm5vdGVEYXRhTW9kZWwgPSA8YW55PntcclxuICAgICAgICAgICAgICAgIGVkaXRGb3JtTW9kZWw6IDxhbnk+eyBzaG93UXVpY2tOb3RlRm9ybTogdHJ1ZSwgcG9wdXBTaXplOiA8YW55Pnt9LCBkYXRhOiA8YW55Pnt9IH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5lZGl0Rm9ybU1vZGVsLnNob3dRdWlja05vdGVGb3JtID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcXVpY2tOb3RlU2hvd0FsbE5vdGVzKCkge1xyXG4gICAgICAgIHRoaXMucXVpY2tOb3RlVG9nZ2xlU3ViQnV0dG9ucyhmYWxzZSk7XHJcbiAgICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSBgJHt0aGlzLmdldEFwcFN3aXRjaGVyVXJsKCd1c2VyJyl9L21haW4vcXVpY2stbm90ZWA7XHJcbiAgICB9XHJcblxyXG4gICAgcXVpY2tOb3RlU2hvd1NldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucXVpY2tOb3RlVG9nZ2xlU3ViQnV0dG9ucyhmYWxzZSk7XHJcbiAgICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSBgJHt0aGlzLmdldEFwcFN3aXRjaGVyVXJsKCd1c2VyJyl9L21haW4vcGVyc29uYWxpemVgO1xyXG4gICAgfVxyXG5cclxuICAgIHF1aWNrTm90ZVRvZ2dsZVN1YkJ1dHRvbnMoc2hvdykge1xyXG4gICAgICAgIGlmIChzaG93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQxLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSAnNTVweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Mi5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzEwMHB4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVpY2tOb3RlQnQxLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSAnNjVweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Mi5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzEyMHB4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5xdWlja05vdGVCdDEubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICc1cHgnO1xyXG4gICAgICAgICAgICB0aGlzLnF1aWNrTm90ZUJ0Mi5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzVweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBpbm5lZCBOb3RlXHJcbiAgICBnZXRQaW5uZWROb3RlcygpIHtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHBpbm5lZE5vdGVzRHJvcHBlZChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgncGlubmVkTm90ZXNMb2NhdGlvbicsIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgYm90dG9tOiAod2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSByZWN0LmhlaWdodCksXHJcbiAgICAgICAgICAgIGxlZnQ6IChyZWN0LmxlZnQpLFxyXG4gICAgICAgICAgICBtaW5pbWl6ZTogdGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5waW5uZWROb3Rlc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGlubmVkTm90ZXNTdGFydGVkKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Q29udGV4dFNlcnZpY2UuZGF0YS5mbGFncy5waW5uZWROb3Rlc01vdmluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcGlubmVkTm90ZXNNaW5pbWl6ZShkYXRhOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzID0gIWRhdGE7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBpbm5lZE5vdGVzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgncGlubmVkTm90ZXNMb2NhdGlvbicsIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgYm90dG9tOiAod2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSByZWN0LmhlaWdodCksXHJcbiAgICAgICAgICAgIGxlZnQ6IChyZWN0LmxlZnQpLFxyXG4gICAgICAgICAgICBtaW5pbWl6ZTogdGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5waW5uZWROb3RlRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5waW5uZWROb3Rlc01pbmltaXplU3RhdHVzID09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBpbm5lZE5vdGVEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3RlRGF0YVtrZXldLnRpdGxlUGFkZGluZ0JvdHRvbSA9ICcwcHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlubmVkTm90ZURhdGFba2V5XS5jb250ZW50RGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucGlubmVkTm90ZURhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZE5vdGVEYXRhW2tleV0udGl0bGVQYWRkaW5nQm90dG9tID0gJzZweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waW5uZWROb3RlRGF0YVtrZXldLmNvbnRlbnREaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1blBpbk5vdGUocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgcm93RGF0YS5pc1Bpbm5lZCA9IGZhbHNlO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wbGV0ZU5vdGUocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgcm93RGF0YS5pc0NvbXBsZXRlZCA9IHRydWU7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluQ29tcGxldGVOb3RlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHJvd0RhdGEuaXNDb21wbGV0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VUYWJXaW5kb3coKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Nsb3NlVGFiV2luZG93Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXBwU3dpdGNoZXJVcmwoYXBwQ29kZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SHR0cENsaWVudEVuZHBvaW50KGFwcENvZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWxpZmUtY3ljbGUtaW50ZXJmYWNlXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFsbCBzdWJzY3JpcHRpb25zXHJcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbGwubmV4dCgxKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudENvbnRleHRTZXJ2aWNlLmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5ERVNUUk9ZX1RBU0tfREVUQUlMX0NPTVBPTkVOVCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VhcmNoIG1lbnVcclxuICAgIG9uU2VhcmNoTWVudShldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoTWVudVJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5xdWVyeSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaE1lbnVSZXN1bHQgPSB0aGlzLmdldFNlYXJjaE1lbnVSZXN1bHQoZXZlbnQucXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlYXJjaE1lbnVSZXN1bHQoa2V5d29yZCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ3JvdXBTZWFyY2hNZW51UmVzdWx0KGtleXdvcmQsIHRoaXMubWVudU1vZGVsLCByZXN1bHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVncm91cFNlYXJjaE1lbnVSZXN1bHQoa2V5d29yZDogc3RyaW5nLCBsaXN0VG9HZXQ6IGFueVtdLCBsaXN0VG9QdXNoOiBhbnlbXSkge1xyXG4gICAgICAgIGxpc3RUb0dldC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdyb3VwU2VhcmNoTWVudVJlc3VsdChrZXl3b3JkLCBpdGVtLml0ZW1zLCBsaXN0VG9QdXNoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgodGhpcy5ub25BY2NlbnRWaWV0bmFtZXNlKGl0ZW0ubGFiZWwpLmluZGV4T2YodGhpcy5ub25BY2NlbnRWaWV0bmFtZXNlKGtleXdvcmQpKSA+PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgbGlzdFRvUHVzaC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5vbkFjY2VudFZpZXRuYW1lc2Uoc3RyKSB7XHJcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgLy8gICAgIFdlIGNhbiBhbHNvIHVzZSB0aGlzIGluc3RlYWQgb2YgZnJvbSBsaW5lIDExIHRvIGxpbmUgMTdcclxuICAgICAgICAvLyAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAwRTB8XFx1MDBFMXxcXHUxRUExfFxcdTFFQTN8XFx1MDBFM3xcXHUwMEUyfFxcdTFFQTd8XFx1MUVBNXxcXHUxRUFEfFxcdTFFQTl8XFx1MUVBQnxcXHUwMTAzfFxcdTFFQjF8XFx1MUVBRnxcXHUxRUI3fFxcdTFFQjN8XFx1MUVCNS9nLCBcImFcIik7XHJcbiAgICAgICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMEU4fFxcdTAwRTl8XFx1MUVCOXxcXHUxRUJCfFxcdTFFQkR8XFx1MDBFQXxcXHUxRUMxfFxcdTFFQkZ8XFx1MUVDN3xcXHUxRUMzfFxcdTFFQzUvZywgXCJlXCIpO1xyXG4gICAgICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDBFQ3xcXHUwMEVEfFxcdTFFQ0J8XFx1MUVDOXxcXHUwMTI5L2csIFwiaVwiKTtcclxuICAgICAgICAvLyAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAwRjJ8XFx1MDBGM3xcXHUxRUNEfFxcdTFFQ0Z8XFx1MDBGNXxcXHUwMEY0fFxcdTFFRDN8XFx1MUVEMXxcXHUxRUQ5fFxcdTFFRDV8XFx1MUVEN3xcXHUwMUExfFxcdTFFRER8XFx1MUVEQnxcXHUxRUUzfFxcdTFFREZ8XFx1MUVFMS9nLCBcIm9cIik7XHJcbiAgICAgICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHUwMEY5fFxcdTAwRkF8XFx1MUVFNXxcXHUxRUU3fFxcdTAxNjl8XFx1MDFCMHxcXHUxRUVCfFxcdTFFRTl8XFx1MUVGMXxcXHUxRUVEfFxcdTFFRUYvZywgXCJ1XCIpO1xyXG4gICAgICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MUVGM3xcXHUwMEZEfFxcdTFFRjV8XFx1MUVGN3xcXHUxRUY5L2csIFwieVwiKTtcclxuICAgICAgICAvLyAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAxMTEvZywgXCJkXCIpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/DoHzDoXzhuqF84bqjfMOjfMOifOG6p3zhuqV84bqtfOG6qXzhuqt8xIN84bqxfOG6r3zhurd84bqzfOG6tS9nLCAnYScpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/DqHzDqXzhurl84bq7fOG6vXzDqnzhu4F84bq/fOG7h3zhu4N84buFL2csICdlJyk7XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL8OsfMOtfOG7i3zhu4l8xKkvZywgJ2knKTtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvw7J8w7N84buNfOG7j3zDtXzDtHzhu5N84buRfOG7mXzhu5V84buXfMahfOG7nXzhu5t84bujfOG7n3zhu6EvZywgJ28nKTtcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvw7l8w7p84bulfOG7p3zFqXzGsHzhu6t84bupfOG7sXzhu6184buvL2csICd1Jyk7XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL+G7s3zDvXzhu7V84bu3fOG7uS9nLCAneScpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/EkS9nLCAnZCcpO1xyXG4gICAgICAgIC8vIFNvbWUgc3lzdGVtIGVuY29kZSB2aWV0bmFtZXNlIGNvbWJpbmluZyBhY2NlbnQgYXMgaW5kaXZpZHVhbCB1dGYtOCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAzMDB8XFx1MDMwMXxcXHUwMzAzfFxcdTAzMDl8XFx1MDMyMy9nLCAnJyk7IC8vIEh1eeG7gW4gc+G6r2MgaOG7j2kgbmfDoyBu4bq3bmdcclxuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDJDNnxcXHUwMzA2fFxcdTAzMUIvZywgJycpOyAvLyDDgiwgw4osIMSCLCDGoCwgxq9cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0TWVudVN1Z2dlc3Rpb24obWVudUl0ZW1PYmopIHtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybChtZW51SXRlbU9iai5yb3V0ZXJMaW5rKTtcclxuICAgICAgICB0aGlzLnNlYXJjaE1lbnVJbnB1dCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnNob3dQaW5uZWRNZW51ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25CbHVyU2VhcmNoTWVudUlucHV0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5pc1NlYXJjaE1lbnVJbnB1dEZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJblBpbm5lZE1lbnUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hNZW51SW5wdXQgPSAnJztcclxuICAgICAgICB0aGlzLnNob3dQaW5uZWRNZW51ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb2N1c1NlYXJjaE1lbnVJbnB1dChldmVudCkge1xyXG4gICAgICAgIHRoaXMuaXNTZWFyY2hNZW51SW5wdXRGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93UGlubmVkTWVudSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gICAgaGFuZGxlU2hvd1BvcHVwUGVybWlzc2lvblV0aWxzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMua2V5UHJlc3NQZXJtaXNzaW9uVXRpbHNbdGhpcy5jdXJyZW50S2V5UHJlc3NJbmRleF0gPT09IGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50S2V5UHJlc3NJbmRleCA9PSB0aGlzLmtleVByZXNzUGVybWlzc2lvblV0aWxzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEtleVByZXNzSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290RGF0YS5zaG93UGVybWlzc2lvblV0aWxzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRLZXlQcmVzc0luZGV4Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEtleVByZXNzSW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZEd1YXJkKHJvdXRlOiBSb3V0ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChyb3V0ZS5wYXRoID09PSAnJyB8fCByb3V0ZS5wYXRoID09PSAnLycpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJvdXRlLmxvYWRDaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgcm91dGUuY2FuQWN0aXZhdGVDaGlsZCA9IHJvdXRlLmNhbkFjdGl2YXRlQ2hpbGQgPyByb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkIDogW0dlbmVyaWNHdWFyZENoaWxkU2VydmljZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb3V0ZS5jYW5BY3RpdmF0ZSA9IHJvdXRlLmNhbkFjdGl2YXRlID8gcm91dGUuY2FuQWN0aXZhdGUgOiBbR2VuZXJpY0d1YXJkU2VydmljZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cInBhZ2VMb2FkZWRcIiBbc3R5bGUuZGlzcGxheV09XCJwYWdlTG9hZGVkID8gJycgOiAnbm9uZSdcIiBjbGFzcz1cImxheW91dC13cmFwcGVyXCJcclxuICAgIChjbGljayk9XCJfY29tbW9uU2VydmljZS5vbkxheW91dENsaWNrKClcIiBbbmdDbGFzc109XCJ7J21lbnUtbGF5b3V0LXN0YXRpYyc6ICFfY29tbW9uU2VydmljZS5pc092ZXJsYXkoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW51LWxheW91dC1vdmVybGF5JzogX2NvbW1vblNlcnZpY2UuaXNPdmVybGF5KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF5b3V0LW1lbnUtb3ZlcmxheS1hY3RpdmUnOiBfY29tbW9uU2VydmljZS5vdmVybGF5TWVudUFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW51LWxheW91dC1ob3Jpem9udGFsJzogX2NvbW1vblNlcnZpY2UuaXNIb3Jpem9udGFsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVudS1sYXlvdXQtc2xpbSc6IF9jb21tb25TZXJ2aWNlLmlzU2xpbSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xheW91dC1tZW51LXN0YXRpYy1kZXNrdG9wLWluYWN0aXZlJzogX2NvbW1vblNlcnZpY2Uuc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXlvdXQtbWVudS1zdGF0aWMtZGVza3RvcC1hY3RpdmUnOiAhX2NvbW1vblNlcnZpY2Uuc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXlvdXQtbWVudS1zdGF0aWMtbW9iaWxlLWluYWN0aXZlJzogIV9jb21tb25TZXJ2aWNlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF5b3V0LW1lbnUtc3RhdGljLW1vYmlsZS1hY3RpdmUnOiBfY29tbW9uU2VydmljZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xheW91dC1tZW51LXN0YXRpYy1pbmFjdGl2ZSc6IF9jb21tb25TZXJ2aWNlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF5b3V0LW1lbnUtc3RhdGljLWFjdGl2ZSc6IF9jb21tb25TZXJ2aWNlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmV9XCI+XHJcblxyXG4gICAgPGFwcC10b3BiYXIgKm5nSWY9XCJfZ2xvYmFsU2VydmljZS5nZXRIZWFkZXJTdGF0ZSgpXCI+PC9hcHAtdG9wYmFyPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJfZ2xvYmFsU2VydmljZS5nZXRNZW51U3RhdGUoKVwiIGNsYXNzPVwibGF5b3V0LW1lbnUtY29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2xheW91dC1tZW51LWRhcmsnOl9jb21tb25TZXJ2aWNlLmRhcmtNZW51fVwiIChjbGljayk9XCJfY29tbW9uU2VydmljZS5vbk1lbnVDbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgPGFwcC1yb290LW1lbnU+PC9hcHAtcm9vdC1tZW51PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtbWVudS1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8dG4tY3VzdG9tLXNjcm9sbGJhciAjc2Nyb2xsYmFyIFtzdHlsZV09XCJ7J3BhZGRpbmctdG9wJzogJzE2cHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1pbmxpbmUtcHJvZmlsZSAqbmdJZj1cIl9jb21tb25TZXJ2aWNlLnByb2ZpbGVNb2RlID09ICdpbmxpbmUnICYmIV9jb21tb25TZXJ2aWNlLmlzSG9yaXpvbnRhbCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC1pbmxpbmUtcHJvZmlsZT5cclxuICAgICAgICAgICAgICAgIDxhcHAtbWVudSBbYXV0b1JlbmRlck1lbnVdPVwiYXV0b1JlbmRlck1lbnVcIiBbcmVzZXRdPVwiX2NvbW1vblNlcnZpY2UucmVzZXRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAob25NZW51QWN0aXZlKT1cImhhbmRsZU1lbnVBY3RpdmUoJGV2ZW50KVwiPjwvYXBwLW1lbnU+XHJcbiAgICAgICAgICAgIDwvdG4tY3VzdG9tLXNjcm9sbGJhcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFyZWEgbGF5b3V0LW1lbnUtc2VhcmNoLWFyZWFcIj5cclxuICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFsobmdNb2RlbCldPVwic2VhcmNoTWVudUlucHV0XCIgW3N0eWxlXT1cInsnd2lkdGgnOicxMDAlJ31cIiBbc3VnZ2VzdGlvbnNdPVwic2VhcmNoTWVudVJlc3VsdFwiXHJcbiAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwib25TZWFyY2hNZW51KCRldmVudClcIiBbYXV0b0hpZ2hsaWdodF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVMOsbSBraeG6v20gY2jhu6ljIG7Eg25nJyB8IHRyYW5zbGF0ZVwiIFtkZWxheV09XCIyMDBcIiBbc2Nyb2xsSGVpZ2h0XT1cIic0MDBweCdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiBbcmVhZG9ubHldPVwiIShtZW51TW9kZWwgJiYgbWVudU1vZGVsLmxlbmd0aClcIlxyXG4gICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uU2VsZWN0TWVudVN1Z2dlc3Rpb24oJGV2ZW50KVwiIGZpZWxkPVwibGFiZWxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpbm5lckhUTUw9XCJ7eyBpdGVtLmxhYmVsIHwgaGlnaGxpZ2h0IDogc2VhcmNoTWVudUlucHV0fX1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zZWFyY2hcIj48aSBjbGFzcz1cInBpIHBpLXNlYXJjaFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IFtjbGFzc109XCInbGF5b3V0LW1haW4nXCIgW25nQ2xhc3NdPVwieyduby1oZWFkZXInOiBfZ2xvYmFsU2VydmljZS5nZXRIZWFkZXJTdGF0ZSgpID8gZmFsc2UgOiB0cnVlfVwiPlxyXG4gICAgICAgIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtbWFza1wiPjwvZGl2PlxyXG4gICAgPGRpdiAjcXVpY2tOb3RlQnQgKm5nSWY9XCIhb25seVNob3dNYWluQ29udGVudCAmJiBzaG93UXVpY2tOb3RlXCIgY2xhc3M9XCJxdWljay1ub3RlLWJ1dHRvbi1ob2xkZXJcIiBjZGtEcmFnXHJcbiAgICAgICAgY2RrRHJhZ0JvdW5kYXJ5PVwiLmxheW91dC13cmFwcGVyXCIgb25jb250ZXh0bWVudT1cInJldHVybiBmYWxzZVwiIChjZGtEcmFnRW5kZWQpPVwicXVpY2tOb3RlRHJvcHBlZCgkZXZlbnQpXCJcclxuICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwicXVpY2tOb3RlU3RhcnRlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGEgI3F1aWNrTm90ZUJ0MSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJhbGwtbm90ZS1idXR0b25cIiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwicXVpY2tOb3RlU2hvd0FsbE5vdGVzKClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3RpY2t5LW5vdGVcIj48L2k+PC9hPlxyXG4gICAgICAgIDxhICNxdWlja05vdGVCdDIgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwic2V0dGluZy1ub3RlLWJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIChjbGljayk9XCJxdWlja05vdGVTaG93U2V0dGluZ3MoKVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jb2dcIj48L2k+PC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAocHJlc3MpPVwicXVpY2tOb3RlUHJlc3MoJGV2ZW50KVwiIChwcmVzc3VwKT1cInF1aWNrTm90ZVByZXNzVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicXVpY2stbm90ZS1idXR0b25cIiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwicXVpY2tOb3RlQWRkTm90ZSgpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIj48L2k+PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNwaW5uZWROb3RlcyAqbmdJZj1cIiFvbmx5U2hvd01haW5Db250ZW50XCIgY2xhc3M9XCJwaW5uZWQtbm90ZXMtaG9sZGVyXCIgY2RrRHJhZyBjZGtEcmFnQm91bmRhcnk9XCIubGF5b3V0LXdyYXBwZXJcIlxyXG4gICAgICAgIG9uY29udGV4dG1lbnU9XCJyZXR1cm4gZmFsc2VcIiAoY2RrRHJhZ0VuZGVkKT1cInBpbm5lZE5vdGVzRHJvcHBlZCgkZXZlbnQpXCJcclxuICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwicGlubmVkTm90ZXNTdGFydGVkKCRldmVudClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGlubmVkLW5vdGVzIHVpLWdcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXNcIiBjbGFzcz1cInBpbm5lZC1ub3Rlcy1taW5pbWl6ZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpbm5lZE5vdGVzTWluaW1pemUocGlubmVkTm90ZXNNaW5pbWl6ZVN0YXR1cylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktd2luZG93LW1heGltaXplXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBpbm5lZE5vdGVzTWF4aW1pemVTdGF0dXNcIiBjbGFzcz1cIiBwaW5uZWQtbm90ZXMtbWluaW1pemUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwaW5uZWROb3Rlc01pbmltaXplKHBpbm5lZE5vdGVzTWluaW1pemVTdGF0dXMpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXdpbmRvdy1taW5pbWl6ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG5vdGUgb2YgcGlubmVkTm90ZURhdGFcIiBjbGFzcz1cInBpbm5lZC1ub3RlIHVpLWctMTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaW5uZWQtbm90ZS1oZWFkZXItbGluZVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIm5vdGUuY29sb3JDb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaW5uZWQtbm90ZS1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaW5uZWQtbm90ZS1saW5lLXRpdGxlXCIgW3N0eWxlLnBhZGRpbmdCb3R0b21dPVwibm90ZS50aXRsZVBhZGRpbmdCb3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpbm5lZC1ub3RlLWhlYWRlci1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaW5uZWQtbm90ZS1oZWFkZXItdGltZVwiPnt7bm90ZS5jcmVhdGVkIHwgZGF0ZTogJ2RkL01NJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvbGF5b3V0L2ltYWdlcy9pY28vdW5waW4tMS5pY29cIiBjbGFzcz1cInBpbm5lZC1ub3RlLWhlYWRlci1idXR0b24tdW5waW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1blBpbk5vdGUobm90ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIW5vdGUuaXNDb21wbGV0ZWRcIiBjbGFzcz1cImZhciBmYS1mbGFnIHBpbm5lZC1ub3RlLWhlYWRlci1idXR0b24tY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21wbGV0ZU5vdGUobm90ZSlcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIm5vdGUuaXNDb21wbGV0ZWRcIiBjbGFzcz1cImZhcyBmYS1mbGFnLWNoZWNrZXJlZCBwaW5uZWQtbm90ZS1oZWFkZXItYnV0dG9uLWNvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5Db21wbGV0ZU5vdGUobm90ZSlcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7bm90ZS5uYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpbm5lZC1ub3RlLWNvbnRlbnRzXCIgW3N0eWxlLmRpc3BsYXldPVwibm90ZS5jb250ZW50RGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgY29udGVudCBvZiBub3RlLmNvbnRlbnRzXCIgY2xhc3M9XCJwaW5uZWQtbm90ZS1saW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8cmVwb3J0LXF1ZXVlIFtoZWFkZXJdPVwiJ1h14bqldCBk4buvIGxp4buHdSdcIj5cclxuICAgIDwvcmVwb3J0LXF1ZXVlPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIndhaXRpbmctYm94XCIgW2NsYXNzLnNob3ddPVwid2FpdGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWxvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGRzLWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgeCBvZiBtZXNzYWdlV2FpdGluZ1wiPnt7eH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48cC10b2FzdCBbcG9zaXRpb25dPVwiJ3RvcC1yaWdodCdcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCI+PC9wLXRvYXN0PlxyXG48cC1jb25maXJtRGlhbG9nICNjZCBbY2xvc2FibGVdPVwiZmFsc2VcIj5cclxuICAgIDxwLWZvb3Rlcj5cclxuICAgICAgICA8YnV0dG9uICNva0J1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktY2hlY2tcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiIGxhYmVsPVwixJDhu5NuZyDDvVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJmb2N1c1RyYXAoJGV2ZW50LCBmYWxzZSlcIiAoY2xpY2spPVwiY2QuYWNjZXB0KClcIj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd1JlamVjdENvbmZpcm1cIiAjY2FuY2VsQnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIGljb249XCJwaSBwaS10aW1lc1wiIGxhYmVsPVwiQuG7jyBxdWFcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bi50YWIpPVwiZm9jdXNUcmFwKCRldmVudCwgdHJ1ZSlcIiAoY2xpY2spPVwiY2QucmVqZWN0KClcIj48L2J1dHRvbj5cclxuICAgIDwvcC1mb290ZXI+XHJcbjwvcC1jb25maXJtRGlhbG9nPlxyXG48IS0tIDx1c2VyLWFjdGlvbi1tYW5hZ2VyPjwvdXNlci1hY3Rpb24tbWFuYWdlcj4gLS0+XHJcbjxwZXJtaXNzaW9uLXV0aWxzICpuZ0lmPVwicm9vdERhdGEuc2hvd1Blcm1pc3Npb25VdGlsc1wiPjwvcGVybWlzc2lvbi11dGlscz5cclxuPG5nLXRlbXBsYXRlICNxdWVyeUJ1aWxkZXJVc2VyUGlja2VyIGxldC1jb250cm9sIGxldC1kaXNhYmxlZD1cImRpc2FibGVkXCIgbGV0LXF1ZXJ5PVwicXVlcnlcIiBsZXQtbXVsdGlwbGU9XCJtdWx0aXBsZVwiPlxyXG4gICAgPHVzZXItcGlja2VyIFtjb250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbXVsdGlwbGVdPVwiY29udHJvbC5tdWx0aXBsZVwiIFsobmdNb2RlbCldPVwicXVlcnkudmFsdWVcIj5cclxuICAgIDwvdXNlci1waWNrZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjcXVlcnlCdWlsZGVyQ29DYXVQaWNrZXIgbGV0LWNvbnRyb2wgbGV0LWRpc2FibGVkPVwiZGlzYWJsZWRcIiBsZXQtcXVlcnk9XCJxdWVyeVwiIGxldC1tdWx0aXBsZT1cIm11bHRpcGxlXCI+XHJcbiAgICA8Y29jYXV0b2NodWMtcGlja2VyLWxpc3QgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFsobmdNb2RlbCldPVwicXVlcnkudmFsdWVcIj5cclxuICAgIDwvY29jYXV0b2NodWMtcGlja2VyLWxpc3Q+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjcXVlcnlCdWlsZGVyQXV0b2NvbXBsZXRlUGlja2VyIGxldC1jb250cm9sIGxldC1kaXNhYmxlZD1cImRpc2FibGVkXCIgbGV0LXF1ZXJ5PVwicXVlcnlcIj5cclxuICAgIDxhdXRvY29tcGxldGUtcGlja2VyICpuZ1N3aXRjaENhc2U9XCInZ3JvdXB1c2VyJ1wiIFtjb250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwicXVlcnkudmFsdWVcIj5cclxuICAgIDwvYXV0b2NvbXBsZXRlLXBpY2tlcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbGlzdENvbmdWaWVjQ29uIGxldC1mb3JtU3RhdGU9XCJmb3JtU3RhdGVcIiBsZXQtbG9haURhbmhTYWNoPVwibG9haURhbmhTYWNoXCIgbGV0LWlkQ29uZ1ZpZWM9XCJpZENvbmdWaWVjXCI+XHJcbiAgICA8YmFzZS1jb25ndmllYyBbbG9hZERldGFpbEZyb21RdWVyeVBhcmFtXT1cImZhbHNlXCIgW2lzQ2hpbGRWaWV3XT1cInRydWVcIiBbZm9ybVN0YXRlXT1cImZvcm1TdGF0ZVwiXHJcbiAgICAgICAgW2xvYWlEYW5oU2FjaF09XCJsb2FpRGFuaFNhY2hcIiBbaWRDb25nVmllY109XCJpZENvbmdWaWVjXCI+XHJcbiAgICA8L2Jhc2UtY29uZ3ZpZWM+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0U2V0dGluZ1JvdyBsZXQtZW50aXR5TWV0YWRhdGFTZXJ2aWNlPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgbGV0LXBhcmVudENvbnRleHQ9XCJwYXJlbnRDb250ZXh0XCJcclxuICAgIGxldC1wYXJlbnRTZXR0aW5nPVwicGFyZW50U2V0dGluZ1wiIGxldC1wYXJlbnRNb2RlbD1cInBhcmVudE1vZGVsXCIgbGV0LW9uU2F2ZT1cIm9uU2F2ZVwiIGxldC1vbkNhbmNlbD1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8c2V0dGluZ3Mtcm93IFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwicGFyZW50Q29udGV4dFwiXHJcbiAgICAgICAgW3BhcmVudFNldHRpbmddPVwicGFyZW50U2V0dGluZ1wiIFtwYXJlbnRNb2RlbF09XCJwYXJlbnRNb2RlbFwiIChvblNhdmUpPVwib25TYXZlKCRldmVudClcIiAob25DYW5jZWwpPVwib25DYW5jZWxcIj5cclxuICAgIDwvc2V0dGluZ3Mtcm93PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0U2V0dGluZyBsZXQtZW50aXR5TWV0YWRhdGFTZXJ2aWNlPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgbGV0LXBhcmVudENvbnRleHQ9XCJwYXJlbnRDb250ZXh0XCJcclxuICAgIGxldC1wYXJlbnRTZXR0aW5nPVwicGFyZW50U2V0dGluZ1wiIGxldC1wYXJlbnRNb2RlbD1cInBhcmVudE1vZGVsXCIgbGV0LW9uU2F2ZT1cIm9uU2F2ZVwiIGxldC1vbkNhbmNlbD1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8c2V0dGluZ3MgW2VudGl0eU1ldGFkYXRhU2VydmljZV09XCJlbnRpdHlNZXRhZGF0YVNlcnZpY2VcIiBbcGFyZW50Q29udGV4dF09XCJwYXJlbnRDb250ZXh0XCJcclxuICAgICAgICBbcGFyZW50U2V0dGluZ109XCJwYXJlbnRTZXR0aW5nXCIgW3BhcmVudE1vZGVsXT1cInBhcmVudE1vZGVsXCIgKG9uU2F2ZSk9XCJvblNhdmUoJGV2ZW50KVwiIChvbkNhbmNlbCk9XCJvbkNhbmNlbFwiPlxyXG4gICAgPC9zZXR0aW5ncz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdEFkdmFuY2VTZWFyY2ggbGV0LXBhcmVudFNldHRpbmc9XCJwYXJlbnRTZXR0aW5nXCIgbGV0LXNlYXJjaEluZm89XCJzZWFyY2hJbmZvXCIgbGV0LWxvYWRpbmc9XCJsb2FkaW5nXCJcclxuICAgIGxldC1vblNlYXJjaD1cIm9uU2VhcmNoXCIgbGV0LW9uSW5pdD1cIm9uSW5pdFwiPlxyXG4gICAgPGFkdmFuY2Utc2VhcmNoIFtwYXJlbnRTZXR0aW5nXT1cInBhcmVudFNldHRpbmdcIiBbc2VhcmNoSW5mb109XCJzZWFyY2hJbmZvXCIgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICAgICAgKG9uU2VhcmNoKT1cIm9uU2VhcmNoKCRldmVudClcIiAob25Jbml0KT1cIm9uSW5pdCgkZXZlbnQpXCI+XHJcbiAgICA8L2FkdmFuY2Utc2VhcmNoPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0V29ya2Zsb3dTZXR0aW5nIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCIgbGV0LXBhcmVudFNldHRpbmc9XCJwYXJlbnRTZXR0aW5nXCJcclxuICAgIGxldC1vblNhdmVkPVwib25TYXZlZFwiPlxyXG4gICAgPHdvcmtmbG93LXNldHRpbmctbmV3ICNmb3JtQmFzZSBbcGFyZW50U2V0dGluZ109XCJwYXJlbnRTZXR0aW5nXCJcclxuICAgICAgICAob25Jbml0KT1cImRpYWxvZ01vZGVsLmJ1dHRvblRlbXBsYXRlID0gJGV2ZW50LmJ1dHRvblRlbXBsYXRlXCIgKG9uU2F2ZWQpPVwib25TYXZlZFwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3dvcmtmbG93LXNldHRpbmctbmV3PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0V29ya2Zsb3dIaXN0b3J5IGxldC1pdGVtIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCI+XHJcbiAgICA8d29ya2Zsb3ctaGlzdG9yeS1uZXcgI2Zvcm1CYXNlIFtidXNpbmVzc1NldHRpbmddPVwiZGlhbG9nTW9kZWwuZGF0YS5zZXR0aW5nXCJcclxuICAgICAgICBbdGFibGVOYW1lXT1cImRpYWxvZ01vZGVsLmRhdGEudGFibGVOYW1lXCIgW2l0ZW1dPVwiaXRlbVwiIFt3b3JrZmxvd1NldHRpbmddPVwiZGlhbG9nTW9kZWwuZGF0YS53b3JrZmxvd1NldHRpbmdcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC93b3JrZmxvdy1oaXN0b3J5LW5ldz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFN0YXJ0V29ya2Zsb3cgbGV0LWRpYWxvZ01vZGVsPVwiZGlhbG9nTW9kZWxcIiBsZXQtb25TYXZlZD1cIm9uU2F2ZWRcIj5cclxuICAgIDxzdGFydC13b3JrZmxvdyAjZm9ybUJhc2UgW3dvcmtmbG93c109XCJkaWFsb2dNb2RlbC5kYXRhLndvcmtmbG93c1wiXHJcbiAgICAgICAgW2RlZmF1bHRXb3JrZmxvd109XCJkaWFsb2dNb2RlbC5kYXRhLmRlZmF1bHRXb3JrZmxvd1wiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJkaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZSA9ICRldmVudC5idXR0b25UZW1wbGF0ZVwiIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiXHJcbiAgICAgICAgKG9uU2F2ZWQpPVwib25TYXZlZFwiPlxyXG4gICAgPC9zdGFydC13b3JrZmxvdz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdENob1lLaWVuIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCI+XHJcbiAgICA8Y2hvLXkta2llbi1mb3JtICNmb3JtQmFzZSBbYnVzc2luZXNzU2V0dGluZ109XCJkaWFsb2dNb2RlbC5kYXRhLnNldHRpbmdcIiBbcm93SXRlbV09XCJkaWFsb2dNb2RlbC5kYXRhLnJvd0RhdGFcIlxyXG4gICAgICAgIChvbkluaXQpPVwiZGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGUgPSAkZXZlbnQuYnV0dG9uVGVtcGxhdGVcIiAob25TYXZlZCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L2Noby15LWtpZW4tZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjcnVkTGlzdFByb2Nlc3NXb3JrZmxvdyBsZXQtaXRlbSBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiIGxldC1vblNhdmVkPVwib25TYXZlZFwiPlxyXG4gICAgPHByb2Nlc3Mtd29ya2Zsb3ctZm9ybSAjZm9ybUJhc2UgW2J1c2luZXNzU2V0dGluZ109XCJkaWFsb2dNb2RlbC5kYXRhLnNldHRpbmdcIiBbaXRlbV09XCJpdGVtXCJcclxuICAgICAgICBbd29ya2Zsb3ddPVwiZGlhbG9nTW9kZWwuZGF0YS53b3JrZmxvd1wiIFthY3Rpb25dPVwiZGlhbG9nTW9kZWwuZGF0YS5hY3Rpb25cIiAob25TYXZlZCk9XCJvblNhdmVkXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvcHJvY2Vzcy13b3JrZmxvdy1mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0Q29uZ1ZpZWMgbGV0LWJhc2VTZXJ2aWNlPVwiYmFzZVNlcnZpY2VcIiBsZXQtaXRlbUlkQXR0YWNoPVwiaXRlbUlkQXR0YWNoXCI+XHJcbiAgICA8YmFzZS1jb25ndmllYyBbc2VydmljZUNvZGVdPVwiYmFzZVNlcnZpY2Uuc2VydmljZUNvZGVcIiBbZW50aXR5XT1cImJhc2VTZXJ2aWNlLmVudGl0eU5hbWVcIlxyXG4gICAgICAgIFtpdGVtSWRBdHRhY2hdPVwiaXRlbUlkQXR0YWNoXCI+PC9iYXNlLWNvbmd2aWVjPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0Rm9ybUNvbmdWaWVjIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCIgbGV0LWlzRm9ybVZpZXc9XCJpc0Zvcm1WaWV3XCIgbGV0LWdldERhdGE9XCJnZXREYXRhXCI+XHJcbiAgICA8YmFzZS1jb25ndmllYy1mb3JtICNmb3JtQmFzZSBbcGFyZW50U2V0dGluZ109XCJkaWFsb2dNb2RlbC5kYXRhLmNvbmdWaWVjU2V0dGluZ1wiXHJcbiAgICAgICAgW21vZGVsXT1cImRpYWxvZ01vZGVsLmRhdGEuZm9ybU1vZGVsXCIgW2ZvcmNlT25seVZpZXddPVwiaXNGb3JtVmlld1wiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJkaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZSA9ICRldmVudC5idXR0b25UZW1wbGF0ZVwiXHJcbiAgICAgICAgKG9uU2F2ZWQpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7IGdldERhdGEoKVwiIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC9iYXNlLWNvbmd2aWVjLWZvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RQZXJtaXNzaW9uU2hhcmluZyBsZXQtaXRlbSBsZXQtYmFzZVNlcnZpY2U9XCJiYXNlU2VydmljZVwiIGxldC1kaWFsb2dNb2RlbD1cImRpYWxvZ01vZGVsXCI+XHJcbiAgICA8cGVybWlzc2lvbi1zaGFyaW5nICNmb3JtQmFzZSBbaXRlbV09XCJpdGVtXCIgW2Jhc2VTZXJ2aWNlXT1cImJhc2VTZXJ2aWNlXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvcGVybWlzc2lvbi1zaGFyaW5nPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0V29ya2Zsb3dQZXJtaXNzaW9uIGxldC1pdGVtIGxldC1idXNpbmVzc1NldHRpbmc9XCJidXNpbmVzc1NldHRpbmdcIiBsZXQtZGlhbG9nTW9kZWw9XCJkaWFsb2dNb2RlbFwiPlxyXG4gICAgPHdvcmtmbG93LXBlcm1pc3Npb24gI2Zvcm1CYXNlIFtpdGVtXT1cIml0ZW1cIiBbYnVzaW5lc3NTZXR0aW5nXT1cImJ1c2luZXNzU2V0dGluZ1wiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImRpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3dvcmtmbG93LXBlcm1pc3Npb24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RTaGFyZUxpbmtCeVBlcm1pc3Npb24gbGV0LXNldHRpbmc9XCJzZXR0aW5nXCIgbGV0LWRpYWxvZ01vZGVsPVwiZGlhbG9nTW9kZWxcIj5cclxuICAgIDxzaGFyZS1saW5rLWJ5LXBlcm1pc3Npb24gI2Zvcm1CYXNlIFtzZXR0aW5nXT1cInNldHRpbmdcIiBbbHN0SXRlbV09XCJkaWFsb2dNb2RlbC5kYXRhLmxzdEl0ZW1cIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC9zaGFyZS1saW5rLWJ5LXBlcm1pc3Npb24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZExpc3RGaWxlVXBsb2FkQ29sdW1uIGxldC1yb3dEYXRhIGxldC1wYXJlbnRDb250ZXh0PVwicGFyZW50Q29udGV4dFwiIGxldC1maWVsZD1cImZpZWxkXCJcclxuICAgIGxldC1maWxlU2V0dGluZz1cImZpbGVTZXR0aW5nXCI+XHJcbiAgICA8ZmlsZS11cGxvYWQgKm5nSWY9XCJmaWxlU2V0dGluZy5tb2RlID09IGZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWRcIlxyXG4gICAgICAgIFtzaGFyZWRGb2xkZXJUeXBlXT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuc2hhcmVkRm9sZGVyVHlwZVwiIFtyZWFkb25seV09XCJmaWxlU2V0dGluZy5jb250cm9sLnJlYWRvbmx5XCJcclxuICAgICAgICBbYWNjZXB0XT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuYWNjZXB0XCIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2ZpZWxkXVwiPlxyXG4gICAgPC9maWxlLXVwbG9hZD5cclxuICAgIDxzZXJ2aWNlLWZpbGUtdXBsb2FkICpuZ0lmPVwiZmlsZVNldHRpbmcuY29udHJvbC5tb2RlID09IGZpbGVVcGxvYWRNb2RlLnVzaW5nU2VydmljZUZpbGVcIlxyXG4gICAgICAgIFtzZXJ2aWNlQ29kZV09XCJmaWxlU2V0dGluZy5jb250cm9sLnNlcnZpY2VDb2RlXCIgW3BhcmVudENvbnRleHRdPVwicGFyZW50Q29udGV4dFwiXHJcbiAgICAgICAgW2VudGl0eV09XCJmaWxlU2V0dGluZy5jb250cm9sLmVudGl0eVwiIFtlbnRpdHlLZXldPVwicm93RGF0YVtmaWxlU2V0dGluZy5jb250cm9sLmVudGl0eUtleUZpZWxkXVwiXHJcbiAgICAgICAgW2NvbnRyb2xdPVwiZmlsZVNldHRpbmcuY29udHJvbFwiIFtmaWxlRGF0YVNlcnZpY2VdPVwiZmlsZVNldHRpbmcuY29udHJvbC5maWxlRGF0YVNlcnZpY2VcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YS5maWVsZFwiPlxyXG4gICAgPC9zZXJ2aWNlLWZpbGUtdXBsb2FkPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRMaXN0RmlsZU1hbmFnZXJDb2x1bW4gbGV0LXJvd0RhdGEgbGV0LWZpbGVTZXR0aW5nPVwiZmlsZVNldHRpbmdcIiBsZXQtZmllbGQ9XCJmaWVsZFwiPlxyXG4gICAgPGZpbGUtbWFuYWdlciBbY29udHJvbF09XCJmaWxlU2V0dGluZy5jb250cm9sXCIgW3NlcnZpY2VDb2RlXT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuc2VydmljZUNvZGVcIlxyXG4gICAgICAgIFtlbnRpdHldPVwiZmlsZVNldHRpbmcuY29udHJvbC5lbnRpdHlcIiBbZW50aXR5S2V5XT1cInJvd0RhdGFbZmlsZVNldHRpbmcuY29udHJvbC5lbnRpdHlLZXlGaWVsZF1cIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJmaWxlU2V0dGluZy5jb250cm9sLnJlYWRvbmx5XCIgW2xheW91dF09XCJmaWxlU2V0dGluZy5jb250cm9sLmxheW91dFwiXHJcbiAgICAgICAgW21heEZpbGVTaXplXT1cImZpbGVTZXR0aW5nLmNvbnRyb2wubWF4RmlsZVNpemVcIiBbaW5UYWlMaWV1XT1cImZpbGVTZXR0aW5nLmNvbnRyb2wuaW5UYWlMaWV1XCJcclxuICAgICAgICBbKHZhbHVlKV09XCJyb3dEYXRhW2ZpZWxkXVwiPlxyXG4gICAgPC9maWxlLW1hbmFnZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtVGFibGVEZXRhaWxGb3JtIGxldC1zY2hlbWEgbGV0LXBhcmVudFNldHRpbmc9XCJwYXJlbnRTZXR0aW5nXCIgbGV0LWRpYWxvZ01vZGVsPVwiZGlhbG9nTW9kZWxcIlxyXG4gICAgbGV0LW9uSW5pdD1cIm9uSW5pdFwiIGxldC1vblNhdmVkPVwib25TYXZlZFwiIGxldC1vbkNhbmNlbD1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8dGFibGUtZGV0YWlsLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRTZXR0aW5nXT1cInBhcmVudFNldHRpbmdcIiBbc2NoZW1hXT1cInNjaGVtYVwiIFtkYXRhXT1cImRpYWxvZ01vZGVsLmRhdGFcIlxyXG4gICAgICAgIChvbkluaXQpPVwiZGlhbG9nTW9kZWwuYnV0dG9uVGVtcGxhdGUgPSAkZXZlbnQuYnV0dG9uVGVtcGxhdGVcIiAob25TYXZlZCk9XCJvblNhdmVkXCIgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsXCI+XHJcbiAgICA8L3RhYmxlLWRldGFpbC1mb3JtPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtQ29uZ1ZpZWNGb3JtIGxldC1jb250cm9sPVwiY29udHJvbFwiPlxyXG4gICAgPGJhc2UtY29uZ3ZpZWMtZm9ybSBbY29udHJvbF09XCJjb250cm9sXCIgW3BhcmVudFNldHRpbmddPVwiY29uZ1ZpZWNTZXR0aW5nXCIgW3RlbkNvbmdWaWVjXT1cImNvbnRyb2wuZGF0YS50ZW5Db25nVmllY1wiPlxyXG4gICAgPC9iYXNlLWNvbmd2aWVjLWZvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZEZvcm1BZGRyZXNzQ29tcG9uZW50IGxldC1kYXRhIGxldC1jb250cm9sPVwiY29udHJvbFwiIGxldC1wYXJlbnRQYXRoPVwicGFyZW50UGF0aFwiXHJcbiAgICBsZXQtY2hlY2tEaXNhYmxlZD1cImNoZWNrRGlzYWJsZWRcIiBsZXQtaGFuZGxlTG9hZGVkQ29udHJvbD1cImhhbmRsZUxvYWRlZENvbnRyb2xcIlxyXG4gICAgbGV0LWhhbmRsZUZpZWxkVmFsdWVDaGFuZ2U9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlXCIgbGV0LWhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50PVwiaGFuZGxlQ29udHJvbFJlYWR5RXZlbnRcIj5cclxuICAgIDxhZGRyZXNzLXBpY2tlciBbY29udHJvbF09XCJjb250cm9sXCIgW3Nob3dTdWJMYWJlbF09XCJjb250cm9sLnNob3dTdWJMYWJlbFwiIFtkaXNhYmxlZF09XCJjaGVja0Rpc2FibGVkKGRhdGEsIGNvbnRyb2wpXCJcclxuICAgICAgICBbKGRhdGEpXT1cImRhdGFbY29udHJvbC5maWVsZF1cIiAob25Jbml0KT1cImhhbmRsZUxvYWRlZENvbnRyb2woJGV2ZW50LCBjb250cm9sLCBwYXJlbnRQYXRoKVwiXHJcbiAgICAgICAgKG9uU2VsZWN0KT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgJGV2ZW50LCBldmVudFR5cGUuQ0hBTkdFLCBkYXRhLCBwYXJlbnRQYXRoKVwiXHJcbiAgICAgICAgKG9uUmVhZHkpPVwiaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aClcIj5cclxuICAgIDwvYWRkcmVzcy1waWNrZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZEZvcm1GaWxlTWFuYWdlckNvbXBvbmVudCBsZXQtZGF0YSBsZXQtY29udHJvbD1cImNvbnRyb2xcIiBsZXQtcGFyZW50UGF0aD1cInBhcmVudFBhdGhcIlxyXG4gICAgbGV0LWNoZWNrRGlzYWJsZWQ9XCJjaGVja0Rpc2FibGVkXCIgbGV0LWhhbmRsZUxvYWRlZENvbnRyb2w9XCJoYW5kbGVMb2FkZWRDb250cm9sXCJcclxuICAgIGxldC1oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZVwiIGxldC1oYW5kbGVDb250cm9sUmVhZHlFdmVudD1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50XCI+XHJcbiAgICA8ZmlsZS1tYW5hZ2VyIFtjb250cm9sXT1cImNvbnRyb2xcIiBbc2VydmljZUNvZGVdPVwiY29udHJvbC5zZXJ2aWNlQ29kZVwiIFtlbnRpdHldPVwiY29udHJvbC5lbnRpdHlcIlxyXG4gICAgICAgIFtlbnRpdHlLZXldPVwiY29udHJvbC5lbnRpdHlLZXkgPyBjb250cm9sLmVudGl0eUtleSA6IGRhdGFbY29udHJvbC5lbnRpdHlLZXlGaWVsZF1cIiBbcmVhZG9ubHldPVwiY29udHJvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgW2xheW91dF09XCJjb250cm9sLmxheW91dFwiIFttYXhGaWxlU2l6ZV09XCJjb250cm9sLm1heEZpbGVTaXplXCIgW2luVGFpTGlldV09XCJjb250cm9sLmluVGFpTGlldVwiXHJcbiAgICAgICAgW2luVGFpTGlldUNodW5nXT1cImNvbnRyb2wuaW5UYWlMaWV1Q2h1bmdcIiBbY29weVRvRm9sZGVySWRdPVwiY29udHJvbC5jb3B5VG9Gb2xkZXJJZFwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlU2l6ZU1lc3NhZ2VTdW1tYXJ5XT1cImNvbnRyb2wuaW52YWxpZEZpbGVTaXplTWVzc2FnZVN1bW1hcnlcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVNpemVNZXNzYWdlRGV0YWlsXT1cImNvbnRyb2wuaW52YWxpZEZpbGVTaXplTWVzc2FnZURldGFpbFwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlVHlwZU1lc3NhZ2VTdW1tYXJ5XT1cImNvbnRyb2wuaW52YWxpZEZpbGVUeXBlTWVzc2FnZVN1bW1hcnlcIlxyXG4gICAgICAgIFtpbnZhbGlkRmlsZVR5cGVNZXNzYWdlRGV0YWlsXT1cImNvbnRyb2wuaW52YWxpZEZpbGVUeXBlTWVzc2FnZURldGFpbFwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlTGltaXRNZXNzYWdlU3VtbWFyeV09XCJjb250cm9sLmludmFsaWRGaWxlTGltaXRNZXNzYWdlU3VtbWFyeVwiXHJcbiAgICAgICAgW2ludmFsaWRGaWxlTGltaXRNZXNzYWdlRGV0YWlsXT1cImNvbnRyb2wuaW52YWxpZEZpbGVMaW1pdE1lc3NhZ2VEZXRhaWxcIiBbKHZhbHVlKV09XCJkYXRhW2NvbnRyb2wuZmllbGRdXCJcclxuICAgICAgICAob25TZWxlY3RlZCk9XCJjb250cm9sLm9uU2VsZWN0ZWQoJGV2ZW50KVwiIChvbkluaXQpPVwiaGFuZGxlTG9hZGVkQ29udHJvbCgkZXZlbnQsIGNvbnRyb2wsIHBhcmVudFBhdGgpXCJcclxuICAgICAgICAob25DaGFuZ2VkKT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgJGV2ZW50LCBldmVudFR5cGUuQ0hBTkdFLCBkYXRhLCBwYXJlbnRQYXRoKVwiXHJcbiAgICAgICAgKG9uUmVhZHkpPVwiaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aClcIj5cclxuICAgIDwvZmlsZS1tYW5hZ2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtU2VydmljZUZpbGVVcGxvYWRDb21wb25lbnQgbGV0LWRhdGEgbGV0LWNvbnRyb2w9XCJjb250cm9sXCIgbGV0LXBhcmVudFBhdGg9XCJwYXJlbnRQYXRoXCJcclxuICAgIGxldC1wYXJlbnRDb250ZXh0PVwicGFyZW50Q29udGV4dFwiIGxldC1jaGVja0Rpc2FibGVkPVwiY2hlY2tEaXNhYmxlZFwiIGxldC1oYW5kbGVMb2FkZWRDb250cm9sPVwiaGFuZGxlTG9hZGVkQ29udHJvbFwiXHJcbiAgICBsZXQtaGFuZGxlRmllbGRWYWx1ZUNoYW5nZT1cImhhbmRsZUZpZWxkVmFsdWVDaGFuZ2VcIiBsZXQtaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQ9XCJoYW5kbGVDb250cm9sUmVhZHlFdmVudFwiPlxyXG4gICAgPHNlcnZpY2UtZmlsZS11cGxvYWQgW3BhcmVudENvbnRleHRdPVwicGFyZW50Q29udGV4dFwiIFtzZXJ2aWNlQ29kZV09XCJjb250cm9sLnNlcnZpY2VDb2RlXCIgW2VudGl0eV09XCJjb250cm9sLmVudGl0eVwiXHJcbiAgICAgICAgW2VudGl0eUtleV09XCJkYXRhW2NvbnRyb2wuZW50aXR5S2V5RmllbGRdXCIgW2NvbnRyb2xdPVwiY29udHJvbFwiIFsobmdNb2RlbCldPVwiZGF0YVtjb250cm9sLmZpZWxkXVwiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJoYW5kbGVMb2FkZWRDb250cm9sKCRldmVudCwgY29udHJvbCwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvbkNoYW5nZWQpPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCAkZXZlbnQsIGV2ZW50VHlwZS5DSEFOR0UsIGRhdGEsIHBhcmVudFBhdGgpXCI+XHJcbiAgICA8L3NlcnZpY2UtZmlsZS11cGxvYWQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3J1ZEZvcm1Db25nVmllY1BpY2tlckNvbXBvbmVudCBsZXQtZGF0YSBsZXQtY29udHJvbD1cImNvbnRyb2xcIiBsZXQtcGFyZW50UGF0aD1cInBhcmVudFBhdGhcIlxyXG4gICAgbGV0LWNoZWNrRGlzYWJsZWQ9XCJjaGVja0Rpc2FibGVkXCIgbGV0LWhhbmRsZUxvYWRlZENvbnRyb2w9XCJoYW5kbGVMb2FkZWRDb250cm9sXCJcclxuICAgIGxldC1oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZVwiIGxldC1oYW5kbGVDb250cm9sUmVhZHlFdmVudD1cImhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50XCI+XHJcbiAgICA8Y29uZ3ZpZWMtcGlja2VyIFtjb250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiY2hlY2tEaXNhYmxlZChkYXRhLCBjb250cm9sKVwiIFtyZXF1aXJlZF09XCJjb250cm9sLnJlcXVpcmVkXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFbY29udHJvbC5maWVsZF1cIiAob25Jbml0KT1cImhhbmRsZUxvYWRlZENvbnRyb2woJGV2ZW50LCBjb250cm9sLCBwYXJlbnRQYXRoKVwiXHJcbiAgICAgICAgKG9uQ2hhbmdlZCk9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsICRldmVudCwgZXZlbnRUeXBlLkNIQU5HRSwgZGF0YSwgcGFyZW50UGF0aClcIj5cclxuICAgIDwvY29uZ3ZpZWMtcGlja2VyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NydWRGb3JtVmFuQmFuUGlja2VyQ29tcG9uZW50IGxldC1kYXRhIGxldC1jb250cm9sPVwiY29udHJvbFwiIGxldC1wYXJlbnRQYXRoPVwicGFyZW50UGF0aFwiXHJcbiAgICBsZXQtY2hlY2tEaXNhYmxlZD1cImNoZWNrRGlzYWJsZWRcIiBsZXQtaGFuZGxlTG9hZGVkQ29udHJvbD1cImhhbmRsZUxvYWRlZENvbnRyb2xcIlxyXG4gICAgbGV0LWhhbmRsZUZpZWxkVmFsdWVDaGFuZ2U9XCJoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlXCIgbGV0LWhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50PVwiaGFuZGxlQ29udHJvbFJlYWR5RXZlbnRcIj5cclxuICAgIDx2YW5iYW4tcGlja2VyIFtjb250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiY2hlY2tEaXNhYmxlZChkYXRhLCBjb250cm9sKVwiIFtyZXF1aXJlZF09XCJjb250cm9sLnJlcXVpcmVkXCJcclxuICAgICAgICBbcmVhZE9ubHldPVwiY29udHJvbC5yZWFkT25seVwiIFtsb2FpVmFuQmFuXT1cImNvbnRyb2wubG9haVZhbkJhblwiIFsobmdNb2RlbCldPVwiZGF0YVtjb250cm9sLmZpZWxkXVwiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJoYW5kbGVMb2FkZWRDb250cm9sKCRldmVudCwgY29udHJvbCwgcGFyZW50UGF0aClcIlxyXG4gICAgICAgIChvbkNoYW5nZWQpPVwiaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCAkZXZlbnQsIGV2ZW50VHlwZS5DSEFOR0UsIGRhdGEsIHBhcmVudFBhdGgpXCI+XHJcbiAgICA8L3ZhbmJhbi1waWNrZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RpbnlNY2VGaWxlUGlja2VyRGlhbG9nIGxldC1wYXJlbnRNb2RlbD1cInBhcmVudE1vZGVsXCIgbGV0LXBhcmVudENvbnRleHQ9XCJwYXJlbnRDb250ZXh0XCJcclxuICAgIGxldC1jbG9zZUZvcm09XCJjbG9zZUZvcm1cIiBsZXQtb25DYW5jZWw9XCJvbkNhbmNlbFwiIGxldC1vbkNoYW5nZWQ9XCJvbkNoYW5nZWRcIj5cclxuICAgIDxmaWxlLXBpY2tlci1kaWFsb2cgI2Zvcm1CYXNlIFtwYXJlbnRNb2RlbF09XCJwYXJlbnRNb2RlbFwiIFtwYXJlbnRDb250ZXh0XT1cInBhcmVudENvbnRleHRcIiAoY2xvc2VGb3JtKT1cImNsb3NlRm9ybVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsXCIgKG9uQ2hhbmdlZCk9XCJvbkNoYW5nZWRcIj5cclxuICAgIDwvZmlsZS1waWNrZXItZGlhbG9nPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3RpbnlNY2VBZGROZXdzIGxldC1sYW5ndWFnZUNvZGU9XCJsYW5ndWFnZUNvZGVcIiBsZXQtc2hvd0NoYW5nZT1cInNob3dDaGFuZ2VcIj5cclxuICAgIDxhZGQtbmV3cyAjbGlzdEJhc2UgW2xhbmd1YWdlQ29kZV09XCJsYW5ndWFnZUNvZGVcIiAoc2hvd0NoYW5nZSk9XCJzaG93Q2hhbmdlKCRldmVudClcIj48L2FkZC1uZXdzPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blF1aWNrQWRkRm9ybSBsZXQtZGlhbG9nTW9kZWwgbGV0LXBhcmVudE1vZGVsPVwicGFyZW50TW9kZWxcIiBsZXQtcGFyZW50Q29udGV4dD1cInBhcmVudENvbnRleHRcIlxyXG4gICAgbGV0LWNvbnRyb2w9XCJjb250cm9sXCIgbGV0LW9uU2F2ZWQ9XCJvblNhdmVkXCIgbGV0LW9uQ2FuY2VsPVwib25DYW5jZWxcIj5cclxuICAgIDxxdWljay1hZGQtZm9ybSAjZm9ybUJhc2UgW3BhcmVudE1vZGVsXT1cInBhcmVudE1vZGVsXCIgW3BhcmVudENvbnRleHRdPVwicGFyZW50Q29udGV4dFwiXHJcbiAgICAgICAgW21vZGVsXT1cImRpYWxvZ01vZGVsLmRhdGEuZm9ybU1vZGVsXCIgW2NvbnRyb2xdPVwiY29udHJvbFwiIFtiYXNlU2VydmljZV09XCJjb250cm9sLmJhc2VTZXJ2aWNlXCJcclxuICAgICAgICAob25Jbml0KT1cImRpYWxvZ01vZGVsLmJ1dHRvblRlbXBsYXRlID0gJGV2ZW50LmJ1dHRvblRlbXBsYXRlXCIgKG9uU2F2ZWQpPVwib25TYXZlZFwiIChvbkNhbmNlbCk9XCJvbkNhbmNlbFwiPlxyXG4gICAgPC9xdWljay1hZGQtZm9ybT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blNldHRpbmdGb3JtIGxldC1kaWFsb2dNb2RlbCBsZXQtb25TYXZlZD1cIm9uU2F2ZWRcIj5cclxuICAgIDxkcm9wZG93bi1zZXR0aW5nLWZvcm0gI2Zvcm1CYXNlIFttb2RlbF09XCJkaWFsb2dNb2RlbC5kYXRhLmZvcm1Nb2RlbFwiXHJcbiAgICAgICAgKG9uSW5pdCk9XCJkaWFsb2dNb2RlbC5idXR0b25UZW1wbGF0ZSA9ICRldmVudC5idXR0b25UZW1wbGF0ZVwiIChvblNhdmVkKT1cIm9uU2F2ZWRcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJkaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPC9kcm9wZG93bi1zZXR0aW5nLWZvcm0+XHJcbjwvbmctdGVtcGxhdGU+Il19