ngx-bimplus-components 0.0.159-29471-1 → 0.0.160

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 (158) hide show
  1. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +5 -40
  2. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +2 -5
  3. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +5 -5
  4. package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +3 -3
  5. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +7 -115
  6. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
  7. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +1 -1
  8. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
  9. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +3 -3
  10. package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +3 -3
  11. package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +32 -12
  12. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +3 -3
  13. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
  14. package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +7 -3
  15. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +4 -42
  16. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.interface.mjs +2 -4
  17. package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +8 -31
  18. package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +8 -34
  19. package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +1 -1
  20. package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +6 -48
  21. package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
  22. package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +10 -54
  23. package/esm2022/public-api.mjs +1 -22
  24. package/fesm2022/ngx-bimplus-components.mjs +112 -4329
  25. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  26. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +3 -14
  27. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +1 -7
  28. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.d.ts +3 -16
  29. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.d.ts +0 -4
  30. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
  31. package/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.d.ts +3 -3
  32. package/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.d.ts +7 -5
  33. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +12 -12
  34. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
  35. package/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.d.ts +1 -0
  36. package/lib/components/bimplus-object-structure/bimplus-object-structure.component.d.ts +1 -5
  37. package/lib/components/bimplus-object-structure/bimplus-object-structure.interface.d.ts +0 -2
  38. package/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.d.ts +1 -8
  39. package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +1 -11
  40. package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
  41. package/lib/components/object-properties-header/object-properties-header.component.d.ts +4 -13
  42. package/lib/components/object-properties-header/object-properties-header.interface.d.ts +0 -8
  43. package/lib/components/resizable-panel/resizable-panel.component.d.ts +3 -12
  44. package/package.json +4 -12
  45. package/public-api.d.ts +0 -21
  46. package/assets/images/default/Attachment_18_gray.svg +0 -1
  47. package/assets/images/default/Attachment_18_maincolor.svg +0 -3
  48. package/assets/images/default/Attachmentlink_18_gray.svg +0 -7
  49. package/assets/images/default/Attachmentlink_18_maincolor.svg +0 -7
  50. package/assets/images/default/Comments_18_gray.svg +0 -1
  51. package/assets/images/default/Comments_18_maincolor.svg +0 -4
  52. package/assets/images/default/Links_18_gray.svg +0 -1
  53. package/assets/images/default/Links_18_maincolor.svg +0 -4
  54. package/assets/images/default/Refresh_18_gray.svg +0 -1
  55. package/assets/images/default/bimplus_WebIcons_Cross_Disabled.svg +0 -1
  56. package/assets/images/default/ic_models.svg +0 -3
  57. package/assets/images/default/ic_models_maincolor.svg +0 -3
  58. package/assets/images/default/icn_grid_attachments.png +0 -0
  59. package/assets/images/default/icn_grid_hyperlinks.png +0 -0
  60. package/assets/images/default/progress-spinner.svg +0 -1
  61. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +0 -114
  62. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +0 -38
  63. package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +0 -95
  64. package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +0 -32
  65. package/esm2022/lib/components/bimplus-comment/IComment.mjs +0 -2
  66. package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +0 -118
  67. package/esm2022/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.mjs +0 -64
  68. package/esm2022/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.mjs +0 -161
  69. package/esm2022/lib/components/bimplus-input-number/bimplus-input-number.component.mjs +0 -85
  70. package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +0 -92
  71. package/esm2022/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.mjs +0 -78
  72. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +0 -385
  73. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.mjs +0 -3
  74. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.mjs +0 -104
  75. package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +0 -2
  76. package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +0 -77
  77. package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +0 -83
  78. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.component.mjs +0 -35
  79. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.service.mjs +0 -35
  80. package/esm2022/lib/components/bimplus-status-bar/statusBar.mjs +0 -2
  81. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +0 -38
  82. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +0 -10
  83. package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +0 -89
  84. package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +0 -33
  85. package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +0 -83
  86. package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +0 -128
  87. package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +0 -373
  88. package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +0 -145
  89. package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +0 -36
  90. package/esm2022/lib/components/object-preview/object-preview.component.mjs +0 -284
  91. package/esm2022/lib/components/object-preview/object-preview.interface.mjs +0 -2
  92. package/esm2022/lib/components/object-properties/object-properties.component.mjs +0 -536
  93. package/esm2022/lib/components/object-properties/object-properties.interface.mjs +0 -2
  94. package/esm2022/lib/components/object-properties/object-properties.service.mjs +0 -26
  95. package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +0 -124
  96. package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +0 -55
  97. package/esm2022/lib/pipes/bit-converter.pipe.mjs +0 -46
  98. package/esm2022/lib/pipes/get-attribute-value-as-string.pipe.mjs +0 -173
  99. package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +0 -162
  100. package/esm2022/lib/pipes/round.pipe.mjs +0 -20
  101. package/esm2022/lib/services/decorators.service.mjs +0 -65
  102. package/esm2022/lib/utils/objectProperties.mjs +0 -9
  103. package/esm2022/lib/validators/double-enum.validator.mjs +0 -17
  104. package/esm2022/lib/validators/double.validator.mjs +0 -23
  105. package/esm2022/lib/validators/guid-enum.validator.mjs +0 -17
  106. package/esm2022/lib/validators/guid.validator.mjs +0 -11
  107. package/esm2022/lib/validators/integer.validator.mjs +0 -20
  108. package/esm2022/lib/validators/string-combobox.validator.mjs +0 -17
  109. package/esm2022/lib/validators/string-enum.validator.mjs +0 -17
  110. package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +0 -39
  111. package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +0 -33
  112. package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +0 -30
  113. package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +0 -8
  114. package/lib/components/bimplus-comment/IComment.d.ts +0 -4
  115. package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +0 -39
  116. package/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.d.ts +0 -18
  117. package/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.d.ts +0 -41
  118. package/lib/components/bimplus-input-number/bimplus-input-number.component.d.ts +0 -26
  119. package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +0 -28
  120. package/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.d.ts +0 -22
  121. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +0 -87
  122. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.d.ts +0 -10
  123. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.d.ts +0 -20
  124. package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +0 -11
  125. package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +0 -29
  126. package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +0 -24
  127. package/lib/components/bimplus-status-bar/bimplus-status-bar.component.d.ts +0 -14
  128. package/lib/components/bimplus-status-bar/bimplus-status-bar.service.d.ts +0 -14
  129. package/lib/components/bimplus-status-bar/statusBar.d.ts +0 -4
  130. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +0 -16
  131. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +0 -18
  132. package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +0 -36
  133. package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +0 -15
  134. package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +0 -24
  135. package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +0 -42
  136. package/lib/components/links-to-documents/links-to-documents.component.d.ts +0 -68
  137. package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +0 -32
  138. package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +0 -15
  139. package/lib/components/object-preview/object-preview.component.d.ts +0 -45
  140. package/lib/components/object-preview/object-preview.interface.d.ts +0 -5
  141. package/lib/components/object-properties/object-properties.component.d.ts +0 -78
  142. package/lib/components/object-properties/object-properties.interface.d.ts +0 -22
  143. package/lib/components/object-properties/object-properties.service.d.ts +0 -12
  144. package/lib/components/object-properties-group/object-properties-group.component.d.ts +0 -29
  145. package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +0 -14
  146. package/lib/pipes/bit-converter.pipe.d.ts +0 -17
  147. package/lib/pipes/get-attribute-value-as-string.pipe.d.ts +0 -35
  148. package/lib/pipes/get-attribute-value.pipe.d.ts +0 -35
  149. package/lib/pipes/round.pipe.d.ts +0 -7
  150. package/lib/services/decorators.service.d.ts +0 -12
  151. package/lib/utils/objectProperties.d.ts +0 -2
  152. package/lib/validators/double-enum.validator.d.ts +0 -2
  153. package/lib/validators/double.validator.d.ts +0 -2
  154. package/lib/validators/guid-enum.validator.d.ts +0 -2
  155. package/lib/validators/guid.validator.d.ts +0 -2
  156. package/lib/validators/integer.validator.d.ts +0 -2
  157. package/lib/validators/string-combobox.validator.d.ts +0 -2
  158. package/lib/validators/string-enum.validator.d.ts +0 -2
@@ -1,373 +0,0 @@
1
- import { Component, ViewEncapsulation, Input, booleanAttribute, Output, EventEmitter } from '@angular/core';
2
- import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
3
- import { TranslateModule } from '@ngx-translate/core';
4
- import { from, BehaviorSubject, switchMap, forkJoin } from 'rxjs';
5
- import { concatMap } from 'rxjs/operators';
6
- import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
7
- import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
8
- import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
9
- import * as WebClient from 'bimplus-webclient';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@ngx-translate/core";
12
- import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
13
- import * as i3 from "../../services/decorators.service";
14
- export const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';
15
- export const postAttachmentLinks = (newAttachmentIDs, objectId, api) => {
16
- // Create an array of observables for each post request
17
- const postRequests = newAttachmentIDs.map((id) => from(api.objects.postAttachmentLink(objectId, JSON.stringify({ attachmentId: id }))));
18
- // Use forkJoin to wait for all post requests to complete in parallel
19
- return forkJoin(postRequests)
20
- .pipe(
21
- // After all posts are complete, switch to the next call to get updated links
22
- concatMap(() => from(api.objects.getAttachmentLinks(objectId))));
23
- };
24
- export class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent {
25
- constructor(translateService, dialogService, renderer, el, decorators) {
26
- super(translateService);
27
- this.dialogService = dialogService;
28
- this.renderer = renderer;
29
- this.el = el;
30
- this.decorators = decorators;
31
- this._rootObjectId = "";
32
- this.isDestroyed = false;
33
- this.localWormHole = true;
34
- //When is true then it means the creation of link is in progress
35
- this.inProgress = false;
36
- this.canCreateAttachmentLink = true;
37
- /** Input Attribute to specify if should show only list of attachments. */
38
- this.listOnly = false;
39
- /** Input Attribute to specify if should show message when no attachments found. */
40
- this.showEmptyMessage = true;
41
- /** Input Attribute to tell if show/hide attachemt size information. */
42
- this.hideAttachmentSize = false;
43
- this._attachments = [];
44
- this.attachmentsChange = new EventEmitter();
45
- this.attachmentsLinkChange = new EventEmitter();
46
- this.canDeleteAttachmentLink = true;
47
- this.project = null;
48
- this.wormholeSelector = "localEmbeddedModalId"; // calling application can provide a place where the iframe for documents selection will be rendered
49
- this.env = 'dev';
50
- this._currentObjectId$ = new BehaviorSubject("");
51
- this._attachmentCount = 0;
52
- this.buttonRowItems = [
53
- {
54
- id: "add-documents",
55
- title: this.translateService.instant('_Add_document'),
56
- tooltip: this.translateService.instant('_Add_document'),
57
- disabled: !this.canCreateAttachmentLink,
58
- buttonStyle: 'primary'
59
- }
60
- ];
61
- this.documentSelection = null;
62
- this.isOpened = false;
63
- this.embeddedModalContainer = 'embedded-modal';
64
- this.shadowRootElement = this.el.nativeElement.shadowRoot;
65
- }
66
- set attachments(value) {
67
- this._attachments = value;
68
- this.onAttachmentsChange();
69
- }
70
- get attachments() {
71
- return this._attachments;
72
- }
73
- onAttachmentsChange() {
74
- if (this.api && this.rootObjectId) {
75
- this._attachments = this.decorateAttachmentLinks(this.api, this._attachments);
76
- }
77
- }
78
- set rootObjectId(id) {
79
- if (!id) {
80
- return;
81
- }
82
- this._currentObjectId$.next(id);
83
- this._rootObjectId = id;
84
- }
85
- get rootObjectId() {
86
- return this._rootObjectId;
87
- }
88
- ngOnInit() {
89
- if (!this.listOnly) {
90
- this._currentObjectId$.subscribe({
91
- next: (id) => {
92
- this._createAttachmentLinkStructure(id);
93
- }
94
- });
95
- }
96
- }
97
- ;
98
- ngOnDestroy() {
99
- this.isDestroyed = true;
100
- }
101
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
102
- decorateAttachmentId(item) {
103
- const it = {
104
- id: item.id,
105
- name: item.name,
106
- nameShort: item.name,
107
- url: '',
108
- iconClass: '',
109
- iconTitle: '',
110
- type: 'AttachmentLink',
111
- deleteButtonTitle: ''
112
- };
113
- return it;
114
- }
115
- decorateAttachmentLinks(api, links) {
116
- const decoratedLinks = links.map((link) => this.decorators.decorateLink(api, link, [this._currentObjectId$.value]));
117
- decoratedLinks.sort((a, b) => {
118
- if (a.fileName.toLowerCase() < b.fileName.toLowerCase())
119
- return -1;
120
- if (a.fileName.toLowerCase() > b.fileName.toLowerCase())
121
- return 1;
122
- return 0;
123
- });
124
- return decoratedLinks;
125
- }
126
- _createAttachmentLinkStructure(objectId) {
127
- this._loadAttachmentLinkStructure(objectId)?.subscribe({
128
- next: (structureData) => {
129
- if (structureData) {
130
- //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);
131
- this._attachmentCount = structureData?.length;
132
- if (this.api) {
133
- const retval = this.decorateAttachmentLinks(this.api, structureData);
134
- if (retval) {
135
- this._attachments = retval;
136
- }
137
- }
138
- }
139
- }
140
- });
141
- }
142
- _loadAttachmentLinkStructure(objectId) {
143
- if (!this.api) {
144
- return;
145
- }
146
- if (!objectId) {
147
- return;
148
- }
149
- return from(this.api.objects.getAttachmentLinks(objectId));
150
- }
151
- // show or hide embedded modal
152
- setModalVisibility(opened = true) {
153
- if (!this.wormholeSelector) {
154
- return;
155
- }
156
- const element = this.localWormHole ? this.shadowRootElement.querySelector("#" + this.wormholeSelector) :
157
- document.getElementById(this.wormholeSelector);
158
- if (!element) {
159
- return;
160
- }
161
- if (this.localWormHole) {
162
- if (element.parentElement) {
163
- this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
164
- }
165
- }
166
- else {
167
- this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
168
- }
169
- ///containerEl.fadeIn("fast") : containerEl.fadeOut("fast");
170
- this.isOpened = opened;
171
- }
172
- closeEmbeddedModalFileSelection() {
173
- this.setModalVisibility(false);
174
- }
175
- _addLink(api, ids) {
176
- // filter out already existing attachment links
177
- const newAttachmentIDs = ids.filter(item => !this.attachments.find(n => n.id === item));
178
- if (!newAttachmentIDs.length) {
179
- return;
180
- }
181
- if (this.inProgress) {
182
- console.log('in progress');
183
- return;
184
- }
185
- if (!this.rootObjectId) {
186
- // we don't know to which object we want to attach the documents
187
- // so we will deliver just information about selected documents
188
- const getRequests = newAttachmentIDs.map((id) => from(api.objects.get(id, 0, undefined, undefined, undefined, undefined)));
189
- forkJoin(getRequests).subscribe({
190
- next: (results) => {
191
- // Process the array of results
192
- results?.forEach((item) => {
193
- if (item?.id && !this.attachments.find(attachment => attachment?.id === item.id)) {
194
- this._attachments.push(item);
195
- }
196
- });
197
- const retval = this._attachments.map((item) => this.decorateAttachmentId(item));
198
- this.attachmentsLinkChange.emit(retval);
199
- },
200
- error: (err) => {
201
- console.error('Error occurred during requests:', err);
202
- this._attachments = [];
203
- }
204
- });
205
- return;
206
- }
207
- // we know to which object we want to attach the documents
208
- this.inProgress = true;
209
- postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)
210
- .subscribe({
211
- next: (updatedAttachments) => {
212
- this._attachments = this.decorateAttachmentLinks(api, updatedAttachments); // Update attachments in component
213
- this.inProgress = false;
214
- this.attachmentsChange.emit(newAttachmentIDs);
215
- },
216
- error: (err) => {
217
- console.error('Failed to add or reload attachments:', err);
218
- this.inProgress = false;
219
- }
220
- });
221
- }
222
- createAttachmentLink(api) {
223
- console.log('createAttachmentLink');
224
- this.localWormHole = this.wormholeSelector === "localEmbeddedModalId";
225
- const callbackF = (docIDs) => {
226
- const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;
227
- const foundDocuments = ids && ids.length > 0;
228
- if (!this.isDestroyed) {
229
- this.closeEmbeddedModalFileSelection();
230
- if (foundDocuments) {
231
- this._addLink(api, ids);
232
- }
233
- }
234
- };
235
- if (typeof callbackF !== "function" || !this.project || !this.api) {
236
- return;
237
- }
238
- setTimeout(() => {
239
- const isLocalhost = window.location.href.includes("localhost");
240
- let access_token = '';
241
- if (isLocalhost) {
242
- access_token = this.api?.getAccessToken();
243
- if (!access_token) {
244
- return;
245
- }
246
- }
247
- const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');
248
- newClient?.initialize();
249
- // Make embedded windows pointing to the current feature branch with baseUrl setup
250
- const options = {};
251
- // In case of localhost ommit explicit setup of baseUrl
252
- if (!isLocalhost) {
253
- // Remove '/viewer/' from the end of pathname
254
- let filteredPathname = window.location.pathname.replace(/\/viewer\/$/, '/');
255
- // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...
256
- filteredPathname = filteredPathname.replace(/\/connexis\/$/, '/');
257
- options.baseUrl = window.location.origin + filteredPathname;
258
- }
259
- ///const env:string="dev"; ///!!! to-do introduce env variable into components
260
- const clientModule = WebClient.BimFilesSelect;
261
- if (this.wormholeSelector) {
262
- const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);
263
- if (!documentSelection) {
264
- return;
265
- }
266
- documentSelection.onAttachmentSelected = callbackF;
267
- if (this.project) {
268
- if (this.localWormHole) {
269
- documentSelection.loadShadowRoot(this.shadowRootElement, this.project.teamSlug, this.project.id);
270
- }
271
- else {
272
- documentSelection.load(this.project.teamSlug, this.project.id);
273
- }
274
- }
275
- this.setModalVisibility(true);
276
- }
277
- }, 200);
278
- }
279
- _deleteAttachmentLink(api, id, $event) {
280
- $event.stopPropagation();
281
- $event.preventDefault();
282
- const objects = api.objects;
283
- const objectId = this._currentObjectId$.value;
284
- from(api.objects.deleteAttachmentLink(this.rootObjectId, id)).pipe(switchMap(() => from(objects.getAttachmentLinks(objectId)))).subscribe({
285
- next: (updatedAttachments) => {
286
- if (this.api) {
287
- this._attachments = this.decorateAttachmentLinks(this.api, updatedAttachments); // Update attachments in component
288
- // Process the array of results
289
- const retval = this._attachments?.map((item) => this.decorateAttachmentId(item));
290
- this.attachmentsLinkChange.emit(retval);
291
- }
292
- },
293
- error: (err) => {
294
- console.error('Failed to delete or reload attachments:', err);
295
- }
296
- });
297
- }
298
- deleteAttachmentLink(attachment, $event) {
299
- if (!this.api) {
300
- return;
301
- }
302
- if (!attachment) {
303
- return;
304
- }
305
- const api = this.api;
306
- this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
307
- options: {
308
- position: 'middle',
309
- positionOptions: {},
310
- overlayClickEnabled: false,
311
- overlayVisibilityEnabled: true,
312
- draggable: true
313
- }, data: {
314
- title: this.translateService.instant('_Delete_attachmentlink'),
315
- message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),
316
- acceptButtonLocalizedString: "_Delete",
317
- acceptCallback: () => {
318
- this._deleteAttachmentLink(api, attachment.id, $event);
319
- }
320
- }
321
- });
322
- }
323
- buttonClicked($event) {
324
- if (!this.api) {
325
- return;
326
- }
327
- const api = this.api;
328
- if ($event.id == "add-documents") {
329
- this.createAttachmentLink(api);
330
- }
331
- }
332
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i3.DecoratorsService }], target: i0.ɵɵFactoryTarget.Component }); }
333
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: LinksToDocumentsComponent, isStandalone: true, selector: "lib-links-to-documents", inputs: { api: "api", canCreateAttachmentLink: "canCreateAttachmentLink", listOnly: ["listOnly", "listOnly", booleanAttribute], showEmptyMessage: ["showEmptyMessage", "showEmptyMessage", booleanAttribute], hideAttachmentSize: ["hideAttachmentSize", "hideAttachmentSize", booleanAttribute], attachments: "attachments", canDeleteAttachmentLink: "canDeleteAttachmentLink", project: "project", wormholeSelector: "wormholeSelector", env: "env", rootObjectId: "rootObjectId" }, outputs: { attachmentsChange: "attachmentsChange", attachmentsLinkChange: "attachmentsLinkChange" }, usesInheritance: true, ngImport: i0, template: "<div class=\"links-to-documents\">\r\n @if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n }\r\n @if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n }\r\n @if (!_attachments?.length && showEmptyMessage) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No_attachmentlinks_found' | translate }}\r\n </div>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-scrollable-container{--scrollable-container-paddin-right: 0}lib-bimplus-buttons-row{flex:0;--button-row-margin-top: 0;--button-row-margin-right: .8rem;--button-row-margin-bottom: 1.4rem;--button-row-margin-left: 0}.attachment-row{margin:var(--attachment-row-margin, 0 .8rem);border-bottom:var(--attachment-row-border-bottom, solid .1rem var(--details-controls-attachment-item-border-color))}.links-to-documents{display:flex;flex:1;flex-direction:column}.links-to-documents .scrollable-content-container{position:relative;flex:1}.links-to-documents .scrollable-content-container lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;width:100%}.bim-attachment-delete-button{color:var(--bim-attachment-delete-button, var(--details-controls-attachment-delete-button-text-color));font-weight:var(--bim-attachment-delete-button-font-weight, normal);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:var(--bim-attachmentlink-item-left-padding, 3.6rem);background-size:var(--bim-attachment-item-background-size, auto);background-repeat:no-repeat;background-position:var(--bim-attachment-item-background-position, .8rem center);background-image:var(--bim-attachment-item-background-image, url(data:image/png;base64,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));text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:var(--bim-attachment-name-padding, 0 0 0 1rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items", "isMultiple", "canUpdateObject"], outputs: ["fileChanged", "buttonClicked"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
334
- }
335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, decorators: [{
336
- type: Component,
337
- args: [{ selector: 'lib-links-to-documents', standalone: true, imports: [
338
- TranslateModule,
339
- BimplusScrollableContainerComponent,
340
- BimplusButtonsRowComponent
341
- ], encapsulation: ViewEncapsulation.ShadowDom, template: "<div class=\"links-to-documents\">\r\n @if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n }\r\n @if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n }\r\n @if (!_attachments?.length && showEmptyMessage) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No_attachmentlinks_found' | translate }}\r\n </div>\r\n } @else {\r\n <div class=\"scrollable-content-container\">\r\n <lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-scrollable-container{--scrollable-container-paddin-right: 0}lib-bimplus-buttons-row{flex:0;--button-row-margin-top: 0;--button-row-margin-right: .8rem;--button-row-margin-bottom: 1.4rem;--button-row-margin-left: 0}.attachment-row{margin:var(--attachment-row-margin, 0 .8rem);border-bottom:var(--attachment-row-border-bottom, solid .1rem var(--details-controls-attachment-item-border-color))}.links-to-documents{display:flex;flex:1;flex-direction:column}.links-to-documents .scrollable-content-container{position:relative;flex:1}.links-to-documents .scrollable-content-container lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;width:100%}.bim-attachment-delete-button{color:var(--bim-attachment-delete-button, var(--details-controls-attachment-delete-button-text-color));font-weight:var(--bim-attachment-delete-button-font-weight, normal);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:var(--bim-attachmentlink-item-left-padding, 3.6rem);background-size:var(--bim-attachment-item-background-size, auto);background-repeat:no-repeat;background-position:var(--bim-attachment-item-background-position, .8rem center);background-image:var(--bim-attachment-item-background-image, url(data:image/png;base64,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));text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:var(--bim-attachment-name-padding, 0 0 0 1rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"] }]
342
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i3.DecoratorsService }], propDecorators: { api: [{
343
- type: Input,
344
- args: [{ required: true }]
345
- }], canCreateAttachmentLink: [{
346
- type: Input
347
- }], listOnly: [{
348
- type: Input,
349
- args: [{ transform: booleanAttribute }]
350
- }], showEmptyMessage: [{
351
- type: Input,
352
- args: [{ transform: booleanAttribute }]
353
- }], hideAttachmentSize: [{
354
- type: Input,
355
- args: [{ transform: booleanAttribute }]
356
- }], attachments: [{
357
- type: Input
358
- }], attachmentsChange: [{
359
- type: Output
360
- }], attachmentsLinkChange: [{
361
- type: Output
362
- }], canDeleteAttachmentLink: [{
363
- type: Input
364
- }], project: [{
365
- type: Input
366
- }], wormholeSelector: [{
367
- type: Input
368
- }], env: [{
369
- type: Input
370
- }], rootObjectId: [{
371
- type: Input
372
- }] } });
373
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbGlua3MtdG8tZG9jdW1lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsU0FBUyxFQUFJLGlCQUFpQixFQUFJLEtBQUssRUFBOEMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBRXhFLE9BQU8sRUFBRyxJQUFJLEVBQUksZUFBZSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHdFQUF3RSxDQUFBO0FBRTVILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRWxHLE9BQU8sRUFDTCxvQ0FBb0MsRUFDckMsTUFBTSw0RUFBNEUsQ0FBQztBQUVwRixPQUFPLEtBQUssU0FBUyxNQUFNLG1CQUFtQixDQUFDOzs7OztBQUcvQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdB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U0FBUztrTUFxQmYsR0FBRztzQkFBN0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFFa0MsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxnQkFBZ0I7c0JBQXZELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRUUsa0JBQWtCO3NCQUF6RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUtsQyxXQUFXO3NCQURkLEtBQUs7Z0JBaUJJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0UsdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUdGLFlBQVk7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ICBDb21wb25lbnQgICwgVmlld0VuY2Fwc3VsYXRpb24gICwgSW5wdXQgICwgT25Jbml0LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgYm9vbGVhbkF0dHJpYnV0ZSwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmltcGx1c0xvY2FsaXplZFdpZGdldENvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCAqIGFzIFdlYlNkayBmcm9tICdiaW1wbHVzLXdlYnNkayc7XHJcbmltcG9ydCB7ICBmcm9tICAsIEJlaGF2aW9yU3ViamVjdCwgc3dpdGNoTWFwLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJpbXBsdXNTY3JvbGxhYmxlQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgUHJvamVjdE5hdmlnYXRvclByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LW1vZGVscy9wcm9qZWN0LW1vZGVscy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCB9IGZyb20gXCIuLi9iaW1wbHVzLWJ1dHRvbnMtcm93L2JpbXBsdXMtYnV0dG9ucy1yb3cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEJpbXBsdXNCdXR0b25DbGlja0V2ZW50LCBCaW1wbHVzQnV0dG9uUm93SXRlbSB9IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJpbXBsdXNPdmVybGF5RGlhbG9nQ29uZmlybUNvbXBvbmVudFxyXG59IGZyb20gXCIuLi9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0vYmltcGx1cy1vdmVybGF5LWRpYWxvZy1jb25maXJtLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuLi9iaW1wbHVzLWdlbmVyYWwtb3ZlcmxheS1kaWFsb2cvYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgV2ViQ2xpZW50IGZyb20gJ2JpbXBsdXMtd2ViY2xpZW50JztcclxuaW1wb3J0IHtuZXdBdHRhY2hJbmZvfSBmcm9tICcuLi9iaW1wbHVzLW9iamVjdC1jb21tZW50cy1saXN0L2JpbXBsdXMtb2JqZWN0LWNvbW1lbnRzLWxpc3QuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtEZWNvcmF0b3JzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RlY29yYXRvcnMuc2VydmljZSc7XHJcbmV4cG9ydCBjb25zdCBFTUJFRERFRF9NT0RBTF9ESUFMT0dFX1RZUEVfRklMRSA9ICdmaWxlJztcclxuXHJcbmV4cG9ydCBjb25zdCBwb3N0QXR0YWNobWVudExpbmtzID0gKG5ld0F0dGFjaG1lbnRJRHM6IHN0cmluZ1tdLCBvYmplY3RJZDogc3RyaW5nLCBhcGk6IFdlYlNkay5BcGkpID0+IHtcclxuICAvLyBDcmVhdGUgYW4gYXJyYXkgb2Ygb2JzZXJ2YWJsZXMgZm9yIGVhY2ggcG9zdCByZXF1ZXN0XHJcbiAgY29uc3QgcG9zdFJlcXVlc3RzID0gbmV3QXR0YWNobWVudElEcy5tYXAoKGlkKSA9PiAgICAgICAgICAgIFxyXG4gICAgZnJvbShhcGkub2JqZWN0cy5wb3N0QXR0YWNobWVudExpbmsob2JqZWN0SWQsIEpTT04uc3RyaW5naWZ5KHsgYXR0YWNobWVudElkOiBpZH0pKSkgICAgICBcclxuICApO1xyXG5cclxuICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIHBvc3QgcmVxdWVzdHMgdG8gY29tcGxldGUgaW4gcGFyYWxsZWxcclxuICByZXR1cm4gZm9ya0pvaW4ocG9zdFJlcXVlc3RzKVxyXG4gIC5waXBlKFxyXG4gICAgLy8gQWZ0ZXIgYWxsIHBvc3RzIGFyZSBjb21wbGV0ZSwgc3dpdGNoIHRvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0IHVwZGF0ZWQgbGlua3NcclxuICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKGFwaS5vYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpKVxyXG4gIClcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbGlua3MtdG8tZG9jdW1lbnRzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICAgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQsXHJcbiAgICAgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQubGVzcyddLCAgXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaW5rc1RvRG9jdW1lbnRzQ29tcG9uZW50IGV4dGVuZHMgQmltcGx1c0xvY2FsaXplZFdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgY29uc3RydWN0b3IodHJhbnNsYXRlU2VydmljZTogIFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNvcmF0b3JzOkRlY29yYXRvcnNTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcih0cmFuc2xhdGVTZXJ2aWNlKVxyXG4gICAgdGhpcy5zaGFkb3dSb290RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zaGFkb3dSb290O1xyXG5cclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaGFkb3dSb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfcm9vdE9iamVjdElkIDogc3RyaW5nID0gXCJcIjtcclxuICBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xyXG4gIGxvY2FsV29ybUhvbGU6Ym9vbGVhbiAgPSB0cnVlO1xyXG4gICAgLy9XaGVuIGlzIHRydWUgdGhlbiBpdCBtZWFucyB0aGUgY3JlYXRpb24gb2YgbGluayBpcyBpbiBwcm9ncmVzc1xyXG4gIGluUHJvZ3Jlc3M6Ym9vbGVhbj0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGFwaSE6IFdlYlNkay5BcGkgfCBudWxsO1xyXG4gIEBJbnB1dCgpIGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKiogSW5wdXQgQXR0cmlidXRlIHRvIHNwZWNpZnkgaWYgc2hvdWxkIHNob3cgb25seSBsaXN0IG9mIGF0dGFjaG1lbnRzLiAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBsaXN0T25seSA9IGZhbHNlO1xyXG4gIC8qKiBJbnB1dCBBdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBzaG91bGQgc2hvdyBtZXNzYWdlIHdoZW4gbm8gYXR0YWNobWVudHMgZm91bmQuICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dFbXB0eU1lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKiBJbnB1dCBBdHRyaWJ1dGUgdG8gdGVsbCBpZiBzaG93L2hpZGUgYXR0YWNoZW10IHNpemUgaW5mb3JtYXRpb24uICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVBdHRhY2htZW50U2l6ZSA9IGZhbHNlO1xyXG5cclxuICBfYXR0YWNobWVudHM6IFdlYlNkay5BdHRhY2htZW50TGlua1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF0dGFjaG1lbnRzKHZhbHVlOiBXZWJTZGsuQXR0YWNobWVudExpbmtbXSkge1xyXG4gICAgdGhpcy5fYXR0YWNobWVudHMgPSB2YWx1ZTtcclxuICAgIHRoaXMub25BdHRhY2htZW50c0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dGFjaG1lbnRzKCk6IFdlYlNkay5BdHRhY2htZW50TGlua1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9hdHRhY2htZW50cztcclxuICB9XHJcblxyXG4gIG9uQXR0YWNobWVudHNDaGFuZ2UoKSB7XHJcbiAgICBpZih0aGlzLmFwaSAmJiB0aGlzLnJvb3RPYmplY3RJZCl7XHJcbiAgICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyh0aGlzLmFwaSx0aGlzLl9hdHRhY2htZW50cyk7ICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIEBPdXRwdXQoKSBhdHRhY2htZW50c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XHJcbiAgQE91dHB1dCgpIGF0dGFjaG1lbnRzTGlua0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bmV3QXR0YWNoSW5mb1tdPigpO1xyXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZUF0dGFjaG1lbnRMaW5rOmJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHByb2plY3QgOiBQcm9qZWN0TmF2aWdhdG9yUHJvamVjdCB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHdvcm1ob2xlU2VsZWN0b3IgOiBzdHJpbmcgfCB1bmRlZmluZWQ9IFwibG9jYWxFbWJlZGRlZE1vZGFsSWRcIjsgIC8vIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHByb3ZpZGUgYSBwbGFjZSB3aGVyZSB0aGUgaWZyYW1lIGZvciBkb2N1bWVudHMgc2VsZWN0aW9uIHdpbGwgYmUgcmVuZGVyZWRcclxuICBASW5wdXQoKSBlbnYgOiBzdHJpbmcgPSAnZGV2JztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcm9vdE9iamVjdElkKGlkIDogc3RyaW5nfHVuZGVmaW5lZCl7XHJcbiAgICBpZighaWQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLm5leHQoaWQpO1xyXG4gICAgdGhpcy5fcm9vdE9iamVjdElkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcm9vdE9iamVjdElkKCkgOiBzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdE9iamVjdElkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudE9iamVjdElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiAoXCJcIik7XHJcbiAgX2F0dGFjaG1lbnRDb3VudCA6IG51bWJlciA9IDA7XHJcbiAgYnV0dG9uUm93SXRlbXM6IEFycmF5PEJpbXBsdXNCdXR0b25Sb3dJdGVtPiA9IFtcclxuICAgIHtcclxuICAgICAgaWQ6IFwiYWRkLWRvY3VtZW50c1wiXHJcbiAgICAgICwgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQWRkX2RvY3VtZW50JylcclxuICAgICAgLCB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZF9kb2N1bWVudCcpXHJcbiAgICAgICwgZGlzYWJsZWQ6ICF0aGlzLmNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rXHJcbiAgICAgICwgYnV0dG9uU3R5bGU6ICdwcmltYXJ5J1xyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKCF0aGlzLmxpc3RPbmx5KSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRPYmplY3RJZCQuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoaWQpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2NyZWF0ZUF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHByaXZhdGUgZGVjb3JhdGVBdHRhY2htZW50SWQoaXRlbTphbnkpe1xyXG4gICAgICBjb25zdCBpdDpuZXdBdHRhY2hJbmZvID0ge1xyXG4gICAgICAgIGlkOiBpdGVtLmlkLFxyXG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICBuYW1lU2hvcnQ6IGl0ZW0ubmFtZSxcclxuICAgICAgICB1cmw6JycsXHJcbiAgICAgICAgaWNvbkNsYXNzOiAnJyxcclxuICAgICAgICBpY29uVGl0bGU6ICcnLFxyXG4gICAgICAgIHR5cGU6ICdBdHRhY2htZW50TGluaycsXHJcbiAgICAgICAgZGVsZXRlQnV0dG9uVGl0bGU6JycgICAgICAgIFxyXG4gICAgICB9OyAgICAgXHJcbiAgICByZXR1cm4gaXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlY29yYXRlQXR0YWNobWVudExpbmtzKGFwaTpXZWJTZGsuQXBpLCBsaW5rczpXZWJTZGsuQXR0YWNobWVudExpbmtzUmVzcG9uc2UpOldlYlNkay5BdHRhY2htZW50TGlua1tde1xyXG4gICAgY29uc3QgZGVjb3JhdGVkTGlua3MgPSBsaW5rcy5tYXAoKGxpbmspID0+IHRoaXMuZGVjb3JhdG9ycy5kZWNvcmF0ZUxpbmsoYXBpLGxpbmssW3RoaXMuX2N1cnJlbnRPYmplY3RJZCQudmFsdWVdKSk7XHJcbiAgICBkZWNvcmF0ZWRMaW5rcy5zb3J0KChhLGIpID0+IHtcclxuICAgICAgaWYoYS5maWxlTmFtZS50b0xvd2VyQ2FzZSgpIDwgYi5maWxlTmFtZS50b0xvd2VyQ2FzZSgpICkgcmV0dXJuIC0xO1xyXG4gICAgICBpZihhLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgID4gYi5maWxlTmFtZS50b0xvd2VyQ2FzZSgpICkgcmV0dXJuIDE7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGVjb3JhdGVkTGlua3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCA6IHN0cmluZyl7XHJcblxyXG4gICAgdGhpcy5fbG9hZEF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKG9iamVjdElkKT8uc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dCA6KHN0cnVjdHVyZURhdGEpID0+IHtcclxuICAgICAgICBpZihzdHJ1Y3R1cmVEYXRhKXtcclxuICAgICAgICAgIC8vdGhpcy5fYXR0YWNobWVudExpbmtTdHJ1Y3R1cmUgPSBfYXR0YWNobWVudExpbmsgU3RydWN0dXJlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICB0aGlzLl9hdHRhY2htZW50Q291bnQgPSBzdHJ1Y3R1cmVEYXRhPy5sZW5ndGg7XHJcbiAgICAgICAgICBpZih0aGlzLmFwaSl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHZhbCA9IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50TGlua3ModGhpcy5hcGksc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICAgIGlmKHJldHZhbCl7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSByZXR2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUob2JqZWN0SWQgOiBzdHJpbmcpe1xyXG4gICAgaWYoIXRoaXMuYXBpKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLmFwaS5vYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpO1xyXG4gIH1cclxuXHJcbiAgZG9jdW1lbnRTZWxlY3Rpb24gOnN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNPcGVuZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIGVtYmVkZGVkTW9kYWxDb250YWluZXI6c3RyaW5nID0gJ2VtYmVkZGVkLW1vZGFsJztcclxuXHJcbiAgLy8gc2hvdyBvciBoaWRlIGVtYmVkZGVkIG1vZGFsXHJcbiAgc2V0TW9kYWxWaXNpYmlsaXR5KG9wZW5lZCA9IHRydWUpIHtcclxuICAgIGlmKCF0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGVtZW50ID0gIHRoaXMubG9jYWxXb3JtSG9sZSA/IHRoaXMuc2hhZG93Um9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMud29ybWhvbGVTZWxlY3Rvcik6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLndvcm1ob2xlU2VsZWN0b3IpO1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubG9jYWxXb3JtSG9sZSl7XHJcbiAgICAgIGlmKGVsZW1lbnQucGFyZW50RWxlbWVudCl7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQsJ2Rpc3BsYXknLG9wZW5lZD8nYmxvY2snOidub25lJylcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQsJ2Rpc3BsYXknLG9wZW5lZD8nYmxvY2snOidub25lJylcclxuICAgIH1cclxuXHJcbiAgICAvLy9jb250YWluZXJFbC5mYWRlSW4oXCJmYXN0XCIpIDogY29udGFpbmVyRWwuZmFkZU91dChcImZhc3RcIik7XHJcbiAgICB0aGlzLmlzT3BlbmVkID0gb3BlbmVkO1xyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKSB7XHJcbiAgICB0aGlzLnNldE1vZGFsVmlzaWJpbGl0eShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBfYWRkTGluayhhcGk6V2ViU2RrLkFwaSwgaWRzOnN0cmluZ1tdKSB7XHJcbiAgICAvLyBmaWx0ZXIgb3V0IGFscmVhZHkgZXhpc3RpbmcgYXR0YWNobWVudCBsaW5rcyBcclxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRJRHMgPSBpZHMuZmlsdGVyKCBpdGVtID0+ICF0aGlzLmF0dGFjaG1lbnRzLmZpbmQobiA9PiBuLmlkID09PSBpdGVtKSApO1xyXG4gICAgaWYoICFuZXdBdHRhY2htZW50SURzLmxlbmd0aCApe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmluUHJvZ3Jlc3Mpe1xyXG4gICAgICBjb25zb2xlLmxvZygnaW4gcHJvZ3Jlc3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCF0aGlzLnJvb3RPYmplY3RJZCl7XHJcbiAgICAgIC8vIHdlIGRvbid0IGtub3cgdG8gd2hpY2ggb2JqZWN0IHdlIHdhbnQgdG8gYXR0YWNoIHRoZSBkb2N1bWVudHNcclxuICAgICAgLy8gc28gd2Ugd2lsbCBkZWxpdmVyIGp1c3QgaW5mb3JtYXRpb24gYWJvdXQgc2VsZWN0ZWQgZG9jdW1lbnRzXHJcbiAgICAgIGNvbnN0IGdldFJlcXVlc3RzID0gbmV3QXR0YWNobWVudElEcy5tYXAoKGlkKSA9PiAgICAgICAgICAgIFxyXG4gICAgICAgIGZyb20oYXBpLm9iamVjdHMuZ2V0KGlkLDAsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkKSlcclxuICAgICAgKTtcclxuICAgIFxyXG4gICAgICBmb3JrSm9pbihnZXRSZXF1ZXN0cykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYXJyYXkgb2YgcmVzdWx0c1xyXG4gICAgICAgICAgKHJlc3VsdHMgYXMgV2ViU2RrLkF0dGFjaG1lbnRMaW5rW10pPy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGl0ZW0/LmlkICYmICF0aGlzLmF0dGFjaG1lbnRzLmZpbmQoYXR0YWNobWVudCA9PiBhdHRhY2htZW50Py5pZCA9PT0gaXRlbS5pZCkpe1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgcmV0dmFsOm5ld0F0dGFjaEluZm9bXSA9IHRoaXMuX2F0dGFjaG1lbnRzLm1hcCgoaXRlbSkgPT4gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRJZChpdGVtKSk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5hdHRhY2htZW50c0xpbmtDaGFuZ2UuZW1pdChyZXR2YWwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIGR1cmluZyByZXF1ZXN0czonLCBlcnIpO1xyXG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHM9W107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGtub3cgdG8gd2hpY2ggb2JqZWN0IHdlIHdhbnQgdG8gYXR0YWNoIHRoZSBkb2N1bWVudHNcclxuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICBwb3N0QXR0YWNobWVudExpbmtzKG5ld0F0dGFjaG1lbnRJRHMsIHRoaXMucm9vdE9iamVjdElkLCBhcGkpXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHVwZGF0ZWRBdHRhY2htZW50cykgPT4ge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyhcclxuICAgICAgICAgIGFwaSxcclxuICAgICAgICAgIHVwZGF0ZWRBdHRhY2htZW50c1xyXG4gICAgICAgICk7IC8vIFVwZGF0ZSBhdHRhY2htZW50cyBpbiBjb21wb25lbnQgICBcclxuICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTsgIFxyXG4gICAgICAgIHRoaXMuYXR0YWNobWVudHNDaGFuZ2UuZW1pdChuZXdBdHRhY2htZW50SURzKSAgIFxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhZGQgb3IgcmVsb2FkIGF0dGFjaG1lbnRzOicsIGVycik7XHJcbiAgICAgICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaTogV2ViU2RrLkFwaSl7XHJcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlQXR0YWNobWVudExpbmsnKVxyXG4gICAgdGhpcy5sb2NhbFdvcm1Ib2xlID0gdGhpcy53b3JtaG9sZVNlbGVjdG9yID09PSBcImxvY2FsRW1iZWRkZWRNb2RhbElkXCI7XHJcbiAgICBjb25zdCBjYWxsYmFja0YgPSAoZG9jSURzOnN0cmluZ1tdKTp2b2lkID0+IHtcclxuICAgICAgY29uc3QgaWRzID0gKHR5cGVvZiBkb2NJRHMgPT09ICdzdHJpbmcnKSA/IFtkb2NJRHNdIDogZG9jSURzO1xyXG4gICAgICBjb25zdCBmb3VuZERvY3VtZW50cyA9IGlkcyAmJiBpZHMubGVuZ3RoID4gMDtcclxuICAgICAgaWYoIXRoaXMuaXNEZXN0cm95ZWQpe1xyXG4gICAgICAgIHRoaXMuY2xvc2VFbWJlZGRlZE1vZGFsRmlsZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChmb3VuZERvY3VtZW50cykge1xyXG4gICAgICAgICAgdGhpcy5fYWRkTGluayhhcGksaWRzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrRiAhPT0gXCJmdW5jdGlvblwiICB8fCAhdGhpcy5wcm9qZWN0IHx8ICF0aGlzLmFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTG9jYWxob3N0ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoXCJsb2NhbGhvc3RcIik7XHJcbiAgICAgIGxldCBhY2Nlc3NfdG9rZW4gOnN0cmluZ3xudWxsIHx1bmRlZmluZWQ9ICcnO1xyXG4gICAgICBpZiAoaXNMb2NhbGhvc3QpIHtcclxuICAgICAgICBhY2Nlc3NfdG9rZW4gPSB0aGlzLmFwaT8uZ2V0QWNjZXNzVG9rZW4oKTtcclxuICAgICAgICBpZiAoIWFjY2Vzc190b2tlbikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbmV3Q2xpZW50ID0gIG5ldyBXZWJDbGllbnQuRXh0ZXJuYWxDbGllbnQoJ0JJbXBsdXNOR1hDb21wb25lbnRDbGllbnQnKTtcclxuICAgICAgbmV3Q2xpZW50Py5pbml0aWFsaXplKCk7XHJcbiAgICAgIC8vIE1ha2UgZW1iZWRkZWQgd2luZG93cyBwb2ludGluZyB0byB0aGUgY3VycmVudCBmZWF0dXJlIGJyYW5jaCB3aXRoIGJhc2VVcmwgc2V0dXBcclxuICAgICAgY29uc3Qgb3B0aW9uczp7YmFzZVVybD86c3RyaW5nfSA9IHt9O1xyXG4gICAgICAvLyBJbiBjYXNlIG9mIGxvY2FsaG9zdCBvbW1pdCBleHBsaWNpdCBzZXR1cCBvZiBiYXNlVXJsXHJcbiAgICAgIGlmICghaXNMb2NhbGhvc3QpIHtcclxuICAgICAgICAvLyBSZW1vdmUgJy92aWV3ZXIvJyBmcm9tIHRoZSBlbmQgb2YgcGF0aG5hbWVcclxuICAgICAgICBsZXQgZmlsdGVyZWRQYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cXC92aWV3ZXJcXC8kLywgJy8nKTtcclxuICAgICAgICAvLyBSZW1vdmUgJy9jb25uZXhpcy8nIGZyb20gdGhlIGVuZCBvZiBwYXRobmFtZSBpZiB3ZSB1c2UgdGVtcG9yYXJ5IHVybCBmb3IgY29ubmV4aXMgbGlrZSAgaHR0cHM6Ly9wb3J0YWwtZGV2LmJpbXBsdXMubmV0L2Nvbm5leGlzLz9lbWJlZGRlZC4uLlxyXG4gICAgICAgIGZpbHRlcmVkUGF0aG5hbWUgPSBmaWx0ZXJlZFBhdGhuYW1lLnJlcGxhY2UoL1xcL2Nvbm5leGlzXFwvJC8sICcvJyk7XHJcbiAgICAgICAgb3B0aW9ucy5iYXNlVXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIGZpbHRlcmVkUGF0aG5hbWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vL2NvbnN0IGVudjpzdHJpbmc9XCJkZXZcIjsgIC8vLyEhISB0by1kbyBpbnRyb2R1Y2UgZW52IHZhcmlhYmxlIGludG8gY29tcG9uZW50c1xyXG4gICAgICBjb25zdCBjbGllbnRNb2R1bGUgPSBXZWJDbGllbnQuQmltRmlsZXNTZWxlY3Q7XHJcbiAgICAgIGlmKHRoaXMud29ybWhvbGVTZWxlY3Rvcil7XHJcbiAgICAgICAgY29uc3QgZG9jdW1lbnRTZWxlY3Rpb24gPSBuZXcgY2xpZW50TW9kdWxlKHRoaXMud29ybWhvbGVTZWxlY3RvciwgYWNjZXNzX3Rva2VuLCBuZXdDbGllbnQsIHRoaXMuZW52LCBvcHRpb25zKTtcclxuICAgICAgICBpZiAoIWRvY3VtZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50U2VsZWN0aW9uLm9uQXR0YWNobWVudFNlbGVjdGVkID0gY2FsbGJhY2tGO1xyXG5cclxuICAgICAgICBpZih0aGlzLnByb2plY3Qpe1xyXG4gICAgICAgICAgaWYodGhpcy5sb2NhbFdvcm1Ib2xlKXtcclxuICAgICAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ubG9hZFNoYWRvd1Jvb3QodGhpcy5zaGFkb3dSb290RWxlbWVudCx0aGlzLnByb2plY3QudGVhbVNsdWcgLCB0aGlzLnByb2plY3QuaWQpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRvY3VtZW50U2VsZWN0aW9uLmxvYWQodGhpcy5wcm9qZWN0LnRlYW1TbHVnICwgdGhpcy5wcm9qZWN0LmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRNb2RhbFZpc2liaWxpdHkodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0sMjAwKTtcclxuXHJcbiAgfVxyXG5cclxuICBfZGVsZXRlQXR0YWNobWVudExpbmsoYXBpOldlYlNkay5BcGkgLGlkOnN0cmluZywkZXZlbnQ6RXZlbnQpe1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBvYmplY3RzID0gYXBpLm9iamVjdHM7XHJcbiAgICBjb25zdCBvYmplY3RJZCA9IHRoaXMuX2N1cnJlbnRPYmplY3RJZCQudmFsdWU7XHJcbiAgICBmcm9tKGFwaS5vYmplY3RzLmRlbGV0ZUF0dGFjaG1lbnRMaW5rKHRoaXMucm9vdE9iamVjdElkLGlkKSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IGZyb20ob2JqZWN0cy5nZXRBdHRhY2htZW50TGlua3Mob2JqZWN0SWQpKSlcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHVwZGF0ZWRBdHRhY2htZW50cykgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMuYXBpKXtcclxuICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyh0aGlzLmFwaSx1cGRhdGVkQXR0YWNobWVudHMpOyAgLy8gVXBkYXRlIGF0dGFjaG1lbnRzIGluIGNvbXBvbmVudFxyXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYXJyYXkgb2YgcmVzdWx0c1xyXG4gICAgICAgICAgY29uc3QgcmV0dmFsOm5ld0F0dGFjaEluZm9bXSA9IHRoaXMuX2F0dGFjaG1lbnRzPy5tYXAoKGl0ZW0pID0+IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50SWQoaXRlbSkpO1xyXG4gICAgICAgICAgdGhpcy5hdHRhY2htZW50c0xpbmtDaGFuZ2UuZW1pdChyZXR2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIG9yIHJlbG9hZCBhdHRhY2htZW50czonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQ6V2ViU2RrLkF0dGFjaG1lbnRMaW5rLCRldmVudDpFdmVudCl7XHJcbiAgICBpZighdGhpcy5hcGkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZighYXR0YWNobWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhcGkgID0gdGhpcy5hcGk7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihCaW1wbHVzT3ZlcmxheURpYWxvZ0NvbmZpcm1Db21wb25lbnQsIHtcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHBvc2l0aW9uOiAnbWlkZGxlJyxcclxuICAgICAgICBwb3NpdGlvbk9wdGlvbnM6IHt9LFxyXG4gICAgICAgIG92ZXJsYXlDbGlja0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG92ZXJsYXlWaXNpYmlsaXR5RW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgfSwgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0RlbGV0ZV9hdHRhY2htZW50bGluaycpLFxyXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQXR0YWNobWVudGxpbmtfZGVsZXRlX2NvbmZpcm1hdGlvbl9tZXNzYWdlJyksXHJcbiAgICAgICAgYWNjZXB0QnV0dG9uTG9jYWxpemVkU3RyaW5nOiBcIl9EZWxldGVcIixcclxuICAgICAgICBhY2NlcHRDYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fZGVsZXRlQXR0YWNobWVudExpbmsoYXBpLGF0dGFjaG1lbnQuaWQsJGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGJ1dHRvbkNsaWNrZWQoJGV2ZW50OiBCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCl7XHJcbiAgICBpZighdGhpcy5hcGkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhcGkgID0gdGhpcy5hcGk7XHJcbiAgICBpZigkZXZlbnQuaWQgPT0gXCJhZGQtZG9jdW1lbnRzXCIpe1xyXG4gICAgICB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsaW5rcy10by1kb2N1bWVudHNcIj5cclxuICBAaWYgKGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rICYmICFsaXN0T25seSkge1xyXG4gICAgPGxpYi1iaW1wbHVzLWJ1dHRvbnMtcm93XHJcbiAgICBbaXRlbXNdPVwiYnV0dG9uUm93SXRlbXNcIlxyXG4gICAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZCgkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgfVxyXG4gIEBpZiAod29ybWhvbGVTZWxlY3RvciA9PT0gJ2xvY2FsRW1iZWRkZWRNb2RhbElkJyl7XHJcbiAgICA8ZGl2IGNsYXNzPSdlbWJlZGRlZC1tb2RhbC1jb250YWluZXInPlxyXG4gICAgICA8aWZyYW1lIGlkPXt7d29ybWhvbGVTZWxlY3Rvcn19IFt0aXRsZV09XCJcIj48L2lmcmFtZT5cclxuICAgIDwvZGl2PiAgXHJcbiAgfVxyXG4gIEBpZiAoIV9hdHRhY2htZW50cz8ubGVuZ3RoICYmIHNob3dFbXB0eU1lc3NhZ2UpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1ub3QtZm91bmRcIj5cclxuICAgICAge3sgJ19Ob19hdHRhY2htZW50bGlua3NfZm91bmQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICA8L2Rpdj5cclxuICB9IEBlbHNlIHtcclxuICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxhYmxlLWNvbnRlbnQtY29udGFpbmVyXCI+XHJcbiAgICAgIDxsaWItYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lcj5cclxuICAgICAgICBAZm9yIChhdHRhY2htZW50IG9mIF9hdHRhY2htZW50czsgdHJhY2sgYXR0YWNobWVudDsgbGV0ICBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudC1yb3dcIj5cclxuICAgICAgICAgICAgQGlmIChjYW5EZWxldGVBdHRhY2htZW50TGluaykge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmltLWF0dGFjaG1lbnQtZGVsZXRlLWJ1dHRvblwiIChjbGljayk9XCJkZWxldGVBdHRhY2htZW50TGluayhhdHRhY2htZW50LCRldmVudClcIiAoa2V5ZG93bik9XCJkZWxldGVBdHRhY2htZW50TGluayhhdHRhY2htZW50LCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnX0RlbGV0ZV9hdHRhY2htZW50bGluaycgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAmIzEwMDA1OyYjeEZFMEU7XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJiaW0tYXR0YWNobWVudGxpbmstaXRlbVwiIGhyZWY9e3thdHRhY2htZW50Lmxpbmt9fSB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lciBub3JlZmVycmVyJz5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmltLWF0dGFjaG1lbnQtbmFtZVwiIHRpdGxlPXt7YXR0YWNobWVudC5maWxlTmFtZX19PlxyXG4gICAgICAgICAgICAgICAge3thdHRhY2htZW50Lm5hbWUgPyBhdHRhY2htZW50Lm5hbWUgOiBhdHRhY2htZW50LmZpbGVOYW1lfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICBAaWYgKCFoaWRlQXR0YWNobWVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1zaXplXCIgdGl0bGU9e3thdHRhY2htZW50Lm5hbWV9fT5cclxuICAgICAgICAgICAgICAgICAgKHt7YXR0YWNobWVudC5zaXplfX0ga0IpXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9saWItYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==