@gravitee/ui-components 3.24.5-renovate-github-markdown-css-5-x-6cd8067 → 3.25.1

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 (115) hide show
  1. package/assets/css/github-markdown-css/github-markdown.css +545 -500
  2. package/assets/i18n/en.json +3 -0
  3. package/assets/i18n/fr.json +3 -0
  4. package/assets/icons/design.svg +1 -1
  5. package/package.json +2 -9
  6. package/src/atoms/gv-autocomplete.js +132 -156
  7. package/src/atoms/gv-button.js +73 -248
  8. package/src/atoms/gv-checkbox.js +45 -103
  9. package/src/atoms/gv-date-picker-calendar.js +312 -393
  10. package/src/atoms/gv-date-picker-cell.js +57 -81
  11. package/src/atoms/gv-date-picker.js +180 -319
  12. package/src/atoms/gv-file-upload.js +85 -195
  13. package/src/atoms/gv-icon.js +13 -34
  14. package/src/atoms/gv-image.js +31 -66
  15. package/src/atoms/gv-input-message.js +12 -37
  16. package/src/atoms/gv-input.js +117 -148
  17. package/src/atoms/gv-link.js +47 -125
  18. package/src/atoms/gv-message.js +18 -69
  19. package/src/atoms/gv-metric.js +19 -68
  20. package/src/atoms/gv-relative-time.js +67 -38
  21. package/src/atoms/gv-select-native.js +96 -215
  22. package/src/atoms/gv-select.js +110 -230
  23. package/src/atoms/gv-spinner.js +5 -26
  24. package/src/atoms/gv-state.js +25 -66
  25. package/src/atoms/gv-switch.js +40 -160
  26. package/src/atoms/gv-tag.js +26 -78
  27. package/src/atoms/gv-text.js +22 -83
  28. package/src/charts/gv-chart-bar.js +22 -18
  29. package/src/charts/gv-chart-gauge.js +28 -31
  30. package/src/charts/gv-chart-histogram.js +18 -10
  31. package/src/charts/gv-chart-line.js +70 -59
  32. package/src/charts/gv-chart-map.js +44 -42
  33. package/src/charts/gv-chart-pie.js +18 -14
  34. package/src/index.js +1 -0
  35. package/src/lib/cron-expression.js +40 -35
  36. package/src/lib/date.js +10 -1
  37. package/src/lib/events.js +3 -1
  38. package/src/lib/http-client-schema-form.js +13 -12
  39. package/src/lib/http.js +57 -56
  40. package/src/lib/i18n.js +30 -22
  41. package/src/lib/item.js +13 -12
  42. package/src/lib/properties.js +77 -42
  43. package/src/lib/schema-form.js +4 -5
  44. package/src/lib/studio.js +13 -60
  45. package/src/lib/style.js +8 -8
  46. package/src/lib/text-format.js +14 -7
  47. package/src/lib/theme.js +8 -5
  48. package/src/lib/utils.js +17 -18
  49. package/src/mixins/chart-element.js +31 -54
  50. package/src/mixins/input-element.js +60 -47
  51. package/src/mixins/item-resource.js +34 -32
  52. package/src/mixins/keyboard-element.js +6 -5
  53. package/src/mixins/update-after-browser.js +4 -1
  54. package/src/mixins/with-resize-observer.js +23 -13
  55. package/src/mixins/with-skeleton-attribute.js +54 -48
  56. package/src/molecules/gv-card-full.js +26 -147
  57. package/src/molecules/gv-card-list.js +13 -42
  58. package/src/molecules/gv-card.js +17 -91
  59. package/src/molecules/gv-category-list.js +6 -17
  60. package/src/molecules/gv-category.js +23 -103
  61. package/src/molecules/gv-code.js +81 -143
  62. package/src/molecules/gv-confirm.js +41 -71
  63. package/src/molecules/gv-cron-editor.js +143 -389
  64. package/src/molecules/gv-dropdown-menu.js +14 -46
  65. package/src/molecules/gv-expandable.js +31 -59
  66. package/src/molecules/gv-expression-language.js +176 -138
  67. package/src/molecules/gv-identity-picture.js +42 -65
  68. package/src/molecules/gv-list.js +42 -134
  69. package/src/molecules/gv-metrics.js +37 -49
  70. package/src/molecules/gv-modal.js +28 -95
  71. package/src/molecules/gv-nav.js +49 -75
  72. package/src/molecules/gv-option.js +57 -130
  73. package/src/molecules/gv-plans.js +86 -209
  74. package/src/molecules/gv-popover.js +57 -177
  75. package/src/molecules/gv-promote.js +28 -146
  76. package/src/molecules/gv-rating-list.js +69 -195
  77. package/src/molecules/gv-rating.js +52 -105
  78. package/src/molecules/gv-row-expandable.js +5 -11
  79. package/src/molecules/gv-row.js +21 -147
  80. package/src/molecules/gv-stats.js +23 -48
  81. package/src/molecules/gv-stepper.js +43 -187
  82. package/src/molecules/gv-table.js +199 -309
  83. package/src/molecules/gv-tree.js +33 -156
  84. package/src/organisms/gv-documentation.js +45 -128
  85. package/src/organisms/gv-header.js +37 -195
  86. package/src/organisms/gv-http-client.js +32 -168
  87. package/src/organisms/gv-menu.js +37 -158
  88. package/src/organisms/gv-newsletter-subscription.js +48 -189
  89. package/src/organisms/gv-pagination.js +49 -77
  90. package/src/organisms/gv-properties.js +271 -492
  91. package/src/organisms/gv-resizable-views.js +41 -259
  92. package/src/organisms/gv-resources.js +168 -275
  93. package/src/organisms/gv-schema-form-array.js +49 -159
  94. package/src/organisms/gv-schema-form-control-object.js +59 -73
  95. package/src/organisms/gv-schema-form-control.js +107 -134
  96. package/src/organisms/gv-schema-form.js +219 -280
  97. package/src/organisms/gv-tabs.js +66 -98
  98. package/src/organisms/gv-user-menu.js +36 -201
  99. package/src/organisms/gv-vertical-menu.js +20 -61
  100. package/src/policy-studio/gv-flow-step.js +106 -245
  101. package/src/policy-studio/gv-flow.js +125 -304
  102. package/src/policy-studio/gv-policy-studio-menu.js +157 -471
  103. package/src/policy-studio/gv-policy-studio.js +714 -760
  104. package/src/styles/empty.js +3 -20
  105. package/src/styles/input.js +3 -247
  106. package/src/styles/link.js +3 -16
  107. package/src/styles/shapes.js +1 -0
  108. package/src/styles/skeleton.js +3 -37
  109. package/src/styles/zoom.js +3 -24
  110. package/src/theme/gv-theme.js +21 -60
  111. package/CHANGELOG.md +0 -1260
  112. package/LICENSE.txt +0 -202
  113. package/README.md +0 -195
  114. package/src/.eslintrc.js +0 -19
  115. package/src/theme/definition.json +0 -1762
@@ -24,7 +24,6 @@ import { link } from '../styles/link';
24
24
  import { i18n } from '../lib/i18n';
25
25
  import { classMap } from 'lit/directives/class-map';
26
26
  import { dispatchCustomEvent } from '../lib/events';
27
-
28
27
  /**
29
28
  * List of ratings with answer form
30
29
  *
@@ -52,119 +51,33 @@ import { dispatchCustomEvent } from '../lib/events';
52
51
  export class GvRatingList extends LitElement {
53
52
  static get properties() {
54
53
  return {
55
- ratings: { type: Array },
56
- user: { type: Object },
57
- permissions: { type: Object },
58
- required: { type: Boolean, attribute: 'required' },
59
- _permissions: { type: Object, attribute: false },
60
- _ratings: { type: Array, attribute: false },
54
+ ratings: {
55
+ type: Array
56
+ },
57
+ user: {
58
+ type: Object
59
+ },
60
+ permissions: {
61
+ type: Object
62
+ },
63
+ required: {
64
+ type: Boolean,
65
+ attribute: 'required'
66
+ },
67
+ _permissions: {
68
+ type: Object,
69
+ attribute: false
70
+ },
71
+ _ratings: {
72
+ type: Array,
73
+ attribute: false
74
+ }
61
75
  };
62
76
  }
63
77
 
64
78
  static get styles() {
65
- return [
66
- skeleton,
67
- link,
68
- // language=CSS
69
- css`
70
- :host {
71
- --s: var(--gv-rating-list--s, 18px);
72
- --gv-icon--s: var(--s);
73
- --gv-rating--s: var(--s);
74
- margin: 0.2rem;
75
- box-sizing: border-box;
76
- }
77
-
78
- .rating-list {
79
- background-color: var(--gv-rating-list--bgc, var(--gv-theme-neutral-color-lightest, #ffffff));
80
- }
81
-
82
- .rating.parent {
83
- border-bottom: 1px solid var(--gv-rating-list--bdc, var(--gv-theme-neutral-color, #f5f5f5));
84
- }
85
-
86
- .rating {
87
- display: flex;
88
- padding: 1rem 0;
89
- }
90
-
91
- .answer .rating {
92
- padding: 1rem 0 0 0;
93
- }
94
-
95
- .sub-title {
96
- color: grey;
97
- display: flex;
98
- line-height: 20px;
99
- }
100
-
101
- gv-confirm {
102
- align-self: center;
103
- }
104
-
105
- .sub-title a.link {
106
- text-decoration: underline;
107
- }
108
-
109
- gv-identity-picture {
110
- margin: 0 1rem;
111
- height: 60px;
112
- width: 60px;
113
- }
114
-
115
- .title {
116
- display: flex;
117
- line-height: 20px;
118
- }
119
-
120
- .title b,
121
- .rating-content {
122
- flex: 1;
123
- }
124
-
125
- .link-answer {
126
- display: inline-block;
127
- padding: 1rem 0;
128
- }
129
-
130
- .link-answer gv-icon {
131
- margin-right: 0.2rem;
132
- --gv-icon--s: var(--s);
133
- }
134
-
135
- .delete-rating,
136
- .delete-answer,
137
- .fake-icon {
138
- --gv-icon--s: var(--s);
139
- min-width: var(--s);
140
- display: inline-flex;
141
- }
142
-
143
- .delete-rating {
144
- padding-right: 1rem;
145
- }
146
-
147
- .answer {
148
- padding: 1rem;
149
- margin-top: 1rem;
150
- background-color: var(--gv-rating-list-answer--bgc, var(--gv-theme-neutral-color-lighter, #fafafa));
151
- }
152
-
153
- .answer-form {
154
- display: flex;
155
- flex-direction: column;
156
- }
157
-
158
- .display-name:after {
159
- content: '|';
160
- margin: 2px;
161
- }
162
-
163
- .actions {
164
- text-align: right;
165
- }
166
- `,
167
- ];
79
+ return [skeleton, link, // language=CSS
80
+ css`:host{--s:var(--gv-rating-list--s, 18px);--gv-icon--s:var(--s);--gv-rating--s:var(--s);margin:.2rem;box-sizing:border-box}.rating-list{background-color:var(--gv-rating-list--bgc,var(--gv-theme-neutral-color-lightest,#fff))}.rating.parent{border-bottom:1px solid var(--gv-rating-list--bdc,var(--gv-theme-neutral-color,#f5f5f5))}.rating{display:flex;padding:1rem 0}.answer .rating{padding:1rem 0 0 0}.sub-title{color:grey;display:flex;line-height:20px}gv-confirm{align-self:center}.sub-title a.link{text-decoration:underline}gv-identity-picture{margin:0 1rem;height:60px;width:60px}.title{display:flex;line-height:20px}.rating-content,.title b{flex:1}.link-answer{display:inline-block;padding:1rem 0}.link-answer gv-icon{margin-right:.2rem;--gv-icon--s:var(--s)}.delete-answer,.delete-rating,.fake-icon{--gv-icon--s:var(--s);min-width:var(--s);display:inline-flex}.delete-rating{padding-right:1rem}.answer{padding:1rem;margin-top:1rem;background-color:var(--gv-rating-list-answer--bgc,var(--gv-theme-neutral-color-lighter,#fafafa))}.answer-form{display:flex;flex-direction:column}.display-name:after{content:'|';margin:2px}.actions{text-align:right}`];
168
81
  }
169
82
 
170
83
  constructor() {
@@ -174,23 +87,21 @@ export class GvRatingList extends LitElement {
174
87
  update: false,
175
88
  delete: false,
176
89
  addAnswer: false,
177
- deleteAnswer: false,
90
+ deleteAnswer: false
178
91
  };
179
92
  }
180
93
 
181
94
  set ratings(value) {
182
- Promise.resolve(value)
183
- .then((value) => {
184
- if (value) {
185
- this._skeleton = false;
186
- this._ratings = value;
187
- } else {
188
- this._skeleton = true;
189
- }
190
- })
191
- .catch(() => {
95
+ Promise.resolve(value).then(value => {
96
+ if (value) {
192
97
  this._skeleton = false;
193
- });
98
+ this._ratings = value;
99
+ } else {
100
+ this._skeleton = true;
101
+ }
102
+ }).catch(() => {
103
+ this._skeleton = false;
104
+ });
194
105
  }
195
106
 
196
107
  set permissions(permissions) {
@@ -200,33 +111,42 @@ export class GvRatingList extends LitElement {
200
111
  }
201
112
 
202
113
  render() {
203
- return html` <div class="rating-list">${repeat(this._ratings, (rating) => this._render(rating))}</div> `;
114
+ return html` <div class="rating-list">${repeat(this._ratings, rating => this._render(rating))}</div> `;
204
115
  }
205
116
 
206
117
  _editAnswer(rating, e) {
207
118
  e.stopPropagation();
208
- this._ratings.forEach((rating) => (rating._edit = false));
119
+
120
+ this._ratings.forEach(rating => rating._edit = false);
121
+
209
122
  rating._edit = true;
210
123
  this.performUpdate();
211
124
  }
212
125
 
213
126
  _getAnswerValue() {
214
127
  const element = this.shadowRoot.querySelector('gv-text');
128
+
215
129
  if (element) {
216
130
  return element.value;
217
131
  }
132
+
218
133
  return '';
219
134
  }
220
135
 
221
136
  _onAnswer(rating) {
222
137
  const answer = this._getAnswerValue();
138
+
223
139
  if (answer.trim().length > 0) {
224
- dispatchCustomEvent(this, 'add-answer', { rating, answer });
140
+ dispatchCustomEvent(this, 'add-answer', {
141
+ rating,
142
+ answer
143
+ });
225
144
  }
226
145
  }
227
146
 
228
147
  _hasValidAnswer() {
229
148
  const answer = this._getAnswerValue();
149
+
230
150
  return answer.trim().length > 0;
231
151
  }
232
152
 
@@ -240,96 +160,46 @@ export class GvRatingList extends LitElement {
240
160
  }
241
161
 
242
162
  _renderAnswers(rating) {
243
- return html` ${rating.answers
244
- ? html` ${this._canAddAnswer()
245
- ? html`<a class="link link-answer" @click="${this._editAnswer.bind(this, rating)}">
246
- <gv-icon class="link" shape="communication:chat#5"></gv-icon> ${i18n('gv-rating-list.reply')}</a
247
- >`
248
- : ''}
249
- ${rating._edit
250
- ? html`
251
- <div class="answer answer-form">
252
- <gv-text rows="4" label="${i18n('gv-rating-list.answerLabel')}" required @input="${this.performUpdate}"></gv-text>
253
- <div class="actions">
254
- <gv-button primary outlined @click="${this._onClose.bind(this, rating)}">${i18n('gv-rating-list.cancel')}</gv-button>
255
- <gv-button primary @click="${this._onAnswer.bind(this, rating)}" .disabled="${!this._hasValidAnswer()}"
256
- >${i18n('gv-rating-list.send')}</gv-button
257
- >
258
- </div>
259
- </div>
260
- `
261
- : ''}
262
- <div>${repeat(rating.answers, (answer) => this._renderAnswer(rating, answer))}</div>`
263
- : ''}`;
163
+ return html` ${rating.answers ? html` ${this._canAddAnswer() ? html`<a class="link link-answer" @click="${this._editAnswer.bind(this, rating)}"> <gv-icon class="link" shape="communication:chat#5"></gv-icon> ${i18n('gv-rating-list.reply')}</a>` : ''} ${rating._edit ? html` <div class="answer answer-form"> <gv-text rows="4" label="${i18n('gv-rating-list.answerLabel')}" required @input="${this.performUpdate}"></gv-text> <div class="actions"> <gv-button primary outlined @click="${this._onClose.bind(this, rating)}">${i18n('gv-rating-list.cancel')}</gv-button> <gv-button primary @click="${this._onAnswer.bind(this, rating)}" .disabled="${!this._hasValidAnswer()}">${i18n('gv-rating-list.send')}</gv-button> </div> </div> ` : ''} <div>${repeat(rating.answers, answer => this._renderAnswer(rating, answer))}</div>` : ''}`;
264
164
  }
265
165
 
266
166
  _onDelete(rating) {
267
- dispatchCustomEvent(this, 'delete', { rating });
167
+ dispatchCustomEvent(this, 'delete', {
168
+ rating
169
+ });
268
170
  }
269
171
 
270
172
  _onDeleteAnswer(rating, answer) {
271
- dispatchCustomEvent(this, 'delete-answer', { rating, answer });
173
+ dispatchCustomEvent(this, 'delete-answer', {
174
+ rating,
175
+ answer
176
+ });
272
177
  }
273
178
 
274
179
  _renderActions(data, parent) {
275
180
  if (parent) {
276
- return html`
277
- ${this._canDeleteAnswer()
278
- ? html`<gv-confirm
279
- danger
280
- icon="home:trash"
281
- @gv-confirm:ok="${this._onDeleteAnswer.bind(this, parent, data)}"
282
- message="${i18n('gv-rating-list.confirmAnswerDelete')}"
283
- >
284
- <gv-icon title="${i18n('gv-rating-list.deleteAnswer')}" class="link delete-answer" shape="home:trash"></gv-icon>
285
- </gv-confirm>`
286
- : ''}
287
- `;
181
+ return html` ${this._canDeleteAnswer() ? html`<gv-confirm danger icon="home:trash" @gv-confirm:ok="${this._onDeleteAnswer.bind(this, parent, data)}" message="${i18n('gv-rating-list.confirmAnswerDelete')}"> <gv-icon title="${i18n('gv-rating-list.deleteAnswer')}" class="link delete-answer" shape="home:trash"></gv-icon> </gv-confirm>` : ''} `;
288
182
  } else {
289
- return html`
290
- ${this._canDelete(data.id)
291
- ? html`<gv-confirm
292
- danger
293
- icon="home:trash"
294
- @gv-confirm:ok="${this._onDelete.bind(this, data)}"
295
- message="${i18n('gv-rating-list.confirmRatingDelete')}"
296
- >
297
- <gv-icon title="${i18n('gv-rating-list.deleteRating')}" class="link delete-rating" shape="home:trash"></gv-icon>
298
- </gv-confirm>`
299
- : html`<div class="fake-icon"></div>`}
300
- `;
183
+ return html` ${this._canDelete(data.id) ? html`<gv-confirm danger icon="home:trash" @gv-confirm:ok="${this._onDelete.bind(this, data)}" message="${i18n('gv-rating-list.confirmRatingDelete')}"> <gv-icon title="${i18n('gv-rating-list.deleteRating')}" class="link delete-rating" shape="home:trash"></gv-icon> </gv-confirm>` : html`<div class="fake-icon"></div>`} `;
301
184
  }
302
185
  }
303
186
 
304
187
  _render(data, parent) {
305
- const classes = { rating: true, skeleton: this._skeleton, parent: parent == null };
188
+ const classes = {
189
+ rating: true,
190
+ skeleton: this._skeleton,
191
+ parent: parent == null
192
+ };
306
193
  const displayName = data.author && data.author.display_name ? data.author.display_name : null;
307
194
  const picture = data.author && data.author._links && data.author._links.avatar ? data.author._links.avatar : null;
308
-
309
- return html`
310
- <div class="${classMap(classes)}">
311
- <gv-identity-picture rounded .display_name="${displayName}" .picture="${picture}"></gv-identity-picture>
312
- <div class="rating-content">
313
- <div class="title">
314
- <b>${data.title ? data.title : data.author.display_name}</b>${parent
315
- ? ''
316
- : html`<gv-rating
317
- .readonly="${!this._canUpdate(data.id)}"
318
- @input="${this._onUpdateRating.bind(this, data)}"
319
- value="${data.value}"
320
- ></gv-rating>`}${this._renderActions(data, parent)}
321
- </div>
322
- <div class="sub-title">${this._getDisplayName(data)}<gv-relative-time datetime="${data.date}" noFuture></gv-relative-time></div>
323
- <p class="comment">${data.comment}</p>
324
- ${parent ? '' : this._renderAnswers(data)}
325
- </div>
326
- </div>
327
- `;
195
+ return html` <div class="${classMap(classes)}"> <gv-identity-picture rounded .display_name="${displayName}" .picture="${picture}"></gv-identity-picture> <div class="rating-content"> <div class="title"> <b>${data.title ? data.title : data.author.display_name}</b>${parent ? '' : html`<gv-rating .readonly="${!this._canUpdate(data.id)}" @input="${this._onUpdateRating.bind(this, data)}" value="${data.value}"></gv-rating>`}${this._renderActions(data, parent)} </div> <div class="sub-title">${this._getDisplayName(data)}<gv-relative-time datetime="${data.date}" noFuture></gv-relative-time></div> <p class="comment">${data.comment}</p> ${parent ? '' : this._renderAnswers(data)} </div> </div> `;
328
196
  }
329
197
 
330
198
  _onUpdateRating(rating, e) {
331
199
  rating.value = e.target.value;
332
- dispatchCustomEvent(this, 'update', { rating });
200
+ dispatchCustomEvent(this, 'update', {
201
+ rating
202
+ });
333
203
  }
334
204
 
335
205
  _canAddAnswer() {
@@ -344,6 +214,7 @@ export class GvRatingList extends LitElement {
344
214
  if (Array.isArray(this._permissions.update)) {
345
215
  return this._permissions.update.includes(ratingId);
346
216
  }
217
+
347
218
  return this._permissions.update === true;
348
219
  }
349
220
 
@@ -351,6 +222,7 @@ export class GvRatingList extends LitElement {
351
222
  if (Array.isArray(this._permissions.delete)) {
352
223
  return this._permissions.delete.includes(ratingId);
353
224
  }
225
+
354
226
  return this._permissions.delete === true;
355
227
  }
356
228
 
@@ -358,8 +230,10 @@ export class GvRatingList extends LitElement {
358
230
  if (data.title) {
359
231
  return html`<span class="display-name">${data.author.display_name}</span>`;
360
232
  }
233
+
361
234
  return '';
362
235
  }
363
- }
364
236
 
237
+ }
365
238
  window.customElements.define('gv-rating-list', GvRatingList);
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1yYXRpbmctbGlzdC5qcyJdLCJuYW1lcyI6WyJjc3MiLCJMaXRFbGVtZW50IiwiaHRtbCIsInJlcGVhdCIsInNrZWxldG9uIiwibGluayIsImkxOG4iLCJjbGFzc01hcCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJHdlJhdGluZ0xpc3QiLCJwcm9wZXJ0aWVzIiwicmF0aW5ncyIsInR5cGUiLCJBcnJheSIsInVzZXIiLCJPYmplY3QiLCJwZXJtaXNzaW9ucyIsInJlcXVpcmVkIiwiQm9vbGVhbiIsImF0dHJpYnV0ZSIsIl9wZXJtaXNzaW9ucyIsIl9yYXRpbmdzIiwic3R5bGVzIiwiY29uc3RydWN0b3IiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRBbnN3ZXIiLCJkZWxldGVBbnN3ZXIiLCJ2YWx1ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9za2VsZXRvbiIsImNhdGNoIiwiYXNzaWduIiwicmVuZGVyIiwicmF0aW5nIiwiX3JlbmRlciIsIl9lZGl0QW5zd2VyIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsImZvckVhY2giLCJfZWRpdCIsInBlcmZvcm1VcGRhdGUiLCJfZ2V0QW5zd2VyVmFsdWUiLCJlbGVtZW50Iiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJfb25BbnN3ZXIiLCJhbnN3ZXIiLCJ0cmltIiwibGVuZ3RoIiwiX2hhc1ZhbGlkQW5zd2VyIiwiX29uQ2xvc2UiLCJfcmVuZGVyQW5zd2VyIiwiX3JlbmRlckFuc3dlcnMiLCJhbnN3ZXJzIiwiX2NhbkFkZEFuc3dlciIsImJpbmQiLCJfb25EZWxldGUiLCJfb25EZWxldGVBbnN3ZXIiLCJfcmVuZGVyQWN0aW9ucyIsImRhdGEiLCJwYXJlbnQiLCJfY2FuRGVsZXRlQW5zd2VyIiwiX2NhbkRlbGV0ZSIsImlkIiwiY2xhc3NlcyIsImRpc3BsYXlOYW1lIiwiYXV0aG9yIiwiZGlzcGxheV9uYW1lIiwicGljdHVyZSIsIl9saW5rcyIsImF2YXRhciIsInRpdGxlIiwiX2NhblVwZGF0ZSIsIl9vblVwZGF0ZVJhdGluZyIsIl9nZXREaXNwbGF5TmFtZSIsImRhdGUiLCJjb21tZW50IiwidGFyZ2V0IiwicmF0aW5nSWQiLCJpc0FycmF5IiwiaW5jbHVkZXMiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBVCxFQUFjQyxVQUFkLEVBQTBCQyxJQUExQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLE1BQVQsUUFBdUIsdUJBQXZCO0FBQ0EsT0FBTyw2QkFBUDtBQUNBLE9BQU8sdUJBQVA7QUFDQSxPQUFPLGFBQVA7QUFDQSxPQUFPLGNBQVA7QUFDQSxTQUFTQyxRQUFULFFBQXlCLG9CQUF6QjtBQUNBLFNBQVNDLElBQVQsUUFBcUIsZ0JBQXJCO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU8sTUFBTUMsWUFBTixTQUEyQlIsVUFBM0IsQ0FBc0M7QUFDdEIsYUFBVlMsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEsT0FBTyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQURKO0FBRUxDLE1BQUFBLElBQUksRUFBRTtBQUFFRixRQUFBQSxJQUFJLEVBQUVHO0FBQVIsT0FGRDtBQUdMQyxNQUFBQSxXQUFXLEVBQUU7QUFBRUosUUFBQUEsSUFBSSxFQUFFRztBQUFSLE9BSFI7QUFJTEUsTUFBQUEsUUFBUSxFQUFFO0FBQUVMLFFBQUFBLElBQUksRUFBRU0sT0FBUjtBQUFpQkMsUUFBQUEsU0FBUyxFQUFFO0FBQTVCLE9BSkw7QUFLTEMsTUFBQUEsWUFBWSxFQUFFO0FBQUVSLFFBQUFBLElBQUksRUFBRUcsTUFBUjtBQUFnQkksUUFBQUEsU0FBUyxFQUFFO0FBQTNCLE9BTFQ7QUFNTEUsTUFBQUEsUUFBUSxFQUFFO0FBQUVULFFBQUFBLElBQUksRUFBRUMsS0FBUjtBQUFlTSxRQUFBQSxTQUFTLEVBQUU7QUFBMUI7QUFOTCxLQUFQO0FBUUQ7O0FBRWdCLGFBQU5HLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0xsQixRQURLLEVBRUxDLElBRkssRUFHTDtBQUNBTCxJQUFBQSxHQUFHLDZuQ0FKRSxDQUFQO0FBdUdEOztBQUVEdUIsRUFBQUEsV0FBVyxHQUFHO0FBQ1o7QUFDQSxTQUFLRixRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0QsWUFBTCxHQUFvQjtBQUNsQkksTUFBQUEsTUFBTSxFQUFFLEtBRFU7QUFFbEJDLE1BQUFBLE1BQU0sRUFBRSxLQUZVO0FBR2xCQyxNQUFBQSxTQUFTLEVBQUUsS0FITztBQUlsQkMsTUFBQUEsWUFBWSxFQUFFO0FBSkksS0FBcEI7QUFNRDs7QUFFVSxNQUFQaEIsT0FBTyxDQUFDaUIsS0FBRCxFQUFRO0FBQ2pCQyxJQUFBQSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JGLEtBQWhCLEVBQ0dHLElBREgsQ0FDU0gsS0FBRCxJQUFXO0FBQ2YsVUFBSUEsS0FBSixFQUFXO0FBQ1QsYUFBS0ksU0FBTCxHQUFpQixLQUFqQjtBQUNBLGFBQUtYLFFBQUwsR0FBZ0JPLEtBQWhCO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsYUFBS0ksU0FBTCxHQUFpQixJQUFqQjtBQUNEO0FBQ0YsS0FSSCxFQVNHQyxLQVRILENBU1MsTUFBTTtBQUNYLFdBQUtELFNBQUwsR0FBaUIsS0FBakI7QUFDRCxLQVhIO0FBWUQ7O0FBRWMsTUFBWGhCLFdBQVcsQ0FBQ0EsV0FBRCxFQUFjO0FBQzNCLFFBQUlBLFdBQVcsSUFBSSxPQUFPQSxXQUFQLEtBQXVCLFFBQTFDLEVBQW9EO0FBQ2xELFdBQUtJLFlBQUwsR0FBb0JMLE1BQU0sQ0FBQ21CLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUtkLFlBQXZCLEVBQXFDSixXQUFyQyxDQUFwQjtBQUNEO0FBQ0Y7O0FBRURtQixFQUFBQSxNQUFNLEdBQUc7QUFDUCxXQUFPakMsSUFBSSw2QkFBNkJDLE1BQU0sQ0FBQyxLQUFLa0IsUUFBTixFQUFpQmUsTUFBRCxJQUFZLEtBQUtDLE9BQUwsQ0FBYUQsTUFBYixDQUE1QixDQUFuQyxTQUFYO0FBQ0Q7O0FBRURFLEVBQUFBLFdBQVcsQ0FBQ0YsTUFBRCxFQUFTRyxDQUFULEVBQVk7QUFDckJBLElBQUFBLENBQUMsQ0FBQ0MsZUFBRjs7QUFDQSxTQUFLbkIsUUFBTCxDQUFjb0IsT0FBZCxDQUF1QkwsTUFBRCxJQUFhQSxNQUFNLENBQUNNLEtBQVAsR0FBZSxLQUFsRDs7QUFDQU4sSUFBQUEsTUFBTSxDQUFDTSxLQUFQLEdBQWUsSUFBZjtBQUNBLFNBQUtDLGFBQUw7QUFDRDs7QUFFREMsRUFBQUEsZUFBZSxHQUFHO0FBQ2hCLFVBQU1DLE9BQU8sR0FBRyxLQUFLQyxVQUFMLENBQWdCQyxhQUFoQixDQUE4QixTQUE5QixDQUFoQjs7QUFDQSxRQUFJRixPQUFKLEVBQWE7QUFDWCxhQUFPQSxPQUFPLENBQUNqQixLQUFmO0FBQ0Q7O0FBQ0QsV0FBTyxFQUFQO0FBQ0Q7O0FBRURvQixFQUFBQSxTQUFTLENBQUNaLE1BQUQsRUFBUztBQUNoQixVQUFNYSxNQUFNLEdBQUcsS0FBS0wsZUFBTCxFQUFmOztBQUNBLFFBQUlLLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjQyxNQUFkLEdBQXVCLENBQTNCLEVBQThCO0FBQzVCM0MsTUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLFlBQVAsRUFBcUI7QUFBRTRCLFFBQUFBLE1BQUY7QUFBVWEsUUFBQUE7QUFBVixPQUFyQixDQUFuQjtBQUNEO0FBQ0Y7O0FBRURHLEVBQUFBLGVBQWUsR0FBRztBQUNoQixVQUFNSCxNQUFNLEdBQUcsS0FBS0wsZUFBTCxFQUFmOztBQUNBLFdBQU9LLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjQyxNQUFkLEdBQXVCLENBQTlCO0FBQ0Q7O0FBRURFLEVBQUFBLFFBQVEsQ0FBQ2pCLE1BQUQsRUFBUztBQUNmLFdBQU9BLE1BQU0sQ0FBQ00sS0FBZDtBQUNBLFNBQUtDLGFBQUw7QUFDRDs7QUFFRFcsRUFBQUEsYUFBYSxDQUFDbEIsTUFBRCxFQUFTYSxNQUFULEVBQWlCO0FBQzVCLFdBQU8vQyxJQUFJLHVCQUF1QixLQUFLbUMsT0FBTCxDQUFhWSxNQUFiLEVBQXFCYixNQUFyQixDQUF2QixRQUFYO0FBQ0Q7O0FBRURtQixFQUFBQSxjQUFjLENBQUNuQixNQUFELEVBQVM7QUFDckIsV0FBT2xDLElBQUksSUFBSWtDLE1BQU0sQ0FBQ29CLE9BQVAsR0FDWHRELElBQUksSUFBSSxLQUFLdUQsYUFBTCxLQUNGdkQsSUFBSSx1Q0FBdUMsS0FBS29DLFdBQUwsQ0FBaUJvQixJQUFqQixDQUFzQixJQUF0QixFQUE0QnRCLE1BQTVCLENBQXZDLG9FQUM4RDlCLElBQUksQ0FBQyxzQkFBRCxDQURsRSxNQURGLEdBSUYsRUFKRixJQUtBOEIsTUFBTSxDQUFDTSxLQUFQLEdBQ0V4QyxJQUFJLDhEQUUyQkksSUFBSSxDQUFDLDRCQUFELENBRi9CLHNCQUVtRixLQUFLcUMsYUFGeEYsMEVBSXdDLEtBQUtVLFFBQUwsQ0FBY0ssSUFBZCxDQUFtQixJQUFuQixFQUF5QnRCLE1BQXpCLENBSnhDLEtBSTZFOUIsSUFBSSxDQUFDLHVCQUFELENBSmpGLDJDQUsrQixLQUFLMEMsU0FBTCxDQUFlVSxJQUFmLENBQW9CLElBQXBCLEVBQTBCdEIsTUFBMUIsQ0FML0IsZ0JBS2dGLENBQUMsS0FBS2dCLGVBQUwsRUFMakYsS0FNTzlDLElBQUksQ0FBQyxxQkFBRCxDQU5YLDZCQUROLEdBWUUsRUFqQkYsU0FrQktILE1BQU0sQ0FBQ2lDLE1BQU0sQ0FBQ29CLE9BQVIsRUFBa0JQLE1BQUQsSUFBWSxLQUFLSyxhQUFMLENBQW1CbEIsTUFBbkIsRUFBMkJhLE1BQTNCLENBQTdCLENBbEJYLFFBRE8sR0FvQlgsRUFwQk8sRUFBWDtBQXFCRDs7QUFFRFUsRUFBQUEsU0FBUyxDQUFDdkIsTUFBRCxFQUFTO0FBQ2hCNUIsSUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUI7QUFBRTRCLE1BQUFBO0FBQUYsS0FBakIsQ0FBbkI7QUFDRDs7QUFFRHdCLEVBQUFBLGVBQWUsQ0FBQ3hCLE1BQUQsRUFBU2EsTUFBVCxFQUFpQjtBQUM5QnpDLElBQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxlQUFQLEVBQXdCO0FBQUU0QixNQUFBQSxNQUFGO0FBQVVhLE1BQUFBO0FBQVYsS0FBeEIsQ0FBbkI7QUFDRDs7QUFFRFksRUFBQUEsY0FBYyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUMzQixRQUFJQSxNQUFKLEVBQVk7QUFDVixhQUFPN0QsSUFBSSxJQUNQLEtBQUs4RCxnQkFBTCxLQUNFOUQsSUFBSSx3REFHZ0IsS0FBSzBELGVBQUwsQ0FBcUJGLElBQXJCLENBQTBCLElBQTFCLEVBQWdDSyxNQUFoQyxFQUF3Q0QsSUFBeEMsQ0FIaEIsY0FJU3hELElBQUksQ0FBQyxvQ0FBRCxDQUpiLHNCQU1nQkEsSUFBSSxDQUFDLDZCQUFELENBTnBCLDBFQUROLEdBU0UsRUFWSyxHQUFYO0FBWUQsS0FiRCxNQWFPO0FBQ0wsYUFBT0osSUFBSSxJQUNQLEtBQUsrRCxVQUFMLENBQWdCSCxJQUFJLENBQUNJLEVBQXJCLElBQ0VoRSxJQUFJLHdEQUdnQixLQUFLeUQsU0FBTCxDQUFlRCxJQUFmLENBQW9CLElBQXBCLEVBQTBCSSxJQUExQixDQUhoQixjQUlTeEQsSUFBSSxDQUFDLG9DQUFELENBSmIsc0JBTWdCQSxJQUFJLENBQUMsNkJBQUQsQ0FOcEIsMEVBRE4sR0FTRUosSUFBSSwrQkFWQyxHQUFYO0FBWUQ7QUFDRjs7QUFFRG1DLEVBQUFBLE9BQU8sQ0FBQ3lCLElBQUQsRUFBT0MsTUFBUCxFQUFlO0FBQ3BCLFVBQU1JLE9BQU8sR0FBRztBQUFFL0IsTUFBQUEsTUFBTSxFQUFFLElBQVY7QUFBZ0JoQyxNQUFBQSxRQUFRLEVBQUUsS0FBSzRCLFNBQS9CO0FBQTBDK0IsTUFBQUEsTUFBTSxFQUFFQSxNQUFNLElBQUk7QUFBNUQsS0FBaEI7QUFDQSxVQUFNSyxXQUFXLEdBQUdOLElBQUksQ0FBQ08sTUFBTCxJQUFlUCxJQUFJLENBQUNPLE1BQUwsQ0FBWUMsWUFBM0IsR0FBMENSLElBQUksQ0FBQ08sTUFBTCxDQUFZQyxZQUF0RCxHQUFxRSxJQUF6RjtBQUNBLFVBQU1DLE9BQU8sR0FBR1QsSUFBSSxDQUFDTyxNQUFMLElBQWVQLElBQUksQ0FBQ08sTUFBTCxDQUFZRyxNQUEzQixJQUFxQ1YsSUFBSSxDQUFDTyxNQUFMLENBQVlHLE1BQVosQ0FBbUJDLE1BQXhELEdBQWlFWCxJQUFJLENBQUNPLE1BQUwsQ0FBWUcsTUFBWixDQUFtQkMsTUFBcEYsR0FBNkYsSUFBN0c7QUFFQSxXQUFPdkUsSUFBSSxnQkFDS0ssUUFBUSxDQUFDNEQsT0FBRCxDQURiLGtEQUV1Q0MsV0FGdkMsZUFFaUVHLE9BRmpFLGdGQUtFVCxJQUFJLENBQUNZLEtBQUwsR0FBYVosSUFBSSxDQUFDWSxLQUFsQixHQUEwQlosSUFBSSxDQUFDTyxNQUFMLENBQVlDLFlBTHhDLE9BSzJEUCxNQUFNLEdBQ2hFLEVBRGdFLEdBRWhFN0QsSUFBSSx5QkFDVyxDQUFDLEtBQUt5RSxVQUFMLENBQWdCYixJQUFJLENBQUNJLEVBQXJCLENBRFosYUFFUSxLQUFLVSxlQUFMLENBQXFCbEIsSUFBckIsQ0FBMEIsSUFBMUIsRUFBZ0NJLElBQWhDLENBRlIsWUFHT0EsSUFBSSxDQUFDbEMsS0FIWixnQkFQTCxHQVdrQixLQUFLaUMsY0FBTCxDQUFvQkMsSUFBcEIsRUFBMEJDLE1BQTFCLENBWGxCLGtDQWFvQixLQUFLYyxlQUFMLENBQXFCZixJQUFyQixDQWJwQiwrQkFhNkVBLElBQUksQ0FBQ2dCLElBYmxGLDJEQWNnQmhCLElBQUksQ0FBQ2lCLE9BZHJCLFFBZUhoQixNQUFNLEdBQUcsRUFBSCxHQUFRLEtBQUtSLGNBQUwsQ0FBb0JPLElBQXBCLENBZlgsaUJBQVg7QUFtQkQ7O0FBRURjLEVBQUFBLGVBQWUsQ0FBQ3hDLE1BQUQsRUFBU0csQ0FBVCxFQUFZO0FBQ3pCSCxJQUFBQSxNQUFNLENBQUNSLEtBQVAsR0FBZVcsQ0FBQyxDQUFDeUMsTUFBRixDQUFTcEQsS0FBeEI7QUFDQXBCLElBQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxRQUFQLEVBQWlCO0FBQUU0QixNQUFBQTtBQUFGLEtBQWpCLENBQW5CO0FBQ0Q7O0FBRURxQixFQUFBQSxhQUFhLEdBQUc7QUFDZCxXQUFPLEtBQUtyQyxZQUFMLENBQWtCTSxTQUFsQixLQUFnQyxJQUF2QztBQUNEOztBQUVEc0MsRUFBQUEsZ0JBQWdCLEdBQUc7QUFDakIsV0FBTyxLQUFLNUMsWUFBTCxDQUFrQk8sWUFBbEIsS0FBbUMsSUFBMUM7QUFDRDs7QUFFRGdELEVBQUFBLFVBQVUsQ0FBQ00sUUFBRCxFQUFXO0FBQ25CLFFBQUlwRSxLQUFLLENBQUNxRSxPQUFOLENBQWMsS0FBSzlELFlBQUwsQ0FBa0JJLE1BQWhDLENBQUosRUFBNkM7QUFDM0MsYUFBTyxLQUFLSixZQUFMLENBQWtCSSxNQUFsQixDQUF5QjJELFFBQXpCLENBQWtDRixRQUFsQyxDQUFQO0FBQ0Q7O0FBQ0QsV0FBTyxLQUFLN0QsWUFBTCxDQUFrQkksTUFBbEIsS0FBNkIsSUFBcEM7QUFDRDs7QUFFRHlDLEVBQUFBLFVBQVUsQ0FBQ2dCLFFBQUQsRUFBVztBQUNuQixRQUFJcEUsS0FBSyxDQUFDcUUsT0FBTixDQUFjLEtBQUs5RCxZQUFMLENBQWtCSyxNQUFoQyxDQUFKLEVBQTZDO0FBQzNDLGFBQU8sS0FBS0wsWUFBTCxDQUFrQkssTUFBbEIsQ0FBeUIwRCxRQUF6QixDQUFrQ0YsUUFBbEMsQ0FBUDtBQUNEOztBQUNELFdBQU8sS0FBSzdELFlBQUwsQ0FBa0JLLE1BQWxCLEtBQTZCLElBQXBDO0FBQ0Q7O0FBRURvRCxFQUFBQSxlQUFlLENBQUNmLElBQUQsRUFBTztBQUNwQixRQUFJQSxJQUFJLENBQUNZLEtBQVQsRUFBZ0I7QUFDZCxhQUFPeEUsSUFBSSw4QkFBOEI0RCxJQUFJLENBQUNPLE1BQUwsQ0FBWUMsWUFBMUMsU0FBWDtBQUNEOztBQUNELFdBQU8sRUFBUDtBQUNEOztBQXRUMEM7QUF5VDdDYyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLGdCQUE3QixFQUErQzdFLFlBQS9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQnO1xuaW1wb3J0ICcuLy4uL2F0b21zL2d2LXJlbGF0aXZlLXRpbWUnO1xuaW1wb3J0ICcuL2d2LWlkZW50aXR5LXBpY3R1cmUnO1xuaW1wb3J0ICcuL2d2LXJhdGluZyc7XG5pbXBvcnQgJy4vZ3YtY29uZmlybSc7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBsaW5rIH0gZnJvbSAnLi4vc3R5bGVzL2xpbmsnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcblxuLyoqXG4gKiBMaXN0IG9mIHJhdGluZ3Mgd2l0aCBhbnN3ZXIgZm9ybVxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqICMjIEF0dHJpYnV0ZSBgcGVybWlzc2lvbnNgIGRldGFpbHNcbiAqICogYGRlbGV0ZWAgYW5kIGB1cGRhdGVgIHByb3BlcnRpZXMgc3VwcG9ydHMgYm9vbGVhbnMgb3IgYXJyYXlzIG9mIHJhdGluZyBpZGVudGlmaWVyLlxuICogKiBgYWRkQW5zd2VyYCBhbmQgYGRlbGV0ZUFuc3dlcmAgb25seSBhY2NlcHQgYm9vbGVhbnMuXG4gKlxuICogQGZpcmVzIGd2LXJhdGluZy1saXN0OmFkZC1hbnN3ZXIgLSBXaGVuIHVzZXIgc3VibWl0IGFuc3dlclxuICogQGZpcmVzIGd2LXJhdGluZy1saXN0OmRlbGV0ZSAtIFdoZW4gdXNlciBkZWxldGUgcmF0aW5nXG4gKiBAZmlyZXMgZ3YtcmF0aW5nLWxpc3Q6ZGVsZXRlLWFuc3dlciAtIFdoZW4gdXNlciBkZWxldGUgYW5zd2VyXG4gKiBAZmlyZXMgZ3YtcmF0aW5nLWxpc3Q6dXBkYXRlIC0gV2hlbiB1c2VyIHVwZGF0ZSByYXRpbmdcbiAqXG4gKiBAYXR0ciB7UHJvbWlzZTxBcnJheT59IHJhdGluZ3MgLSByYXRpbmdzXG4gKiBAYXR0ciB7aWQsIGF2YXRhciwgZGlzcGxheV9uYW1lfSB1c2VyIC0gYSBjdXJyZW50IHVzZXJcbiAqIEBhdHRyIHtPYmplY3Q8e3VwZGF0ZSwgZGVsZXRlLCBhZGRBbnN3ZXIsIGRlbGV0ZUFuc3dlcn0+fSBwZXJtaXNzaW9ucyAtIFRoZSBwZXJtaXNzaW9uc1xuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1yYXRpbmctbGlzdC0tYmdjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlc3QsICNmZmZmZmYpXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtcmF0aW5nLWxpc3QtYW5zd2VyLS1iZ2M9dmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1saWdodGVyLCAjZmFmYWZhKV0gLSBBbnN3ZXIgYmFja2dyb3VuZCBjb2xvclxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1yYXRpbmctbGlzdC0tYmRjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IsICNmNWY1ZjUpXSAtIEJvcmRlciBjb2xvclxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3YtcmF0aW5nLWxpc3QtLXM9MThweF0gLSBIZWlnaHQgYW5kIHN0YXIgd2lkdGhcbiAqL1xuXG5leHBvcnQgY2xhc3MgR3ZSYXRpbmdMaXN0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmF0aW5nczogeyB0eXBlOiBBcnJheSB9LFxuICAgICAgdXNlcjogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAncmVxdWlyZWQnIH0sXG4gICAgICBfcGVybWlzc2lvbnM6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfcmF0aW5nczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgc2tlbGV0b24sXG4gICAgICBsaW5rLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAtLXM6IHZhcigtLWd2LXJhdGluZy1saXN0LS1zLCAxOHB4KTtcbiAgICAgICAgICAtLWd2LWljb24tLXM6IHZhcigtLXMpO1xuICAgICAgICAgIC0tZ3YtcmF0aW5nLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgICBtYXJnaW46IDAuMnJlbTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLnJhdGluZy1saXN0IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ndi1yYXRpbmctbGlzdC0tYmdjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0LCAjZmZmZmZmKSk7XG4gICAgICAgIH1cblxuICAgICAgICAucmF0aW5nLnBhcmVudCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWd2LXJhdGluZy1saXN0LS1iZGMsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IsICNmNWY1ZjUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5yYXRpbmcge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgcGFkZGluZzogMXJlbSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFuc3dlciAucmF0aW5nIHtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtIDAgMCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLnN1Yi10aXRsZSB7XG4gICAgICAgICAgY29sb3I6IGdyZXk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWNvbmZpcm0ge1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdWItdGl0bGUgYS5saW5rIHtcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWlkZW50aXR5LXBpY3R1cmUge1xuICAgICAgICAgIG1hcmdpbjogMCAxcmVtO1xuICAgICAgICAgIGhlaWdodDogNjBweDtcbiAgICAgICAgICB3aWR0aDogNjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aXRsZSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aXRsZSBiLFxuICAgICAgICAucmF0aW5nLWNvbnRlbnQge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAubGluay1hbnN3ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICAubGluay1hbnN3ZXIgZ3YtaWNvbiB7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwLjJyZW07XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kZWxldGUtcmF0aW5nLFxuICAgICAgICAuZGVsZXRlLWFuc3dlcixcbiAgICAgICAgLmZha2UtaWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgICBtaW4td2lkdGg6IHZhcigtLXMpO1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRlbGV0ZS1yYXRpbmcge1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuYW5zd2VyIHtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDFyZW07XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3YtcmF0aW5nLWxpc3QtYW5zd2VyLS1iZ2MsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlciwgI2ZhZmFmYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFuc3dlci1mb3JtIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuZGlzcGxheS1uYW1lOmFmdGVyIHtcbiAgICAgICAgICBjb250ZW50OiAnfCc7XG4gICAgICAgICAgbWFyZ2luOiAycHg7XG4gICAgICAgIH1cblxuICAgICAgICAuYWN0aW9ucyB7XG4gICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmF0aW5ncyA9IFtdO1xuICAgIHRoaXMuX3Blcm1pc3Npb25zID0ge1xuICAgICAgdXBkYXRlOiBmYWxzZSxcbiAgICAgIGRlbGV0ZTogZmFsc2UsXG4gICAgICBhZGRBbnN3ZXI6IGZhbHNlLFxuICAgICAgZGVsZXRlQW5zd2VyOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgc2V0IHJhdGluZ3ModmFsdWUpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpXG4gICAgICAudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fc2tlbGV0b24gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9yYXRpbmdzID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2tlbGV0b24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2tlbGV0b24gPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zKSB7XG4gICAgaWYgKHBlcm1pc3Npb25zICYmIHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuX3Blcm1pc3Npb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGVybWlzc2lvbnMsIHBlcm1pc3Npb25zKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxkaXYgY2xhc3M9XCJyYXRpbmctbGlzdFwiPiR7cmVwZWF0KHRoaXMuX3JhdGluZ3MsIChyYXRpbmcpID0+IHRoaXMuX3JlbmRlcihyYXRpbmcpKX08L2Rpdj4gYDtcbiAgfVxuXG4gIF9lZGl0QW5zd2VyKHJhdGluZywgZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5fcmF0aW5ncy5mb3JFYWNoKChyYXRpbmcpID0+IChyYXRpbmcuX2VkaXQgPSBmYWxzZSkpO1xuICAgIHJhdGluZy5fZWRpdCA9IHRydWU7XG4gICAgdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gIH1cblxuICBfZ2V0QW5zd2VyVmFsdWUoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi10ZXh0Jyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBfb25BbnN3ZXIocmF0aW5nKSB7XG4gICAgY29uc3QgYW5zd2VyID0gdGhpcy5fZ2V0QW5zd2VyVmFsdWUoKTtcbiAgICBpZiAoYW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdhZGQtYW5zd2VyJywgeyByYXRpbmcsIGFuc3dlciB9KTtcbiAgICB9XG4gIH1cblxuICBfaGFzVmFsaWRBbnN3ZXIoKSB7XG4gICAgY29uc3QgYW5zd2VyID0gdGhpcy5fZ2V0QW5zd2VyVmFsdWUoKTtcbiAgICByZXR1cm4gYW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgX29uQ2xvc2UocmF0aW5nKSB7XG4gICAgZGVsZXRlIHJhdGluZy5fZWRpdDtcbiAgICB0aGlzLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIF9yZW5kZXJBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiYW5zd2VyXCI+JHt0aGlzLl9yZW5kZXIoYW5zd2VyLCByYXRpbmcpfTwvZGl2PmA7XG4gIH1cblxuICBfcmVuZGVyQW5zd2VycyhyYXRpbmcpIHtcbiAgICByZXR1cm4gaHRtbGAgJHtyYXRpbmcuYW5zd2Vyc1xuICAgICAgPyBodG1sYCAke3RoaXMuX2NhbkFkZEFuc3dlcigpXG4gICAgICAgICAgICA/IGh0bWxgPGEgY2xhc3M9XCJsaW5rIGxpbmstYW5zd2VyXCIgQGNsaWNrPVwiJHt0aGlzLl9lZGl0QW5zd2VyLmJpbmQodGhpcywgcmF0aW5nKX1cIj5cbiAgICAgICAgICAgICAgICA8Z3YtaWNvbiBjbGFzcz1cImxpbmtcIiBzaGFwZT1cImNvbW11bmljYXRpb246Y2hhdCM1XCI+PC9ndi1pY29uPiAke2kxOG4oJ2d2LXJhdGluZy1saXN0LnJlcGx5Jyl9PC9hXG4gICAgICAgICAgICAgID5gXG4gICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICR7cmF0aW5nLl9lZGl0XG4gICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuc3dlciBhbnN3ZXItZm9ybVwiPlxuICAgICAgICAgICAgICAgICAgPGd2LXRleHQgcm93cz1cIjRcIiBsYWJlbD1cIiR7aTE4bignZ3YtcmF0aW5nLWxpc3QuYW5zd2VyTGFiZWwnKX1cIiByZXF1aXJlZCBAaW5wdXQ9XCIke3RoaXMucGVyZm9ybVVwZGF0ZX1cIj48L2d2LXRleHQ+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIHByaW1hcnkgb3V0bGluZWQgQGNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlLmJpbmQodGhpcywgcmF0aW5nKX1cIj4ke2kxOG4oJ2d2LXJhdGluZy1saXN0LmNhbmNlbCcpfTwvZ3YtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIHByaW1hcnkgQGNsaWNrPVwiJHt0aGlzLl9vbkFuc3dlci5iaW5kKHRoaXMsIHJhdGluZyl9XCIgLmRpc2FibGVkPVwiJHshdGhpcy5faGFzVmFsaWRBbnN3ZXIoKX1cIlxuICAgICAgICAgICAgICAgICAgICAgID4ke2kxOG4oJ2d2LXJhdGluZy1saXN0LnNlbmQnKX08L2d2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiAnJ31cbiAgICAgICAgICA8ZGl2PiR7cmVwZWF0KHJhdGluZy5hbnN3ZXJzLCAoYW5zd2VyKSA9PiB0aGlzLl9yZW5kZXJBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpKX08L2Rpdj5gXG4gICAgICA6ICcnfWA7XG4gIH1cblxuICBfb25EZWxldGUocmF0aW5nKSB7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZGVsZXRlJywgeyByYXRpbmcgfSk7XG4gIH1cblxuICBfb25EZWxldGVBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWxldGUtYW5zd2VyJywgeyByYXRpbmcsIGFuc3dlciB9KTtcbiAgfVxuXG4gIF9yZW5kZXJBY3Rpb25zKGRhdGEsIHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAke3RoaXMuX2NhbkRlbGV0ZUFuc3dlcigpXG4gICAgICAgICAgPyBodG1sYDxndi1jb25maXJtXG4gICAgICAgICAgICAgIGRhbmdlclxuICAgICAgICAgICAgICBpY29uPVwiaG9tZTp0cmFzaFwiXG4gICAgICAgICAgICAgIEBndi1jb25maXJtOm9rPVwiJHt0aGlzLl9vbkRlbGV0ZUFuc3dlci5iaW5kKHRoaXMsIHBhcmVudCwgZGF0YSl9XCJcbiAgICAgICAgICAgICAgbWVzc2FnZT1cIiR7aTE4bignZ3YtcmF0aW5nLWxpc3QuY29uZmlybUFuc3dlckRlbGV0ZScpfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxndi1pY29uIHRpdGxlPVwiJHtpMThuKCdndi1yYXRpbmctbGlzdC5kZWxldGVBbnN3ZXInKX1cIiBjbGFzcz1cImxpbmsgZGVsZXRlLWFuc3dlclwiIHNoYXBlPVwiaG9tZTp0cmFzaFwiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgIDwvZ3YtY29uZmlybT5gXG4gICAgICAgICAgOiAnJ31cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAke3RoaXMuX2NhbkRlbGV0ZShkYXRhLmlkKVxuICAgICAgICAgID8gaHRtbGA8Z3YtY29uZmlybVxuICAgICAgICAgICAgICBkYW5nZXJcbiAgICAgICAgICAgICAgaWNvbj1cImhvbWU6dHJhc2hcIlxuICAgICAgICAgICAgICBAZ3YtY29uZmlybTpvaz1cIiR7dGhpcy5fb25EZWxldGUuYmluZCh0aGlzLCBkYXRhKX1cIlxuICAgICAgICAgICAgICBtZXNzYWdlPVwiJHtpMThuKCdndi1yYXRpbmctbGlzdC5jb25maXJtUmF0aW5nRGVsZXRlJyl9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGd2LWljb24gdGl0bGU9XCIke2kxOG4oJ2d2LXJhdGluZy1saXN0LmRlbGV0ZVJhdGluZycpfVwiIGNsYXNzPVwibGluayBkZWxldGUtcmF0aW5nXCIgc2hhcGU9XCJob21lOnRyYXNoXCI+PC9ndi1pY29uPlxuICAgICAgICAgICAgPC9ndi1jb25maXJtPmBcbiAgICAgICAgICA6IGh0bWxgPGRpdiBjbGFzcz1cImZha2UtaWNvblwiPjwvZGl2PmB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxuXG4gIF9yZW5kZXIoZGF0YSwgcGFyZW50KSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IHsgcmF0aW5nOiB0cnVlLCBza2VsZXRvbjogdGhpcy5fc2tlbGV0b24sIHBhcmVudDogcGFyZW50ID09IG51bGwgfTtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGRhdGEuYXV0aG9yICYmIGRhdGEuYXV0aG9yLmRpc3BsYXlfbmFtZSA/IGRhdGEuYXV0aG9yLmRpc3BsYXlfbmFtZSA6IG51bGw7XG4gICAgY29uc3QgcGljdHVyZSA9IGRhdGEuYXV0aG9yICYmIGRhdGEuYXV0aG9yLl9saW5rcyAmJiBkYXRhLmF1dGhvci5fbGlua3MuYXZhdGFyID8gZGF0YS5hdXRob3IuX2xpbmtzLmF2YXRhciA6IG51bGw7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKGNsYXNzZXMpfVwiPlxuICAgICAgICA8Z3YtaWRlbnRpdHktcGljdHVyZSByb3VuZGVkIC5kaXNwbGF5X25hbWU9XCIke2Rpc3BsYXlOYW1lfVwiIC5waWN0dXJlPVwiJHtwaWN0dXJlfVwiPjwvZ3YtaWRlbnRpdHktcGljdHVyZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJhdGluZy1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICA8Yj4ke2RhdGEudGl0bGUgPyBkYXRhLnRpdGxlIDogZGF0YS5hdXRob3IuZGlzcGxheV9uYW1lfTwvYj4ke3BhcmVudFxuICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgIDogaHRtbGA8Z3YtcmF0aW5nXG4gICAgICAgICAgICAgICAgICAucmVhZG9ubHk9XCIkeyF0aGlzLl9jYW5VcGRhdGUoZGF0YS5pZCl9XCJcbiAgICAgICAgICAgICAgICAgIEBpbnB1dD1cIiR7dGhpcy5fb25VcGRhdGVSYXRpbmcuYmluZCh0aGlzLCBkYXRhKX1cIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke2RhdGEudmFsdWV9XCJcbiAgICAgICAgICAgICAgICA+PC9ndi1yYXRpbmc+YH0ke3RoaXMuX3JlbmRlckFjdGlvbnMoZGF0YSwgcGFyZW50KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+JHt0aGlzLl9nZXREaXNwbGF5TmFtZShkYXRhKX08Z3YtcmVsYXRpdmUtdGltZSBkYXRldGltZT1cIiR7ZGF0YS5kYXRlfVwiIG5vRnV0dXJlPjwvZ3YtcmVsYXRpdmUtdGltZT48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNvbW1lbnRcIj4ke2RhdGEuY29tbWVudH08L3A+XG4gICAgICAgICAgJHtwYXJlbnQgPyAnJyA6IHRoaXMuX3JlbmRlckFuc3dlcnMoZGF0YSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIF9vblVwZGF0ZVJhdGluZyhyYXRpbmcsIGUpIHtcbiAgICByYXRpbmcudmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICd1cGRhdGUnLCB7IHJhdGluZyB9KTtcbiAgfVxuXG4gIF9jYW5BZGRBbnN3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmFkZEFuc3dlciA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5EZWxldGVBbnN3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmRlbGV0ZUFuc3dlciA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5VcGRhdGUocmF0aW5nSWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucy51cGRhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvbnMudXBkYXRlLmluY2x1ZGVzKHJhdGluZ0lkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLnVwZGF0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5EZWxldGUocmF0aW5nSWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucy5kZWxldGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvbnMuZGVsZXRlLmluY2x1ZGVzKHJhdGluZ0lkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmRlbGV0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9nZXREaXNwbGF5TmFtZShkYXRhKSB7XG4gICAgaWYgKGRhdGEudGl0bGUpIHtcbiAgICAgIHJldHVybiBodG1sYDxzcGFuIGNsYXNzPVwiZGlzcGxheS1uYW1lXCI+JHtkYXRhLmF1dGhvci5kaXNwbGF5X25hbWV9PC9zcGFuPmA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1yYXRpbmctbGlzdCcsIEd2UmF0aW5nTGlzdCk7XG4iXX0=