@gravitee/ui-components 3.24.4 → 3.24.5-renovate-github-markdown-css-5-x-d2ffdad

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 (117) hide show
  1. package/CHANGELOG.md +1260 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/css/github-markdown-css/github-markdown.css +500 -545
  5. package/assets/i18n/en.json +0 -3
  6. package/assets/i18n/fr.json +0 -3
  7. package/package.json +19 -21
  8. package/src/.eslintrc.js +19 -0
  9. package/src/atoms/gv-autocomplete.js +156 -132
  10. package/src/atoms/gv-button.js +248 -73
  11. package/src/atoms/gv-checkbox.js +103 -45
  12. package/src/atoms/gv-date-picker-calendar.js +393 -312
  13. package/src/atoms/gv-date-picker-cell.js +81 -57
  14. package/src/atoms/gv-date-picker.js +319 -180
  15. package/src/atoms/gv-file-upload.js +195 -85
  16. package/src/atoms/gv-icon.js +34 -13
  17. package/src/atoms/gv-image.js +66 -31
  18. package/src/atoms/gv-input-message.js +37 -12
  19. package/src/atoms/gv-input.js +169 -139
  20. package/src/atoms/gv-link.js +125 -47
  21. package/src/atoms/gv-message.js +69 -18
  22. package/src/atoms/gv-metric.js +68 -19
  23. package/src/atoms/gv-relative-time.js +38 -67
  24. package/src/atoms/gv-select-native.js +215 -96
  25. package/src/atoms/gv-select.js +230 -110
  26. package/src/atoms/gv-spinner.js +26 -5
  27. package/src/atoms/gv-state.js +66 -25
  28. package/src/atoms/gv-switch.js +160 -40
  29. package/src/atoms/gv-tag.js +78 -26
  30. package/src/atoms/gv-text.js +83 -22
  31. package/src/charts/gv-chart-bar.js +18 -22
  32. package/src/charts/gv-chart-gauge.js +31 -28
  33. package/src/charts/gv-chart-histogram.js +10 -18
  34. package/src/charts/gv-chart-line.js +59 -70
  35. package/src/charts/gv-chart-map.js +42 -44
  36. package/src/charts/gv-chart-pie.js +14 -18
  37. package/src/index.js +0 -2
  38. package/src/lib/cron-expression.js +35 -40
  39. package/src/lib/date.js +1 -10
  40. package/src/lib/events.js +1 -3
  41. package/src/lib/http-client-schema-form.js +12 -13
  42. package/src/lib/http.js +56 -57
  43. package/src/lib/i18n.js +22 -30
  44. package/src/lib/item.js +12 -13
  45. package/src/lib/properties.js +42 -77
  46. package/src/lib/schema-form.js +5 -4
  47. package/src/lib/studio.js +60 -13
  48. package/src/lib/style.js +8 -8
  49. package/src/lib/text-format.js +7 -14
  50. package/src/lib/theme.js +5 -8
  51. package/src/lib/utils.js +18 -17
  52. package/src/mixins/chart-element.js +54 -31
  53. package/src/mixins/input-element.js +49 -60
  54. package/src/mixins/item-resource.js +32 -34
  55. package/src/mixins/keyboard-element.js +5 -6
  56. package/src/mixins/update-after-browser.js +1 -4
  57. package/src/mixins/with-resize-observer.js +13 -23
  58. package/src/mixins/with-skeleton-attribute.js +48 -54
  59. package/src/molecules/gv-card-full.js +147 -26
  60. package/src/molecules/gv-card-list.js +42 -13
  61. package/src/molecules/gv-card.js +91 -17
  62. package/src/molecules/gv-category-list.js +17 -6
  63. package/src/molecules/gv-category.js +103 -23
  64. package/src/molecules/gv-code.js +263 -189
  65. package/src/molecules/gv-confirm.js +71 -41
  66. package/src/molecules/gv-cron-editor.js +389 -143
  67. package/src/molecules/gv-dropdown-menu.js +46 -14
  68. package/src/molecules/gv-expandable.js +59 -31
  69. package/src/molecules/gv-expression-language.js +208 -552
  70. package/src/molecules/gv-identity-picture.js +65 -42
  71. package/src/molecules/gv-list.js +134 -42
  72. package/src/molecules/gv-metrics.js +49 -37
  73. package/src/molecules/gv-modal.js +95 -28
  74. package/src/molecules/gv-nav.js +75 -49
  75. package/src/molecules/gv-option.js +130 -57
  76. package/src/molecules/gv-plans.js +209 -86
  77. package/src/molecules/gv-popover.js +177 -57
  78. package/src/molecules/gv-promote.js +146 -28
  79. package/src/molecules/gv-rating-list.js +195 -69
  80. package/src/molecules/gv-rating.js +105 -52
  81. package/src/molecules/gv-row-expandable.js +11 -5
  82. package/src/molecules/gv-row.js +147 -21
  83. package/src/molecules/gv-stats.js +48 -23
  84. package/src/molecules/gv-stepper.js +187 -43
  85. package/src/molecules/gv-table.js +309 -199
  86. package/src/molecules/gv-tree.js +156 -33
  87. package/src/organisms/gv-documentation.js +127 -44
  88. package/src/organisms/gv-header.js +195 -37
  89. package/src/organisms/gv-http-client.js +168 -32
  90. package/src/organisms/gv-menu.js +158 -37
  91. package/src/organisms/gv-newsletter-subscription.js +189 -48
  92. package/src/organisms/gv-pagination.js +77 -49
  93. package/src/organisms/gv-properties.js +492 -271
  94. package/src/organisms/gv-resizable-views.js +259 -41
  95. package/src/organisms/gv-resources.js +275 -168
  96. package/src/organisms/gv-schema-form-array.js +159 -49
  97. package/src/organisms/gv-schema-form-control-object.js +73 -59
  98. package/src/organisms/gv-schema-form-control.js +134 -107
  99. package/src/organisms/gv-schema-form.js +280 -195
  100. package/src/organisms/gv-tabs.js +98 -66
  101. package/src/organisms/gv-user-menu.js +201 -36
  102. package/src/organisms/gv-vertical-menu.js +61 -20
  103. package/src/policy-studio/gv-flow-step.js +245 -105
  104. package/src/policy-studio/gv-flow.js +304 -125
  105. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  106. package/src/policy-studio/gv-policy-studio.js +761 -692
  107. package/src/styles/empty.js +20 -3
  108. package/src/styles/input.js +247 -3
  109. package/src/styles/link.js +16 -3
  110. package/src/styles/shapes.js +0 -1
  111. package/src/styles/skeleton.js +37 -3
  112. package/src/styles/zoom.js +24 -3
  113. package/src/theme/definition.json +1762 -0
  114. package/src/theme/gv-theme.js +60 -21
  115. package/assets/css/codemirror/all.css +0 -476
  116. package/src/molecules/gv-code-hint.js +0 -49
  117. package/wc/gv-code-hint.js +0 -1
@@ -29,71 +29,32 @@ import '../organisms/gv-schema-form-array';
29
29
  import '../organisms/gv-schema-form-control-object';
30
30
  import { isCodemirror, isObject, isComplexArray } from '../lib/schema-form';
31
31
  import { UpdateAfterBrowser } from '../mixins/update-after-browser';
32
+
32
33
  export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
33
34
  static get properties() {
34
35
  return {
35
- type: {
36
- type: String
37
- },
38
- id: {
39
- type: String,
40
- reflect: true
41
- },
42
- name: {
43
- type: String,
44
- reflect: true
45
- },
46
- required: {
47
- type: Boolean,
48
- reflect: true
49
- },
50
- disabled: {
51
- type: Boolean,
52
- reflect: true
53
- },
54
- readonly: {
55
- type: Boolean,
56
- reflect: true
57
- },
58
- title: {
59
- type: String,
60
- reflect: true
61
- },
62
- pattern: {
63
- type: String
64
- },
65
- control: {
66
- type: Object
67
- },
68
- errors: {
69
- type: Array
70
- },
71
- value: {
72
- type: Object,
73
- reflect: true
74
- },
75
- skeleton: {
76
- type: Boolean,
77
- reflect: true
78
- },
79
- hidden: {
80
- type: Boolean,
81
- reflect: true
82
- },
83
- writeOnly: {
84
- type: Boolean,
85
- reflect: true
86
- },
87
- compact: {
88
- type: Boolean
89
- }
36
+ type: { type: String },
37
+ id: { type: String, reflect: true },
38
+ name: { type: String, reflect: true },
39
+ required: { type: Boolean, reflect: true },
40
+ disabled: { type: Boolean, reflect: true },
41
+ readonly: { type: Boolean, reflect: true },
42
+ title: { type: String, reflect: true },
43
+ pattern: { type: String },
44
+ control: { type: Object },
45
+ errors: { type: Array },
46
+ value: { type: Object, reflect: true },
47
+ skeleton: { type: Boolean, reflect: true },
48
+ hidden: { type: Boolean, reflect: true },
49
+ writeOnly: { type: Boolean, reflect: true },
50
+ compact: { type: Boolean },
90
51
  };
91
52
  }
92
53
 
93
54
  constructor() {
94
- super(); // When form has errors, the control is not update to conserve the error state.
55
+ super();
56
+ // When form has errors, the control is not update to conserve the error state.
95
57
  // This list is used to force the update of properties even in error case.
96
-
97
58
  this._observedProperties = ['disabled', 'readonly', 'required'];
98
59
  }
99
60
 
@@ -106,7 +67,10 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
106
67
  }
107
68
 
108
69
  isPassword() {
109
- return this.control.writeOnly === true || this.control['x-schema-form'] && this.control['x-schema-form'].type != null && this.control['x-schema-form'].type === 'password';
70
+ return (
71
+ this.control.writeOnly === true ||
72
+ (this.control['x-schema-form'] && this.control['x-schema-form'].type != null && this.control['x-schema-form'].type === 'password')
73
+ );
110
74
  }
111
75
 
112
76
  getPlaceholder() {
@@ -133,12 +97,10 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
133
97
  if (this.isObject()) {
134
98
  return 'gv-schema-form-control-object';
135
99
  }
136
-
137
- if ((this.control.enum || this.control.items && this.control.items.enum) && !this.isAutocomplete()) {
100
+ if ((this.control.enum || (this.control.items && this.control.items.enum)) && !this.isAutocomplete()) {
138
101
  if (this.control.type === 'array') {
139
102
  return 'gv-select';
140
103
  }
141
-
142
104
  return 'gv-select-native';
143
105
  } else if (isComplexArray(this.control)) {
144
106
  return 'gv-schema-form-array';
@@ -161,7 +123,7 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
161
123
 
162
124
  _updateProperties(element) {
163
125
  if (element != null) {
164
- this._observedProperties.forEach(property => {
126
+ this._observedProperties.forEach((property) => {
165
127
  if (this[property] != null) {
166
128
  element[property] = this[property];
167
129
  }
@@ -176,16 +138,10 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
176
138
  element.name = this.id;
177
139
  element.skeleton = this.skeleton;
178
140
  element.classList.add('form__control');
179
-
180
141
  if (this.value == null && this.control.default != null) {
181
142
  this.value = this.control.default;
182
- dispatchCustomEvent(this, 'default-value', {
183
- value: this.value,
184
- currentTarget: element,
185
- control: this.control
186
- });
143
+ dispatchCustomEvent(this, 'default-value', { value: this.value, currentTarget: element, control: this.control });
187
144
  }
188
-
189
145
  if (this.value != null) {
190
146
  this._setValue(element);
191
147
  }
@@ -204,7 +160,6 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
204
160
  } else {
205
161
  const tmp = this.id.split('.');
206
162
  const title = tmp[tmp.length - 1];
207
-
208
163
  if (isNaN(parseInt(title, 10))) {
209
164
  element.label = title;
210
165
  element.title = title;
@@ -227,24 +182,21 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
227
182
 
228
183
  const placeholder = this.getPlaceholder();
229
184
 
230
- if (this.control.enum || this.control.items && this.control.items.enum) {
185
+ if (this.control.enum || (this.control.items && this.control.items.enum)) {
231
186
  const options = this.control.enum || this.control.items.enum;
232
-
233
187
  if (this.control['x-schema-form'] && this.control['x-schema-form'].titleMap) {
234
- element.options = options.map(value => ({
188
+ element.options = options.map((value) => ({
235
189
  value,
236
- label: this.control['x-schema-form'].titleMap[value] || value
190
+ label: this.control['x-schema-form'].titleMap[value] || value,
237
191
  }));
238
192
  } else {
239
193
  element.options = options;
240
194
  }
241
-
242
195
  if (this.control.type === 'array') {
243
196
  element.multiple = true;
244
197
  }
245
198
  } else if (this.isCodemirror()) {
246
199
  element.options = this.control['x-schema-form'].codemirrorOptions;
247
-
248
200
  if (this.control.default != null && element.options.value == null) {
249
201
  element.options.value = this.control.default;
250
202
  }
@@ -275,8 +227,8 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
275
227
  }
276
228
 
277
229
  element.addEventListener(`${elementName}:input`, this._onInput.bind(this));
278
- let currentTarget;
279
230
 
231
+ let currentTarget;
280
232
  if (this.isAutocomplete()) {
281
233
  const autocomplete = document.createElement('gv-autocomplete');
282
234
  autocomplete.minChars = 0;
@@ -290,14 +242,12 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
290
242
  } else {
291
243
  currentTarget = element;
292
244
  }
293
-
294
245
  if (this.control['x-schema-form'] != null) {
295
246
  dispatchCustomEvent(this, 'control-ready', {
296
247
  currentTarget,
297
- control: this
248
+ control: this,
298
249
  });
299
250
  }
300
-
301
251
  return currentTarget;
302
252
  }
303
253
 
@@ -305,29 +255,26 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
305
255
  e.preventDefault();
306
256
  e.stopPropagation();
307
257
  let value = null;
308
-
309
258
  if (e.target.tagName === 'GV-AUTOCOMPLETE') {
310
259
  value = e.detail.value;
311
260
  } else {
312
261
  value = e.detail;
313
262
  }
314
-
315
- dispatchCustomEvent(this, 'change', {
316
- value,
317
- currentTarget: e.target,
318
- control: this.control
319
- });
263
+ dispatchCustomEvent(this, 'change', { value, currentTarget: e.target, control: this.control });
320
264
  }
321
265
 
322
266
  getControls() {
323
- return [...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control')), ...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control-array')), ...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control-object'))];
267
+ return [
268
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control')),
269
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control-array')),
270
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control-object')),
271
+ ];
324
272
  }
325
273
 
326
274
  getControl(id) {
327
275
  if (id == null) {
328
276
  id = this.id;
329
277
  }
330
-
331
278
  return this.shadowRoot.querySelector(`[id="${id}"]`);
332
279
  }
333
280
 
@@ -339,13 +286,12 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
339
286
  controlElement.value = this.value.toString ? this.value.toString() : this.value;
340
287
  }
341
288
  }
342
-
343
289
  return controlElement;
344
290
  }
345
291
 
346
292
  async updated(changedProperties) {
347
293
  if (changedProperties.has('value')) {
348
- Promise.all(this.getControls().map(control => control.updateComplete)).then(() => {
294
+ Promise.all(this.getControls().map((control) => control.updateComplete)).then(() => {
349
295
  this._setValue(this.getControl());
350
296
  });
351
297
  }
@@ -353,42 +299,39 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
353
299
 
354
300
  async getUpdateComplete() {
355
301
  await super.getUpdateComplete();
356
- await Promise.all(this.getControls().map(e => e.updateComplete));
302
+ await Promise.all(this.getControls().map((e) => e.updateComplete));
357
303
  }
358
304
 
359
305
  formatErrorMessage(error) {
360
306
  let title;
361
-
362
307
  if (this.control.properties != null && this.control.properties[error.argument] != null) {
363
308
  title = this.control.properties[error.argument].title;
364
309
  } else {
365
310
  title = this.control.title;
366
311
  }
367
-
368
312
  if (title) {
369
313
  return `<span>${error.message.replace(error.argument, title)}</span>`;
370
314
  }
371
-
372
315
  return `<span>${error.message}</span>`;
373
316
  }
374
317
 
375
318
  shouldUpdate(changedProperties) {
376
- if (this._observedProperties.find(property => changedProperties.has(property)) != null) {
319
+ if (this._observedProperties.find((property) => changedProperties.has(property)) != null) {
377
320
  this._updateProperties(this.getControl());
378
321
  }
379
322
 
380
323
  if (changedProperties.has('errors') && this.errors != null) {
381
324
  // Set errors to complex controls
382
- this.getControls().forEach(control => {
325
+ this.getControls().forEach((control) => {
383
326
  control.errors = this.errors;
384
- }); // Find simple controls and append error message
327
+ });
385
328
 
329
+ // Find simple controls and append error message
386
330
  const errorContainer = this.shadowRoot.querySelectorAll('.form__control-error');
387
- errorContainer.forEach(container => container.innerHTML = '');
388
- this.errors.forEach(error => {
331
+ errorContainer.forEach((container) => (container.innerHTML = ''));
332
+ this.errors.forEach((error) => {
389
333
  const key = error.property === 'instance' ? error.argument : error.property.replace('instance.', '');
390
334
  const errorContainer = this.shadowRoot.querySelector(`[id="${key}-error"]`);
391
-
392
335
  if (errorContainer) {
393
336
  const message = document.createElement('gv-input-message');
394
337
  message.innerHTML = this.formatErrorMessage(error);
@@ -398,19 +341,103 @@ export class GvSchemaFormControl extends UpdateAfterBrowser(LitElement) {
398
341
  });
399
342
  return false;
400
343
  }
401
-
402
344
  return super.shouldUpdate(changedProperties);
403
345
  }
404
346
 
405
347
  render() {
406
- return html` ${this._renderControl()} <div class="form__control-error" id="${this.id + '-error'}"></div> `;
348
+ return html`
349
+ ${this._renderControl()}
350
+ <div class="form__control-error" id="${this.id + '-error'}"></div>
351
+ `;
407
352
  }
408
353
 
409
354
  static get styles() {
410
- return [// language=CSS
411
- css`:host{box-sizing:border-box;margin:var(--gv-schema-form-control--m,.4rem);display:block}:host([hidden]){visibility:hidden;height:0;margin:0;padding:0;overflow:hidden}.form__control-description,.form__control-error{font-size:12px}.form__control-description{opacity:.8}.form__control-label{display:flex;flex-direction:row;border-bottom:1px solid #d9d9d9}label{margin:.2rem}.form__control-label label{flex:1;text-transform:capitalize}.form__control-array,.form__control-object{display:flex;flex-direction:column}.form__control-enum{display:flex}.form__control-array gv-button{align-self:flex-end}.form__control{position:relative}gv-code,gv-expression-language,gv-input,gv-select,gv-select-native,gv-switch{width:100%;margin:.2rem 0}gv-autocomplete:hover,gv-select-native:hover,gv-select:hover{z-index:70}.error{color:var(--gv-theme-color-error,#f44336)}.warning{color:var(--gv-theme-color-warning,#ff9800)}`];
412
- }
355
+ return [
356
+ // language=CSS
357
+ css`
358
+ :host {
359
+ box-sizing: border-box;
360
+ margin: var(--gv-schema-form-control--m, 0.4rem);
361
+ display: block;
362
+ }
413
363
 
364
+ :host([hidden]) {
365
+ visibility: hidden;
366
+ height: 0;
367
+ margin: 0;
368
+ padding: 0;
369
+ overflow: hidden;
370
+ }
371
+
372
+ .form__control-description,
373
+ .form__control-error {
374
+ font-size: 12px;
375
+ }
376
+
377
+ .form__control-description {
378
+ opacity: 0.8;
379
+ }
380
+
381
+ .form__control-label {
382
+ display: flex;
383
+ flex-direction: row;
384
+ border-bottom: 1px solid #d9d9d9;
385
+ }
386
+
387
+ label {
388
+ margin: 0.2rem;
389
+ }
390
+
391
+ .form__control-label label {
392
+ flex: 1;
393
+ text-transform: capitalize;
394
+ }
395
+
396
+ .form__control-array,
397
+ .form__control-object {
398
+ display: flex;
399
+ flex-direction: column;
400
+ }
401
+
402
+ .form__control-enum {
403
+ display: flex;
404
+ /*align-items: flex-end;*/
405
+ }
406
+
407
+ .form__control-array gv-button {
408
+ align-self: flex-end;
409
+ }
410
+
411
+ .form__control {
412
+ position: relative;
413
+ }
414
+
415
+ gv-select,
416
+ gv-select-native,
417
+ gv-input,
418
+ gv-code,
419
+ gv-switch,
420
+ gv-expression-language {
421
+ width: 100%;
422
+ margin: 0.2rem 0;
423
+ }
424
+
425
+ gv-select:hover,
426
+ gv-select-native:hover,
427
+ gv-autocomplete:hover {
428
+ z-index: 70;
429
+ }
430
+
431
+ .error {
432
+ color: var(--gv-theme-color-error, #f44336);
433
+ }
434
+
435
+ .warning {
436
+ color: var(--gv-theme-color-warning, #ff9800);
437
+ }
438
+ `,
439
+ ];
440
+ }
414
441
  }
442
+
415
443
  window.customElements.define('gv-schema-form-control', GvSchemaFormControl);
416
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybS1jb250cm9sLmpzIl0sIm5hbWVzIjpbImNzcyIsIkxpdEVsZW1lbnQiLCJodG1sIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsImlzQ29kZW1pcnJvciIsImlzT2JqZWN0IiwiaXNDb21wbGV4QXJyYXkiLCJVcGRhdGVBZnRlckJyb3dzZXIiLCJHdlNjaGVtYUZvcm1Db250cm9sIiwicHJvcGVydGllcyIsInR5cGUiLCJTdHJpbmciLCJpZCIsInJlZmxlY3QiLCJuYW1lIiwicmVxdWlyZWQiLCJCb29sZWFuIiwiZGlzYWJsZWQiLCJyZWFkb25seSIsInRpdGxlIiwicGF0dGVybiIsImNvbnRyb2wiLCJPYmplY3QiLCJlcnJvcnMiLCJBcnJheSIsInZhbHVlIiwic2tlbGV0b24iLCJoaWRkZW4iLCJ3cml0ZU9ubHkiLCJjb21wYWN0IiwiY29uc3RydWN0b3IiLCJfb2JzZXJ2ZWRQcm9wZXJ0aWVzIiwiaXNFeHByZXNzaW9uTGFuZ3VhZ2UiLCJpc0Nyb25FeHByZXNzaW9uIiwiaXNQYXNzd29yZCIsImdldFBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXIiLCJpc0F1dG9jb21wbGV0ZSIsImV2ZW50IiwiaXNUZXh0IiwiZ2V0RWxlbWVudE5hbWUiLCJlbnVtIiwiaXRlbXMiLCJfdXBkYXRlUHJvcGVydGllcyIsImVsZW1lbnQiLCJmb3JFYWNoIiwicHJvcGVydHkiLCJfcmVuZGVyQ29udHJvbCIsImVsZW1lbnROYW1lIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiZGVmYXVsdCIsImN1cnJlbnRUYXJnZXQiLCJfc2V0VmFsdWUiLCJzY2hlbWEiLCJsYWJlbCIsInRtcCIsInNwbGl0IiwibGVuZ3RoIiwiaXNOYU4iLCJwYXJzZUludCIsInJvd3MiLCJhdXRvc2l6ZSIsImRlc2NyaXB0aW9uIiwib3B0aW9ucyIsInRpdGxlTWFwIiwibWFwIiwibXVsdGlwbGUiLCJjb2RlbWlycm9yT3B0aW9ucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfb25JbnB1dCIsImJpbmQiLCJhdXRvY29tcGxldGUiLCJtaW5DaGFycyIsImZpbHRlciIsImNsZWFyYWJsZSIsImFwcGVuZENoaWxkIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwidGFnTmFtZSIsImRldGFpbCIsImdldENvbnRyb2xzIiwiZnJvbSIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0Q29udHJvbCIsInF1ZXJ5U2VsZWN0b3IiLCJjb250cm9sRWxlbWVudCIsInRvU3RyaW5nIiwidXBkYXRlZCIsImNoYW5nZWRQcm9wZXJ0aWVzIiwiaGFzIiwiUHJvbWlzZSIsImFsbCIsInVwZGF0ZUNvbXBsZXRlIiwidGhlbiIsImdldFVwZGF0ZUNvbXBsZXRlIiwiZm9ybWF0RXJyb3JNZXNzYWdlIiwiZXJyb3IiLCJhcmd1bWVudCIsIm1lc3NhZ2UiLCJyZXBsYWNlIiwic2hvdWxkVXBkYXRlIiwiZmluZCIsImVycm9yQ29udGFpbmVyIiwiY29udGFpbmVyIiwiaW5uZXJIVE1MIiwia2V5IiwibGV2ZWwiLCJyZW5kZXIiLCJzdHlsZXMiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBVCxFQUFjQyxVQUFkLEVBQTBCQyxJQUExQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLG1CQUFULFFBQW9DLGVBQXBDO0FBQ0EsT0FBTyxtQkFBUDtBQUNBLE9BQU8sMkJBQVA7QUFDQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTyxvQkFBUDtBQUNBLE9BQU8sMkJBQVA7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxzQkFBUDtBQUNBLE9BQU8scUNBQVA7QUFDQSxPQUFPLDZCQUFQO0FBQ0EsT0FBTywwQkFBUDtBQUNBLE9BQU8sbUNBQVA7QUFDQSxPQUFPLDRDQUFQO0FBQ0EsU0FBU0MsWUFBVCxFQUF1QkMsUUFBdkIsRUFBaUNDLGNBQWpDLFFBQXVELG9CQUF2RDtBQUNBLFNBQVNDLGtCQUFULFFBQW1DLGdDQUFuQztBQUVBLE9BQU8sTUFBTUMsbUJBQU4sU0FBa0NELGtCQUFrQixDQUFDTixVQUFELENBQXBELENBQWlFO0FBQ2pELGFBQVZRLFVBQVUsR0FBRztBQUN0QixXQUFPO0FBQ0xDLE1BQUFBLElBQUksRUFBRTtBQUFFQSxRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FERDtBQUVMQyxNQUFBQSxFQUFFLEVBQUU7QUFBRUYsUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCRSxRQUFBQSxPQUFPLEVBQUU7QUFBekIsT0FGQztBQUdMQyxNQUFBQSxJQUFJLEVBQUU7QUFBRUosUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCRSxRQUFBQSxPQUFPLEVBQUU7QUFBekIsT0FIRDtBQUlMRSxNQUFBQSxRQUFRLEVBQUU7QUFBRUwsUUFBQUEsSUFBSSxFQUFFTSxPQUFSO0FBQWlCSCxRQUFBQSxPQUFPLEVBQUU7QUFBMUIsT0FKTDtBQUtMSSxNQUFBQSxRQUFRLEVBQUU7QUFBRVAsUUFBQUEsSUFBSSxFQUFFTSxPQUFSO0FBQWlCSCxRQUFBQSxPQUFPLEVBQUU7QUFBMUIsT0FMTDtBQU1MSyxNQUFBQSxRQUFRLEVBQUU7QUFBRVIsUUFBQUEsSUFBSSxFQUFFTSxPQUFSO0FBQWlCSCxRQUFBQSxPQUFPLEVBQUU7QUFBMUIsT0FOTDtBQU9MTSxNQUFBQSxLQUFLLEVBQUU7QUFBRVQsUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCRSxRQUFBQSxPQUFPLEVBQUU7QUFBekIsT0FQRjtBQVFMTyxNQUFBQSxPQUFPLEVBQUU7QUFBRVYsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BUko7QUFTTFUsTUFBQUEsT0FBTyxFQUFFO0FBQUVYLFFBQUFBLElBQUksRUFBRVk7QUFBUixPQVRKO0FBVUxDLE1BQUFBLE1BQU0sRUFBRTtBQUFFYixRQUFBQSxJQUFJLEVBQUVjO0FBQVIsT0FWSDtBQVdMQyxNQUFBQSxLQUFLLEVBQUU7QUFBRWYsUUFBQUEsSUFBSSxFQUFFWSxNQUFSO0FBQWdCVCxRQUFBQSxPQUFPLEVBQUU7QUFBekIsT0FYRjtBQVlMYSxNQUFBQSxRQUFRLEVBQUU7QUFBRWhCLFFBQUFBLElBQUksRUFBRU0sT0FBUjtBQUFpQkgsUUFBQUEsT0FBTyxFQUFFO0FBQTFCLE9BWkw7QUFhTGMsTUFBQUEsTUFBTSxFQUFFO0FBQUVqQixRQUFBQSxJQUFJLEVBQUVNLE9BQVI7QUFBaUJILFFBQUFBLE9BQU8sRUFBRTtBQUExQixPQWJIO0FBY0xlLE1BQUFBLFNBQVMsRUFBRTtBQUFFbEIsUUFBQUEsSUFBSSxFQUFFTSxPQUFSO0FBQWlCSCxRQUFBQSxPQUFPLEVBQUU7QUFBMUIsT0FkTjtBQWVMZ0IsTUFBQUEsT0FBTyxFQUFFO0FBQUVuQixRQUFBQSxJQUFJLEVBQUVNO0FBQVI7QUFmSixLQUFQO0FBaUJEOztBQUVEYyxFQUFBQSxXQUFXLEdBQUc7QUFDWixZQURZLENBRVo7QUFDQTs7QUFDQSxTQUFLQyxtQkFBTCxHQUEyQixDQUFDLFVBQUQsRUFBYSxVQUFiLEVBQXlCLFVBQXpCLENBQTNCO0FBQ0Q7O0FBRURDLEVBQUFBLG9CQUFvQixHQUFHO0FBQ3JCLFdBQU8sS0FBS1gsT0FBTCxDQUFhLGVBQWIsS0FBaUMsS0FBS0EsT0FBTCxDQUFhLGVBQWIsRUFBOEIscUJBQTlCLEtBQXdELElBQWhHO0FBQ0Q7O0FBRURZLEVBQUFBLGdCQUFnQixHQUFHO0FBQ2pCLFdBQU8sS0FBS1osT0FBTCxDQUFhLGVBQWIsS0FBaUMsS0FBS0EsT0FBTCxDQUFhLGVBQWIsRUFBOEIsaUJBQTlCLE1BQXFELElBQTdGO0FBQ0Q7O0FBRURhLEVBQUFBLFVBQVUsR0FBRztBQUNYLFdBQ0UsS0FBS2IsT0FBTCxDQUFhTyxTQUFiLEtBQTJCLElBQTNCLElBQ0MsS0FBS1AsT0FBTCxDQUFhLGVBQWIsS0FBaUMsS0FBS0EsT0FBTCxDQUFhLGVBQWIsRUFBOEJYLElBQTlCLElBQXNDLElBQXZFLElBQStFLEtBQUtXLE9BQUwsQ0FBYSxlQUFiLEVBQThCWCxJQUE5QixLQUF1QyxVQUZ6SDtBQUlEOztBQUVEeUIsRUFBQUEsY0FBYyxHQUFHO0FBQ2YsV0FBTyxLQUFLZCxPQUFMLENBQWEsZUFBYixLQUFpQyxLQUFLQSxPQUFMLENBQWEsZUFBYixFQUE4QmUsV0FBL0QsR0FBNkUsS0FBS2YsT0FBTCxDQUFhLGVBQWIsRUFBOEJlLFdBQTNHLEdBQXlILElBQWhJO0FBQ0Q7O0FBRURoQyxFQUFBQSxZQUFZLEdBQUc7QUFDYixXQUFPQSxZQUFZLENBQUMsS0FBS2lCLE9BQU4sQ0FBbkI7QUFDRDs7QUFFRGhCLEVBQUFBLFFBQVEsR0FBRztBQUNULFdBQU9BLFFBQVEsQ0FBQyxLQUFLZ0IsT0FBTixDQUFmO0FBQ0Q7O0FBRURnQixFQUFBQSxjQUFjLEdBQUc7QUFDZixXQUFPLEtBQUtoQixPQUFMLENBQWEsZUFBYixLQUFpQyxLQUFLQSxPQUFMLENBQWEsZUFBYixFQUE4QmlCLEtBQTlCLElBQXVDLElBQXhFLElBQWdGLEtBQUtqQixPQUFMLENBQWFYLElBQWIsS0FBc0IsUUFBN0c7QUFDRDs7QUFFRDZCLEVBQUFBLE1BQU0sR0FBRztBQUNQLFdBQU8sS0FBS2xCLE9BQUwsQ0FBYSxlQUFiLEtBQWlDLEtBQUtBLE9BQUwsQ0FBYSxlQUFiLEVBQThCWCxJQUE5QixLQUF1QyxNQUF4RSxJQUFrRixLQUFLVyxPQUFMLENBQWFYLElBQWIsS0FBc0IsUUFBL0c7QUFDRDs7QUFFRDhCLEVBQUFBLGNBQWMsR0FBRztBQUNmLFFBQUksS0FBS25DLFFBQUwsRUFBSixFQUFxQjtBQUNuQixhQUFPLCtCQUFQO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDLEtBQUtnQixPQUFMLENBQWFvQixJQUFiLElBQXNCLEtBQUtwQixPQUFMLENBQWFxQixLQUFiLElBQXNCLEtBQUtyQixPQUFMLENBQWFxQixLQUFiLENBQW1CRCxJQUFoRSxLQUEwRSxDQUFDLEtBQUtKLGNBQUwsRUFBL0UsRUFBc0c7QUFDcEcsVUFBSSxLQUFLaEIsT0FBTCxDQUFhWCxJQUFiLEtBQXNCLE9BQTFCLEVBQW1DO0FBQ2pDLGVBQU8sV0FBUDtBQUNEOztBQUNELGFBQU8sa0JBQVA7QUFDRCxLQUxELE1BS08sSUFBSUosY0FBYyxDQUFDLEtBQUtlLE9BQU4sQ0FBbEIsRUFBa0M7QUFDdkMsYUFBTyxzQkFBUDtBQUNELEtBRk0sTUFFQSxJQUFJLEtBQUtBLE9BQUwsQ0FBYVgsSUFBYixLQUFzQixPQUExQixFQUFtQztBQUN4QyxhQUFPLFdBQVA7QUFDRCxLQUZNLE1BRUEsSUFBSSxLQUFLVyxPQUFMLENBQWFYLElBQWIsS0FBc0IsU0FBMUIsRUFBcUM7QUFDMUMsYUFBTyxXQUFQO0FBQ0QsS0FGTSxNQUVBLElBQUksS0FBS3NCLG9CQUFMLEVBQUosRUFBaUM7QUFDdEMsYUFBTyx3QkFBUDtBQUNELEtBRk0sTUFFQSxJQUFJLEtBQUs1QixZQUFMLEVBQUosRUFBeUI7QUFDOUIsYUFBTyxTQUFQO0FBQ0QsS0FGTSxNQUVBLElBQUksS0FBSzZCLGdCQUFMLEVBQUosRUFBNkI7QUFDbEMsYUFBTyxnQkFBUDtBQUNELEtBRk0sTUFFQSxJQUFJLEtBQUtNLE1BQUwsRUFBSixFQUFtQjtBQUN4QixhQUFPLFNBQVA7QUFDRDs7QUFFRCxXQUFPLFVBQVA7QUFDRDs7QUFFREksRUFBQUEsaUJBQWlCLENBQUNDLE9BQUQsRUFBVTtBQUN6QixRQUFJQSxPQUFPLElBQUksSUFBZixFQUFxQjtBQUNuQixXQUFLYixtQkFBTCxDQUF5QmMsT0FBekIsQ0FBa0NDLFFBQUQsSUFBYztBQUM3QyxZQUFJLEtBQUtBLFFBQUwsS0FBa0IsSUFBdEIsRUFBNEI7QUFDMUJGLFVBQUFBLE9BQU8sQ0FBQ0UsUUFBRCxDQUFQLEdBQW9CLEtBQUtBLFFBQUwsQ0FBcEI7QUFDRDtBQUNGLE9BSkQ7QUFLRDtBQUNGOztBQUVEQyxFQUFBQSxjQUFjLEdBQUc7QUFDZixVQUFNQyxXQUFXLEdBQUcsS0FBS1IsY0FBTCxFQUFwQjtBQUNBLFVBQU1JLE9BQU8sR0FBR0ssUUFBUSxDQUFDQyxhQUFULENBQXVCRixXQUF2QixDQUFoQjtBQUNBSixJQUFBQSxPQUFPLENBQUNoQyxFQUFSLEdBQWEsS0FBS0EsRUFBbEI7QUFDQWdDLElBQUFBLE9BQU8sQ0FBQzlCLElBQVIsR0FBZSxLQUFLRixFQUFwQjtBQUNBZ0MsSUFBQUEsT0FBTyxDQUFDbEIsUUFBUixHQUFtQixLQUFLQSxRQUF4QjtBQUNBa0IsSUFBQUEsT0FBTyxDQUFDTyxTQUFSLENBQWtCQyxHQUFsQixDQUFzQixlQUF0Qjs7QUFDQSxRQUFJLEtBQUszQixLQUFMLElBQWMsSUFBZCxJQUFzQixLQUFLSixPQUFMLENBQWFnQyxPQUFiLElBQXdCLElBQWxELEVBQXdEO0FBQ3RELFdBQUs1QixLQUFMLEdBQWEsS0FBS0osT0FBTCxDQUFhZ0MsT0FBMUI7QUFDQWxELE1BQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxlQUFQLEVBQXdCO0FBQUVzQixRQUFBQSxLQUFLLEVBQUUsS0FBS0EsS0FBZDtBQUFxQjZCLFFBQUFBLGFBQWEsRUFBRVYsT0FBcEM7QUFBNkN2QixRQUFBQSxPQUFPLEVBQUUsS0FBS0E7QUFBM0QsT0FBeEIsQ0FBbkI7QUFDRDs7QUFDRCxRQUFJLEtBQUtJLEtBQUwsSUFBYyxJQUFsQixFQUF3QjtBQUN0QixXQUFLOEIsU0FBTCxDQUFlWCxPQUFmO0FBQ0Q7O0FBRUQsUUFBSSxLQUFLdkIsT0FBTCxDQUFhWCxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDa0MsTUFBQUEsT0FBTyxDQUFDWSxNQUFSLEdBQWlCLEtBQUtuQyxPQUF0QjtBQUNELEtBRkQsTUFFTyxJQUFJZixjQUFjLENBQUMsS0FBS2UsT0FBTixDQUFsQixFQUFrQztBQUN2Q3VCLE1BQUFBLE9BQU8sQ0FBQ1ksTUFBUixHQUFpQixLQUFLbkMsT0FBTCxDQUFhcUIsS0FBOUI7QUFDRDs7QUFFRCxTQUFLQyxpQkFBTCxDQUF1QkMsT0FBdkI7O0FBRUEsUUFBSSxLQUFLdkIsT0FBTCxDQUFhRixLQUFqQixFQUF3QjtBQUN0QnlCLE1BQUFBLE9BQU8sQ0FBQ2EsS0FBUixHQUFnQixLQUFLcEMsT0FBTCxDQUFhRixLQUE3QjtBQUNBeUIsTUFBQUEsT0FBTyxDQUFDekIsS0FBUixHQUFnQixLQUFLRSxPQUFMLENBQWFGLEtBQTdCO0FBQ0QsS0FIRCxNQUdPO0FBQ0wsWUFBTXVDLEdBQUcsR0FBRyxLQUFLOUMsRUFBTCxDQUFRK0MsS0FBUixDQUFjLEdBQWQsQ0FBWjtBQUNBLFlBQU14QyxLQUFLLEdBQUd1QyxHQUFHLENBQUNBLEdBQUcsQ0FBQ0UsTUFBSixHQUFhLENBQWQsQ0FBakI7O0FBQ0EsVUFBSUMsS0FBSyxDQUFDQyxRQUFRLENBQUMzQyxLQUFELEVBQVEsRUFBUixDQUFULENBQVQsRUFBZ0M7QUFDOUJ5QixRQUFBQSxPQUFPLENBQUNhLEtBQVIsR0FBZ0J0QyxLQUFoQjtBQUNBeUIsUUFBQUEsT0FBTyxDQUFDekIsS0FBUixHQUFnQkEsS0FBaEI7QUFDRDtBQUNGOztBQUVELFFBQUksS0FBS0UsT0FBTCxDQUFhRCxPQUFqQixFQUEwQjtBQUN4QndCLE1BQUFBLE9BQU8sQ0FBQ3hCLE9BQVIsR0FBa0IsS0FBS0MsT0FBTCxDQUFhRCxPQUEvQjtBQUNEOztBQUVELFFBQUksS0FBS0MsT0FBTCxDQUFhWCxJQUFiLEtBQXNCLFNBQTFCLEVBQXFDO0FBQ25Da0MsTUFBQUEsT0FBTyxDQUFDbEMsSUFBUixHQUFlLFFBQWY7QUFDRDs7QUFFRCxRQUFJLEtBQUs2QixNQUFMLEVBQUosRUFBbUI7QUFDakJLLE1BQUFBLE9BQU8sQ0FBQ21CLElBQVIsR0FBZSxDQUFmO0FBQ0FuQixNQUFBQSxPQUFPLENBQUNvQixRQUFSLEdBQW1CLElBQW5CO0FBQ0FwQixNQUFBQSxPQUFPLENBQUNSLFdBQVIsR0FBc0IsS0FBS2YsT0FBTCxDQUFhNEMsV0FBbkM7QUFDRDs7QUFFRCxVQUFNN0IsV0FBVyxHQUFHLEtBQUtELGNBQUwsRUFBcEI7O0FBRUEsUUFBSSxLQUFLZCxPQUFMLENBQWFvQixJQUFiLElBQXNCLEtBQUtwQixPQUFMLENBQWFxQixLQUFiLElBQXNCLEtBQUtyQixPQUFMLENBQWFxQixLQUFiLENBQW1CRCxJQUFuRSxFQUEwRTtBQUN4RSxZQUFNeUIsT0FBTyxHQUFHLEtBQUs3QyxPQUFMLENBQWFvQixJQUFiLElBQXFCLEtBQUtwQixPQUFMLENBQWFxQixLQUFiLENBQW1CRCxJQUF4RDs7QUFDQSxVQUFJLEtBQUtwQixPQUFMLENBQWEsZUFBYixLQUFpQyxLQUFLQSxPQUFMLENBQWEsZUFBYixFQUE4QjhDLFFBQW5FLEVBQTZFO0FBQzNFdkIsUUFBQUEsT0FBTyxDQUFDc0IsT0FBUixHQUFrQkEsT0FBTyxDQUFDRSxHQUFSLENBQWEzQyxLQUFELEtBQVk7QUFDeENBLFVBQUFBLEtBRHdDO0FBRXhDZ0MsVUFBQUEsS0FBSyxFQUFFLEtBQUtwQyxPQUFMLENBQWEsZUFBYixFQUE4QjhDLFFBQTlCLENBQXVDMUMsS0FBdkMsS0FBaURBO0FBRmhCLFNBQVosQ0FBWixDQUFsQjtBQUlELE9BTEQsTUFLTztBQUNMbUIsUUFBQUEsT0FBTyxDQUFDc0IsT0FBUixHQUFrQkEsT0FBbEI7QUFDRDs7QUFDRCxVQUFJLEtBQUs3QyxPQUFMLENBQWFYLElBQWIsS0FBc0IsT0FBMUIsRUFBbUM7QUFDakNrQyxRQUFBQSxPQUFPLENBQUN5QixRQUFSLEdBQW1CLElBQW5CO0FBQ0Q7QUFDRixLQWJELE1BYU8sSUFBSSxLQUFLakUsWUFBTCxFQUFKLEVBQXlCO0FBQzlCd0MsTUFBQUEsT0FBTyxDQUFDc0IsT0FBUixHQUFrQixLQUFLN0MsT0FBTCxDQUFhLGVBQWIsRUFBOEJpRCxpQkFBaEQ7O0FBQ0EsVUFBSSxLQUFLakQsT0FBTCxDQUFhZ0MsT0FBYixJQUF3QixJQUF4QixJQUFnQ1QsT0FBTyxDQUFDc0IsT0FBUixDQUFnQnpDLEtBQWhCLElBQXlCLElBQTdELEVBQW1FO0FBQ2pFbUIsUUFBQUEsT0FBTyxDQUFDc0IsT0FBUixDQUFnQnpDLEtBQWhCLEdBQXdCLEtBQUtKLE9BQUwsQ0FBYWdDLE9BQXJDO0FBQ0Q7QUFDRixLQUxNLE1BS0EsSUFBSSxLQUFLckIsb0JBQUwsRUFBSixFQUFpQztBQUN0Q1ksTUFBQUEsT0FBTyxDQUFDc0IsT0FBUixHQUFrQixFQUFsQjtBQUNBdEIsTUFBQUEsT0FBTyxDQUFDbUIsSUFBUixHQUFlLENBQWY7QUFDRCxLQUhNLE1BR0EsSUFBSSxLQUFLN0IsVUFBTCxFQUFKLEVBQXVCO0FBQzVCVSxNQUFBQSxPQUFPLENBQUNsQyxJQUFSLEdBQWUsVUFBZjtBQUNEOztBQUVELFFBQUksS0FBS1csT0FBTCxDQUFhNEMsV0FBakIsRUFBOEI7QUFDNUJyQixNQUFBQSxPQUFPLENBQUNxQixXQUFSLEdBQXNCLEtBQUs1QyxPQUFMLENBQWE0QyxXQUFuQztBQUNEOztBQUVELFFBQUksS0FBS3BDLE9BQVQsRUFBa0I7QUFDaEJlLE1BQUFBLE9BQU8sQ0FBQ1IsV0FBUixHQUFzQlEsT0FBTyxDQUFDcUIsV0FBUixJQUF1QnJCLE9BQU8sQ0FBQ2EsS0FBckQ7QUFDQWIsTUFBQUEsT0FBTyxDQUFDYSxLQUFSLEdBQWdCLElBQWhCO0FBQ0FiLE1BQUFBLE9BQU8sQ0FBQ3FCLFdBQVIsR0FBc0IsSUFBdEI7QUFDQXJCLE1BQUFBLE9BQU8sQ0FBQ2YsT0FBUixHQUFrQixLQUFLQSxPQUF2QjtBQUNEOztBQUVELFFBQUlPLFdBQVcsSUFBSSxJQUFuQixFQUF5QjtBQUN2QixVQUFJLEtBQUtKLG9CQUFMLE1BQStCLEtBQUs1QixZQUFMLEVBQW5DLEVBQXdEO0FBQ3REd0MsUUFBQUEsT0FBTyxDQUFDc0IsT0FBUixDQUFnQjlCLFdBQWhCLEdBQThCQSxXQUE5QjtBQUNELE9BRkQsTUFFTztBQUNMUSxRQUFBQSxPQUFPLENBQUNSLFdBQVIsR0FBc0JBLFdBQXRCO0FBQ0Q7QUFDRjs7QUFFRFEsSUFBQUEsT0FBTyxDQUFDMkIsZ0JBQVIsQ0FBMEIsR0FBRXZCLFdBQVksUUFBeEMsRUFBaUQsS0FBS3dCLFFBQUwsQ0FBY0MsSUFBZCxDQUFtQixJQUFuQixDQUFqRDtBQUVBLFFBQUluQixhQUFKOztBQUNBLFFBQUksS0FBS2pCLGNBQUwsRUFBSixFQUEyQjtBQUN6QixZQUFNcUMsWUFBWSxHQUFHekIsUUFBUSxDQUFDQyxhQUFULENBQXVCLGlCQUF2QixDQUFyQjtBQUNBd0IsTUFBQUEsWUFBWSxDQUFDQyxRQUFiLEdBQXdCLENBQXhCO0FBQ0FELE1BQUFBLFlBQVksQ0FBQ0UsTUFBYixHQUFzQixJQUF0QjtBQUNBaEMsTUFBQUEsT0FBTyxDQUFDaUMsU0FBUixHQUFvQixJQUFwQjtBQUNBSCxNQUFBQSxZQUFZLENBQUM5RCxFQUFiLEdBQWtCLEtBQUtBLEVBQXZCO0FBQ0E4RCxNQUFBQSxZQUFZLENBQUNJLFdBQWIsQ0FBeUJsQyxPQUF6QjtBQUNBOEIsTUFBQUEsWUFBWSxDQUFDSCxnQkFBYixDQUErQix3QkFBL0IsRUFBd0QsS0FBS0MsUUFBTCxDQUFjQyxJQUFkLENBQW1CLElBQW5CLENBQXhEO0FBQ0E3QixNQUFBQSxPQUFPLENBQUMyQixnQkFBUixDQUEwQixnQkFBMUIsRUFBMkMsS0FBS0MsUUFBTCxDQUFjQyxJQUFkLENBQW1CLElBQW5CLENBQTNDO0FBQ0FuQixNQUFBQSxhQUFhLEdBQUdvQixZQUFoQjtBQUNELEtBVkQsTUFVTztBQUNMcEIsTUFBQUEsYUFBYSxHQUFHVixPQUFoQjtBQUNEOztBQUNELFFBQUksS0FBS3ZCLE9BQUwsQ0FBYSxlQUFiLEtBQWlDLElBQXJDLEVBQTJDO0FBQ3pDbEIsTUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLGVBQVAsRUFBd0I7QUFDekNtRCxRQUFBQSxhQUR5QztBQUV6Q2pDLFFBQUFBLE9BQU8sRUFBRTtBQUZnQyxPQUF4QixDQUFuQjtBQUlEOztBQUNELFdBQU9pQyxhQUFQO0FBQ0Q7O0FBRURrQixFQUFBQSxRQUFRLENBQUNPLENBQUQsRUFBSTtBQUNWQSxJQUFBQSxDQUFDLENBQUNDLGNBQUY7QUFDQUQsSUFBQUEsQ0FBQyxDQUFDRSxlQUFGO0FBQ0EsUUFBSXhELEtBQUssR0FBRyxJQUFaOztBQUNBLFFBQUlzRCxDQUFDLENBQUNHLE1BQUYsQ0FBU0MsT0FBVCxLQUFxQixpQkFBekIsRUFBNEM7QUFDMUMxRCxNQUFBQSxLQUFLLEdBQUdzRCxDQUFDLENBQUNLLE1BQUYsQ0FBUzNELEtBQWpCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xBLE1BQUFBLEtBQUssR0FBR3NELENBQUMsQ0FBQ0ssTUFBVjtBQUNEOztBQUNEakYsSUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUI7QUFBRXNCLE1BQUFBLEtBQUY7QUFBUzZCLE1BQUFBLGFBQWEsRUFBRXlCLENBQUMsQ0FBQ0csTUFBMUI7QUFBa0M3RCxNQUFBQSxPQUFPLEVBQUUsS0FBS0E7QUFBaEQsS0FBakIsQ0FBbkI7QUFDRDs7QUFFRGdFLEVBQUFBLFdBQVcsR0FBRztBQUNaLFdBQU8sQ0FDTCxHQUFHN0QsS0FBSyxDQUFDOEQsSUFBTixDQUFXLEtBQUtDLFVBQUwsQ0FBZ0JDLGdCQUFoQixDQUFpQyx3QkFBakMsQ0FBWCxDQURFLEVBRUwsR0FBR2hFLEtBQUssQ0FBQzhELElBQU4sQ0FBVyxLQUFLQyxVQUFMLENBQWdCQyxnQkFBaEIsQ0FBaUMsOEJBQWpDLENBQVgsQ0FGRSxFQUdMLEdBQUdoRSxLQUFLLENBQUM4RCxJQUFOLENBQVcsS0FBS0MsVUFBTCxDQUFnQkMsZ0JBQWhCLENBQWlDLCtCQUFqQyxDQUFYLENBSEUsQ0FBUDtBQUtEOztBQUVEQyxFQUFBQSxVQUFVLENBQUM3RSxFQUFELEVBQUs7QUFDYixRQUFJQSxFQUFFLElBQUksSUFBVixFQUFnQjtBQUNkQSxNQUFBQSxFQUFFLEdBQUcsS0FBS0EsRUFBVjtBQUNEOztBQUNELFdBQU8sS0FBSzJFLFVBQUwsQ0FBZ0JHLGFBQWhCLENBQStCLFFBQU85RSxFQUFHLElBQXpDLENBQVA7QUFDRDs7QUFFRDJDLEVBQUFBLFNBQVMsQ0FBQ29DLGNBQUQsRUFBaUI7QUFDeEIsUUFBSSxLQUFLbEUsS0FBTCxJQUFjLElBQWQsSUFBc0JrRSxjQUFjLElBQUksSUFBNUMsRUFBa0Q7QUFDaEQsVUFBSSxLQUFLdEUsT0FBTCxDQUFhWCxJQUFiLEtBQXNCLFNBQXRCLElBQW1DLEtBQUtXLE9BQUwsQ0FBYVgsSUFBYixLQUFzQixPQUF6RCxJQUFvRSxLQUFLVyxPQUFMLENBQWFYLElBQWIsS0FBc0IsUUFBOUYsRUFBd0c7QUFDdEdpRixRQUFBQSxjQUFjLENBQUNsRSxLQUFmLEdBQXVCLEtBQUtBLEtBQTVCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xrRSxRQUFBQSxjQUFjLENBQUNsRSxLQUFmLEdBQXVCLEtBQUtBLEtBQUwsQ0FBV21FLFFBQVgsR0FBc0IsS0FBS25FLEtBQUwsQ0FBV21FLFFBQVgsRUFBdEIsR0FBOEMsS0FBS25FLEtBQTFFO0FBQ0Q7QUFDRjs7QUFDRCxXQUFPa0UsY0FBUDtBQUNEOztBQUVZLFFBQVBFLE9BQU8sQ0FBQ0MsaUJBQUQsRUFBb0I7QUFDL0IsUUFBSUEsaUJBQWlCLENBQUNDLEdBQWxCLENBQXNCLE9BQXRCLENBQUosRUFBb0M7QUFDbENDLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLEtBQUtaLFdBQUwsR0FBbUJqQixHQUFuQixDQUF3Qi9DLE9BQUQsSUFBYUEsT0FBTyxDQUFDNkUsY0FBNUMsQ0FBWixFQUF5RUMsSUFBekUsQ0FBOEUsTUFBTTtBQUNsRixhQUFLNUMsU0FBTCxDQUFlLEtBQUtrQyxVQUFMLEVBQWY7QUFDRCxPQUZEO0FBR0Q7QUFDRjs7QUFFc0IsUUFBakJXLGlCQUFpQixHQUFHO0FBQ3hCLFVBQU0sTUFBTUEsaUJBQU4sRUFBTjtBQUNBLFVBQU1KLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLEtBQUtaLFdBQUwsR0FBbUJqQixHQUFuQixDQUF3QlcsQ0FBRCxJQUFPQSxDQUFDLENBQUNtQixjQUFoQyxDQUFaLENBQU47QUFDRDs7QUFFREcsRUFBQUEsa0JBQWtCLENBQUNDLEtBQUQsRUFBUTtBQUN4QixRQUFJbkYsS0FBSjs7QUFDQSxRQUFJLEtBQUtFLE9BQUwsQ0FBYVosVUFBYixJQUEyQixJQUEzQixJQUFtQyxLQUFLWSxPQUFMLENBQWFaLFVBQWIsQ0FBd0I2RixLQUFLLENBQUNDLFFBQTlCLEtBQTJDLElBQWxGLEVBQXdGO0FBQ3RGcEYsTUFBQUEsS0FBSyxHQUFHLEtBQUtFLE9BQUwsQ0FBYVosVUFBYixDQUF3QjZGLEtBQUssQ0FBQ0MsUUFBOUIsRUFBd0NwRixLQUFoRDtBQUNELEtBRkQsTUFFTztBQUNMQSxNQUFBQSxLQUFLLEdBQUcsS0FBS0UsT0FBTCxDQUFhRixLQUFyQjtBQUNEOztBQUNELFFBQUlBLEtBQUosRUFBVztBQUNULGFBQVEsU0FBUW1GLEtBQUssQ0FBQ0UsT0FBTixDQUFjQyxPQUFkLENBQXNCSCxLQUFLLENBQUNDLFFBQTVCLEVBQXNDcEYsS0FBdEMsQ0FBNkMsU0FBN0Q7QUFDRDs7QUFDRCxXQUFRLFNBQVFtRixLQUFLLENBQUNFLE9BQVEsU0FBOUI7QUFDRDs7QUFFREUsRUFBQUEsWUFBWSxDQUFDWixpQkFBRCxFQUFvQjtBQUM5QixRQUFJLEtBQUsvRCxtQkFBTCxDQUF5QjRFLElBQXpCLENBQStCN0QsUUFBRCxJQUFjZ0QsaUJBQWlCLENBQUNDLEdBQWxCLENBQXNCakQsUUFBdEIsQ0FBNUMsS0FBZ0YsSUFBcEYsRUFBMEY7QUFDeEYsV0FBS0gsaUJBQUwsQ0FBdUIsS0FBSzhDLFVBQUwsRUFBdkI7QUFDRDs7QUFFRCxRQUFJSyxpQkFBaUIsQ0FBQ0MsR0FBbEIsQ0FBc0IsUUFBdEIsS0FBbUMsS0FBS3hFLE1BQUwsSUFBZSxJQUF0RCxFQUE0RDtBQUMxRDtBQUNBLFdBQUs4RCxXQUFMLEdBQW1CeEMsT0FBbkIsQ0FBNEJ4QixPQUFELElBQWE7QUFDdENBLFFBQUFBLE9BQU8sQ0FBQ0UsTUFBUixHQUFpQixLQUFLQSxNQUF0QjtBQUNELE9BRkQsRUFGMEQsQ0FNMUQ7O0FBQ0EsWUFBTXFGLGNBQWMsR0FBRyxLQUFLckIsVUFBTCxDQUFnQkMsZ0JBQWhCLENBQWlDLHNCQUFqQyxDQUF2QjtBQUNBb0IsTUFBQUEsY0FBYyxDQUFDL0QsT0FBZixDQUF3QmdFLFNBQUQsSUFBZ0JBLFNBQVMsQ0FBQ0MsU0FBVixHQUFzQixFQUE3RDtBQUNBLFdBQUt2RixNQUFMLENBQVlzQixPQUFaLENBQXFCeUQsS0FBRCxJQUFXO0FBQzdCLGNBQU1TLEdBQUcsR0FBR1QsS0FBSyxDQUFDeEQsUUFBTixLQUFtQixVQUFuQixHQUFnQ3dELEtBQUssQ0FBQ0MsUUFBdEMsR0FBaURELEtBQUssQ0FBQ3hELFFBQU4sQ0FBZTJELE9BQWYsQ0FBdUIsV0FBdkIsRUFBb0MsRUFBcEMsQ0FBN0Q7QUFDQSxjQUFNRyxjQUFjLEdBQUcsS0FBS3JCLFVBQUwsQ0FBZ0JHLGFBQWhCLENBQStCLFFBQU9xQixHQUFJLFVBQTFDLENBQXZCOztBQUNBLFlBQUlILGNBQUosRUFBb0I7QUFDbEIsZ0JBQU1KLE9BQU8sR0FBR3ZELFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixrQkFBdkIsQ0FBaEI7QUFDQXNELFVBQUFBLE9BQU8sQ0FBQ00sU0FBUixHQUFvQixLQUFLVCxrQkFBTCxDQUF3QkMsS0FBeEIsQ0FBcEI7QUFDQUUsVUFBQUEsT0FBTyxDQUFDUSxLQUFSLEdBQWdCLE1BQWhCO0FBQ0FKLFVBQUFBLGNBQWMsQ0FBQzlCLFdBQWYsQ0FBMkIwQixPQUEzQjtBQUNEO0FBQ0YsT0FURDtBQVVBLGFBQU8sS0FBUDtBQUNEOztBQUNELFdBQU8sTUFBTUUsWUFBTixDQUFtQlosaUJBQW5CLENBQVA7QUFDRDs7QUFFRG1CLEVBQUFBLE1BQU0sR0FBRztBQUNQLFdBQU8vRyxJQUFJLElBQ1AsS0FBSzZDLGNBQUwsRUFETyx5Q0FFOEIsS0FBS25DLEVBQUwsR0FBVSxRQUZ4QyxXQUFYO0FBSUQ7O0FBRWdCLGFBQU5zRyxNQUFNLEdBQUc7QUFDbEIsV0FBTyxDQUNMO0FBQ0FsSCxJQUFBQSxHQUFHLHk0QkFGRSxDQUFQO0FBcUZEOztBQXZacUU7QUEwWnhFbUgsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxNQUF0QixDQUE2Qix3QkFBN0IsRUFBdUQ3RyxtQkFBdkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtaW5wdXQnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1pbnB1dC1tZXNzYWdlJztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtdGV4dCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LXNlbGVjdCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LXNlbGVjdC1uYXRpdmUnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1zd2l0Y2gnO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3YtY29kZSc7XG5pbXBvcnQgJy4uL21vbGVjdWxlcy9ndi1leHByZXNzaW9uLWxhbmd1YWdlJztcbmltcG9ydCAnLi4vbW9sZWN1bGVzL2d2LWNyb24tZWRpdG9yJztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtYXV0b2NvbXBsZXRlJztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LXNjaGVtYS1mb3JtLWFycmF5JztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LXNjaGVtYS1mb3JtLWNvbnRyb2wtb2JqZWN0JztcbmltcG9ydCB7IGlzQ29kZW1pcnJvciwgaXNPYmplY3QsIGlzQ29tcGxleEFycmF5IH0gZnJvbSAnLi4vbGliL3NjaGVtYS1mb3JtJztcbmltcG9ydCB7IFVwZGF0ZUFmdGVyQnJvd3NlciB9IGZyb20gJy4uL21peGlucy91cGRhdGUtYWZ0ZXItYnJvd3Nlcic7XG5cbmV4cG9ydCBjbGFzcyBHdlNjaGVtYUZvcm1Db250cm9sIGV4dGVuZHMgVXBkYXRlQWZ0ZXJCcm93c2VyKExpdEVsZW1lbnQpIHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB7IHR5cGU6IFN0cmluZyB9LFxuICAgICAgaWQ6IHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBwYXR0ZXJuOiB7IHR5cGU6IFN0cmluZyB9LFxuICAgICAgY29udHJvbDogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIGVycm9yczogeyB0eXBlOiBBcnJheSB9LFxuICAgICAgdmFsdWU6IHsgdHlwZTogT2JqZWN0LCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBza2VsZXRvbjogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBoaWRkZW46IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgd3JpdGVPbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGNvbXBhY3Q6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIFdoZW4gZm9ybSBoYXMgZXJyb3JzLCB0aGUgY29udHJvbCBpcyBub3QgdXBkYXRlIHRvIGNvbnNlcnZlIHRoZSBlcnJvciBzdGF0ZS5cbiAgICAvLyBUaGlzIGxpc3QgaXMgdXNlZCB0byBmb3JjZSB0aGUgdXBkYXRlIG9mIHByb3BlcnRpZXMgZXZlbiBpbiBlcnJvciBjYXNlLlxuICAgIHRoaXMuX29ic2VydmVkUHJvcGVydGllcyA9IFsnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAncmVxdWlyZWQnXTtcbiAgfVxuXG4gIGlzRXhwcmVzc2lvbkxhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSAmJiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVsnZXhwcmVzc2lvbi1sYW5ndWFnZSddICE9IG51bGw7XG4gIH1cblxuICBpc0Nyb25FeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSAmJiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVsnY3Jvbi1leHByZXNzaW9uJ10gPT09IHRydWU7XG4gIH1cblxuICBpc1Bhc3N3b3JkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbnRyb2wud3JpdGVPbmx5ID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10gJiYgdGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10udHlwZSAhPSBudWxsICYmIHRoaXMuY29udHJvbFsneC1zY2hlbWEtZm9ybSddLnR5cGUgPT09ICdwYXNzd29yZCcpXG4gICAgKTtcbiAgfVxuXG4gIGdldFBsYWNlaG9sZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSAmJiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5wbGFjZWhvbGRlciA/IHRoaXMuY29udHJvbFsneC1zY2hlbWEtZm9ybSddLnBsYWNlaG9sZGVyIDogbnVsbDtcbiAgfVxuXG4gIGlzQ29kZW1pcnJvcigpIHtcbiAgICByZXR1cm4gaXNDb2RlbWlycm9yKHRoaXMuY29udHJvbCk7XG4gIH1cblxuICBpc09iamVjdCgpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGhpcy5jb250cm9sKTtcbiAgfVxuXG4gIGlzQXV0b2NvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSAmJiB0aGlzLmNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5ldmVudCAhPSBudWxsICYmIHRoaXMuY29udHJvbC50eXBlID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIGlzVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10gJiYgdGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10udHlwZSA9PT0gJ3RleHQnICYmIHRoaXMuY29udHJvbC50eXBlID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIGdldEVsZW1lbnROYW1lKCkge1xuICAgIGlmICh0aGlzLmlzT2JqZWN0KCkpIHtcbiAgICAgIHJldHVybiAnZ3Ytc2NoZW1hLWZvcm0tY29udHJvbC1vYmplY3QnO1xuICAgIH1cbiAgICBpZiAoKHRoaXMuY29udHJvbC5lbnVtIHx8ICh0aGlzLmNvbnRyb2wuaXRlbXMgJiYgdGhpcy5jb250cm9sLml0ZW1zLmVudW0pKSAmJiAhdGhpcy5pc0F1dG9jb21wbGV0ZSgpKSB7XG4gICAgICBpZiAodGhpcy5jb250cm9sLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuICdndi1zZWxlY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdndi1zZWxlY3QtbmF0aXZlJztcbiAgICB9IGVsc2UgaWYgKGlzQ29tcGxleEFycmF5KHRoaXMuY29udHJvbCkpIHtcbiAgICAgIHJldHVybiAnZ3Ytc2NoZW1hLWZvcm0tYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb250cm9sLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgIHJldHVybiAnZ3YtYnV0dG9uJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29udHJvbC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAnZ3Ytc3dpdGNoJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHByZXNzaW9uTGFuZ3VhZ2UoKSkge1xuICAgICAgcmV0dXJuICdndi1leHByZXNzaW9uLWxhbmd1YWdlJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb2RlbWlycm9yKCkpIHtcbiAgICAgIHJldHVybiAnZ3YtY29kZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ3JvbkV4cHJlc3Npb24oKSkge1xuICAgICAgcmV0dXJuICdndi1jcm9uLWVkaXRvcic7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGV4dCgpKSB7XG4gICAgICByZXR1cm4gJ2d2LXRleHQnO1xuICAgIH1cblxuICAgIHJldHVybiAnZ3YtaW5wdXQnO1xuICB9XG5cbiAgX3VwZGF0ZVByb3BlcnRpZXMoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX29ic2VydmVkUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBpZiAodGhpc1twcm9wZXJ0eV0gIT0gbnVsbCkge1xuICAgICAgICAgIGVsZW1lbnRbcHJvcGVydHldID0gdGhpc1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9yZW5kZXJDb250cm9sKCkge1xuICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5nZXRFbGVtZW50TmFtZSgpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKTtcbiAgICBlbGVtZW50LmlkID0gdGhpcy5pZDtcbiAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmlkO1xuICAgIGVsZW1lbnQuc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uO1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybV9fY29udHJvbCcpO1xuICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwgJiYgdGhpcy5jb250cm9sLmRlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udHJvbC5kZWZhdWx0O1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZGVmYXVsdC12YWx1ZScsIHsgdmFsdWU6IHRoaXMudmFsdWUsIGN1cnJlbnRUYXJnZXQ6IGVsZW1lbnQsIGNvbnRyb2w6IHRoaXMuY29udHJvbCB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2V0VmFsdWUoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udHJvbC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgZWxlbWVudC5zY2hlbWEgPSB0aGlzLmNvbnRyb2w7XG4gICAgfSBlbHNlIGlmIChpc0NvbXBsZXhBcnJheSh0aGlzLmNvbnRyb2wpKSB7XG4gICAgICBlbGVtZW50LnNjaGVtYSA9IHRoaXMuY29udHJvbC5pdGVtcztcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVQcm9wZXJ0aWVzKGVsZW1lbnQpO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbC50aXRsZSkge1xuICAgICAgZWxlbWVudC5sYWJlbCA9IHRoaXMuY29udHJvbC50aXRsZTtcbiAgICAgIGVsZW1lbnQudGl0bGUgPSB0aGlzLmNvbnRyb2wudGl0bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRtcCA9IHRoaXMuaWQuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gdG1wW3RtcC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChpc05hTihwYXJzZUludCh0aXRsZSwgMTApKSkge1xuICAgICAgICBlbGVtZW50LmxhYmVsID0gdGl0bGU7XG4gICAgICAgIGVsZW1lbnQudGl0bGUgPSB0aXRsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnBhdHRlcm4pIHtcbiAgICAgIGVsZW1lbnQucGF0dGVybiA9IHRoaXMuY29udHJvbC5wYXR0ZXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRyb2wudHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICBlbGVtZW50LnR5cGUgPSAnbnVtYmVyJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RleHQoKSkge1xuICAgICAgZWxlbWVudC5yb3dzID0gMztcbiAgICAgIGVsZW1lbnQuYXV0b3NpemUgPSB0cnVlO1xuICAgICAgZWxlbWVudC5wbGFjZWhvbGRlciA9IHRoaXMuY29udHJvbC5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbnRyb2wuZW51bSB8fCAodGhpcy5jb250cm9sLml0ZW1zICYmIHRoaXMuY29udHJvbC5pdGVtcy5lbnVtKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29udHJvbC5lbnVtIHx8IHRoaXMuY29udHJvbC5pdGVtcy5lbnVtO1xuICAgICAgaWYgKHRoaXMuY29udHJvbFsneC1zY2hlbWEtZm9ybSddICYmIHRoaXMuY29udHJvbFsneC1zY2hlbWEtZm9ybSddLnRpdGxlTWFwKSB7XG4gICAgICAgIGVsZW1lbnQub3B0aW9ucyA9IG9wdGlvbnMubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBsYWJlbDogdGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10udGl0bGVNYXBbdmFsdWVdIHx8IHZhbHVlLFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udHJvbC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvZGVtaXJyb3IoKSkge1xuICAgICAgZWxlbWVudC5vcHRpb25zID0gdGhpcy5jb250cm9sWyd4LXNjaGVtYS1mb3JtJ10uY29kZW1pcnJvck9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5jb250cm9sLmRlZmF1bHQgIT0gbnVsbCAmJiBlbGVtZW50Lm9wdGlvbnMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50Lm9wdGlvbnMudmFsdWUgPSB0aGlzLmNvbnRyb2wuZGVmYXVsdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHByZXNzaW9uTGFuZ3VhZ2UoKSkge1xuICAgICAgZWxlbWVudC5vcHRpb25zID0ge307XG4gICAgICBlbGVtZW50LnJvd3MgPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1Bhc3N3b3JkKCkpIHtcbiAgICAgIGVsZW1lbnQudHlwZSA9ICdwYXNzd29yZCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udHJvbC5kZXNjcmlwdGlvbikge1xuICAgICAgZWxlbWVudC5kZXNjcmlwdGlvbiA9IHRoaXMuY29udHJvbC5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21wYWN0KSB7XG4gICAgICBlbGVtZW50LnBsYWNlaG9sZGVyID0gZWxlbWVudC5kZXNjcmlwdGlvbiB8fCBlbGVtZW50LmxhYmVsO1xuICAgICAgZWxlbWVudC5sYWJlbCA9IG51bGw7XG4gICAgICBlbGVtZW50LmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgIGVsZW1lbnQuY29tcGFjdCA9IHRoaXMuY29tcGFjdDtcbiAgICB9XG5cbiAgICBpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uTGFuZ3VhZ2UoKSB8fCB0aGlzLmlzQ29kZW1pcnJvcigpKSB7XG4gICAgICAgIGVsZW1lbnQub3B0aW9ucy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihgJHtlbGVtZW50TmFtZX06aW5wdXRgLCB0aGlzLl9vbklucHV0LmJpbmQodGhpcykpO1xuXG4gICAgbGV0IGN1cnJlbnRUYXJnZXQ7XG4gICAgaWYgKHRoaXMuaXNBdXRvY29tcGxldGUoKSkge1xuICAgICAgY29uc3QgYXV0b2NvbXBsZXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZ3YtYXV0b2NvbXBsZXRlJyk7XG4gICAgICBhdXRvY29tcGxldGUubWluQ2hhcnMgPSAwO1xuICAgICAgYXV0b2NvbXBsZXRlLmZpbHRlciA9IHRydWU7XG4gICAgICBlbGVtZW50LmNsZWFyYWJsZSA9IHRydWU7XG4gICAgICBhdXRvY29tcGxldGUuaWQgPSB0aGlzLmlkO1xuICAgICAgYXV0b2NvbXBsZXRlLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgYXV0b2NvbXBsZXRlLmFkZEV2ZW50TGlzdGVuZXIoYGd2LWF1dG9jb21wbGV0ZTpzZWxlY3RgLCB0aGlzLl9vbklucHV0LmJpbmQodGhpcykpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGBndi1pbnB1dDpjbGVhcmAsIHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKSk7XG4gICAgICBjdXJyZW50VGFyZ2V0ID0gYXV0b2NvbXBsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VGFyZ2V0ID0gZWxlbWVudDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udHJvbFsneC1zY2hlbWEtZm9ybSddICE9IG51bGwpIHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NvbnRyb2wtcmVhZHknLCB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGNvbnRyb2w6IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQ7XG4gIH1cblxuICBfb25JbnB1dChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gJ0dWLUFVVE9DT01QTEVURScpIHtcbiAgICAgIHZhbHVlID0gZS5kZXRhaWwudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gZS5kZXRhaWw7XG4gICAgfVxuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgdmFsdWUsIGN1cnJlbnRUYXJnZXQ6IGUudGFyZ2V0LCBjb250cm9sOiB0aGlzLmNvbnRyb2wgfSk7XG4gIH1cblxuICBnZXRDb250cm9scygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCcpKSxcbiAgICAgIC4uLkFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2d2LXNjaGVtYS1mb3JtLWNvbnRyb2wtYXJyYXknKSksXG4gICAgICAuLi5BcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1zY2hlbWEtZm9ybS1jb250cm9sLW9iamVjdCcpKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0Q29udHJvbChpZCkge1xuICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICBpZCA9IHRoaXMuaWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgfVxuXG4gIF9zZXRWYWx1ZShjb250cm9sRWxlbWVudCkge1xuICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwgJiYgY29udHJvbEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuY29udHJvbC50eXBlID09PSAnYm9vbGVhbicgfHwgdGhpcy5jb250cm9sLnR5cGUgPT09ICdhcnJheScgfHwgdGhpcy5jb250cm9sLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50LnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50LnZhbHVlID0gdGhpcy52YWx1ZS50b1N0cmluZyA/IHRoaXMudmFsdWUudG9TdHJpbmcoKSA6IHRoaXMudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sRWxlbWVudDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2YWx1ZScpKSB7XG4gICAgICBQcm9taXNlLmFsbCh0aGlzLmdldENvbnRyb2xzKCkubWFwKChjb250cm9sKSA9PiBjb250cm9sLnVwZGF0ZUNvbXBsZXRlKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NldFZhbHVlKHRoaXMuZ2V0Q29udHJvbCgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgIGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRDb250cm9scygpLm1hcCgoZSkgPT4gZS51cGRhdGVDb21wbGV0ZSkpO1xuICB9XG5cbiAgZm9ybWF0RXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gICAgbGV0IHRpdGxlO1xuICAgIGlmICh0aGlzLmNvbnRyb2wucHJvcGVydGllcyAhPSBudWxsICYmIHRoaXMuY29udHJvbC5wcm9wZXJ0aWVzW2Vycm9yLmFyZ3VtZW50XSAhPSBudWxsKSB7XG4gICAgICB0aXRsZSA9IHRoaXMuY29udHJvbC5wcm9wZXJ0aWVzW2Vycm9yLmFyZ3VtZW50XS50aXRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGUgPSB0aGlzLmNvbnRyb2wudGl0bGU7XG4gICAgfVxuICAgIGlmICh0aXRsZSkge1xuICAgICAgcmV0dXJuIGA8c3Bhbj4ke2Vycm9yLm1lc3NhZ2UucmVwbGFjZShlcnJvci5hcmd1bWVudCwgdGl0bGUpfTwvc3Bhbj5gO1xuICAgIH1cbiAgICByZXR1cm4gYDxzcGFuPiR7ZXJyb3IubWVzc2FnZX08L3NwYW4+YDtcbiAgfVxuXG4gIHNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgIGlmICh0aGlzLl9vYnNlcnZlZFByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eSkpICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVByb3BlcnRpZXModGhpcy5nZXRDb250cm9sKCkpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Vycm9ycycpICYmIHRoaXMuZXJyb3JzICE9IG51bGwpIHtcbiAgICAgIC8vIFNldCBlcnJvcnMgdG8gY29tcGxleCBjb250cm9sc1xuICAgICAgdGhpcy5nZXRDb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29udHJvbC5lcnJvcnMgPSB0aGlzLmVycm9ycztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGaW5kIHNpbXBsZSBjb250cm9scyBhbmQgYXBwZW5kIGVycm9yIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGVycm9yQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb3JtX19jb250cm9sLWVycm9yJyk7XG4gICAgICBlcnJvckNvbnRhaW5lci5mb3JFYWNoKChjb250YWluZXIpID0+IChjb250YWluZXIuaW5uZXJIVE1MID0gJycpKTtcbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGVycm9yLnByb3BlcnR5ID09PSAnaW5zdGFuY2UnID8gZXJyb3IuYXJndW1lbnQgOiBlcnJvci5wcm9wZXJ0eS5yZXBsYWNlKCdpbnN0YW5jZS4nLCAnJyk7XG4gICAgICAgIGNvbnN0IGVycm9yQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7a2V5fS1lcnJvclwiXWApO1xuICAgICAgICBpZiAoZXJyb3JDb250YWluZXIpIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZ3YtaW5wdXQtbWVzc2FnZScpO1xuICAgICAgICAgIG1lc3NhZ2UuaW5uZXJIVE1MID0gdGhpcy5mb3JtYXRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgICAgICAgIG1lc3NhZ2UubGV2ZWwgPSAnd2Fybic7XG4gICAgICAgICAgZXJyb3JDb250YWluZXIuYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2hvdWxkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgICR7dGhpcy5fcmVuZGVyQ29udHJvbCgpfVxuICAgICAgPGRpdiBjbGFzcz1cImZvcm1fX2NvbnRyb2wtZXJyb3JcIiBpZD1cIiR7dGhpcy5pZCArICctZXJyb3InfVwiPjwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIG1hcmdpbjogdmFyKC0tZ3Ytc2NoZW1hLWZvcm0tY29udHJvbC0tbSwgMC40cmVtKTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIDpob3N0KFtoaWRkZW5dKSB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAgIGhlaWdodDogMDtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wtZGVzY3JpcHRpb24sXG4gICAgICAgIC5mb3JtX19jb250cm9sLWVycm9yIHtcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybV9fY29udHJvbC1kZXNjcmlwdGlvbiB7XG4gICAgICAgICAgb3BhY2l0eTogMC44O1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wtbGFiZWwge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsIHtcbiAgICAgICAgICBtYXJnaW46IDAuMnJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtX19jb250cm9sLWxhYmVsIGxhYmVsIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wtYXJyYXksXG4gICAgICAgIC5mb3JtX19jb250cm9sLW9iamVjdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wtZW51bSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAvKmFsaWduLWl0ZW1zOiBmbGV4LWVuZDsqL1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wtYXJyYXkgZ3YtYnV0dG9uIHtcbiAgICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb3JtX19jb250cm9sIHtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cblxuICAgICAgICBndi1zZWxlY3QsXG4gICAgICAgIGd2LXNlbGVjdC1uYXRpdmUsXG4gICAgICAgIGd2LWlucHV0LFxuICAgICAgICBndi1jb2RlLFxuICAgICAgICBndi1zd2l0Y2gsXG4gICAgICAgIGd2LWV4cHJlc3Npb24tbGFuZ3VhZ2Uge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIG1hcmdpbjogMC4ycmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICBndi1zZWxlY3Q6aG92ZXIsXG4gICAgICAgIGd2LXNlbGVjdC1uYXRpdmU6aG92ZXIsXG4gICAgICAgIGd2LWF1dG9jb21wbGV0ZTpob3ZlciB7XG4gICAgICAgICAgei1pbmRleDogNzA7XG4gICAgICAgIH1cblxuICAgICAgICAuZXJyb3Ige1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi10aGVtZS1jb2xvci1lcnJvciwgI2Y0NDMzNik7XG4gICAgICAgIH1cblxuICAgICAgICAud2FybmluZyB7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWd2LXRoZW1lLWNvbG9yLXdhcm5pbmcsICNmZjk4MDApO1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIF07XG4gIH1cbn1cblxud2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCcsIEd2U2NoZW1hRm9ybUNvbnRyb2wpO1xuIl19