ngx-bimplus-components 0.0.160 → 0.0.162

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 (162) hide show
  1. package/assets/images/default/Attachment_18_gray.svg +1 -0
  2. package/assets/images/default/Attachment_18_maincolor.svg +3 -0
  3. package/assets/images/default/Attachmentlink_18_gray.svg +7 -0
  4. package/assets/images/default/Attachmentlink_18_maincolor.svg +7 -0
  5. package/assets/images/default/Calendar_18.svg +4 -0
  6. package/assets/images/default/Calendar_18_disabled.svg +1 -0
  7. package/assets/images/default/Calendar_18_gray.svg +1 -0
  8. package/assets/images/default/Comments_18_gray.svg +1 -0
  9. package/assets/images/default/Comments_18_maincolor.svg +4 -0
  10. package/assets/images/default/Links_18_gray.svg +1 -0
  11. package/assets/images/default/Links_18_maincolor.svg +4 -0
  12. package/assets/images/default/Refresh_18_gray.svg +1 -0
  13. package/assets/images/default/bimplus_WebIcons_Cross_Disabled.svg +1 -0
  14. package/assets/images/default/ic_models.svg +3 -0
  15. package/assets/images/default/ic_models_maincolor.svg +3 -0
  16. package/assets/images/default/icn_grid_attachments.png +0 -0
  17. package/assets/images/default/icn_grid_hyperlinks.png +0 -0
  18. package/assets/images/default/progress-spinner.svg +1 -0
  19. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +114 -0
  20. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +38 -0
  21. package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +95 -0
  22. package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +32 -0
  23. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +40 -5
  24. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +5 -2
  25. package/esm2022/lib/components/bimplus-comment/IComment.mjs +2 -0
  26. package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +118 -0
  27. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +5 -5
  28. package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +3 -3
  29. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +115 -7
  30. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
  31. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +1 -1
  32. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
  33. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +3 -3
  34. package/esm2022/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.mjs +64 -0
  35. package/esm2022/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.mjs +161 -0
  36. package/esm2022/lib/components/bimplus-input-date/bimplus-input-date.component.mjs +271 -0
  37. package/esm2022/lib/components/bimplus-input-number/bimplus-input-number.component.mjs +85 -0
  38. package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +92 -0
  39. package/esm2022/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.mjs +78 -0
  40. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +388 -0
  41. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.mjs +3 -0
  42. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.mjs +104 -0
  43. package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +2 -0
  44. package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +3 -3
  45. package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +6 -3
  46. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +3 -3
  47. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
  48. package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +3 -3
  49. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +42 -4
  50. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.interface.mjs +4 -2
  51. package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +77 -0
  52. package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +83 -0
  53. package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +31 -8
  54. package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +34 -8
  55. package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +1 -1
  56. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.component.mjs +35 -0
  57. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.service.mjs +35 -0
  58. package/esm2022/lib/components/bimplus-status-bar/statusBar.mjs +2 -0
  59. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +38 -0
  60. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +10 -0
  61. package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +89 -0
  62. package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +33 -0
  63. package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +83 -0
  64. package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +128 -0
  65. package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +376 -0
  66. package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +145 -0
  67. package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +36 -0
  68. package/esm2022/lib/components/object-preview/object-preview.component.mjs +284 -0
  69. package/esm2022/lib/components/object-preview/object-preview.interface.mjs +2 -0
  70. package/esm2022/lib/components/object-properties/object-properties.component.mjs +545 -0
  71. package/esm2022/lib/components/object-properties/object-properties.interface.mjs +2 -0
  72. package/esm2022/lib/components/object-properties/object-properties.service.mjs +26 -0
  73. package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +129 -0
  74. package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +55 -0
  75. package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +48 -6
  76. package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
  77. package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +54 -10
  78. package/esm2022/lib/pipes/bit-converter.pipe.mjs +46 -0
  79. package/esm2022/lib/pipes/get-attribute-value-as-string.pipe.mjs +173 -0
  80. package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +156 -0
  81. package/esm2022/lib/pipes/round.pipe.mjs +20 -0
  82. package/esm2022/lib/services/decorators.service.mjs +65 -0
  83. package/esm2022/lib/utils/objectProperties.mjs +9 -0
  84. package/esm2022/lib/validators/double-enum.validator.mjs +20 -0
  85. package/esm2022/lib/validators/double.validator.mjs +23 -0
  86. package/esm2022/lib/validators/guid-enum.validator.mjs +20 -0
  87. package/esm2022/lib/validators/guid.validator.mjs +14 -0
  88. package/esm2022/lib/validators/integer.validator.mjs +23 -0
  89. package/esm2022/lib/validators/string-combobox.validator.mjs +20 -0
  90. package/esm2022/lib/validators/string-enum.validator.mjs +20 -0
  91. package/esm2022/public-api.mjs +22 -1
  92. package/fesm2022/ngx-bimplus-components.mjs +4618 -80
  93. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  94. package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +39 -0
  95. package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +33 -0
  96. package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +30 -0
  97. package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +8 -0
  98. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +14 -3
  99. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +7 -1
  100. package/lib/components/bimplus-comment/IComment.d.ts +4 -0
  101. package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +39 -0
  102. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.d.ts +16 -3
  103. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.d.ts +4 -0
  104. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
  105. package/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.d.ts +3 -3
  106. package/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.d.ts +18 -0
  107. package/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.d.ts +41 -0
  108. package/lib/components/bimplus-input-date/bimplus-input-date.component.d.ts +46 -0
  109. package/lib/components/bimplus-input-number/bimplus-input-number.component.d.ts +26 -0
  110. package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +28 -0
  111. package/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.d.ts +22 -0
  112. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +88 -0
  113. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.d.ts +10 -0
  114. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.d.ts +20 -0
  115. package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +11 -0
  116. package/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.d.ts +2 -1
  117. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +12 -12
  118. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
  119. package/lib/components/bimplus-object-structure/bimplus-object-structure.component.d.ts +5 -1
  120. package/lib/components/bimplus-object-structure/bimplus-object-structure.interface.d.ts +2 -0
  121. package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +29 -0
  122. package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +24 -0
  123. package/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.d.ts +8 -1
  124. package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +11 -1
  125. package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
  126. package/lib/components/bimplus-status-bar/bimplus-status-bar.component.d.ts +14 -0
  127. package/lib/components/bimplus-status-bar/bimplus-status-bar.service.d.ts +14 -0
  128. package/lib/components/bimplus-status-bar/statusBar.d.ts +4 -0
  129. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +16 -0
  130. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +18 -0
  131. package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +36 -0
  132. package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +15 -0
  133. package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +24 -0
  134. package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +42 -0
  135. package/lib/components/links-to-documents/links-to-documents.component.d.ts +69 -0
  136. package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +32 -0
  137. package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +15 -0
  138. package/lib/components/object-preview/object-preview.component.d.ts +45 -0
  139. package/lib/components/object-preview/object-preview.interface.d.ts +5 -0
  140. package/lib/components/object-properties/object-properties.component.d.ts +79 -0
  141. package/lib/components/object-properties/object-properties.interface.d.ts +22 -0
  142. package/lib/components/object-properties/object-properties.service.d.ts +12 -0
  143. package/lib/components/object-properties-group/object-properties-group.component.d.ts +30 -0
  144. package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +14 -0
  145. package/lib/components/object-properties-header/object-properties-header.component.d.ts +13 -4
  146. package/lib/components/object-properties-header/object-properties-header.interface.d.ts +8 -0
  147. package/lib/components/resizable-panel/resizable-panel.component.d.ts +12 -3
  148. package/lib/pipes/bit-converter.pipe.d.ts +17 -0
  149. package/lib/pipes/get-attribute-value-as-string.pipe.d.ts +35 -0
  150. package/lib/pipes/get-attribute-value.pipe.d.ts +35 -0
  151. package/lib/pipes/round.pipe.d.ts +7 -0
  152. package/lib/services/decorators.service.d.ts +12 -0
  153. package/lib/utils/objectProperties.d.ts +2 -0
  154. package/lib/validators/double-enum.validator.d.ts +2 -0
  155. package/lib/validators/double.validator.d.ts +2 -0
  156. package/lib/validators/guid-enum.validator.d.ts +2 -0
  157. package/lib/validators/guid.validator.d.ts +2 -0
  158. package/lib/validators/integer.validator.d.ts +2 -0
  159. package/lib/validators/string-combobox.validator.d.ts +2 -0
  160. package/lib/validators/string-enum.validator.d.ts +2 -0
  161. package/package.json +14 -4
  162. package/public-api.d.ts +21 -0
@@ -0,0 +1,376 @@
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.inputBaseUrl = ''; // base url for the embedded modal
44
+ this._attachments = [];
45
+ this.attachmentsChange = new EventEmitter();
46
+ this.attachmentsLinkChange = new EventEmitter();
47
+ this.canDeleteAttachmentLink = true;
48
+ this.project = null;
49
+ this.wormholeSelector = "localEmbeddedModalId"; // calling application can provide a place where the iframe for documents selection will be rendered
50
+ this.env = 'dev';
51
+ this._currentObjectId$ = new BehaviorSubject("");
52
+ this._attachmentCount = 0;
53
+ this.buttonRowItems = [
54
+ {
55
+ id: "add-documents",
56
+ title: this.translateService.instant('_Add_document'),
57
+ tooltip: this.translateService.instant('_Add_document'),
58
+ disabled: !this.canCreateAttachmentLink,
59
+ buttonStyle: 'primary'
60
+ }
61
+ ];
62
+ this.documentSelection = null;
63
+ this.isOpened = false;
64
+ this.embeddedModalContainer = 'embedded-modal';
65
+ this.shadowRootElement = this.el.nativeElement.shadowRoot;
66
+ }
67
+ set attachments(value) {
68
+ this._attachments = value;
69
+ this.onAttachmentsChange();
70
+ }
71
+ get attachments() {
72
+ return this._attachments;
73
+ }
74
+ onAttachmentsChange() {
75
+ if (this.api && this.rootObjectId) {
76
+ this._attachments = this.decorateAttachmentLinks(this.api, this._attachments);
77
+ }
78
+ }
79
+ set rootObjectId(id) {
80
+ if (!id) {
81
+ return;
82
+ }
83
+ this._currentObjectId$.next(id);
84
+ this._rootObjectId = id;
85
+ }
86
+ get rootObjectId() {
87
+ return this._rootObjectId;
88
+ }
89
+ ngOnInit() {
90
+ if (!this.listOnly) {
91
+ this._currentObjectId$.subscribe({
92
+ next: (id) => {
93
+ this._createAttachmentLinkStructure(id);
94
+ }
95
+ });
96
+ }
97
+ }
98
+ ;
99
+ ngOnDestroy() {
100
+ this.isDestroyed = true;
101
+ }
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ decorateAttachmentId(item) {
104
+ const it = {
105
+ id: item.id,
106
+ name: item.name,
107
+ nameShort: item.name,
108
+ url: '',
109
+ iconClass: '',
110
+ iconTitle: '',
111
+ type: 'AttachmentLink',
112
+ deleteButtonTitle: ''
113
+ };
114
+ return it;
115
+ }
116
+ decorateAttachmentLinks(api, links) {
117
+ const decoratedLinks = links.map((link) => this.decorators.decorateLink(api, link, [this._currentObjectId$.value]));
118
+ decoratedLinks.sort((a, b) => {
119
+ if (a.fileName.toLowerCase() < b.fileName.toLowerCase())
120
+ return -1;
121
+ if (a.fileName.toLowerCase() > b.fileName.toLowerCase())
122
+ return 1;
123
+ return 0;
124
+ });
125
+ return decoratedLinks;
126
+ }
127
+ _createAttachmentLinkStructure(objectId) {
128
+ this._loadAttachmentLinkStructure(objectId)?.subscribe({
129
+ next: (structureData) => {
130
+ if (structureData) {
131
+ //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);
132
+ this._attachmentCount = structureData?.length;
133
+ if (this.api) {
134
+ const retval = this.decorateAttachmentLinks(this.api, structureData);
135
+ if (retval) {
136
+ this._attachments = retval;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ });
142
+ }
143
+ _loadAttachmentLinkStructure(objectId) {
144
+ if (!this.api) {
145
+ return;
146
+ }
147
+ if (!objectId) {
148
+ return;
149
+ }
150
+ return from(this.api.objects.getAttachmentLinks(objectId));
151
+ }
152
+ // show or hide embedded modal
153
+ setModalVisibility(opened = true) {
154
+ if (!this.wormholeSelector) {
155
+ return;
156
+ }
157
+ const element = this.localWormHole ? this.shadowRootElement.querySelector("#" + this.wormholeSelector) :
158
+ document.getElementById(this.wormholeSelector);
159
+ if (!element) {
160
+ return;
161
+ }
162
+ if (this.localWormHole) {
163
+ if (element.parentElement) {
164
+ this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
165
+ }
166
+ }
167
+ else {
168
+ this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
169
+ }
170
+ ///containerEl.fadeIn("fast") : containerEl.fadeOut("fast");
171
+ this.isOpened = opened;
172
+ }
173
+ closeEmbeddedModalFileSelection() {
174
+ this.setModalVisibility(false);
175
+ }
176
+ _addLink(api, ids) {
177
+ // filter out already existing attachment links
178
+ const newAttachmentIDs = ids.filter(item => !this.attachments.find(n => n.id === item));
179
+ if (!newAttachmentIDs.length) {
180
+ return;
181
+ }
182
+ if (this.inProgress) {
183
+ console.log('in progress');
184
+ return;
185
+ }
186
+ if (!this.rootObjectId) {
187
+ // we don't know to which object we want to attach the documents
188
+ // so we will deliver just information about selected documents
189
+ const getRequests = newAttachmentIDs.map((id) => from(api.objects.get(id, 0, undefined, undefined, undefined, undefined)));
190
+ forkJoin(getRequests).subscribe({
191
+ next: (results) => {
192
+ // Process the array of results
193
+ results?.forEach((item) => {
194
+ if (item?.id && !this.attachments.find(attachment => attachment?.id === item.id)) {
195
+ this._attachments.push(item);
196
+ }
197
+ });
198
+ const retval = this._attachments.map((item) => this.decorateAttachmentId(item));
199
+ this.attachmentsLinkChange.emit(retval);
200
+ },
201
+ error: (err) => {
202
+ console.error('Error occurred during requests:', err);
203
+ this._attachments = [];
204
+ }
205
+ });
206
+ return;
207
+ }
208
+ // we know to which object we want to attach the documents
209
+ this.inProgress = true;
210
+ postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)
211
+ .subscribe({
212
+ next: (updatedAttachments) => {
213
+ this._attachments = this.decorateAttachmentLinks(api, updatedAttachments); // Update attachments in component
214
+ this.inProgress = false;
215
+ this.attachmentsChange.emit(newAttachmentIDs);
216
+ },
217
+ error: (err) => {
218
+ console.error('Failed to add or reload attachments:', err);
219
+ this.inProgress = false;
220
+ }
221
+ });
222
+ }
223
+ createAttachmentLink(api) {
224
+ console.log('createAttachmentLink');
225
+ this.localWormHole = this.wormholeSelector === "localEmbeddedModalId";
226
+ const callbackF = (docIDs) => {
227
+ const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;
228
+ const foundDocuments = ids && ids.length > 0;
229
+ if (!this.isDestroyed) {
230
+ this.closeEmbeddedModalFileSelection();
231
+ if (foundDocuments) {
232
+ this._addLink(api, ids);
233
+ }
234
+ }
235
+ };
236
+ if (typeof callbackF !== "function" || !this.project || !this.api) {
237
+ return;
238
+ }
239
+ setTimeout(() => {
240
+ const isLocalhost = window.location.href.includes("localhost");
241
+ let access_token = '';
242
+ if (isLocalhost) {
243
+ access_token = this.api?.getAccessToken();
244
+ if (!access_token) {
245
+ return;
246
+ }
247
+ }
248
+ const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');
249
+ newClient?.initialize();
250
+ // Make embedded windows pointing to the current feature branch with baseUrl setup
251
+ const options = {};
252
+ // In case of localhost ommit explicit setup of baseUrl
253
+ if (!isLocalhost) {
254
+ // Remove '/viewer/' from the end of pathname
255
+ let filteredPathname = window.location.pathname.replace(/\/viewer\/$/, '/');
256
+ // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...
257
+ filteredPathname = filteredPathname.replace(/\/connexis\/$/, '/');
258
+ options.baseUrl = this.inputBaseUrl ? this.inputBaseUrl : window.location.origin + filteredPathname;
259
+ }
260
+ ///const env:string="dev"; ///!!! to-do introduce env variable into components
261
+ const clientModule = WebClient.BimFilesSelect;
262
+ if (this.wormholeSelector) {
263
+ const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);
264
+ if (!documentSelection) {
265
+ return;
266
+ }
267
+ documentSelection.onAttachmentSelected = callbackF;
268
+ if (this.project) {
269
+ if (this.localWormHole) {
270
+ documentSelection.loadShadowRoot(this.shadowRootElement, this.project.teamSlug, this.project.id);
271
+ }
272
+ else {
273
+ documentSelection.load(this.project.teamSlug, this.project.id);
274
+ }
275
+ }
276
+ this.setModalVisibility(true);
277
+ }
278
+ }, 200);
279
+ }
280
+ _deleteAttachmentLink(api, id, $event) {
281
+ $event.stopPropagation();
282
+ $event.preventDefault();
283
+ const objects = api.objects;
284
+ const objectId = this._currentObjectId$.value;
285
+ from(api.objects.deleteAttachmentLink(this.rootObjectId, id)).pipe(switchMap(() => from(objects.getAttachmentLinks(objectId)))).subscribe({
286
+ next: (updatedAttachments) => {
287
+ if (this.api) {
288
+ this._attachments = this.decorateAttachmentLinks(this.api, updatedAttachments); // Update attachments in component
289
+ // Process the array of results
290
+ const retval = this._attachments?.map((item) => this.decorateAttachmentId(item));
291
+ this.attachmentsLinkChange.emit(retval);
292
+ }
293
+ },
294
+ error: (err) => {
295
+ console.error('Failed to delete or reload attachments:', err);
296
+ }
297
+ });
298
+ }
299
+ deleteAttachmentLink(attachment, $event) {
300
+ if (!this.api) {
301
+ return;
302
+ }
303
+ if (!attachment) {
304
+ return;
305
+ }
306
+ const api = this.api;
307
+ this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
308
+ options: {
309
+ position: 'middle',
310
+ positionOptions: {},
311
+ overlayClickEnabled: false,
312
+ overlayVisibilityEnabled: true,
313
+ draggable: true
314
+ }, data: {
315
+ title: this.translateService.instant('_Delete_attachmentlink'),
316
+ message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),
317
+ acceptButtonLocalizedString: "_Delete",
318
+ acceptCallback: () => {
319
+ this._deleteAttachmentLink(api, attachment.id, $event);
320
+ }
321
+ }
322
+ });
323
+ }
324
+ buttonClicked($event) {
325
+ if (!this.api) {
326
+ return;
327
+ }
328
+ const api = this.api;
329
+ if ($event.id == "add-documents") {
330
+ this.createAttachmentLink(api);
331
+ }
332
+ }
333
+ 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 }); }
334
+ 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], inputBaseUrl: "inputBaseUrl", 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 }); }
335
+ }
336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, decorators: [{
337
+ type: Component,
338
+ args: [{ selector: 'lib-links-to-documents', standalone: true, imports: [
339
+ TranslateModule,
340
+ BimplusScrollableContainerComponent,
341
+ BimplusButtonsRowComponent
342
+ ], 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"] }]
343
+ }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i3.DecoratorsService }], propDecorators: { api: [{
344
+ type: Input,
345
+ args: [{ required: true }]
346
+ }], canCreateAttachmentLink: [{
347
+ type: Input
348
+ }], listOnly: [{
349
+ type: Input,
350
+ args: [{ transform: booleanAttribute }]
351
+ }], showEmptyMessage: [{
352
+ type: Input,
353
+ args: [{ transform: booleanAttribute }]
354
+ }], hideAttachmentSize: [{
355
+ type: Input,
356
+ args: [{ transform: booleanAttribute }]
357
+ }], inputBaseUrl: [{
358
+ type: Input
359
+ }], attachments: [{
360
+ type: Input
361
+ }], attachmentsChange: [{
362
+ type: Output
363
+ }], attachmentsLinkChange: [{
364
+ type: Output
365
+ }], canDeleteAttachmentLink: [{
366
+ type: Input
367
+ }], project: [{
368
+ type: Input
369
+ }], wormholeSelector: [{
370
+ type: Input
371
+ }], env: [{
372
+ type: Input
373
+ }], rootObjectId: [{
374
+ type: Input
375
+ }] } });
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbGlua3MtdG8tZG9jdW1lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsU0FBUyxFQUFJLGlCQUFpQixFQUFJLEtBQUssRUFBOEMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBRXhFLE9BQU8sRUFBRyxJQUFJLEVBQUksZUFBZSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHdFQUF3RSxDQUFBO0FBRTVILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRWxHLE9BQU8sRUFDTCxvQ0FBb0MsRUFDckMsTUFBTSw0RUFBNEUsQ0FBQztBQUVwRixPQUFPLEtBQUssU0FBUyxNQUFNLG1CQUFtQixDQUFDOzs7OztBQUcvQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdB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QyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ04sZUFBZTt3QkFDZixtQ0FBbUM7d0JBQ25DLDBCQUEwQjtxQkFDNUIsaUJBR2MsaUJBQWlCLENBQUMsU0FBUztrTUFxQmYsR0FBRztzQkFBN0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFFa0MsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxnQkFBZ0I7c0JBQXZELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRUUsa0JBQWtCO3NCQUF6RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU3QixZQUFZO3NCQUFwQixLQUFLO2dCQUtGLFdBQVc7c0JBRGQsS0FBSztnQkFpQkksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRSx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBR0YsWUFBWTtzQkFEZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgIENvbXBvbmVudCAgLCBWaWV3RW5jYXBzdWxhdGlvbiAgLCBJbnB1dCAgLCBPbkluaXQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBib29sZWFuQXR0cmlidXRlLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0L2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0ICogYXMgV2ViU2RrIGZyb20gJ2JpbXBsdXMtd2Vic2RrJztcclxuaW1wb3J0IHsgIGZyb20gICwgQmVoYXZpb3JTdWJqZWN0LCBzd2l0Y2hNYXAsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBQcm9qZWN0TmF2aWdhdG9yUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QtbW9kZWxzL3Byb2plY3QtbW9kZWxzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEJpbXBsdXNCdXR0b25zUm93Q29tcG9uZW50IH0gZnJvbSBcIi4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQsIEJpbXBsdXNCdXR0b25Sb3dJdGVtIH0gZnJvbSAnLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4uL2JpbXBsdXMtb3ZlcmxheS1kaWFsb2ctY29uZmlybS9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RGlhbG9nU2VydmljZX0gZnJvbSBcIi4uL2JpbXBsdXMtZ2VuZXJhbC1vdmVybGF5LWRpYWxvZy9iaW1wbHVzLWdlbmVyYWwtb3ZlcmxheS1kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBXZWJDbGllbnQgZnJvbSAnYmltcGx1cy13ZWJjbGllbnQnO1xyXG5pbXBvcnQge25ld0F0dGFjaEluZm99IGZyb20gJy4uL2JpbXBsdXMtb2JqZWN0LWNvbW1lbnRzLWxpc3QvYmltcGx1cy1vYmplY3QtY29tbWVudHMtbGlzdC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0RlY29yYXRvcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVjb3JhdG9ycy5zZXJ2aWNlJztcclxuZXhwb3J0IGNvbnN0IEVNQkVEREVEX01PREFMX0RJQUxPR0VfVFlQRV9GSUxFID0gJ2ZpbGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IHBvc3RBdHRhY2htZW50TGlua3MgPSAobmV3QXR0YWNobWVudElEczogc3RyaW5nW10sIG9iamVjdElkOiBzdHJpbmcsIGFwaTogV2ViU2RrLkFwaSkgPT4ge1xyXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBvYnNlcnZhYmxlcyBmb3IgZWFjaCBwb3N0IHJlcXVlc3RcclxuICBjb25zdCBwb3N0UmVxdWVzdHMgPSBuZXdBdHRhY2htZW50SURzLm1hcCgoaWQpID0+ICAgICAgICAgICAgXHJcbiAgICBmcm9tKGFwaS5vYmplY3RzLnBvc3RBdHRhY2htZW50TGluayhvYmplY3RJZCwgSlNPTi5zdHJpbmdpZnkoeyBhdHRhY2htZW50SWQ6IGlkfSkpKSAgICAgIFxyXG4gICk7XHJcblxyXG4gIC8vIFVzZSBmb3JrSm9pbiB0byB3YWl0IGZvciBhbGwgcG9zdCByZXF1ZXN0cyB0byBjb21wbGV0ZSBpbiBwYXJhbGxlbFxyXG4gIHJldHVybiBmb3JrSm9pbihwb3N0UmVxdWVzdHMpXHJcbiAgLnBpcGUoXHJcbiAgICAvLyBBZnRlciBhbGwgcG9zdHMgYXJlIGNvbXBsZXRlLCBzd2l0Y2ggdG8gdGhlIG5leHQgY2FsbCB0byBnZXQgdXBkYXRlZCBsaW5rc1xyXG4gICAgY29uY2F0TWFwKCgpID0+IGZyb20oYXBpLm9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKG9iamVjdElkKSkpXHJcbiAgKVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1saW5rcy10by1kb2N1bWVudHMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgICBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCxcclxuICAgICBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5sZXNzJ10sICBcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIExpbmtzVG9Eb2N1bWVudHNDb21wb25lbnQgZXh0ZW5kcyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiAgVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlY29yYXRvcnM6RGVjb3JhdG9yc1NlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKHRyYW5zbGF0ZVNlcnZpY2UpXHJcbiAgICB0aGlzLnNoYWRvd1Jvb3RFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNoYWRvd1Jvb3Q7XHJcblxyXG4gIH1cclxuICBwcml2YXRlIHJlYWRvbmx5IHNoYWRvd1Jvb3RFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9yb290T2JqZWN0SWQgOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGlzRGVzdHJveWVkID0gZmFsc2U7XHJcbiAgbG9jYWxXb3JtSG9sZTpib29sZWFuICA9IHRydWU7XHJcbiAgICAvL1doZW4gaXMgdHJ1ZSB0aGVuIGl0IG1lYW5zIHRoZSBjcmVhdGlvbiBvZiBsaW5rIGlzIGluIHByb2dyZXNzXHJcbiAgaW5Qcm9ncmVzczpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgYXBpITogV2ViU2RrLkFwaSB8IG51bGw7XHJcbiAgQElucHV0KCkgY2FuQ3JlYXRlQXR0YWNobWVudExpbms6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKiBJbnB1dCBBdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBzaG91bGQgc2hvdyBvbmx5IGxpc3Qgb2YgYXR0YWNobWVudHMuICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGxpc3RPbmx5ID0gZmFsc2U7XHJcbiAgLyoqIElucHV0IEF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIHNob3VsZCBzaG93IG1lc3NhZ2Ugd2hlbiBubyBhdHRhY2htZW50cyBmb3VuZC4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0VtcHR5TWVzc2FnZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqIElucHV0IEF0dHJpYnV0ZSB0byB0ZWxsIGlmIHNob3cvaGlkZSBhdHRhY2hlbXQgc2l6ZSBpbmZvcm1hdGlvbi4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlkZUF0dGFjaG1lbnRTaXplID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGlucHV0QmFzZVVybDogc3RyaW5nID0nJzsgLy8gYmFzZSB1cmwgZm9yIHRoZSBlbWJlZGRlZCBtb2RhbFxyXG4gIFxyXG4gIF9hdHRhY2htZW50czogV2ViU2RrLkF0dGFjaG1lbnRMaW5rW10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXR0YWNobWVudHModmFsdWU6IFdlYlNkay5BdHRhY2htZW50TGlua1tdKSB7XHJcbiAgICB0aGlzLl9hdHRhY2htZW50cyA9IHZhbHVlO1xyXG4gICAgdGhpcy5vbkF0dGFjaG1lbnRzQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0YWNobWVudHMoKTogV2ViU2RrLkF0dGFjaG1lbnRMaW5rW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F0dGFjaG1lbnRzO1xyXG4gIH1cclxuXHJcbiAgb25BdHRhY2htZW50c0NoYW5nZSgpIHtcclxuICAgIGlmKHRoaXMuYXBpICYmIHRoaXMucm9vdE9iamVjdElkKXtcclxuICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKHRoaXMuYXBpLHRoaXMuX2F0dGFjaG1lbnRzKTsgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgQE91dHB1dCgpIGF0dGFjaG1lbnRzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcclxuICBAT3V0cHV0KCkgYXR0YWNobWVudHNMaW5rQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxuZXdBdHRhY2hJbmZvW10+KCk7XHJcbiAgQElucHV0KCkgY2FuRGVsZXRlQXR0YWNobWVudExpbms6Ym9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcHJvamVjdCA6IFByb2plY3ROYXZpZ2F0b3JQcm9qZWN0IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgd29ybWhvbGVTZWxlY3RvciA6IHN0cmluZyB8IHVuZGVmaW5lZD0gXCJsb2NhbEVtYmVkZGVkTW9kYWxJZFwiOyAgLy8gY2FsbGluZyBhcHBsaWNhdGlvbiBjYW4gcHJvdmlkZSBhIHBsYWNlIHdoZXJlIHRoZSBpZnJhbWUgZm9yIGRvY3VtZW50cyBzZWxlY3Rpb24gd2lsbCBiZSByZW5kZXJlZFxyXG4gIEBJbnB1dCgpIGVudiA6IHN0cmluZyA9ICdkZXYnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCByb290T2JqZWN0SWQoaWQgOiBzdHJpbmd8dW5kZWZpbmVkKXtcclxuICAgIGlmKCFpZCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2N1cnJlbnRPYmplY3RJZCQubmV4dChpZCk7XHJcbiAgICB0aGlzLl9yb290T2JqZWN0SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIGdldCByb290T2JqZWN0SWQoKSA6IHN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9yb290T2JqZWN0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50T2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+IChcIlwiKTtcclxuICBfYXR0YWNobWVudENvdW50IDogbnVtYmVyID0gMDtcclxuICBidXR0b25Sb3dJdGVtczogQXJyYXk8QmltcGx1c0J1dHRvblJvd0l0ZW0+ID0gW1xyXG4gICAge1xyXG4gICAgICBpZDogXCJhZGQtZG9jdW1lbnRzXCJcclxuICAgICAgLCB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BZGRfZG9jdW1lbnQnKVxyXG4gICAgICAsIHRvb2x0aXA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQWRkX2RvY3VtZW50JylcclxuICAgICAgLCBkaXNhYmxlZDogIXRoaXMuY2FuQ3JlYXRlQXR0YWNobWVudExpbmtcclxuICAgICAgLCBidXR0b25TdHlsZTogJ3ByaW1hcnknXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMubGlzdE9ubHkpIHtcclxuICAgICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChpZCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY3JlYXRlQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUoaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTtcclxuICB9XHJcbiAgXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcHJpdmF0ZSBkZWNvcmF0ZUF0dGFjaG1lbnRJZChpdGVtOmFueSl7XHJcbiAgICAgIGNvbnN0IGl0Om5ld0F0dGFjaEluZm8gPSB7XHJcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxyXG4gICAgICAgIG5hbWVTaG9ydDogaXRlbS5uYW1lLFxyXG4gICAgICAgIHVybDonJyxcclxuICAgICAgICBpY29uQ2xhc3M6ICcnLFxyXG4gICAgICAgIGljb25UaXRsZTogJycsXHJcbiAgICAgICAgdHlwZTogJ0F0dGFjaG1lbnRMaW5rJyxcclxuICAgICAgICBkZWxldGVCdXR0b25UaXRsZTonJyAgICAgICAgXHJcbiAgICAgIH07ICAgICBcclxuICAgIHJldHVybiBpdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVjb3JhdGVBdHRhY2htZW50TGlua3MoYXBpOldlYlNkay5BcGksIGxpbmtzOldlYlNkay5BdHRhY2htZW50TGlua3NSZXNwb25zZSk6V2ViU2RrLkF0dGFjaG1lbnRMaW5rW117XHJcbiAgICBjb25zdCBkZWNvcmF0ZWRMaW5rcyA9IGxpbmtzLm1hcCgobGluaykgPT4gdGhpcy5kZWNvcmF0b3JzLmRlY29yYXRlTGluayhhcGksbGluayxbdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZV0pKTtcclxuICAgIGRlY29yYXRlZExpbmtzLnNvcnQoKGEsYikgPT4ge1xyXG4gICAgICBpZihhLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgPCBiLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmKGEuZmlsZU5hbWUudG9Mb3dlckNhc2UoKSAgPiBiLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgKSByZXR1cm4gMTtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkZWNvcmF0ZWRMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKG9iamVjdElkIDogc3RyaW5nKXtcclxuXHJcbiAgICB0aGlzLl9sb2FkQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUob2JqZWN0SWQpPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0IDooc3RydWN0dXJlRGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKHN0cnVjdHVyZURhdGEpe1xyXG4gICAgICAgICAgLy90aGlzLl9hdHRhY2htZW50TGlua1N0cnVjdHVyZSA9IF9hdHRhY2htZW50TGluayBTdHJ1Y3R1cmVCdWlsZGVyLmNyZWF0ZUZyb21SZXNwb25zZShzdHJ1Y3R1cmVEYXRhKTtcclxuICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRDb3VudCA9IHN0cnVjdHVyZURhdGE/Lmxlbmd0aDtcclxuICAgICAgICAgIGlmKHRoaXMuYXBpKXtcclxuICAgICAgICAgICAgY29uc3QgcmV0dmFsID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyh0aGlzLmFwaSxzdHJ1Y3R1cmVEYXRhKTtcclxuICAgICAgICAgICAgaWYocmV0dmFsKXtcclxuICAgICAgICAgICAgICB0aGlzLl9hdHRhY2htZW50cyA9IHJldHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCA6IHN0cmluZyl7XHJcbiAgICBpZighdGhpcy5hcGkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIW9iamVjdElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tKHRoaXMuYXBpLm9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKG9iamVjdElkKSk7XHJcbiAgfVxyXG5cclxuICBkb2N1bWVudFNlbGVjdGlvbiA6c3RyaW5nW10gfCBudWxsID0gbnVsbDtcclxuICBpc09wZW5lZDpib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRNb2RhbENvbnRhaW5lcjpzdHJpbmcgPSAnZW1iZWRkZWQtbW9kYWwnO1xyXG5cclxuICAvLyBzaG93IG9yIGhpZGUgZW1iZWRkZWQgbW9kYWxcclxuICBzZXRNb2RhbFZpc2liaWxpdHkob3BlbmVkID0gdHJ1ZSkge1xyXG4gICAgaWYoIXRoaXMud29ybWhvbGVTZWxlY3Rvcil7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVsZW1lbnQgPSAgdGhpcy5sb2NhbFdvcm1Ib2xlID8gdGhpcy5zaGFkb3dSb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy53b3JtaG9sZVNlbGVjdG9yKTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMud29ybWhvbGVTZWxlY3Rvcik7XHJcbiAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5sb2NhbFdvcm1Ib2xlKXtcclxuICAgICAgaWYoZWxlbWVudC5wYXJlbnRFbGVtZW50KXtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxyXG4gICAgfVxyXG5cclxuICAgIC8vL2NvbnRhaW5lckVsLmZhZGVJbihcImZhc3RcIikgOiBjb250YWluZXJFbC5mYWRlT3V0KFwiZmFzdFwiKTtcclxuICAgIHRoaXMuaXNPcGVuZWQgPSBvcGVuZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2VFbWJlZGRlZE1vZGFsRmlsZVNlbGVjdGlvbigpIHtcclxuICAgIHRoaXMuc2V0TW9kYWxWaXNpYmlsaXR5KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIF9hZGRMaW5rKGFwaTpXZWJTZGsuQXBpLCBpZHM6c3RyaW5nW10pIHtcclxuICAgIC8vIGZpbHRlciBvdXQgYWxyZWFkeSBleGlzdGluZyBhdHRhY2htZW50IGxpbmtzIFxyXG4gICAgY29uc3QgbmV3QXR0YWNobWVudElEcyA9IGlkcy5maWx0ZXIoIGl0ZW0gPT4gIXRoaXMuYXR0YWNobWVudHMuZmluZChuID0+IG4uaWQgPT09IGl0ZW0pICk7XHJcbiAgICBpZiggIW5ld0F0dGFjaG1lbnRJRHMubGVuZ3RoICl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuaW5Qcm9ncmVzcyl7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdpbiBwcm9ncmVzcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXRoaXMucm9vdE9iamVjdElkKXtcclxuICAgICAgLy8gd2UgZG9uJ3Qga25vdyB0byB3aGljaCBvYmplY3Qgd2Ugd2FudCB0byBhdHRhY2ggdGhlIGRvY3VtZW50c1xyXG4gICAgICAvLyBzbyB3ZSB3aWxsIGRlbGl2ZXIganVzdCBpbmZvcm1hdGlvbiBhYm91dCBzZWxlY3RlZCBkb2N1bWVudHNcclxuICAgICAgY29uc3QgZ2V0UmVxdWVzdHMgPSBuZXdBdHRhY2htZW50SURzLm1hcCgoaWQpID0+ICAgICAgICAgICAgXHJcbiAgICAgICAgZnJvbShhcGkub2JqZWN0cy5nZXQoaWQsMCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQpKVxyXG4gICAgICApO1xyXG4gICAgXHJcbiAgICAgIGZvcmtKb2luKGdldFJlcXVlc3RzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBhcnJheSBvZiByZXN1bHRzXHJcbiAgICAgICAgICAocmVzdWx0cyBhcyBXZWJTZGsuQXR0YWNobWVudExpbmtbXSk/LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbT8uaWQgJiYgIXRoaXMuYXR0YWNobWVudHMuZmluZChhdHRhY2htZW50ID0+IGF0dGFjaG1lbnQ/LmlkID09PSBpdGVtLmlkKSl7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCByZXR2YWw6bmV3QXR0YWNoSW5mb1tdID0gdGhpcy5fYXR0YWNobWVudHMubWFwKChpdGVtKSA9PiB0aGlzLmRlY29yYXRlQXR0YWNobWVudElkKGl0ZW0pKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRzTGlua0NoYW5nZS5lbWl0KHJldHZhbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHJlcXVlc3RzOicsIGVycik7XHJcbiAgICAgICAgICB0aGlzLl9hdHRhY2htZW50cz1bXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2Uga25vdyB0byB3aGljaCBvYmplY3Qgd2Ugd2FudCB0byBhdHRhY2ggdGhlIGRvY3VtZW50c1xyXG4gICAgdGhpcy5pblByb2dyZXNzID0gdHJ1ZTtcclxuICAgIHBvc3RBdHRhY2htZW50TGlua3MobmV3QXR0YWNobWVudElEcywgdGhpcy5yb290T2JqZWN0SWQsIGFwaSlcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodXBkYXRlZEF0dGFjaG1lbnRzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKFxyXG4gICAgICAgICAgYXBpLFxyXG4gICAgICAgICAgdXBkYXRlZEF0dGFjaG1lbnRzXHJcbiAgICAgICAgKTsgLy8gVXBkYXRlIGF0dGFjaG1lbnRzIGluIGNvbXBvbmVudCAgIFxyXG4gICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlOyAgXHJcbiAgICAgICAgdGhpcy5hdHRhY2htZW50c0NoYW5nZS5lbWl0KG5ld0F0dGFjaG1lbnRJRHMpICAgXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGFkZCBvciByZWxvYWQgYXR0YWNobWVudHM6JywgZXJyKTtcclxuICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlQXR0YWNobWVudExpbmsoYXBpOiBXZWJTZGsuQXBpKXtcclxuICAgIGNvbnNvbGUubG9nKCdjcmVhdGVBdHRhY2htZW50TGluaycpXHJcbiAgICB0aGlzLmxvY2FsV29ybUhvbGUgPSB0aGlzLndvcm1ob2xlU2VsZWN0b3IgPT09IFwibG9jYWxFbWJlZGRlZE1vZGFsSWRcIjtcclxuICAgIGNvbnN0IGNhbGxiYWNrRiA9IChkb2NJRHM6c3RyaW5nW10pOnZvaWQgPT4ge1xyXG4gICAgICBjb25zdCBpZHMgPSAodHlwZW9mIGRvY0lEcyA9PT0gJ3N0cmluZycpID8gW2RvY0lEc10gOiBkb2NJRHM7XHJcbiAgICAgIGNvbnN0IGZvdW5kRG9jdW1lbnRzID0gaWRzICYmIGlkcy5sZW5ndGggPiAwO1xyXG4gICAgICBpZighdGhpcy5pc0Rlc3Ryb3llZCl7XHJcbiAgICAgICAgdGhpcy5jbG9zZUVtYmVkZGVkTW9kYWxGaWxlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKGZvdW5kRG9jdW1lbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLl9hZGRMaW5rKGFwaSxpZHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGICE9PSBcImZ1bmN0aW9uXCIgIHx8ICF0aGlzLnByb2plY3QgfHwgIXRoaXMuYXBpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgaXNMb2NhbGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyhcImxvY2FsaG9zdFwiKTtcclxuICAgICAgbGV0IGFjY2Vzc190b2tlbiA6c3RyaW5nfG51bGwgfHVuZGVmaW5lZD0gJyc7XHJcbiAgICAgIGlmIChpc0xvY2FsaG9zdCkge1xyXG4gICAgICAgIGFjY2Vzc190b2tlbiA9IHRoaXMuYXBpPy5nZXRBY2Nlc3NUb2tlbigpO1xyXG4gICAgICAgIGlmICghYWNjZXNzX3Rva2VuKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBuZXdDbGllbnQgPSAgbmV3IFdlYkNsaWVudC5FeHRlcm5hbENsaWVudCgnQkltcGx1c05HWENvbXBvbmVudENsaWVudCcpO1xyXG4gICAgICBuZXdDbGllbnQ/LmluaXRpYWxpemUoKTtcclxuICAgICAgLy8gTWFrZSBlbWJlZGRlZCB3aW5kb3dzIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IGZlYXR1cmUgYnJhbmNoIHdpdGggYmFzZVVybCBzZXR1cFxyXG4gICAgICBjb25zdCBvcHRpb25zOntiYXNlVXJsPzpzdHJpbmd9ID0ge307XHJcbiAgICAgIC8vIEluIGNhc2Ugb2YgbG9jYWxob3N0IG9tbWl0IGV4cGxpY2l0IHNldHVwIG9mIGJhc2VVcmxcclxuICAgICAgaWYgKCFpc0xvY2FsaG9zdCkge1xyXG4gICAgICAgIC8vIFJlbW92ZSAnL3ZpZXdlci8nIGZyb20gdGhlIGVuZCBvZiBwYXRobmFtZVxyXG4gICAgICAgIGxldCBmaWx0ZXJlZFBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL3ZpZXdlclxcLyQvLCAnLycpO1xyXG4gICAgICAgIC8vIFJlbW92ZSAnL2Nvbm5leGlzLycgZnJvbSB0aGUgZW5kIG9mIHBhdGhuYW1lIGlmIHdlIHVzZSB0ZW1wb3JhcnkgdXJsIGZvciBjb25uZXhpcyBsaWtlICBodHRwczovL3BvcnRhbC1kZXYuYmltcGx1cy5uZXQvY29ubmV4aXMvP2VtYmVkZGVkLi4uXHJcbiAgICAgICAgZmlsdGVyZWRQYXRobmFtZSA9IGZpbHRlcmVkUGF0aG5hbWUucmVwbGFjZSgvXFwvY29ubmV4aXNcXC8kLywgJy8nKTtcclxuICAgICAgICBvcHRpb25zLmJhc2VVcmwgPSB0aGlzLmlucHV0QmFzZVVybCA/IHRoaXMuaW5wdXRCYXNlVXJsOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgZmlsdGVyZWRQYXRobmFtZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8vY29uc3QgZW52OnN0cmluZz1cImRldlwiOyAgLy8vISEhIHRvLWRvIGludHJvZHVjZSBlbnYgdmFyaWFibGUgaW50byBjb21wb25lbnRzXHJcbiAgICAgIGNvbnN0IGNsaWVudE1vZHVsZSA9IFdlYkNsaWVudC5CaW1GaWxlc1NlbGVjdDtcclxuICAgICAgaWYodGhpcy53b3JtaG9sZVNlbGVjdG9yKXtcclxuICAgICAgICBjb25zdCBkb2N1bWVudFNlbGVjdGlvbiA9IG5ldyBjbGllbnRNb2R1bGUodGhpcy53b3JtaG9sZVNlbGVjdG9yLCBhY2Nlc3NfdG9rZW4sIG5ld0NsaWVudCwgdGhpcy5lbnYsIG9wdGlvbnMpO1xyXG4gICAgICAgIGlmICghZG9jdW1lbnRTZWxlY3Rpb24pIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ub25BdHRhY2htZW50U2VsZWN0ZWQgPSBjYWxsYmFja0Y7XHJcblxyXG4gICAgICAgIGlmKHRoaXMucHJvamVjdCl7XHJcbiAgICAgICAgICBpZih0aGlzLmxvY2FsV29ybUhvbGUpe1xyXG4gICAgICAgICAgICBkb2N1bWVudFNlbGVjdGlvbi5sb2FkU2hhZG93Um9vdCh0aGlzLnNoYWRvd1Jvb3RFbGVtZW50LHRoaXMucHJvamVjdC50ZWFtU2x1ZyAsIHRoaXMucHJvamVjdC5pZCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ubG9hZCh0aGlzLnByb2plY3QudGVhbVNsdWcgLCB0aGlzLnByb2plY3QuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldE1vZGFsVmlzaWJpbGl0eSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSwyMDApO1xyXG5cclxuICB9XHJcblxyXG4gIF9kZWxldGVBdHRhY2htZW50TGluayhhcGk6V2ViU2RrLkFwaSAsaWQ6c3RyaW5nLCRldmVudDpFdmVudCl7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IG9iamVjdHMgPSBhcGkub2JqZWN0cztcclxuICAgIGNvbnN0IG9iamVjdElkID0gdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZTtcclxuICAgIGZyb20oYXBpLm9iamVjdHMuZGVsZXRlQXR0YWNobWVudExpbmsodGhpcy5yb290T2JqZWN0SWQsaWQpKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gZnJvbShvYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpKVxyXG4gICAgKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodXBkYXRlZEF0dGFjaG1lbnRzKSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5hcGkpe1xyXG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKHRoaXMuYXBpLHVwZGF0ZWRBdHRhY2htZW50cyk7ICAvLyBVcGRhdGUgYXR0YWNobWVudHMgaW4gY29tcG9uZW50XHJcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBhcnJheSBvZiByZXN1bHRzXHJcbiAgICAgICAgICBjb25zdCByZXR2YWw6bmV3QXR0YWNoSW5mb1tdID0gdGhpcy5fYXR0YWNobWVudHM/Lm1hcCgoaXRlbSkgPT4gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRJZChpdGVtKSk7XHJcbiAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRzTGlua0NoYW5nZS5lbWl0KHJldHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3IgcmVsb2FkIGF0dGFjaG1lbnRzOicsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlQXR0YWNobWVudExpbmsoYXR0YWNobWVudDpXZWJTZGsuQXR0YWNobWVudExpbmssJGV2ZW50OkV2ZW50KXtcclxuICAgIGlmKCF0aGlzLmFwaSl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKCFhdHRhY2htZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFwaSAgPSB0aGlzLmFwaTtcclxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKEJpbXBsdXNPdmVybGF5RGlhbG9nQ29uZmlybUNvbXBvbmVudCwge1xyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgcG9zaXRpb246ICdtaWRkbGUnLFxyXG4gICAgICAgIHBvc2l0aW9uT3B0aW9uczoge30sXHJcbiAgICAgICAgb3ZlcmxheUNsaWNrRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3ZlcmxheVZpc2liaWxpdHlFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxyXG4gICAgICB9LCBkYXRhOiB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfRGVsZXRlX2F0dGFjaG1lbnRsaW5rJyksXHJcbiAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BdHRhY2htZW50bGlua19kZWxldGVfY29uZmlybWF0aW9uX21lc3NhZ2UnKSxcclxuICAgICAgICBhY2NlcHRCdXR0b25Mb2NhbGl6ZWRTdHJpbmc6IFwiX0RlbGV0ZVwiLFxyXG4gICAgICAgIGFjY2VwdENhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9kZWxldGVBdHRhY2htZW50TGluayhhcGksYXR0YWNobWVudC5pZCwkZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZCgkZXZlbnQ6IEJpbXBsdXNCdXR0b25DbGlja0V2ZW50KXtcclxuICAgIGlmKCF0aGlzLmFwaSl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFwaSAgPSB0aGlzLmFwaTtcclxuICAgIGlmKCRldmVudC5pZCA9PSBcImFkZC1kb2N1bWVudHNcIil7XHJcbiAgICAgIHRoaXMuY3JlYXRlQXR0YWNobWVudExpbmsoYXBpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImxpbmtzLXRvLWRvY3VtZW50c1wiPlxyXG4gIEBpZiAoY2FuQ3JlYXRlQXR0YWNobWVudExpbmsgJiYgIWxpc3RPbmx5KSB7XHJcbiAgICA8bGliLWJpbXBsdXMtYnV0dG9ucy1yb3dcclxuICAgIFtpdGVtc109XCJidXR0b25Sb3dJdGVtc1wiXHJcbiAgICAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25DbGlja2VkKCRldmVudClcIlxyXG4gICAgLz5cclxuICB9XHJcbiAgQGlmICh3b3JtaG9sZVNlbGVjdG9yID09PSAnbG9jYWxFbWJlZGRlZE1vZGFsSWQnKXtcclxuICAgIDxkaXYgY2xhc3M9J2VtYmVkZGVkLW1vZGFsLWNvbnRhaW5lcic+XHJcbiAgICAgIDxpZnJhbWUgaWQ9e3t3b3JtaG9sZVNlbGVjdG9yfX0gW3RpdGxlXT1cIlwiPjwvaWZyYW1lPlxyXG4gICAgPC9kaXY+ICBcclxuICB9XHJcbiAgQGlmICghX2F0dGFjaG1lbnRzPy5sZW5ndGggJiYgc2hvd0VtcHR5TWVzc2FnZSkge1xyXG4gICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LW5vdC1mb3VuZFwiPlxyXG4gICAgICB7eyAnX05vX2F0dGFjaG1lbnRsaW5rc19mb3VuZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgIDwvZGl2PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cInNjcm9sbGFibGUtY29udGVudC1jb250YWluZXJcIj5cclxuICAgICAgPGxpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gICAgICAgIEBmb3IgKGF0dGFjaG1lbnQgb2YgX2F0dGFjaG1lbnRzOyB0cmFjayBhdHRhY2htZW50OyBsZXQgIGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LXJvd1wiPlxyXG4gICAgICAgICAgICBAaWYgKGNhbkRlbGV0ZUF0dGFjaG1lbnRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaW0tYXR0YWNobWVudC1kZWxldGUtYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiIChrZXlkb3duKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdfRGVsZXRlX2F0dGFjaG1lbnRsaW5rJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICYjMTAwMDU7JiN4RkUwRTtcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImJpbS1hdHRhY2htZW50bGluay1pdGVtXCIgaHJlZj17e2F0dGFjaG1lbnQubGlua319IHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyIG5vcmVmZXJyZXInPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1uYW1lXCIgdGl0bGU9e3thdHRhY2htZW50LmZpbGVOYW1lfX0+XHJcbiAgICAgICAgICAgICAgICB7e2F0dGFjaG1lbnQubmFtZSA/IGF0dGFjaG1lbnQubmFtZSA6IGF0dGFjaG1lbnQuZmlsZU5hbWV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIEBpZiAoIWhpZGVBdHRhY2htZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LXNpemVcIiB0aXRsZT17e2F0dGFjaG1lbnQubmFtZX19PlxyXG4gICAgICAgICAgICAgICAgICAoe3thdHRhY2htZW50LnNpemV9fSBrQilcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2xpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuIl19