@jeraldj/discussions-ui 8.0.3-v16

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 (174) hide show
  1. package/README.md +24 -0
  2. package/assets/images/Buffer-512.webp +0 -0
  3. package/assets/images/announcement.svg +25 -0
  4. package/assets/images/back-img.png +0 -0
  5. package/assets/images/bookmarks.png +0 -0
  6. package/assets/images/card-icon.png +0 -0
  7. package/assets/images/close.png +0 -0
  8. package/assets/images/delete.svg +13 -0
  9. package/assets/images/down-arrow.png +0 -0
  10. package/assets/images/down-chevron.png +0 -0
  11. package/assets/images/down.svg +12 -0
  12. package/assets/images/edit.svg +11 -0
  13. package/assets/images/empty.svg +37 -0
  14. package/assets/images/eye-icon.png +0 -0
  15. package/assets/images/general discussion.svg +15 -0
  16. package/assets/images/import-export-arrows.png +0 -0
  17. package/assets/images/loader-icon.svg +6 -0
  18. package/assets/images/profits.png +0 -0
  19. package/assets/images/search-icon.png +0 -0
  20. package/assets/images/select-bookmarks.png +0 -0
  21. package/assets/images/select-down-arrow.png +0 -0
  22. package/assets/images/select-profits.png +0 -0
  23. package/assets/images/select-up-arrow.png +0 -0
  24. package/assets/images/up-arrow.png +0 -0
  25. package/assets/images/up-chevron.png +0 -0
  26. package/assets/images/up.svg +12 -0
  27. package/assets/images/views.svg +9 -0
  28. package/assets/images/votes.svg +14 -0
  29. package/assets/styles/global.scss +283 -0
  30. package/esm2022/jeraldj-discussions-ui.mjs +5 -0
  31. package/esm2022/lib/common/constants.json +630 -0
  32. package/esm2022/lib/components/components.module.mjs +105 -0
  33. package/esm2022/lib/components/discuss-all/discuss-all.component.mjs +269 -0
  34. package/esm2022/lib/components/discuss-category/discuss-category.component.mjs +152 -0
  35. package/esm2022/lib/components/discuss-home/discuss-home.component.mjs +142 -0
  36. package/esm2022/lib/components/discuss-start/discuss-start.component.mjs +199 -0
  37. package/esm2022/lib/components/discuss-tags/discuss-tags.component.mjs +93 -0
  38. package/esm2022/lib/components/discussion-details/discussion-details.component.mjs +459 -0
  39. package/esm2022/lib/components/lib-entry/lib-entry.component.mjs +96 -0
  40. package/esm2022/lib/components/my-discussion/my-discussion.component.mjs +234 -0
  41. package/esm2022/lib/components/side-pannel/side-pannel.component.mjs +79 -0
  42. package/esm2022/lib/components/tag-all-discussion/tag-all-discussion.component.mjs +151 -0
  43. package/esm2022/lib/components/trending-tags/trending-tags.component.mjs +62 -0
  44. package/esm2022/lib/config/url.config.mjs +32 -0
  45. package/esm2022/lib/discussion-events.service.mjs +27 -0
  46. package/esm2022/lib/discussion-routing/discussion-routing.module.mjs +80 -0
  47. package/esm2022/lib/discussion-ui.module.mjs +41 -0
  48. package/esm2022/lib/elements/app-loader/app-loader.component.mjs +36 -0
  49. package/esm2022/lib/elements/avatar-photo/avatar-photo.component.mjs +81 -0
  50. package/esm2022/lib/elements/category-card/category-card.component.mjs +17 -0
  51. package/esm2022/lib/elements/discuss-card/discuss-card.component.mjs +45 -0
  52. package/esm2022/lib/elements/elements.module.mjs +69 -0
  53. package/esm2022/lib/elements/load-alert/load-alert.component.mjs +34 -0
  54. package/esm2022/lib/elements/post-reply/post-reply.component.mjs +69 -0
  55. package/esm2022/lib/elements/related-discussion/related-discussion.component.mjs +61 -0
  56. package/esm2022/lib/elements/sliders/sliders.component.mjs +76 -0
  57. package/esm2022/lib/events.service.mjs +31 -0
  58. package/esm2022/lib/models/discuss.model.mjs +16 -0
  59. package/esm2022/lib/models/discussion-config.model.mjs +2 -0
  60. package/esm2022/lib/navigation-service.service.mjs +39 -0
  61. package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
  62. package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +22 -0
  63. package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +41 -0
  64. package/esm2022/lib/pipes/pipes.module.mjs +24 -0
  65. package/esm2022/lib/pipes/sort-by/sort-by.pipe.mjs +34 -0
  66. package/esm2022/lib/pipes/split-initials/split-initials.pipe.mjs +23 -0
  67. package/esm2022/lib/router-service.service.mjs +21 -0
  68. package/esm2022/lib/services/abstract-config.service.mjs +3 -0
  69. package/esm2022/lib/services/config.service.mjs +76 -0
  70. package/esm2022/lib/services/discuss-utils.service.mjs +36 -0
  71. package/esm2022/lib/services/discussion.service.mjs +254 -0
  72. package/esm2022/lib/telemetry-utils.service.mjs +103 -0
  73. package/esm2022/lib/wrapper/base-wrapper/base-wrapper.component.mjs +41 -0
  74. package/esm2022/lib/wrapper/category-widget/category-widget.component.mjs +37 -0
  75. package/esm2022/lib/wrapper/tags-widget/tags-widget.component.mjs +33 -0
  76. package/esm2022/lib/wrapper-navigate.service.mjs +23 -0
  77. package/esm2022/public-api.mjs +29 -0
  78. package/fesm2022/jeraldj-discussions-ui.mjs +3929 -0
  79. package/fesm2022/jeraldj-discussions-ui.mjs.map +1 -0
  80. package/index.d.ts +6 -0
  81. package/jeraldj-discussions-ui.d.ts.map +1 -0
  82. package/lib/components/components.module.d.ts +24 -0
  83. package/lib/components/components.module.d.ts.map +1 -0
  84. package/lib/components/discuss-all/discuss-all.component.d.ts +61 -0
  85. package/lib/components/discuss-all/discuss-all.component.d.ts.map +1 -0
  86. package/lib/components/discuss-category/discuss-category.component.d.ts +45 -0
  87. package/lib/components/discuss-category/discuss-category.component.d.ts.map +1 -0
  88. package/lib/components/discuss-home/discuss-home.component.d.ts +59 -0
  89. package/lib/components/discuss-home/discuss-home.component.d.ts.map +1 -0
  90. package/lib/components/discuss-start/discuss-start.component.d.ts +50 -0
  91. package/lib/components/discuss-start/discuss-start.component.d.ts.map +1 -0
  92. package/lib/components/discuss-tags/discuss-tags.component.d.ts +41 -0
  93. package/lib/components/discuss-tags/discuss-tags.component.d.ts.map +1 -0
  94. package/lib/components/discussion-details/discussion-details.component.d.ts +112 -0
  95. package/lib/components/discussion-details/discussion-details.component.d.ts.map +1 -0
  96. package/lib/components/lib-entry/lib-entry.component.d.ts +42 -0
  97. package/lib/components/lib-entry/lib-entry.component.d.ts.map +1 -0
  98. package/lib/components/my-discussion/my-discussion.component.d.ts +54 -0
  99. package/lib/components/my-discussion/my-discussion.component.d.ts.map +1 -0
  100. package/lib/components/side-pannel/side-pannel.component.d.ts +34 -0
  101. package/lib/components/side-pannel/side-pannel.component.d.ts.map +1 -0
  102. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts +53 -0
  103. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts.map +1 -0
  104. package/lib/components/trending-tags/trending-tags.component.d.ts +26 -0
  105. package/lib/components/trending-tags/trending-tags.component.d.ts.map +1 -0
  106. package/lib/config/url.config.d.ts +29 -0
  107. package/lib/config/url.config.d.ts.map +1 -0
  108. package/lib/discussion-events.service.d.ts +12 -0
  109. package/lib/discussion-events.service.d.ts.map +1 -0
  110. package/lib/discussion-routing/discussion-routing.module.d.ts +9 -0
  111. package/lib/discussion-routing/discussion-routing.module.d.ts.map +1 -0
  112. package/lib/discussion-ui.module.d.ts +16 -0
  113. package/lib/discussion-ui.module.d.ts.map +1 -0
  114. package/lib/elements/app-loader/app-loader.component.d.ts +17 -0
  115. package/lib/elements/app-loader/app-loader.component.d.ts.map +1 -0
  116. package/lib/elements/avatar-photo/avatar-photo.component.d.ts +19 -0
  117. package/lib/elements/avatar-photo/avatar-photo.component.d.ts.map +1 -0
  118. package/lib/elements/category-card/category-card.component.d.ts +10 -0
  119. package/lib/elements/category-card/category-card.component.d.ts.map +1 -0
  120. package/lib/elements/discuss-card/discuss-card.component.d.ts +17 -0
  121. package/lib/elements/discuss-card/discuss-card.component.d.ts.map +1 -0
  122. package/lib/elements/elements.module.d.ts +18 -0
  123. package/lib/elements/elements.module.d.ts.map +1 -0
  124. package/lib/elements/load-alert/load-alert.component.d.ts +15 -0
  125. package/lib/elements/load-alert/load-alert.component.d.ts.map +1 -0
  126. package/lib/elements/post-reply/post-reply.component.d.ts +22 -0
  127. package/lib/elements/post-reply/post-reply.component.d.ts.map +1 -0
  128. package/lib/elements/related-discussion/related-discussion.component.d.ts +26 -0
  129. package/lib/elements/related-discussion/related-discussion.component.d.ts.map +1 -0
  130. package/lib/elements/sliders/sliders.component.d.ts +18 -0
  131. package/lib/elements/sliders/sliders.component.d.ts.map +1 -0
  132. package/lib/events.service.d.ts +18 -0
  133. package/lib/events.service.d.ts.map +1 -0
  134. package/lib/models/discuss.model.d.ts +298 -0
  135. package/lib/models/discuss.model.d.ts.map +1 -0
  136. package/lib/models/discussion-config.model.d.ts +42 -0
  137. package/lib/models/discussion-config.model.d.ts.map +1 -0
  138. package/lib/navigation-service.service.d.ts +22 -0
  139. package/lib/navigation-service.service.d.ts.map +1 -0
  140. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +8 -0
  141. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts.map +1 -0
  142. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +8 -0
  143. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts.map +1 -0
  144. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +8 -0
  145. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts.map +1 -0
  146. package/lib/pipes/pipes.module.d.ts +13 -0
  147. package/lib/pipes/pipes.module.d.ts.map +1 -0
  148. package/lib/pipes/sort-by/sort-by.pipe.d.ts +8 -0
  149. package/lib/pipes/sort-by/sort-by.pipe.d.ts.map +1 -0
  150. package/lib/pipes/split-initials/split-initials.pipe.d.ts +8 -0
  151. package/lib/pipes/split-initials/split-initials.pipe.d.ts.map +1 -0
  152. package/lib/router-service.service.d.ts +10 -0
  153. package/lib/router-service.service.d.ts.map +1 -0
  154. package/lib/services/abstract-config.service.d.ts +4 -0
  155. package/lib/services/abstract-config.service.d.ts.map +1 -0
  156. package/lib/services/config.service.d.ts +36 -0
  157. package/lib/services/config.service.d.ts.map +1 -0
  158. package/lib/services/discuss-utils.service.d.ts +14 -0
  159. package/lib/services/discuss-utils.service.d.ts.map +1 -0
  160. package/lib/services/discussion.service.d.ts +76 -0
  161. package/lib/services/discussion.service.d.ts.map +1 -0
  162. package/lib/telemetry-utils.service.d.ts +20 -0
  163. package/lib/telemetry-utils.service.d.ts.map +1 -0
  164. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts +22 -0
  165. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts.map +1 -0
  166. package/lib/wrapper/category-widget/category-widget.component.d.ts +23 -0
  167. package/lib/wrapper/category-widget/category-widget.component.d.ts.map +1 -0
  168. package/lib/wrapper/tags-widget/tags-widget.component.d.ts +17 -0
  169. package/lib/wrapper/tags-widget/tags-widget.component.d.ts.map +1 -0
  170. package/lib/wrapper-navigate.service.d.ts +11 -0
  171. package/lib/wrapper-navigate.service.d.ts.map +1 -0
  172. package/package.json +44 -0
  173. package/public-api.d.ts +26 -0
  174. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,459 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { NSDiscussData } from './../../models/discuss.model';
3
+ import * as CONSTANTS from '../../common/constants.json';
4
+ /* tslint:disable */
5
+ import * as _ from 'lodash';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/router";
8
+ import * as i2 from "./../../services/discussion.service";
9
+ import * as i3 from "../../services/config.service";
10
+ import * as i4 from "@angular/forms";
11
+ import * as i5 from "./../../telemetry-utils.service";
12
+ import * as i6 from "@angular/common";
13
+ import * as i7 from "../../navigation-service.service";
14
+ import * as i8 from "../../elements/app-loader/app-loader.component";
15
+ import * as i9 from "../../elements/related-discussion/related-discussion.component";
16
+ import * as i10 from "../../elements/post-reply/post-reply.component";
17
+ import * as i11 from "../discuss-start/discuss-start.component";
18
+ import * as i12 from "../../pipes/pipe-filter/pipe-filter.pipe";
19
+ import * as i13 from "../../pipes/sort-by/sort-by.pipe";
20
+ import * as i14 from "../../pipes/split-initials/split-initials.pipe";
21
+ const MSGS = {
22
+ deletePost: `Are you sure you want to delete this Post? This can't be undone.`,
23
+ deleteTopic: `Are you sure you want to delete this topic? Your action cannot be undone.`
24
+ };
25
+ export class DiscussionDetailsComponent {
26
+ constructor(route, discussionService, configService, formBuilder, router, telemetryUtils, renderer, location, navigationService) {
27
+ this.route = route;
28
+ this.discussionService = discussionService;
29
+ this.configService = configService;
30
+ this.formBuilder = formBuilder;
31
+ this.router = router;
32
+ this.telemetryUtils = telemetryUtils;
33
+ this.renderer = renderer;
34
+ this.location = location;
35
+ this.navigationService = navigationService;
36
+ this.stateChange = new EventEmitter();
37
+ this.currentActivePage = 1;
38
+ this.currentFilter = 'timestamp'; // 'recent
39
+ this.pager = {};
40
+ this.fetchSingleCategoryLoader = false;
41
+ this.editMode = false;
42
+ this.updatedPost = false;
43
+ this.showEditTopicModal = false;
44
+ this.dropdownContent = true;
45
+ this.showLoader = false;
46
+ /**
47
+ * @description - It will check for the outside click while kebab menu is in open mode.
48
+ */
49
+ this.renderer.listen('window', 'click', (e) => {
50
+ // tslint:disable-next-line:no-string-literal
51
+ if (e.target['id'] !== 'group-actions') {
52
+ this.dropdownContent = true;
53
+ }
54
+ });
55
+ }
56
+ ngOnInit() {
57
+ this.initializeFormFiled();
58
+ if (this.widget) {
59
+ this.fetchSingleCategoryLoader = true;
60
+ }
61
+ if (!this.topicId && !this.slug) {
62
+ this.route.params.subscribe(params => {
63
+ this.routeParams = params;
64
+ this.slug = _.get(this.routeParams, 'slug');
65
+ this.topicId = _.get(this.routeParams, 'topicId');
66
+ this.refreshPostData(this.currentActivePage);
67
+ // this.getRealtedDiscussion(this.cid)
68
+ });
69
+ }
70
+ else {
71
+ this.refreshPostData(this.currentActivePage);
72
+ // this.getRealtedDiscussion(this.cid)
73
+ }
74
+ this.telemetryUtils.logImpression(NSDiscussData.IPageName.DETAILS);
75
+ }
76
+ // tslint:disable-next-line: use-life-cycle-interface
77
+ ngOnChanges() {
78
+ if (!this.topicId && !this.slug) {
79
+ this.route.params.subscribe(params => {
80
+ this.routeParams = params;
81
+ this.slug = _.get(this.routeParams, 'slug');
82
+ this.topicId = _.get(this.routeParams, 'topicId');
83
+ this.refreshPostData(this.currentActivePage);
84
+ // this.getRealtedDiscussion(this.cid)
85
+ });
86
+ }
87
+ else {
88
+ this.refreshPostData(this.currentActivePage);
89
+ // this.getRealtedDiscussion(this.cid)
90
+ }
91
+ }
92
+ // new method
93
+ acceptData(discuss) {
94
+ // debugger
95
+ const matchedTopic = _.find(this.telemetryUtils.getContext(), { type: 'Topic' });
96
+ if (matchedTopic) {
97
+ this.telemetryUtils.deleteContext(matchedTopic);
98
+ }
99
+ this.telemetryUtils.uppendContext({
100
+ id: _.get(discuss, 'tid'),
101
+ type: 'Topic'
102
+ });
103
+ const slug = _.trim(_.get(discuss, 'slug'));
104
+ const input = {
105
+ data: { url: `${this.configService.getRouterSlug()}${CONSTANTS.ROUTES.TOPIC}${slug}`, queryParams: {} },
106
+ action: CONSTANTS.CATEGORY_DETAILS
107
+ };
108
+ this.navigationService.navigate(input);
109
+ this.stateChange.emit({ action: CONSTANTS.CATEGORY_DETAILS, title: discuss.title, tid: discuss.tid });
110
+ }
111
+ initializeFormFiled() {
112
+ this.postAnswerForm = this.formBuilder.group({
113
+ answer: [],
114
+ });
115
+ this.UpdatePostAnswerForm = this.formBuilder.group({
116
+ updatedAnswer: [],
117
+ });
118
+ this.replyForm = this.formBuilder.group({
119
+ reply: []
120
+ });
121
+ }
122
+ async refreshPostData(page) {
123
+ if (this.currentFilter === 'timestamp') {
124
+ this.discussionService.fetchTopicById(this.topicId, this.slug, page).subscribe((data) => {
125
+ this.appendResponse(data);
126
+ this.showLoader = true;
127
+ }, (err) => {
128
+ // error code check
129
+ this.discussionService.showTrafficAlert(err);
130
+ console.log('Error in fetching topics');
131
+ // toast message
132
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
133
+ });
134
+ }
135
+ else {
136
+ this.discussionService.fetchTopicByIdSort(this.topicId, 'voted', page).subscribe((data) => {
137
+ this.appendResponse(data);
138
+ this.showLoader = true;
139
+ }, (err) => {
140
+ // error code check
141
+ this.discussionService.showTrafficAlert(err);
142
+ console.log('Error in fetching topics');
143
+ });
144
+ }
145
+ }
146
+ appendResponse(data) {
147
+ this.data = data;
148
+ this.paginationData = _.get(data, 'pagination');
149
+ // TODO: After updating the nodebb version to v1.18.6 or above. Remove the fallback after 2/3 releases.
150
+ this.mainUid = _.get(data, 'loggedInUser.uid') || _.get(data, 'privileges.uid');
151
+ this.categoryId = _.get(data, 'cid');
152
+ this.topicId = _.get(data, 'tid');
153
+ }
154
+ setPagination() {
155
+ this.pager = {
156
+ startIndex: this.paginationData.first.page,
157
+ endIndex: this.paginationData.last.page,
158
+ pages: this.paginationData.pages,
159
+ currentPage: this.paginationData.currentPage,
160
+ totalPage: this.paginationData.pageCount,
161
+ };
162
+ }
163
+ upvote(discuss) {
164
+ const req = {
165
+ delta: 1,
166
+ };
167
+ this.processVote(discuss, req);
168
+ }
169
+ downvote(discuss) {
170
+ const req = {
171
+ delta: -1,
172
+ };
173
+ this.processVote(discuss, req);
174
+ }
175
+ async processVote(discuss, req) {
176
+ if (discuss && discuss.uid) {
177
+ this.discussionService.votePost(discuss.pid, req).subscribe(() => {
178
+ // toast
179
+ // this.openSnackbar(this.toastSuccess.nativeElement.value);
180
+ this.postAnswerForm.reset();
181
+ this.refreshPostData(this.currentActivePage);
182
+ }, (err) => {
183
+ // error code check
184
+ this.discussionService.showTrafficAlert(err);
185
+ // toast
186
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
187
+ });
188
+ }
189
+ }
190
+ bookmark(discuss) {
191
+ this.discussionService.bookmarkPost(discuss.pid).subscribe(data => {
192
+ // toast
193
+ // this.openSnackbar('Bookmark added successfully!');
194
+ this.refreshPostData(this.currentActivePage);
195
+ }, (err) => {
196
+ // error code check
197
+ this.discussionService.showTrafficAlert(err);
198
+ // toast
199
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
200
+ });
201
+ }
202
+ unBookMark(discuss) {
203
+ this.discussionService.deleteBookmarkPost(discuss.pid).subscribe(data => {
204
+ // toast
205
+ this.refreshPostData(this.currentActivePage);
206
+ }, (err) => {
207
+ // error code check
208
+ this.discussionService.showTrafficAlert(err);
209
+ // toast
210
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
211
+ });
212
+ }
213
+ deleteVote(discuss) {
214
+ this.discussionService.deleteVotePost(discuss.pid).subscribe(data => {
215
+ // toast
216
+ this.refreshPostData(this.currentActivePage);
217
+ }, (err) => {
218
+ // error code check
219
+ this.discussionService.showTrafficAlert(err);
220
+ // toast
221
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
222
+ });
223
+ }
224
+ postReply(replyContent, post) {
225
+ const req = {
226
+ content: replyContent,
227
+ };
228
+ this.postAnswerForm.controls['answer'].setValue('');
229
+ if (post && post.tid) {
230
+ this.discussionService.replyPost(post.tid, req).subscribe(() => {
231
+ // toast
232
+ // this.openSnackbar('Your reply was saved succesfuly!');
233
+ // this.fetchNewData = true;
234
+ this.refreshPostData(this.currentActivePage);
235
+ }, (err) => {
236
+ // error code check
237
+ this.discussionService.showTrafficAlert(err);
238
+ // toast
239
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
240
+ });
241
+ }
242
+ }
243
+ postCommentsReply(replyContent, post) {
244
+ const req = {
245
+ content: replyContent,
246
+ toPid: post.pid,
247
+ };
248
+ if (post && post.tid) {
249
+ this.discussionService.replyPost(post.tid, req).subscribe(() => {
250
+ // toast
251
+ // this.openSnackbar('Your reply was saved succesfuly!');
252
+ this.refreshPostData(this.currentActivePage);
253
+ }, (err) => {
254
+ // error code check
255
+ this.discussionService.showTrafficAlert(err);
256
+ // toast
257
+ // this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
258
+ });
259
+ }
260
+ }
261
+ confirmDelete(pid) {
262
+ if (window.confirm(MSGS.deletePost)) {
263
+ this.deletePost(pid);
264
+ }
265
+ }
266
+ filter(key) {
267
+ if (key) {
268
+ this.currentFilter = key;
269
+ this.refreshPostData(this.currentActivePage);
270
+ }
271
+ }
272
+ navigateWithPage(page) {
273
+ if (page !== this.currentActivePage) {
274
+ this.router.navigate([`${this.configService.getRouterSlug()}${CONSTANTS.ROUTES.CATEGORY} ${this.topicId}`], { queryParams: { page }, queryParamsHandling: "merge" });
275
+ }
276
+ }
277
+ showError(meta) {
278
+ if (meta) {
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ getBgColor(tagTitle) {
284
+ const bgColor = this.stringToColor(tagTitle.toLowerCase());
285
+ const color = this.getContrast();
286
+ return { color, 'background-color': bgColor };
287
+ }
288
+ stringToColor(title) {
289
+ let hash = 0;
290
+ for (let i = 0; i < title.length; i++) {
291
+ // tslint:disable-next-line: no-bitwise
292
+ hash = title.charCodeAt(i) + ((hash << 5) - hash);
293
+ }
294
+ const hue = Math.abs(hash % 360);
295
+ // tslint:disable-next-line: prefer-template
296
+ const colour = 'hsl(' + hue + ',100%,30%)';
297
+ return colour;
298
+ }
299
+ getContrast() {
300
+ return 'rgba(255, 255, 255, 80%)';
301
+ }
302
+ logTelemetry(event, data) {
303
+ const pid = _.get(data, 'pid') || _.get(data, 'mainPid') ?
304
+ { id: _.get(data, 'pid') || _.get(data, 'mainPid'), type: 'Post' } : {};
305
+ this.telemetryUtils.uppendContext(pid);
306
+ this.telemetryUtils.logInteract(event, NSDiscussData.IPageName.DETAILS);
307
+ }
308
+ onEditMode(UpdatePostStatus) {
309
+ if (UpdatePostStatus) {
310
+ this.editMode = true;
311
+ }
312
+ else {
313
+ this.editMode = false;
314
+ }
315
+ }
316
+ getRealtimePost(post, index) {
317
+ this.editMode = true;
318
+ this.editContentIndex = index;
319
+ this.contentPost = _.get(post, 'content').replace(/<[^>]*>/g, '');
320
+ post.toggle = false;
321
+ }
322
+ updatePost(updatedPostContent, pid) {
323
+ this.editMode = false;
324
+ const req = {
325
+ content: updatedPostContent,
326
+ title: '',
327
+ tags: [],
328
+ uid: this.mainUid
329
+ };
330
+ this.discussionService.editPost(pid, req).subscribe((data) => {
331
+ // TODO: Success toast
332
+ this.refreshPostData(this.currentActivePage);
333
+ }, (error) => {
334
+ // error code check
335
+ this.discussionService.showTrafficAlert(error);
336
+ // TODO: error toast
337
+ console.log('e', error);
338
+ });
339
+ console.log(pid);
340
+ }
341
+ deletePost(postId) {
342
+ this.discussionService.deletePost(postId, this.mainUid).subscribe((data) => {
343
+ // TODO: Success toast
344
+ this.refreshPostData(this.currentActivePage);
345
+ }, (error) => {
346
+ // error code check
347
+ this.discussionService.showTrafficAlert(error);
348
+ // TODO: error toast
349
+ console.log('e', error);
350
+ });
351
+ }
352
+ editReplyHandler(event, post) {
353
+ if (_.get(event, 'action') === 'cancel') {
354
+ this.onEditMode(false);
355
+ }
356
+ else if (_.get(event, 'action') === 'edit') {
357
+ this.updatePost(_.get(event, 'content'), _.get(post, 'pid'));
358
+ this.logTelemetry(event, post);
359
+ }
360
+ }
361
+ commentReplyHandler(event, post) {
362
+ if (_.get(event, 'action') === 'cancel') {
363
+ this.togglePost(post);
364
+ }
365
+ else if (_.get(event, 'action') === 'reply') {
366
+ this.postCommentsReply(_.get(event, 'content'), post);
367
+ this.logTelemetry(event, post);
368
+ }
369
+ }
370
+ postReplyHandler(event, post) {
371
+ if (_.get(event, 'action') === 'reply') {
372
+ this.postReply(_.get(event, 'content'), post);
373
+ this.logTelemetry(event, post);
374
+ }
375
+ }
376
+ togglePost(post) {
377
+ post.toggle = !post.toggle;
378
+ this.onEditMode(false);
379
+ }
380
+ /**
381
+ * @description - It will trigger the event handlers and close the update thread popup.
382
+ */
383
+ closeModal(event) {
384
+ console.log('close event', event);
385
+ if (_.get(event, 'action') === 'update') {
386
+ this.editTopicHandler(event, _.get(event, 'tid'), _.get(event, 'request'));
387
+ }
388
+ this.showEditTopicModal = false;
389
+ }
390
+ /**
391
+ * @description - It will open update thread popup.
392
+ */
393
+ editTopic(event, topicData) {
394
+ this.showEditTopicModal = true;
395
+ this.logTelemetry(event, topicData);
396
+ }
397
+ /**
398
+ * @description - It will all the update topic api. If success, then will refresh the data.
399
+ */
400
+ editTopicHandler(event, tid, updateTopicRequest) {
401
+ this.logTelemetry(event, this.editableTopicDetails);
402
+ this.discussionService.editPost(tid, updateTopicRequest).subscribe(data => {
403
+ console.log('update success', data);
404
+ this.refreshPostData(this.currentActivePage);
405
+ }, error => {
406
+ // error code check
407
+ this.discussionService.showTrafficAlert(error);
408
+ console.log('error while updating', error);
409
+ });
410
+ }
411
+ /**
412
+ * @description - It will open the confirmation popup before deleting the topic,
413
+ * If clicked yes, then will call the delete topic handler.
414
+ */
415
+ deleteTopic(event, topicData) {
416
+ if (window.confirm(MSGS.deleteTopic)) {
417
+ this.logTelemetry(event, topicData);
418
+ this.deleteTopicHandler(_.get(topicData, 'tid'));
419
+ }
420
+ }
421
+ /**
422
+ * @description - It will all the delete topic api. If success, then will navigate back to the previous page.
423
+ */
424
+ deleteTopicHandler(topicId) {
425
+ this.discussionService.deleteTopic(topicId).subscribe(data => {
426
+ this.location.back();
427
+ }, error => {
428
+ // error code check
429
+ this.discussionService.showTrafficAlert(error);
430
+ console.log('error while deleting', error);
431
+ });
432
+ }
433
+ /**
434
+ * @description - It will toggle the kebab menu click
435
+ */
436
+ onMenuClick() {
437
+ this.dropdownContent = !this.dropdownContent;
438
+ }
439
+ ngOnDestroy() {
440
+ if (this.paramsSubscription) {
441
+ this.paramsSubscription.unsubscribe();
442
+ }
443
+ }
444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussionDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.DiscussionService }, { token: i3.ConfigService }, { token: i4.UntypedFormBuilder }, { token: i1.Router }, { token: i5.TelemetryUtilsService }, { token: i0.Renderer2 }, { token: i6.Location }, { token: i7.NavigationServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussionDetailsComponent, selector: "lib-discussion-details", inputs: { topicId: "topicId", slug: "slug", widget: "widget" }, outputs: { stateChange: "stateChange" }, usesOnChanges: true, ngImport: i0, template: "<lib-app-loader *ngIf=\"!showLoader\"></lib-app-loader>\n<div class=\"discuss-details-content\" *ngIf=\"showLoader\">\n <div class=\"discussion-details\" tabindex=\"0\" role=\"link\">\n\n <!-- header -->\n <div class=\"discuss-card-kabab-menu\">\n <h3 class=\"discussion-card-title df-label-color\" [innerHTML]=\"data?.title\"></h3>\n <div *ngIf=\"data?.uid === mainUid\">\n <div class=\"kabab-menu\" id=\"group-actions\" (click)=\"onMenuClick()\" tabindex=\"0\"></div>\n <div class=\"kabab-menu-dropdown-content\" [hidden]=\"dropdownContent\">\n <div id=\"edit-topic\" class=\"list\" tabindex=\"0\"\n (click)=\"editTopic($event, data); editableTopicDetails = data\">Edit\n </div>\n <div id=\"delete-topic\" class=\"list\" (click)=\"deleteTopic($event, data)\" tabindex=\"0\">Delete</div>\n </div>\n </div>\n </div>\n <!-- /header -->\n\n <ng-container *ngFor=\"let post of data?.posts\">\n <div class=\"post-reply-card\" *ngIf=\"post?.index === 0\">\n <h3 class=\"discussion-heading df-text-color\" [innerHTML]=\"post?.content\"></h3>\n <div class=\"discussion-content\">\n <div class=\"circle-text\">\n <div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div>\n </div>\n <div class=\"discussion-labels\">{{'Asked by '}}</div>\n <div class=\"discussion-labels\" *ngIf=\"post.user.fullname\" [innerHTML]=\"post.user.fullname\"></div>\n <div class=\"discussion-labels\" *ngIf=\"!post.user.fullname\" [innerHTML]=\"post.user.username\"></div>\n </div>\n\n <div class=\"tags\" aria-label=\"tags\">\n <ng-container *ngIf=\"data && data?.tags && data?.tags?.length > 0\">\n <span *ngFor=\"let tag of data?.tags\" class=\"tag\" role=\"link\" tabindex=\"0\"\n [ngStyle]=\"getBgColor(tag.value)\">\n {{tag.value}}\n </span>\n </ng-container>\n </div>\n\n <div class=\"comments-area\">\n <div>\n <span class=\"post-icons mobile\">\n <span role=\"link\" tabindex=\"0\" *ngIf=\"!post.upvoted\" (click)=\"upvote(post);logTelemetry($event, post)\"\n aria-label=\"upvote the post\" id=\"up-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up-arrow\" class=\"icons\"\n alt=\"up arrow icon for like the post\">\n </span>\n <span *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove upvote\" id=\"delete-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up.svg\" alt=\"select-up-arrow\" class=\"icons\" alt=\"up image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote post\" id=\"down-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\"\n alt=\"down arrow icon for unlike post\">\n </span>\n <span *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove down vote\" id=\"delete-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.downvotes}}</span>\n </span>\n <span class=\"post-icons mobile\" role=\"link\" tabindex=\"0\">\n <!-- trending -->\n <img src=\"./assets/discussion-ui/images/views.svg\" alt=\"views icon for seeing the posts\" class=\"icons\">\n <span class=\"vote-value\" aria-label=\"views count\">{{data.viewcount}} Views</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"bookmark(post);logTelemetry($event, post)\" aria-label=\"Bookmark post\" id=\"bookmark\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/bookmarks.png\" class=\"icons\" alt=\"bookmark icon\">\n </span>\n <span *ngIf=\"data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"unBookMark(post);logTelemetry($event, post)\" aria-label=\"unBookmark post\"\n id=\"un-bookmark-vote\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/select-bookmarks.png\" class=\"icons bookmark-icon\"\n alt=\"select bookmark icon\">\n </span>\n </span>\n </div>\n <div class=\"comments-count\">\n <span *ngIf=\"data?.postcount-1 > 0\" aria-label=\"comments count\">\n {{data?.postcount-1}}\n comments\n </span>\n <span *ngIf=\"data?.postcount-1 <=0\" aria-label=\"comments count\">\n 0 comments</span>\n </div>\n </div>\n <!-- /card content -->\n <!-- post reply -->\n <lib-post-reply (actionEvent)=\"postReplyHandler($event, post); logTelemetry($event, post)\" [mode]=\"'reply'\"\n [showCancel]=\"false\"></lib-post-reply>\n \n </div>\n </ng-container>\n <!-- /card end -->\n\n <ng-container *ngIf=\"data?.posts && data?.postcount > 1\">\n <div class=\"recent-tabs\">\n <div class=\"tabs-content\">\n <div class=\"tabs-filter\">\n <a href=\"javascript:void(0)\" class=\"filter-option\" role=\"link\" tabindex=\"0\" [ngClass]=\"{'tabs-active' : currentFilter === 'timestamp',\n 'ws-mat-accent-border':currentFilter !== 'timestamp'}\"\n (click)=\"filter('timestamp');logTelemetry($event)\" id=\"recent-post\">\n Recent </a>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngFor=\"let post of data?.posts | sortBy: 'timestampISO':'desc'; index as i\">\n <!-- card content -->\n <div *ngIf=\"post?.index != 0\" class=\"post-card\">\n <!-- header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <span class=\"circle-text\"><span class=\"circle-label\">{{ post?.user?.username | splitInitials\n }}</span></span>\n <span class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></span>\n <span class=\"post-name df-label-color\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></span>\n </div>\n <div class=\"custom-actions\">\n <span class=\"post-time\">{{ post?.timestamp | date: 'dd MMM yyyy hh:mm a'}}</span>\n <ng-container *ngIf=\"mainUid === post?.uid\">\n <img src=\"./assets/discussion-ui/images/edit.svg\" class=\"edit-icon\" id=\"edit-post\" alt=\"edit icon\"\n (click)=\"getRealtimePost(post, i)\" tabindex=\"0\">\n <img src=\"./assets/discussion-ui/images/delete.svg\" class=\"delete-icon\" id=\"delete-post\" alt=\"delete icon\"\n (click)=\"confirmDelete(post?.pid)\" tabindex=\"0\">\n </ng-container>\n </div>\n </div>\n <!-- / header -->\n <div>\n <div class=\"edit-text\" *ngIf=\"!editMode || editContentIndex !== i\">\n <p [innerHTML]=\"post?.content\" class=\"post-labels df-text-color\"></p>\n <div class=\"edited-text\" *ngIf=\"post?.edited\">(edited)</div>\n </div>\n <div *ngIf=\"editMode && editContentIndex === i\">\n <lib-post-reply (actionEvent)=\"editReplyHandler($event, post)\" [mode]=\"'edit'\" [showCancel]=\"true\"\n [content]=\"contentPost\"></lib-post-reply>\n </div>\n <div class=\"reply-area\">\n <div>\n <span class=\"flex mobile\">\n <!-- upward arrow -->\n <span class=\"up-vote-text\" *ngIf=\"!post?.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"upvote(post);logTelemetry($event, post)\" aria-label=\"upvote comment\" id=\"up-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <!-- upward arrow -->\n <span class=\"down-vote-text\" *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete upvote on comment\"\n id=\"delete-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n <span class=\"vote-value\">{{post?.upvotes}}</span>\n </span>\n\n <span class=\"flex mobile\">\n <span id=\"down-vote\" *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote comment\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\" alt=\"down arrow icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <span id=\"delete-vote\" *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete downvote on comment\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down icon\">\n </span>\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n\n <button (click)=\"togglePost(post); logTelemetry($event, post)\"\n class=\"df-btn df-btn-normal df-btn-primary df-reply-btn\" id=\"reply-comment\">\n Reply </button>\n\n </div>\n <div class=\"replies\" *ngIf=\"post?.toggle\">\n <ng-container [ngTemplateOutlet]=\"reply\" [ngTemplateOutletContext]=\"{post:post}\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"post?.replies?.count > 0\">\n <div>\n <div>\n <div class=\"reply-content\" (click)=\"post.replyCountToggle = !post.replyCountToggle\" tabindex=\"0\">\n <span class=\"replies-count\"> {{post?.replies?.count}} reply(s) </span>\n <div *ngIf=\"post?.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"post?.replyCountToggle\" aria-label=\"reply toggle upwards\">\n <!-- up arrow -->\n <img src=\"./assets/discussion-ui/images/up-chevron.png\" class=\"icons\" alt=\"up chevron icon\">\n </span>\n </div>\n <div *ngIf=\"!post.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"!post.replyCountToggle\" aria-label=\"reply toggle downwards\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down-chevron.png\" class=\"icons\" alt=\"down chevron icon\">\n </span>\n </div>\n </div>\n </div>\n <div class=\"last-reply-data\">\n <span *ngIf=\"!post.replyCountToggle\">Last reply\n {{ post?.replies?.timestampISO | date: 'dd MMM yyyy hh:mm a' }} </span>\n </div>\n </div>\n <div class=\"replies\" *ngIf=\"post?.replyCountToggle\">\n <ng-container [ngTemplateOutlet]=\"replies\"\n [ngTemplateOutletContext]=\"{posts:data.posts, postId:post.pid}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <!-- /card content -->\n </div>\n <!-- / card -->\n <!-- Divider -->\n <div *ngIf=\"post.index != 0\"></div>\n </ng-container>\n </div>\n\n <div class=\"related-discuss-part\">\n <div *ngIf=\"fetchSingleCategoryLoader\" class=\"related-discuss-part-content\"></div>\n <lib-related-discussion *ngIf=\"!fetchSingleCategoryLoader\" [catId]=\"categoryId\" [topicId]=\"topicId\">\n </lib-related-discussion>\n </div>\n</div>\n\n<ng-template #reply let-post=\"post\">\n <lib-post-reply (actionEvent)=\"commentReplyHandler($event, post)\" [mode]=\"'reply'\" [showCancel]=\"true\">\n </lib-post-reply>\n</ng-template>\n\n<ng-template #replies let-posts=\"posts\" let-postId=\"postId\">\n <ng-container *ngFor=\"let post of posts | pipeFilter:'toPid': postId; index as index; last as last\">\n <!-- card -->\n <div class=\"post-sub-card\">\n <!-- card-header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <div class=\"circle-text\"><div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div></div>\n <div class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></div>\n <div class=\"df-label-color post-name\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></div>\n </div>\n <div class=\"post-time\">{{ post?.timestamp | date}}</div>\n </div>\n <!-- /card-header -->\n\n <!-- card-content -->\n <div>\n <p role=\"link\" tabindex=\"0\" tabindex=\"0\" [innerHTML]=\"post?.content\"></p>\n <div class=\"reply-area\">\n <div class=\"reply-area-content\">\n <span class=\"post-icons mobile\">\n <!-- up arrow -->\n <img *ngIf=\"!post?.upvoted\" class=\"cursor-pointer\" (click)=\"upvote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up arrow icon\" class=\"icons\" tabindex=\"0\">\n <img *ngIf=\"post?.upvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up.svg\" alt=\"select up arrow icon\" class=\"icons\" tabindex=\"0\">\n <span class=\"vote-value\">{{post.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <img *ngIf=\"!post?.downvoted\" class=\"cursor-pointer\" (click)=\"downvote(post); logTelemetry($event, post)\"\n id=\"up-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down-arrow.png\" alt=\"down arrow icon\"\n class=\"icons\">\n <img *ngIf=\"post?.downvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n id=\"delete-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down.svg\" alt=\"select down arrow icon\"\n class=\"icons\">\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n </div>\n </div>\n </div> \n <!-- /card -->\n </ng-container>\n</ng-template>\n\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Thank you for voting!\" value=\"Thank you for voting!!\"\n #toastSuccess />\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Something went wrong, please try again later!\"\n value=\"Something went wrong, please try again later!\" #toastError />\n\n<lib-discuss-start [mode]=\"'edit'\" [topicData]=\"editableTopicDetails\" (close)=\"closeModal($event)\"\n *ngIf=\"showEditTopicModal\"></lib-discuss-start>", styles: ["@charset \"UTF-8\";.discuss-details-content{display:flex;flex-direction:row}.discussion-details{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;background:var(--df-card-bg);color:var(--df-text);flex:3;height:auto;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:.875rem 1rem;justify-content:space-between;z-index:unset;margin-bottom:1rem}.related-discuss-part{padding:0 0 1rem 1.5rem;position:relative;z-index:2}.related-discuss-part .related-discuss-part-content{padding:0 .25rem}.discussion-card-title{font-size:1.25rem;font-weight:700}.discussion-heading{font-size:.875rem;font-weight:400;pointer-events:none;margin-bottom:0;margin-top:.5rem}.discussion-content{display:flex;align-items:center;margin-bottom:1rem;font-size:.875rem;flex-wrap:wrap;margin-bottom:0;margin-top:1rem}.comment-section{display:flex;align-items:center;justify-content:space-between;margin:.5rem 0;flex-direction:row;flex-wrap:wrap}.post-header-content{display:flex;align-items:center}.circle-text{border-radius:50%;width:1.75rem;height:1.75rem;display:flex;justify-content:center;align-items:center;background-color:#306933}.circle-label{color:var(--white);font-size:1rem;line-height:.75rem;letter-spacing:.2625px;text-transform:uppercase}.discussion-labels{color:var(--gray-400);margin-left:.5rem;font-size:.875rem}.comments-area{display:flex;align-items:center;justify-content:space-between;font-weight:700;flex-direction:row;font-size:.875rem;margin:1rem 0}.text-form-field{display:flex;flex-direction:column}.text-content{min-height:6.75rem;max-height:33.75rem;margin-bottom:.875rem;background-color:var(--df-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;cursor:pointer;outline:0;padding:.5rem .875rem}.text-content.is-invalid,.text-content.is-invalid:hover,.text-content.is-invalid:focus{border:.0625rem solid var(--red-100)}.text-content.is-valid,.text-content.is-valid:hover,.text-content.is-valid:focus{border:.0625rem solid var(--primary-400)}.up-vote-text,.down-vote-text{font-size:1rem;color:var(--black);margin-right:.5rem}.post-card,.post-reply-card{border-bottom:.0625rem solid var(--gray-100);margin-bottom:1.5rem}.post-sub-card{margin:0 .5rem .5rem;border:0}.comments-section{display:flex;align-items:center;justify-content:space-between}.post-icons{margin-right:1rem}.post-name{font-size:1rem;font-weight:700;margin-left:1rem;word-break:break-all;text-transform:capitalize}.post-time{color:var(var(--gray-400));margin:0 1rem;font-size:.875rem}.post-labels{font-size:.875rem;margin:0}.reply-area{display:flex;justify-content:space-between;align-items:center}.reply-area-content{position:relative;margin-top:1rem}.margin-gap-tb{margin:1rem 0}.custom-actions{display:flex;align-items:center}.edit-post{margin-right:1.25rem}.border-0{border-bottom:0px}.comments-count{color:var(--primary);font-weight:700;cursor:pointer}@media (max-width: 768px){.discuss-details-content{flex-direction:column}.related-discuss-part{padding:0}.post-btn{width:100%;margin-top:.5rem;cursor:pointer}.post-time{margin-top:.5rem;margin-left:0}.comment-section{display:flex;flex-direction:column;align-items:start;margin-bottom:.5rem}}.df-btn-disabled{background-color:var(--gray-100)!important;color:var(--gray-200)!important}.df-reply-btn{margin-bottom:.5rem}.edited-text{padding-left:.5rem;margin-top:.25rem;font-size:.75rem;color:var(--gray-200)}.delete-icon,.edit-icon{cursor:pointer;width:1rem;height:1rem;margin:0 .5rem}.discuss-card-kabab-menu{display:flex;justify-content:space-between;flex-wrap:wrap}.kabab-menu{color:var(--primary-400);width:1.875rem;height:1.875rem;line-height:1.75rem;text-align:center;border-radius:50%;padding-left:.5rem;position:absolute;right:.5rem}.kabab-menu:hover{background:var(--gray-0);cursor:pointer}.kabab-menu:after{content:\"\\2807\";font-size:1.5rem}.kabab-menu-dropdown-content{position:absolute;border-radius:.125rem;background-color:var(--white);box-shadow:0 3px 5px 4px rgba(var(--rc-rgba-black),.05);padding:.5rem;z-index:1;text-align:left;right:0;top:0;min-width:13.125rem}.kabab-menu-dropdown-content .list{display:flex;align-items:center;width:100%;cursor:pointer;font-size:.875rem;padding:.5rem}.kabab-menu-dropdown-content .list:hover,.kabab-menu-dropdown-content .list:active{background-color:var(--primary-100)}.kabab-menu-dropdown-content .list:last-child .df-btn-normal{color:var(--red-400)}.kabab-menu-dropdown-content .list .df-btn-normal{font-size:.875rem}::ng-deep html[dir=rtl] .kabab-menu-dropdown-content{right:auto;left:0}.vote-value{margin-left:.5rem}.icons{width:.875rem;height:.875rem;position:relative;cursor:pointer}.edit-text{display:flex}.last-reply-data{margin:1rem 0;font-size:.875rem}.reply-content{display:flex;align-items:center}.replies{width:100%}.replies-count{font-size:.875rem;font-weight:700;cursor:pointer}.toggle-icon{padding:0 1rem;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.AppLoaderComponent, selector: "lib-app-loader", inputs: ["data"] }, { kind: "component", type: i9.RelatedDiscussionComponent, selector: "lib-related-discussion", inputs: ["catId", "topicId"], outputs: ["stateChange"] }, { kind: "component", type: i10.PostReplyComponent, selector: "lib-post-reply", inputs: ["showCancel", "mode", "content"], outputs: ["actionEvent"] }, { kind: "component", type: i11.DiscussStartComponent, selector: "lib-discuss-start", inputs: ["categoryId", "topicData", "mode"], outputs: ["close"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i12.PipeFilterPipe, name: "pipeFilter" }, { kind: "pipe", type: i13.SortByPipe, name: "sortBy" }, { kind: "pipe", type: i14.SplitInitialsPipe, name: "splitInitials" }] }); }
446
+ }
447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussionDetailsComponent, decorators: [{
448
+ type: Component,
449
+ args: [{ selector: 'lib-discussion-details', template: "<lib-app-loader *ngIf=\"!showLoader\"></lib-app-loader>\n<div class=\"discuss-details-content\" *ngIf=\"showLoader\">\n <div class=\"discussion-details\" tabindex=\"0\" role=\"link\">\n\n <!-- header -->\n <div class=\"discuss-card-kabab-menu\">\n <h3 class=\"discussion-card-title df-label-color\" [innerHTML]=\"data?.title\"></h3>\n <div *ngIf=\"data?.uid === mainUid\">\n <div class=\"kabab-menu\" id=\"group-actions\" (click)=\"onMenuClick()\" tabindex=\"0\"></div>\n <div class=\"kabab-menu-dropdown-content\" [hidden]=\"dropdownContent\">\n <div id=\"edit-topic\" class=\"list\" tabindex=\"0\"\n (click)=\"editTopic($event, data); editableTopicDetails = data\">Edit\n </div>\n <div id=\"delete-topic\" class=\"list\" (click)=\"deleteTopic($event, data)\" tabindex=\"0\">Delete</div>\n </div>\n </div>\n </div>\n <!-- /header -->\n\n <ng-container *ngFor=\"let post of data?.posts\">\n <div class=\"post-reply-card\" *ngIf=\"post?.index === 0\">\n <h3 class=\"discussion-heading df-text-color\" [innerHTML]=\"post?.content\"></h3>\n <div class=\"discussion-content\">\n <div class=\"circle-text\">\n <div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div>\n </div>\n <div class=\"discussion-labels\">{{'Asked by '}}</div>\n <div class=\"discussion-labels\" *ngIf=\"post.user.fullname\" [innerHTML]=\"post.user.fullname\"></div>\n <div class=\"discussion-labels\" *ngIf=\"!post.user.fullname\" [innerHTML]=\"post.user.username\"></div>\n </div>\n\n <div class=\"tags\" aria-label=\"tags\">\n <ng-container *ngIf=\"data && data?.tags && data?.tags?.length > 0\">\n <span *ngFor=\"let tag of data?.tags\" class=\"tag\" role=\"link\" tabindex=\"0\"\n [ngStyle]=\"getBgColor(tag.value)\">\n {{tag.value}}\n </span>\n </ng-container>\n </div>\n\n <div class=\"comments-area\">\n <div>\n <span class=\"post-icons mobile\">\n <span role=\"link\" tabindex=\"0\" *ngIf=\"!post.upvoted\" (click)=\"upvote(post);logTelemetry($event, post)\"\n aria-label=\"upvote the post\" id=\"up-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up-arrow\" class=\"icons\"\n alt=\"up arrow icon for like the post\">\n </span>\n <span *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove upvote\" id=\"delete-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up.svg\" alt=\"select-up-arrow\" class=\"icons\" alt=\"up image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote post\" id=\"down-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\"\n alt=\"down arrow icon for unlike post\">\n </span>\n <span *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove down vote\" id=\"delete-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.downvotes}}</span>\n </span>\n <span class=\"post-icons mobile\" role=\"link\" tabindex=\"0\">\n <!-- trending -->\n <img src=\"./assets/discussion-ui/images/views.svg\" alt=\"views icon for seeing the posts\" class=\"icons\">\n <span class=\"vote-value\" aria-label=\"views count\">{{data.viewcount}} Views</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"bookmark(post);logTelemetry($event, post)\" aria-label=\"Bookmark post\" id=\"bookmark\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/bookmarks.png\" class=\"icons\" alt=\"bookmark icon\">\n </span>\n <span *ngIf=\"data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"unBookMark(post);logTelemetry($event, post)\" aria-label=\"unBookmark post\"\n id=\"un-bookmark-vote\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/select-bookmarks.png\" class=\"icons bookmark-icon\"\n alt=\"select bookmark icon\">\n </span>\n </span>\n </div>\n <div class=\"comments-count\">\n <span *ngIf=\"data?.postcount-1 > 0\" aria-label=\"comments count\">\n {{data?.postcount-1}}\n comments\n </span>\n <span *ngIf=\"data?.postcount-1 <=0\" aria-label=\"comments count\">\n 0 comments</span>\n </div>\n </div>\n <!-- /card content -->\n <!-- post reply -->\n <lib-post-reply (actionEvent)=\"postReplyHandler($event, post); logTelemetry($event, post)\" [mode]=\"'reply'\"\n [showCancel]=\"false\"></lib-post-reply>\n \n </div>\n </ng-container>\n <!-- /card end -->\n\n <ng-container *ngIf=\"data?.posts && data?.postcount > 1\">\n <div class=\"recent-tabs\">\n <div class=\"tabs-content\">\n <div class=\"tabs-filter\">\n <a href=\"javascript:void(0)\" class=\"filter-option\" role=\"link\" tabindex=\"0\" [ngClass]=\"{'tabs-active' : currentFilter === 'timestamp',\n 'ws-mat-accent-border':currentFilter !== 'timestamp'}\"\n (click)=\"filter('timestamp');logTelemetry($event)\" id=\"recent-post\">\n Recent </a>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngFor=\"let post of data?.posts | sortBy: 'timestampISO':'desc'; index as i\">\n <!-- card content -->\n <div *ngIf=\"post?.index != 0\" class=\"post-card\">\n <!-- header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <span class=\"circle-text\"><span class=\"circle-label\">{{ post?.user?.username | splitInitials\n }}</span></span>\n <span class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></span>\n <span class=\"post-name df-label-color\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></span>\n </div>\n <div class=\"custom-actions\">\n <span class=\"post-time\">{{ post?.timestamp | date: 'dd MMM yyyy hh:mm a'}}</span>\n <ng-container *ngIf=\"mainUid === post?.uid\">\n <img src=\"./assets/discussion-ui/images/edit.svg\" class=\"edit-icon\" id=\"edit-post\" alt=\"edit icon\"\n (click)=\"getRealtimePost(post, i)\" tabindex=\"0\">\n <img src=\"./assets/discussion-ui/images/delete.svg\" class=\"delete-icon\" id=\"delete-post\" alt=\"delete icon\"\n (click)=\"confirmDelete(post?.pid)\" tabindex=\"0\">\n </ng-container>\n </div>\n </div>\n <!-- / header -->\n <div>\n <div class=\"edit-text\" *ngIf=\"!editMode || editContentIndex !== i\">\n <p [innerHTML]=\"post?.content\" class=\"post-labels df-text-color\"></p>\n <div class=\"edited-text\" *ngIf=\"post?.edited\">(edited)</div>\n </div>\n <div *ngIf=\"editMode && editContentIndex === i\">\n <lib-post-reply (actionEvent)=\"editReplyHandler($event, post)\" [mode]=\"'edit'\" [showCancel]=\"true\"\n [content]=\"contentPost\"></lib-post-reply>\n </div>\n <div class=\"reply-area\">\n <div>\n <span class=\"flex mobile\">\n <!-- upward arrow -->\n <span class=\"up-vote-text\" *ngIf=\"!post?.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"upvote(post);logTelemetry($event, post)\" aria-label=\"upvote comment\" id=\"up-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <!-- upward arrow -->\n <span class=\"down-vote-text\" *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete upvote on comment\"\n id=\"delete-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n <span class=\"vote-value\">{{post?.upvotes}}</span>\n </span>\n\n <span class=\"flex mobile\">\n <span id=\"down-vote\" *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote comment\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\" alt=\"down arrow icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <span id=\"delete-vote\" *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete downvote on comment\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down icon\">\n </span>\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n\n <button (click)=\"togglePost(post); logTelemetry($event, post)\"\n class=\"df-btn df-btn-normal df-btn-primary df-reply-btn\" id=\"reply-comment\">\n Reply </button>\n\n </div>\n <div class=\"replies\" *ngIf=\"post?.toggle\">\n <ng-container [ngTemplateOutlet]=\"reply\" [ngTemplateOutletContext]=\"{post:post}\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"post?.replies?.count > 0\">\n <div>\n <div>\n <div class=\"reply-content\" (click)=\"post.replyCountToggle = !post.replyCountToggle\" tabindex=\"0\">\n <span class=\"replies-count\"> {{post?.replies?.count}} reply(s) </span>\n <div *ngIf=\"post?.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"post?.replyCountToggle\" aria-label=\"reply toggle upwards\">\n <!-- up arrow -->\n <img src=\"./assets/discussion-ui/images/up-chevron.png\" class=\"icons\" alt=\"up chevron icon\">\n </span>\n </div>\n <div *ngIf=\"!post.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"!post.replyCountToggle\" aria-label=\"reply toggle downwards\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down-chevron.png\" class=\"icons\" alt=\"down chevron icon\">\n </span>\n </div>\n </div>\n </div>\n <div class=\"last-reply-data\">\n <span *ngIf=\"!post.replyCountToggle\">Last reply\n {{ post?.replies?.timestampISO | date: 'dd MMM yyyy hh:mm a' }} </span>\n </div>\n </div>\n <div class=\"replies\" *ngIf=\"post?.replyCountToggle\">\n <ng-container [ngTemplateOutlet]=\"replies\"\n [ngTemplateOutletContext]=\"{posts:data.posts, postId:post.pid}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <!-- /card content -->\n </div>\n <!-- / card -->\n <!-- Divider -->\n <div *ngIf=\"post.index != 0\"></div>\n </ng-container>\n </div>\n\n <div class=\"related-discuss-part\">\n <div *ngIf=\"fetchSingleCategoryLoader\" class=\"related-discuss-part-content\"></div>\n <lib-related-discussion *ngIf=\"!fetchSingleCategoryLoader\" [catId]=\"categoryId\" [topicId]=\"topicId\">\n </lib-related-discussion>\n </div>\n</div>\n\n<ng-template #reply let-post=\"post\">\n <lib-post-reply (actionEvent)=\"commentReplyHandler($event, post)\" [mode]=\"'reply'\" [showCancel]=\"true\">\n </lib-post-reply>\n</ng-template>\n\n<ng-template #replies let-posts=\"posts\" let-postId=\"postId\">\n <ng-container *ngFor=\"let post of posts | pipeFilter:'toPid': postId; index as index; last as last\">\n <!-- card -->\n <div class=\"post-sub-card\">\n <!-- card-header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <div class=\"circle-text\"><div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div></div>\n <div class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></div>\n <div class=\"df-label-color post-name\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></div>\n </div>\n <div class=\"post-time\">{{ post?.timestamp | date}}</div>\n </div>\n <!-- /card-header -->\n\n <!-- card-content -->\n <div>\n <p role=\"link\" tabindex=\"0\" tabindex=\"0\" [innerHTML]=\"post?.content\"></p>\n <div class=\"reply-area\">\n <div class=\"reply-area-content\">\n <span class=\"post-icons mobile\">\n <!-- up arrow -->\n <img *ngIf=\"!post?.upvoted\" class=\"cursor-pointer\" (click)=\"upvote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up arrow icon\" class=\"icons\" tabindex=\"0\">\n <img *ngIf=\"post?.upvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up.svg\" alt=\"select up arrow icon\" class=\"icons\" tabindex=\"0\">\n <span class=\"vote-value\">{{post.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <img *ngIf=\"!post?.downvoted\" class=\"cursor-pointer\" (click)=\"downvote(post); logTelemetry($event, post)\"\n id=\"up-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down-arrow.png\" alt=\"down arrow icon\"\n class=\"icons\">\n <img *ngIf=\"post?.downvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n id=\"delete-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down.svg\" alt=\"select down arrow icon\"\n class=\"icons\">\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n </div>\n </div>\n </div> \n <!-- /card -->\n </ng-container>\n</ng-template>\n\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Thank you for voting!\" value=\"Thank you for voting!!\"\n #toastSuccess />\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Something went wrong, please try again later!\"\n value=\"Something went wrong, please try again later!\" #toastError />\n\n<lib-discuss-start [mode]=\"'edit'\" [topicData]=\"editableTopicDetails\" (close)=\"closeModal($event)\"\n *ngIf=\"showEditTopicModal\"></lib-discuss-start>", styles: ["@charset \"UTF-8\";.discuss-details-content{display:flex;flex-direction:row}.discussion-details{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;background:var(--df-card-bg);color:var(--df-text);flex:3;height:auto;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:.875rem 1rem;justify-content:space-between;z-index:unset;margin-bottom:1rem}.related-discuss-part{padding:0 0 1rem 1.5rem;position:relative;z-index:2}.related-discuss-part .related-discuss-part-content{padding:0 .25rem}.discussion-card-title{font-size:1.25rem;font-weight:700}.discussion-heading{font-size:.875rem;font-weight:400;pointer-events:none;margin-bottom:0;margin-top:.5rem}.discussion-content{display:flex;align-items:center;margin-bottom:1rem;font-size:.875rem;flex-wrap:wrap;margin-bottom:0;margin-top:1rem}.comment-section{display:flex;align-items:center;justify-content:space-between;margin:.5rem 0;flex-direction:row;flex-wrap:wrap}.post-header-content{display:flex;align-items:center}.circle-text{border-radius:50%;width:1.75rem;height:1.75rem;display:flex;justify-content:center;align-items:center;background-color:#306933}.circle-label{color:var(--white);font-size:1rem;line-height:.75rem;letter-spacing:.2625px;text-transform:uppercase}.discussion-labels{color:var(--gray-400);margin-left:.5rem;font-size:.875rem}.comments-area{display:flex;align-items:center;justify-content:space-between;font-weight:700;flex-direction:row;font-size:.875rem;margin:1rem 0}.text-form-field{display:flex;flex-direction:column}.text-content{min-height:6.75rem;max-height:33.75rem;margin-bottom:.875rem;background-color:var(--df-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;cursor:pointer;outline:0;padding:.5rem .875rem}.text-content.is-invalid,.text-content.is-invalid:hover,.text-content.is-invalid:focus{border:.0625rem solid var(--red-100)}.text-content.is-valid,.text-content.is-valid:hover,.text-content.is-valid:focus{border:.0625rem solid var(--primary-400)}.up-vote-text,.down-vote-text{font-size:1rem;color:var(--black);margin-right:.5rem}.post-card,.post-reply-card{border-bottom:.0625rem solid var(--gray-100);margin-bottom:1.5rem}.post-sub-card{margin:0 .5rem .5rem;border:0}.comments-section{display:flex;align-items:center;justify-content:space-between}.post-icons{margin-right:1rem}.post-name{font-size:1rem;font-weight:700;margin-left:1rem;word-break:break-all;text-transform:capitalize}.post-time{color:var(var(--gray-400));margin:0 1rem;font-size:.875rem}.post-labels{font-size:.875rem;margin:0}.reply-area{display:flex;justify-content:space-between;align-items:center}.reply-area-content{position:relative;margin-top:1rem}.margin-gap-tb{margin:1rem 0}.custom-actions{display:flex;align-items:center}.edit-post{margin-right:1.25rem}.border-0{border-bottom:0px}.comments-count{color:var(--primary);font-weight:700;cursor:pointer}@media (max-width: 768px){.discuss-details-content{flex-direction:column}.related-discuss-part{padding:0}.post-btn{width:100%;margin-top:.5rem;cursor:pointer}.post-time{margin-top:.5rem;margin-left:0}.comment-section{display:flex;flex-direction:column;align-items:start;margin-bottom:.5rem}}.df-btn-disabled{background-color:var(--gray-100)!important;color:var(--gray-200)!important}.df-reply-btn{margin-bottom:.5rem}.edited-text{padding-left:.5rem;margin-top:.25rem;font-size:.75rem;color:var(--gray-200)}.delete-icon,.edit-icon{cursor:pointer;width:1rem;height:1rem;margin:0 .5rem}.discuss-card-kabab-menu{display:flex;justify-content:space-between;flex-wrap:wrap}.kabab-menu{color:var(--primary-400);width:1.875rem;height:1.875rem;line-height:1.75rem;text-align:center;border-radius:50%;padding-left:.5rem;position:absolute;right:.5rem}.kabab-menu:hover{background:var(--gray-0);cursor:pointer}.kabab-menu:after{content:\"\\2807\";font-size:1.5rem}.kabab-menu-dropdown-content{position:absolute;border-radius:.125rem;background-color:var(--white);box-shadow:0 3px 5px 4px rgba(var(--rc-rgba-black),.05);padding:.5rem;z-index:1;text-align:left;right:0;top:0;min-width:13.125rem}.kabab-menu-dropdown-content .list{display:flex;align-items:center;width:100%;cursor:pointer;font-size:.875rem;padding:.5rem}.kabab-menu-dropdown-content .list:hover,.kabab-menu-dropdown-content .list:active{background-color:var(--primary-100)}.kabab-menu-dropdown-content .list:last-child .df-btn-normal{color:var(--red-400)}.kabab-menu-dropdown-content .list .df-btn-normal{font-size:.875rem}::ng-deep html[dir=rtl] .kabab-menu-dropdown-content{right:auto;left:0}.vote-value{margin-left:.5rem}.icons{width:.875rem;height:.875rem;position:relative;cursor:pointer}.edit-text{display:flex}.last-reply-data{margin:1rem 0;font-size:.875rem}.reply-content{display:flex;align-items:center}.replies{width:100%}.replies-count{font-size:.875rem;font-weight:700;cursor:pointer}.toggle-icon{padding:0 1rem;cursor:pointer}\n"] }]
450
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.DiscussionService }, { type: i3.ConfigService }, { type: i4.UntypedFormBuilder }, { type: i1.Router }, { type: i5.TelemetryUtilsService }, { type: i0.Renderer2 }, { type: i6.Location }, { type: i7.NavigationServiceService }]; }, propDecorators: { topicId: [{
451
+ type: Input
452
+ }], slug: [{
453
+ type: Input
454
+ }], widget: [{
455
+ type: Input
456
+ }], stateChange: [{
457
+ type: Output
458
+ }] } });
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzc2lvbi1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rpc2N1c3Npb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL2Rpc2N1c3Npb24tZGV0YWlscy9kaXNjdXNzaW9uLWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzc2lvbi1kZXRhaWxzL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRM0IsTUFBTSxJQUFJLEdBQUc7SUFDWCxVQUFVLEVBQUUsa0VBQWtFO0lBQzlFLFdBQVcsRUFBRSwyRUFBMkU7Q0FDekYsQ0FBQztBQU9GLE1BQU0sT0FBTywwQkFBMEI7SUE4QnJDLFlBQ1UsS0FBcUIsRUFDckIsaUJBQW9DLEVBQ3BDLGFBQTRCLEVBQzVCLFdBQStCLEVBQ2hDLE1BQWMsRUFDYixjQUFxQyxFQUNyQyxRQUFtQixFQUNuQixRQUFrQixFQUNsQixpQkFBMkM7UUFSM0MsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FB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LFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZWxlbWV0cnlVdGlsc1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3RlbGVtZXRyeS11dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IERpc2N1c3Npb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9kaXNjdXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgUmVuZGVyZXIyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTlNEaXNjdXNzRGF0YSB9IGZyb20gJy4vLi4vLi4vbW9kZWxzL2Rpc2N1c3MubW9kZWwnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgQ09OU1RBTlRTIGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMuanNvbic7XG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL25hdmlnYXRpb24tc2VydmljZS5zZXJ2aWNlJztcblxuY29uc3QgTVNHUyA9IHtcbiAgZGVsZXRlUG9zdDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBQb3N0PyBUaGlzIGNhbid0IGJlIHVuZG9uZS5gLFxuICBkZWxldGVUb3BpYzogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB0b3BpYz8gWW91ciBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5gXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlzY3Vzc2lvbi1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERpc2N1c3Npb25EZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0b3BpY0lkOiBhbnk7XG4gIEBJbnB1dCgpIHNsdWc6IHN0cmluZztcbiAgQElucHV0KCkgd2lkZ2V0OiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcm91dGVQYXJhbXM6IGFueTtcbiAgY3VycmVudEFjdGl2ZVBhZ2UgPSAxO1xuICBjdXJyZW50RmlsdGVyID0gJ3RpbWVzdGFtcCc7IC8vICdyZWNlbnRcbiAgZGF0YTogYW55O1xuICBwYWdpbmF0aW9uRGF0YSE6IGFueTtcbiAgcGFnZXIgPSB7fTtcbiAgcG9zdEFuc3dlckZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBVcGRhdGVQb3N0QW5zd2VyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcmVwbHlGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBmZXRjaFNpbmdsZUNhdGVnb3J5TG9hZGVyID0gZmFsc2U7XG4gIHBhcmFtc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBlZGl0TW9kZSA9IGZhbHNlO1xuICB1cGRhdGVkUG9zdCA9IGZhbHNlO1xuICBjb250ZW50UG9zdDogYW55O1xuICBlZGl0Q29udGVudEluZGV4OiBhbnk7XG4gIG1haW5VaWQ6IG51bWJlcjtcbiAgc2ltaWxhclBvc3RzOiBhbnlbXTtcbiAgc2hvd0VkaXRUb3BpY01vZGFsID0gZmFsc2U7XG4gIGVkaXRhYmxlVG9waWNEZXRhaWxzOiBhbnk7XG4gIGRyb3Bkb3duQ29udGVudCA9IHRydWU7XG4gIGNhdGVnb3J5SWQ6IGFueTtcbiAgc2hvd0xvYWRlciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZGlzY3Vzc2lvblNlcnZpY2U6IERpc2N1c3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdGVsZW1ldHJ5VXRpbHM6IFRlbGVtZXRyeVV0aWxzU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2VTZXJ2aWNlLFxuICApIHtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGNoZWNrIGZvciB0aGUgb3V0c2lkZSBjbGljayB3aGlsZSBrZWJhYiBtZW51IGlzIGluIG9wZW4gbW9kZS5cbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIGlmIChlLnRhcmdldFsnaWQnXSAhPT0gJ2dyb3VwLWFjdGlvbnMnKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db250ZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1GaWxlZCgpO1xuICAgIGlmKHRoaXMud2lkZ2V0KXtcbiAgICAgIHRoaXMuZmV0Y2hTaW5nbGVDYXRlZ29yeUxvYWRlciA9IHRydWVcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRvcGljSWQgJiYgIXRoaXMuc2x1Zykge1xuICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMucm91dGVQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMuc2x1ZyA9IF8uZ2V0KHRoaXMucm91dGVQYXJhbXMsICdzbHVnJyk7XG4gICAgICAgIHRoaXMudG9waWNJZCA9IF8uZ2V0KHRoaXMucm91dGVQYXJhbXMsICd0b3BpY0lkJyk7XG4gICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICAvLyB0aGlzLmdldFJlYWx0ZWREaXNjdXNzaW9uKHRoaXMuY2lkKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgLy8gdGhpcy5nZXRSZWFsdGVkRGlzY3Vzc2lvbih0aGlzLmNpZClcbiAgICB9XG5cblxuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMubG9nSW1wcmVzc2lvbihOU0Rpc2N1c3NEYXRhLklQYWdlTmFtZS5ERVRBSUxTKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWxpZmUtY3ljbGUtaW50ZXJmYWNlXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICghdGhpcy50b3BpY0lkICYmICF0aGlzLnNsdWcpIHtcbiAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICB0aGlzLnJvdXRlUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnNsdWcgPSBfLmdldCh0aGlzLnJvdXRlUGFyYW1zLCAnc2x1ZycpO1xuICAgICAgICB0aGlzLnRvcGljSWQgPSBfLmdldCh0aGlzLnJvdXRlUGFyYW1zLCAndG9waWNJZCcpO1xuICAgICAgICB0aGlzLnJlZnJlc2hQb3N0RGF0YSh0aGlzLmN1cnJlbnRBY3RpdmVQYWdlKTtcbiAgICAgICAgLy8gdGhpcy5nZXRSZWFsdGVkRGlzY3Vzc2lvbih0aGlzLmNpZClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2hQb3N0RGF0YSh0aGlzLmN1cnJlbnRBY3RpdmVQYWdlKTtcbiAgICAgIC8vIHRoaXMuZ2V0UmVhbHRlZERpc2N1c3Npb24odGhpcy5jaWQpXG4gICAgfVxuICB9XG5cbiAgLy8gbmV3IG1ldGhvZFxuICBhY2NlcHREYXRhKGRpc2N1c3MpIHtcbiAgICAvLyBkZWJ1Z2dlclxuICAgIGNvbnN0IG1hdGNoZWRUb3BpYyA9IF8uZmluZCh0aGlzLnRlbGVtZXRyeVV0aWxzLmdldENvbnRleHQoKSwgeyB0eXBlOiAnVG9waWMnIH0pO1xuICAgIGlmIChtYXRjaGVkVG9waWMpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMuZGVsZXRlQ29udGV4dChtYXRjaGVkVG9waWMpO1xuICAgIH1cblxuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMudXBwZW5kQ29udGV4dCh7XG4gICAgICBpZDogXy5nZXQoZGlzY3VzcywgJ3RpZCcpLFxuICAgICAgdHlwZTogJ1RvcGljJ1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2x1ZyA9IF8udHJpbShfLmdldChkaXNjdXNzLCAnc2x1ZycpKVxuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgZGF0YTogeyB1cmw6IGAke3RoaXMuY29uZmlnU2VydmljZS5nZXRSb3V0ZXJTbHVnKCl9JHtDT05TVEFOVFMuUk9VVEVTLlRPUElDfSR7c2x1Z31gLCBxdWVyeVBhcmFtczoge30gfSxcbiAgICAgIGFjdGlvbjogQ09OU1RBTlRTLkNBVEVHT1JZX0RFVEFJTFMgfTtcblxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGUoaW5wdXQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh7IGFjdGlvbjogQ09OU1RBTlRTLkNBVEVHT1JZX0RFVEFJTFMsIHRpdGxlOiBkaXNjdXNzLnRpdGxlLCB0aWQ6IGRpc2N1c3MudGlkIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUZvcm1GaWxlZCgpIHtcbiAgICB0aGlzLnBvc3RBbnN3ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBhbnN3ZXI6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMuVXBkYXRlUG9zdEFuc3dlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHVwZGF0ZWRBbnN3ZXI6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMucmVwbHlGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICByZXBseTogW11cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hQb3N0RGF0YShwYWdlPzogYW55KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlciA9PT0gJ3RpbWVzdGFtcCcpIHtcblxuICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5mZXRjaFRvcGljQnlJZCh0aGlzLnRvcGljSWQsIHRoaXMuc2x1ZywgcGFnZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZFJlc3BvbnNlKGRhdGEpXG4gICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBmZXRjaGluZyB0b3BpY3MnKVxuICAgICAgICAgIC8vIHRvYXN0IG1lc3NhZ2VcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuZmV0Y2hUb3BpY0J5SWRTb3J0KHRoaXMudG9waWNJZCwgJ3ZvdGVkJywgcGFnZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZFJlc3BvbnNlKGRhdGEpXG4gICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBmZXRjaGluZyB0b3BpY3MnKVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhcHBlbmRSZXNwb25zZShkYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnBhZ2luYXRpb25EYXRhID0gXy5nZXQoZGF0YSwgJ3BhZ2luYXRpb24nKTtcbiAgICAvLyBUT0RPOiBBZnRlciB1cGRhdGluZyB0aGUgbm9kZWJiIHZlcnNpb24gdG8gdjEuMTguNiBvciBhYm92ZS4gUmVtb3ZlIHRoZSBmYWxsYmFjayBhZnRlciAyLzMgcmVsZWFzZXMuXG4gICAgdGhpcy5tYWluVWlkID0gXy5nZXQoZGF0YSwgJ2xvZ2dlZEluVXNlci51aWQnKSB8fCBfLmdldChkYXRhLCAncHJpdmlsZWdlcy51aWQnKTtcbiAgICB0aGlzLmNhdGVnb3J5SWQgPSBfLmdldChkYXRhLCAnY2lkJyk7XG4gICAgdGhpcy50b3BpY0lkID0gXy5nZXQoZGF0YSwgJ3RpZCcpO1xuICB9XG5cblxuICBzZXRQYWdpbmF0aW9uKCkge1xuICAgIHRoaXMucGFnZXIgPSB7XG4gICAgICBzdGFydEluZGV4OiB0aGlzLnBhZ2luYXRpb25EYXRhLmZpcnN0LnBhZ2UsXG4gICAgICBlbmRJbmRleDogdGhpcy5wYWdpbmF0aW9uRGF0YS5sYXN0LnBhZ2UsXG4gICAgICBwYWdlczogdGhpcy5wYWdpbmF0aW9uRGF0YS5wYWdlcyxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2luYXRpb25EYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgdG90YWxQYWdlOiB0aGlzLnBhZ2luYXRpb25EYXRhLnBhZ2VDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgdXB2b3RlKGRpc2N1c3M6IE5TRGlzY3Vzc0RhdGEuSURpc2N1c3Npb25EYXRhKSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgZGVsdGE6IDEsXG4gICAgfTtcbiAgICB0aGlzLnByb2Nlc3NWb3RlKGRpc2N1c3MsIHJlcSk7XG4gIH1cblxuICBkb3dudm90ZShkaXNjdXNzOiBOU0Rpc2N1c3NEYXRhLklEaXNjdXNzaW9uRGF0YSkge1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGRlbHRhOiAtMSxcbiAgICB9O1xuICAgIHRoaXMucHJvY2Vzc1ZvdGUoZGlzY3VzcywgcmVxKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1ZvdGUoZGlzY3VzczogYW55LCByZXE6IGFueSkge1xuICAgIGlmIChkaXNjdXNzICYmIGRpc2N1c3MudWlkKSB7XG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnZvdGVQb3N0KGRpc2N1c3MucGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIodGhpcy50b2FzdFN1Y2Nlc3MubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgdGhpcy5wb3N0QW5zd2VyRm9ybS5yZXNldCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycik7XG4gICAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYm9va21hcmsoZGlzY3VzczogYW55KSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5ib29rbWFya1Bvc3QoZGlzY3Vzcy5waWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIC8vIHRvYXN0XG4gICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcignQm9va21hcmsgYWRkZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAvLyB0b2FzdFxuICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdW5Cb29rTWFyayhkaXNjdXNzOiBhbnkpIHtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmRlbGV0ZUJvb2ttYXJrUG9zdChkaXNjdXNzLnBpZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgLy8gdG9hc3RcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sXG4gICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoZXJyLmVycm9yLm1lc3NhZ2Uuc3BsaXQoJ3wnKVsxXSB8fCB0aGlzLmRlZmF1bHRFcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZVZvdGUoZGlzY3VzczogYW55KSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5kZWxldGVWb3RlUG9zdChkaXNjdXNzLnBpZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgLy8gdG9hc3RcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sXG4gICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoZXJyLmVycm9yLm1lc3NhZ2Uuc3BsaXQoJ3wnKVsxXSB8fCB0aGlzLmRlZmF1bHRFcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBvc3RSZXBseShyZXBseUNvbnRlbnQ6IHN0cmluZywgcG9zdDogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpIHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBjb250ZW50OiByZXBseUNvbnRlbnQsXG4gICAgfTtcbiAgICB0aGlzLnBvc3RBbnN3ZXJGb3JtLmNvbnRyb2xzWydhbnN3ZXInXS5zZXRWYWx1ZSgnJyk7XG4gICAgaWYgKHBvc3QgJiYgcG9zdC50aWQpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UucmVwbHlQb3N0KHBvc3QudGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoJ1lvdXIgcmVwbHkgd2FzIHNhdmVkIHN1Y2Nlc2Z1bHkhJyk7XG4gICAgICAgICAgLy8gdGhpcy5mZXRjaE5ld0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycik7XG4gICAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcG9zdENvbW1lbnRzUmVwbHkocmVwbHlDb250ZW50OiBzdHJpbmcsIHBvc3Q6IE5TRGlzY3Vzc0RhdGEuSVBvc3RzKSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgY29udGVudDogcmVwbHlDb250ZW50LFxuICAgICAgdG9QaWQ6IHBvc3QucGlkLFxuICAgIH07XG4gICAgaWYgKHBvc3QgJiYgcG9zdC50aWQpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UucmVwbHlQb3N0KHBvc3QudGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoJ1lvdXIgcmVwbHkgd2FzIHNhdmVkIHN1Y2Nlc2Z1bHkhJyk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGVycm9yIGNvZGUgY2hlY2tcbiAgICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgICAvLyB0b2FzdFxuICAgICAgICAgIC8vIHRoaXMub3BlblNuYWNrYmFyKGVyci5lcnJvci5tZXNzYWdlLnNwbGl0KCd8JylbMV0gfHwgdGhpcy5kZWZhdWx0RXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtRGVsZXRlKHBpZCkge1xuICAgIGlmICh3aW5kb3cuY29uZmlybShNU0dTLmRlbGV0ZVBvc3QpKSB7XG4gICAgICB0aGlzLmRlbGV0ZVBvc3QocGlkKTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXIoa2V5OiBzdHJpbmcgfCAndGltZXN0YW1wJyB8ICd1cHZvdGVzJykge1xuICAgIGlmIChrZXkpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlciA9IGtleTtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlV2l0aFBhZ2UocGFnZTogYW55KSB7XG4gICAgaWYgKHBhZ2UgIT09IHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Um91dGVyU2x1ZygpfSR7Q09OU1RBTlRTLlJPVVRFUy5DQVRFR09SWX0gJHt0aGlzLnRvcGljSWR9YF0sIHsgcXVlcnlQYXJhbXM6IHsgcGFnZSB9LCAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiICB9KTtcbiAgICB9XG4gIH1cblxuICBzaG93RXJyb3IobWV0YTogc3RyaW5nKSB7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmdDb2xvcih0YWdUaXRsZTogYW55KSB7XG4gICAgY29uc3QgYmdDb2xvciA9IHRoaXMuc3RyaW5nVG9Db2xvcih0YWdUaXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29udHJhc3QoKTtcbiAgICByZXR1cm4geyBjb2xvciwgJ2JhY2tncm91bmQtY29sb3InOiBiZ0NvbG9yIH07XG4gIH1cblxuICBzdHJpbmdUb0NvbG9yKHRpdGxlKSB7XG4gICAgbGV0IGhhc2ggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aXRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXG4gICAgICBoYXNoID0gdGl0bGUuY2hhckNvZGVBdChpKSArICgoaGFzaCA8PCA1KSAtIGhhc2gpO1xuICAgIH1cbiAgICBjb25zdCBodWUgPSBNYXRoLmFicyhoYXNoICUgMzYwKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHByZWZlci10ZW1wbGF0ZVxuICAgIGNvbnN0IGNvbG91ciA9ICdoc2woJyArIGh1ZSArICcsMTAwJSwzMCUpJztcbiAgICByZXR1cm4gY29sb3VyO1xuICB9XG5cbiAgZ2V0Q29udHJhc3QoKSB7XG4gICAgcmV0dXJuICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDgwJSknO1xuICB9XG5cbiAgbG9nVGVsZW1ldHJ5KGV2ZW50LCBkYXRhPykge1xuICAgIGNvbnN0IHBpZCA9IF8uZ2V0KGRhdGEsICdwaWQnKSB8fCBfLmdldChkYXRhLCAnbWFpblBpZCcpID9cbiAgICAgIHsgaWQ6IF8uZ2V0KGRhdGEsICdwaWQnKSB8fCBfLmdldChkYXRhLCAnbWFpblBpZCcpLCB0eXBlOiAnUG9zdCcgfSA6IHt9O1xuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMudXBwZW5kQ29udGV4dChwaWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMubG9nSW50ZXJhY3QoZXZlbnQsIE5TRGlzY3Vzc0RhdGEuSVBhZ2VOYW1lLkRFVEFJTFMpO1xuICB9XG5cbiAgb25FZGl0TW9kZShVcGRhdGVQb3N0U3RhdHVzOiBib29sZWFuKSB7XG4gICAgaWYgKFVwZGF0ZVBvc3RTdGF0dXMpIHtcbiAgICAgIHRoaXMuZWRpdE1vZGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVhbHRpbWVQb3N0KHBvc3Q6IGFueSwgaW5kZXg6IGFueSkge1xuICAgIHRoaXMuZWRpdE1vZGUgPSB0cnVlO1xuICAgIHRoaXMuZWRpdENvbnRlbnRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuY29udGVudFBvc3QgPSBfLmdldChwb3N0LCAnY29udGVudCcpLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICAgIHBvc3QudG9nZ2xlID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVQb3N0KHVwZGF0ZWRQb3N0Q29udGVudDogYW55LCBwaWQ6IG51bWJlcikge1xuICAgIHRoaXMuZWRpdE1vZGUgPSBmYWxzZTtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBjb250ZW50OiB1cGRhdGVkUG9zdENvbnRlbnQsXG4gICAgICB0aXRsZTogJycsXG4gICAgICB0YWdzOiBbXSxcbiAgICAgIHVpZDogdGhpcy5tYWluVWlkXG4gICAgfTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmVkaXRQb3N0KHBpZCwgcmVxKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVE9ETzogU3VjY2VzcyB0b2FzdFxuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgLy8gVE9ETzogZXJyb3IgdG9hc3RcbiAgICAgIGNvbnNvbGUubG9nKCdlJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKHBpZCk7XG4gIH1cblxuICBkZWxldGVQb3N0KHBvc3RJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5kZWxldGVQb3N0KHBvc3RJZCwgdGhpcy5tYWluVWlkKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVE9ETzogU3VjY2VzcyB0b2FzdFxuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgLy8gVE9ETzogZXJyb3IgdG9hc3RcbiAgICAgIGNvbnNvbGUubG9nKCdlJywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdFJlcGx5SGFuZGxlcihldmVudCwgcG9zdCkge1xuICAgIGlmIChfLmdldChldmVudCwgJ2FjdGlvbicpID09PSAnY2FuY2VsJykge1xuICAgICAgdGhpcy5vbkVkaXRNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICdlZGl0Jykge1xuICAgICAgdGhpcy51cGRhdGVQb3N0KF8uZ2V0KGV2ZW50LCAnY29udGVudCcpLCBfLmdldChwb3N0LCAncGlkJykpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIGNvbW1lbnRSZXBseUhhbmRsZXIoZXZlbnQsIHBvc3QpIHtcbiAgICBpZiAoXy5nZXQoZXZlbnQsICdhY3Rpb24nKSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgIHRoaXMudG9nZ2xlUG9zdChwb3N0KTtcbiAgICB9IGVsc2UgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICdyZXBseScpIHtcbiAgICAgIHRoaXMucG9zdENvbW1lbnRzUmVwbHkoXy5nZXQoZXZlbnQsICdjb250ZW50JyksIHBvc3QpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3RSZXBseUhhbmRsZXIoZXZlbnQsIHBvc3QpIHtcbiAgICBpZiAoXy5nZXQoZXZlbnQsICdhY3Rpb24nKSA9PT0gJ3JlcGx5Jykge1xuICAgICAgdGhpcy5wb3N0UmVwbHkoXy5nZXQoZXZlbnQsICdjb250ZW50JyksIHBvc3QpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVBvc3QocG9zdCkge1xuICAgIHBvc3QudG9nZ2xlID0gIXBvc3QudG9nZ2xlO1xuICAgIHRoaXMub25FZGl0TW9kZShmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCB0cmlnZ2VyIHRoZSBldmVudCBoYW5kbGVycyBhbmQgY2xvc2UgdGhlIHVwZGF0ZSB0aHJlYWQgcG9wdXAuXG4gICAqL1xuICBjbG9zZU1vZGFsKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnY2xvc2UgZXZlbnQnLCBldmVudCk7XG4gICAgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICd1cGRhdGUnKSB7XG4gICAgICB0aGlzLmVkaXRUb3BpY0hhbmRsZXIoZXZlbnQsIF8uZ2V0KGV2ZW50LCAndGlkJyksIF8uZ2V0KGV2ZW50LCAncmVxdWVzdCcpKTtcbiAgICB9XG4gICAgdGhpcy5zaG93RWRpdFRvcGljTW9kYWwgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIG9wZW4gdXBkYXRlIHRocmVhZCBwb3B1cC5cbiAgICovXG4gICBlZGl0VG9waWMoZXZlbnQsIHRvcGljRGF0YSkge1xuICAgIHRoaXMuc2hvd0VkaXRUb3BpY01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmxvZ1RlbGVtZXRyeShldmVudCwgdG9waWNEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGFsbCB0aGUgdXBkYXRlIHRvcGljIGFwaS4gSWYgc3VjY2VzcywgdGhlbiB3aWxsIHJlZnJlc2ggdGhlIGRhdGEuXG4gICAqL1xuICBlZGl0VG9waWNIYW5kbGVyKGV2ZW50LCB0aWQsIHVwZGF0ZVRvcGljUmVxdWVzdCkge1xuICAgIHRoaXMubG9nVGVsZW1ldHJ5KGV2ZW50LCB0aGlzLmVkaXRhYmxlVG9waWNEZXRhaWxzKTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmVkaXRQb3N0KHRpZCwgdXBkYXRlVG9waWNSZXF1ZXN0KS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndXBkYXRlIHN1Y2Nlc3MnLCBkYXRhKTtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIC8vIGVycm9yIGNvZGUgY2hlY2tcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdXBkYXRpbmcnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCBvcGVuIHRoZSBjb25maXJtYXRpb24gcG9wdXAgYmVmb3JlIGRlbGV0aW5nIHRoZSB0b3BpYyxcbiAgICogICAgICAgICAgICAgICAgSWYgY2xpY2tlZCB5ZXMsIHRoZW4gd2lsbCBjYWxsIHRoZSBkZWxldGUgdG9waWMgaGFuZGxlci5cbiAgICovXG4gIGRlbGV0ZVRvcGljKGV2ZW50LCB0b3BpY0RhdGEpIHtcbiAgICBpZiAod2luZG93LmNvbmZpcm0oTVNHUy5kZWxldGVUb3BpYykpIHtcbiAgICAgIHRoaXMubG9nVGVsZW1ldHJ5KGV2ZW50LCB0b3BpY0RhdGEpO1xuICAgICAgdGhpcy5kZWxldGVUb3BpY0hhbmRsZXIoXy5nZXQodG9waWNEYXRhLCAndGlkJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGFsbCB0aGUgZGVsZXRlIHRvcGljIGFwaS4gSWYgc3VjY2VzcywgdGhlbiB3aWxsIG5hdmlnYXRlIGJhY2sgdG8gdGhlIHByZXZpb3VzIHBhZ2UuXG4gICAqL1xuICBkZWxldGVUb3BpY0hhbmRsZXIodG9waWNJZCkge1xuICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuZGVsZXRlVG9waWModG9waWNJZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycm9yKTtcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSBkZWxldGluZycsIGVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCB0b2dnbGUgdGhlIGtlYmFiIG1lbnUgY2xpY2tcbiAgICovXG4gIG9uTWVudUNsaWNrKCkge1xuICAgIHRoaXMuZHJvcGRvd25Db250ZW50ID0gIXRoaXMuZHJvcGRvd25Db250ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBhcmFtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8bGliLWFwcC1sb2FkZXIgKm5nSWY9XCIhc2hvd0xvYWRlclwiPjwvbGliLWFwcC1sb2FkZXI+XG48ZGl2IGNsYXNzPVwiZGlzY3Vzcy1kZXRhaWxzLWNvbnRlbnRcIiAqbmdJZj1cInNob3dMb2FkZXJcIj5cbiAgPGRpdiBjbGFzcz1cImRpc2N1c3Npb24tZGV0YWlsc1wiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJsaW5rXCI+XG5cbiAgICAgIDwhLS0gaGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRpc2N1c3MtY2FyZC1rYWJhYi1tZW51XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImRpc2N1c3Npb24tY2FyZC10aXRsZSBkZi1sYWJlbC1jb2xvclwiIFtpbm5lckhUTUxdPVwiZGF0YT8udGl0bGVcIj48L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YT8udWlkID09PSBtYWluVWlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImthYmFiLW1lbnVcIiBpZD1cImdyb3VwLWFjdGlvbnNcIiAoY2xpY2spPVwib25NZW51Q2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYWJhYi1tZW51LWRyb3Bkb3duLWNvbnRlbnRcIiBbaGlkZGVuXT1cImRyb3Bkb3duQ29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZWRpdC10b3BpY1wiIGNsYXNzPVwibGlzdFwiIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUb3BpYygkZXZlbnQsIGRhdGEpOyBlZGl0YWJsZVRvcGljRGV0YWlscyA9IGRhdGFcIj5FZGl0XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGVsZXRlLXRvcGljXCIgY2xhc3M9XCJsaXN0XCIgKGNsaWNrKT1cImRlbGV0ZVRvcGljKCRldmVudCwgZGF0YSlcIiB0YWJpbmRleD1cIjBcIj5EZWxldGU8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gL2hlYWRlciAtLT5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBkYXRhPy5wb3N0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1yZXBseS1jYXJkXCIgKm5nSWY9XCJwb3N0Py5pbmRleCA9PT0gMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImRpc2N1c3Npb24taGVhZGluZyBkZi10ZXh0LWNvbG9yXCIgW2lubmVySFRNTF09XCJwb3N0Py5jb250ZW50XCI+PC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY3Vzc2lvbi1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlLXRleHRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZS1sYWJlbFwiPnt7IHBvc3Q/LnVzZXI/LnVzZXJuYW1lIHwgc3BsaXRJbml0aWFscyB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY3Vzc2lvbi1sYWJlbHNcIj57eydBc2tlZCBieSAnfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjdXNzaW9uLWxhYmVsc1wiICpuZ0lmPVwicG9zdC51c2VyLmZ1bGxuYW1lXCIgW2lubmVySFRNTF09XCJwb3N0LnVzZXIuZnVsbG5hbWVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjdXNzaW9uLWxhYmVsc1wiICpuZ0lmPVwiIXBvc3QudXNlci5mdWxsbmFtZVwiIFtpbm5lckhUTUxdPVwicG9zdC51c2VyLnVzZXJuYW1lXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFnc1wiIGFyaWEtbGFiZWw9XCJ0YWdzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YSAmJiBkYXRhPy50YWdzICYmIGRhdGE/LnRhZ3M/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHRhZyBvZiBkYXRhPy50YWdzXCIgY2xhc3M9XCJ0YWdcIiByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0QmdDb2xvcih0YWcudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAge3t0YWcudmFsdWV9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hcmVhXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIiAqbmdJZj1cIiFwb3N0LnVwdm90ZWRcIiAoY2xpY2spPVwidXB2b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJ1cHZvdGUgdGhlIHBvc3RcIiBpZD1cInVwLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC1hcnJvdy5wbmdcIiBhbHQ9XCJ1cC1hcnJvd1wiIGNsYXNzPVwiaWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ1cCBhcnJvdyBpY29uIGZvciBsaWtlIHRoZSBwb3N0XCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicG9zdC51cHZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwicmVtb3ZlIHVwdm90ZVwiIGlkPVwiZGVsZXRlLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC5zdmdcIiBhbHQ9XCJzZWxlY3QtdXAtYXJyb3dcIiBjbGFzcz1cImljb25zXCIgYWx0PVwidXAgaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2b3RlLXZhbHVlXCIgcm9sZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndG90YWwgdXB2b2F0IGlzJyArIGRhdGE/LnVwdm90ZXNcIj57e2RhdGE/LnVwdm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd252b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRvd252b3RlIHBvc3RcIiBpZD1cImRvd24tdm90ZVwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBkb3dud2FyZCBhcnJvdyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi1hcnJvdy5wbmdcIiBjbGFzcz1cImljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwiZG93biBhcnJvdyBpY29uIGZvciB1bmxpa2UgcG9zdFwiPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBvc3Q/LmRvd252b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWb3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cInJlbW92ZSBkb3duIHZvdGVcIiBpZD1cImRlbGV0ZS12b3RlXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIGRvd253YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kb3duLnN2Z1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJkb3duIGltYWdlXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiIHJvbGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvdGFsIHVwdm9hdCBpcycgKyBkYXRhPy51cHZvdGVzXCI+e3tkYXRhPy5kb3dudm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICA8IS0tIHRyZW5kaW5nIC0tPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdmlld3Muc3ZnXCIgYWx0PVwidmlld3MgaWNvbiBmb3Igc2VlaW5nIHRoZSBwb3N0c1wiIGNsYXNzPVwiaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvdGUtdmFsdWVcIiBhcmlhLWxhYmVsPVwidmlld3MgY291bnRcIj57e2RhdGEudmlld2NvdW50fX0gVmlld3M8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LWljb25zIG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWRhdGE/LnBvc3RzWzBdPy5ib29rbWFya2VkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJvb2ttYXJrKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cIkJvb2ttYXJrIHBvc3RcIiBpZD1cImJvb2ttYXJrXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIGJvb2ttYXJrIC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9ib29rbWFya3MucG5nXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cImJvb2ttYXJrIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRhPy5wb3N0c1swXT8uYm9va21hcmtlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bkJvb2tNYXJrKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cInVuQm9va21hcmsgcG9zdFwiXG4gICAgICAgICAgICAgICAgICBpZD1cInVuLWJvb2ttYXJrLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gYm9va21hcmsgLS0+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL3NlbGVjdC1ib29rbWFya3MucG5nXCIgY2xhc3M9XCJpY29ucyBib29rbWFyay1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwic2VsZWN0IGJvb2ttYXJrIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YT8ucG9zdGNvdW50LTEgPiAwXCIgYXJpYS1sYWJlbD1cImNvbW1lbnRzIGNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tkYXRhPy5wb3N0Y291bnQtMX19XG4gICAgICAgICAgICAgICAgY29tbWVudHNcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGE/LnBvc3Rjb3VudC0xIDw9MFwiIGFyaWEtbGFiZWw9XCJjb21tZW50cyBjb3VudFwiPlxuICAgICAgICAgICAgICAgIDAgY29tbWVudHM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSAvY2FyZCBjb250ZW50IC0tPlxuICAgICAgICA8IS0tIHBvc3QgcmVwbHkgLS0+XG4gICAgICAgIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwicG9zdFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpOyBsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiIFttb2RlXT1cIidyZXBseSdcIlxuICAgICAgICAgIFtzaG93Q2FuY2VsXT1cImZhbHNlXCI+PC9saWItcG9zdC1yZXBseT5cbiAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIC9jYXJkIGVuZCAtLT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5wb3N0cyAmJiBkYXRhPy5wb3N0Y291bnQgPiAxXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVjZW50LXRhYnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWZpbHRlclwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCIgW25nQ2xhc3NdPVwieyd0YWJzLWFjdGl2ZScgOiBjdXJyZW50RmlsdGVyID09PSAndGltZXN0YW1wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd3MtbWF0LWFjY2VudC1ib3JkZXInOmN1cnJlbnRGaWx0ZXIgIT09ICd0aW1lc3RhbXAnfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXIoJ3RpbWVzdGFtcCcpO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgaWQ9XCJyZWNlbnQtcG9zdFwiPlxuICAgICAgICAgICAgICBSZWNlbnQgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBkYXRhPy5wb3N0cyB8IHNvcnRCeTogJ3RpbWVzdGFtcElTTyc6J2Rlc2MnOyBpbmRleCBhcyBpXCI+XG4gICAgICA8IS0tIGNhcmQgY29udGVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJwb3N0Py5pbmRleCAhPSAwXCIgY2xhc3M9XCJwb3N0LWNhcmRcIj5cbiAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50LXNlY3Rpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaXJjbGUtdGV4dFwiPjxzcGFuIGNsYXNzPVwiY2lyY2xlLWxhYmVsXCI+e3sgcG9zdD8udXNlcj8udXNlcm5hbWUgfCBzcGxpdEluaXRpYWxzXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LW5hbWVcIiAqbmdJZj1cInBvc3Q/LnVzZXI/LmZ1bGxuYW1lXCIgW2lubmVySFRNTF09XCJwb3N0Py51c2VyPy5mdWxsbmFtZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zdC1uYW1lIGRmLWxhYmVsLWNvbG9yXCIgKm5nSWY9XCIhcG9zdD8udXNlcj8uZnVsbG5hbWVcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInBvc3Q/LnVzZXI/LnVzZXJuYW1lXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tYWN0aW9uc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LXRpbWVcIj57eyBwb3N0Py50aW1lc3RhbXAgfCBkYXRlOiAnZGQgTU1NIHl5eXkgaGg6bW0gYSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYWluVWlkID09PSBwb3N0Py51aWRcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9lZGl0LnN2Z1wiIGNsYXNzPVwiZWRpdC1pY29uXCIgaWQ9XCJlZGl0LXBvc3RcIiBhbHQ9XCJlZGl0IGljb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRSZWFsdGltZVBvc3QocG9zdCwgaSlcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kZWxldGUuc3ZnXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIGlkPVwiZGVsZXRlLXBvc3RcIiBhbHQ9XCJkZWxldGUgaWNvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUocG9zdD8ucGlkKVwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIC8gaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LXRleHRcIiAqbmdJZj1cIiFlZGl0TW9kZSB8fCBlZGl0Q29udGVudEluZGV4ICE9PSBpXCI+XG4gICAgICAgICAgICA8cCBbaW5uZXJIVE1MXT1cInBvc3Q/LmNvbnRlbnRcIiBjbGFzcz1cInBvc3QtbGFiZWxzIGRmLXRleHQtY29sb3JcIj48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdGVkLXRleHRcIiAqbmdJZj1cInBvc3Q/LmVkaXRlZFwiPihlZGl0ZWQpPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRNb2RlICYmIGVkaXRDb250ZW50SW5kZXggPT09IGlcIj5cbiAgICAgICAgICAgIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwiZWRpdFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpXCIgW21vZGVdPVwiJ2VkaXQnXCIgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbnRlbnRQb3N0XCI+PC9saWItcG9zdC1yZXBseT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktYXJlYVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXAtdm90ZS10ZXh0XCIgKm5nSWY9XCIhcG9zdD8udXB2b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cHZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwidXB2b3RlIGNvbW1lbnRcIiBpZD1cInVwLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAuc3ZnXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cInVwIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LWljb25zIG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG93bi12b3RlLXRleHRcIiAqbmdJZj1cInBvc3QudXB2b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWb3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRlbGV0ZSB1cHZvdGUgb24gY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICBpZD1cImRlbGV0ZS12b3RlXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL3VwLnN2Z1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJ1cCBpY29uXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdD8udXB2b3Rlc319PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwiZG93bi12b3RlXCIgKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd252b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRvd252b3RlIGNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gZG93bndhcmQgYXJyb3cgLS0+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL2Rvd24tYXJyb3cucG5nXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cImRvd24gYXJyb3cgaWNvblwiPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJkZWxldGUtdm90ZVwiICpuZ0lmPVwicG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwiZGVsZXRlIGRvd252b3RlIG9uIGNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gZG93biBhcnJvdyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi5zdmdcIiBjbGFzcz1cImljb25zXCIgYWx0PVwiZG93biBpY29uXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdD8uZG93bnZvdGVzfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVQb3N0KHBvc3QpOyBsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGYtYnRuIGRmLWJ0bi1ub3JtYWwgZGYtYnRuLXByaW1hcnkgZGYtcmVwbHktYnRuXCIgaWQ9XCJyZXBseS1jb21tZW50XCI+XG4gICAgICAgICAgICAgIFJlcGx5IDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGxpZXNcIiAqbmdJZj1cInBvc3Q/LnRvZ2dsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXBseVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cG9zdDpwb3N0fVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvc3Q/LnJlcGxpZXM/LmNvdW50ID4gMFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktY29udGVudFwiIChjbGljayk9XCJwb3N0LnJlcGx5Q291bnRUb2dnbGUgPSAhcG9zdC5yZXBseUNvdW50VG9nZ2xlXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcGxpZXMtY291bnRcIj4ge3twb3N0Py5yZXBsaWVzPy5jb3VudH19IHJlcGx5KHMpIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwb3N0Py5yZXBseUNvdW50VG9nZ2xlXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIiBhcmlhLWxhYmVsPVwicmVwbHkgdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWljb25cIiAqbmdJZj1cInBvc3Q/LnJlcGx5Q291bnRUb2dnbGVcIiBhcmlhLWxhYmVsPVwicmVwbHkgdG9nZ2xlIHVwd2FyZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIHVwIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAtY2hldnJvbi5wbmdcIiBjbGFzcz1cImljb25zXCIgYWx0PVwidXAgY2hldnJvbiBpY29uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwb3N0LnJlcGx5Q291bnRUb2dnbGVcIiByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiIGFyaWEtbGFiZWw9XCJyZXBseSB0b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtaWNvblwiICpuZ0lmPVwiIXBvc3QucmVwbHlDb3VudFRvZ2dsZVwiIGFyaWEtbGFiZWw9XCJyZXBseSB0b2dnbGUgZG93bndhcmRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBkb3duIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi1jaGV2cm9uLnBuZ1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJkb3duIGNoZXZyb24gaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXN0LXJlcGx5LWRhdGFcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFwb3N0LnJlcGx5Q291bnRUb2dnbGVcIj5MYXN0IHJlcGx5XG4gICAgICAgICAgICAgICAgICB7eyBwb3N0Py5yZXBsaWVzPy50aW1lc3RhbXBJU08gfCBkYXRlOiAnZGQgTU1NIHl5eXkgaGg6bW0gYScgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGxpZXNcIiAqbmdJZj1cInBvc3Q/LnJlcGx5Q291bnRUb2dnbGVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXBsaWVzXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Bvc3RzOmRhdGEucG9zdHMsIHBvc3RJZDpwb3N0LnBpZH1cIj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gL2NhcmQgY29udGVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSAgLyBjYXJkIC0tPlxuICAgICAgPCEtLSBEaXZpZGVyIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInBvc3QuaW5kZXggIT0gMFwiPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwicmVsYXRlZC1kaXNjdXNzLXBhcnRcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZmV0Y2hTaW5nbGVDYXRlZ29yeUxvYWRlclwiIGNsYXNzPVwicmVsYXRlZC1kaXNjdXNzLXBhcnQtY29udGVudFwiPjwvZGl2PlxuICAgIDxsaWItcmVsYXRlZC1kaXNjdXNzaW9uICpuZ0lmPVwiIWZldGNoU2luZ2xlQ2F0ZWdvcnlMb2FkZXJcIiBbY2F0SWRdPVwiY2F0ZWdvcnlJZFwiIFt0b3BpY0lkXT1cInRvcGljSWRcIj5cbiAgICA8L2xpYi1yZWxhdGVkLWRpc2N1c3Npb24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbHkgbGV0LXBvc3Q9XCJwb3N0XCI+XG4gIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwiY29tbWVudFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpXCIgW21vZGVdPVwiJ3JlcGx5J1wiIFtzaG93Q2FuY2VsXT1cInRydWVcIj5cbiAgPC9saWItcG9zdC1yZXBseT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbGllcyBsZXQtcG9zdHM9XCJwb3N0c1wiIGxldC1wb3N0SWQ9XCJwb3N0SWRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBwb3N0cyB8IHBpcGVGaWx0ZXI6J3RvUGlkJzogcG9zdElkOyBpbmRleCBhcyBpbmRleDsgbGFzdCBhcyBsYXN0XCI+XG4gICAgPCEtLSBjYXJkIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwb3N0LXN1Yi1jYXJkXCI+XG4gICAgICA8IS0tIGNhcmQtaGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGUtdGV4dFwiPjxkaXYgY2xhc3M9XCJjaXJjbGUtbGFiZWxcIj57eyBwb3N0Py51c2VyPy51c2VybmFtZSB8IHNwbGl0SW5pdGlhbHMgfX08L2Rpdj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1uYW1lXCIgKm5nSWY9XCJwb3N0Py51c2VyPy5mdWxsbmFtZVwiIFtpbm5lckhUTUxdPVwicG9zdD8udXNlcj8uZnVsbG5hbWVcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGYtbGFiZWwtY29sb3IgcG9zdC1uYW1lXCIgKm5nSWY9XCIhcG9zdD8udXNlcj8uZnVsbG5hbWVcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJwb3N0Py51c2VyPy51c2VybmFtZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc3QtdGltZVwiPnt7IHBvc3Q/LnRpbWVzdGFtcCB8IGRhdGV9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIC9jYXJkLWhlYWRlciAtLT5cblxuICAgICAgPCEtLSBjYXJkLWNvbnRlbnQgLS0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8cCByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiIHRhYmluZGV4PVwiMFwiIFtpbm5lckhUTUxdPVwicG9zdD8uY29udGVudFwiPjwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlcGx5LWFyZWFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktYXJlYS1jb250ZW50XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgIDwhLS0gdXAgYXJyb3cgLS0+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhcG9zdD8udXB2b3RlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidXB2b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCJcbiAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC1hcnJvdy5wbmdcIiBhbHQ9XCJ1cCBhcnJvdyBpY29uXCIgY2xhc3M9XCJpY29uc1wiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicG9zdD8udXB2b3RlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlVm90ZShwb3N0KTtsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiXG4gICAgICAgICAgICAgICAgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAuc3ZnXCIgYWx0PVwic2VsZWN0IHVwIGFycm93IGljb25cIiBjbGFzcz1cImljb25zXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdC51cHZvdGVzfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkb3dudm90ZShwb3N0KTsgbG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIlxuICAgICAgICAgICAgICAgIGlkPVwidXAtdm90ZVwiIHRhYmluZGV4PVwiMFwiIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL2Rvd24tYXJyb3cucG5nXCIgYWx0PVwiZG93biBhcnJvdyBpY29uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImljb25zXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwb3N0Py5kb3dudm90ZWRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIlxuICAgICAgICAgICAgICAgIGlkPVwiZGVsZXRlLXZvdGVcIiB0YWJpbmRleD1cIjBcIiBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kb3duLnN2Z1wiIGFsdD1cInNlbGVjdCBkb3duIGFycm93IGljb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbnNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2b3RlLXZhbHVlXCI+e3twb3N0Py5kb3dudm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICAgIDwhLS0gL2NhcmQgLS0+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpMTgtdmFsdWUgaTE4LWFyaWEtdmFsdWUgYXJpYS12YWx1ZT1cIlRoYW5rIHlvdSBmb3Igdm90aW5nIVwiIHZhbHVlPVwiVGhhbmsgeW91IGZvciB2b3RpbmchIVwiXG4gICN0b2FzdFN1Y2Nlc3MgLz5cbjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaTE4LXZhbHVlIGkxOC1hcmlhLXZhbHVlIGFyaWEtdmFsdWU9XCJTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciFcIlxuICB2YWx1ZT1cIlNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIVwiICN0b2FzdEVycm9yIC8+XG5cbjxsaWItZGlzY3Vzcy1zdGFydCBbbW9kZV09XCInZWRpdCdcIiBbdG9waWNEYXRhXT1cImVkaXRhYmxlVG9waWNEZXRhaWxzXCIgKGNsb3NlKT1cImNsb3NlTW9kYWwoJGV2ZW50KVwiXG4gICpuZ0lmPVwic2hvd0VkaXRUb3BpY01vZGFsXCI+PC9saWItZGlzY3Vzcy1zdGFydD4iXX0=