@gravitee/ui-components 3.24.5 → 3.25.0-fix-gvcode-15ce1d2

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 (114) hide show
  1. package/CHANGELOG.md +1270 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/i18n/en.json +3 -0
  5. package/assets/i18n/fr.json +3 -0
  6. package/assets/icons/design.svg +1 -1
  7. package/package.json +1 -1
  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 +148 -117
  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 -1
  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 +47 -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 +143 -81
  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 +138 -176
  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 +128 -45
  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 +324 -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 +266 -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 +777 -686
  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
@@ -20,6 +20,7 @@ import { repeat } from 'lit/directives/repeat';
20
20
  import { classMap } from 'lit/directives/class-map';
21
21
  import { i18n } from '../lib/i18n';
22
22
  import { withSkeletonAttribute } from '../mixins/with-skeleton-attribute';
23
+
23
24
  /**
24
25
  * Stats component
25
26
  *
@@ -29,22 +30,45 @@ import { withSkeletonAttribute } from '../mixins/with-skeleton-attribute';
29
30
  * @attr {Object} stats - The stats (count by key). Key can be: count, min, max, avg, sum, rps, rpm or rph.
30
31
  * @attr {Array<any>} options - The list of options to display.
31
32
  */
32
-
33
33
  export class GvStats extends withSkeletonAttribute(LitElement) {
34
34
  static get properties() {
35
35
  return {
36
- stats: {
37
- type: Object
38
- },
39
- options: {
40
- type: Array
41
- }
36
+ stats: { type: Object },
37
+ options: { type: Array },
42
38
  };
43
39
  }
44
40
 
45
41
  static get styles() {
46
- return [...super.styles, // language=CSS
47
- css`.stats{align-content:center;justify-content:center;display:flex;flex-wrap:wrap;height:100%}.stats-container{border:1px solid;border-radius:8px;margin:15px;padding:15px}.stats-value{font-size:30px;text-align:center}.stats-label{font-size:15px;text-align:center}`];
42
+ return [
43
+ ...super.styles,
44
+ // language=CSS
45
+ css`
46
+ .stats {
47
+ align-content: center;
48
+ justify-content: center;
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ height: 100%;
52
+ }
53
+
54
+ .stats-container {
55
+ border: 1px solid;
56
+ border-radius: 8px;
57
+ margin: 15px;
58
+ padding: 15px;
59
+ }
60
+
61
+ .stats-value {
62
+ font-size: 30px;
63
+ text-align: center;
64
+ }
65
+
66
+ .stats-label {
67
+ font-size: 15px;
68
+ text-align: center;
69
+ }
70
+ `,
71
+ ];
48
72
  }
49
73
 
50
74
  constructor() {
@@ -56,16 +80,12 @@ export class GvStats extends withSkeletonAttribute(LitElement) {
56
80
  if (!this.stats) {
57
81
  return '<div></div>';
58
82
  }
59
-
60
83
  let value = Math.round(this.stats[option.key]);
61
-
62
84
  if (isNaN(value)) {
63
85
  value = 0;
64
86
  }
65
-
66
87
  if (value === 0 && option.fallback) {
67
- const fallback = option.fallback.find(fallback => Math.round(this.stats[fallback.key]) > 0);
68
-
88
+ const fallback = option.fallback.find((fallback) => Math.round(this.stats[fallback.key]) > 0);
69
89
  if (fallback) {
70
90
  option.key = fallback.key;
71
91
  option.label = fallback.label;
@@ -73,24 +93,29 @@ export class GvStats extends withSkeletonAttribute(LitElement) {
73
93
  }
74
94
  }
75
95
 
76
- return html` <div class="stats-container" style="color:${option.color}"> <div class="stats-value">${value}${option.unit}</div> <div class="stats-label">${option.label || option.key}</div> </div> `;
96
+ return html`
97
+ <div class="stats-container" style="color: ${option.color}">
98
+ <div class="stats-value">${value}${option.unit}</div>
99
+ <div class="stats-label">${option.label || option.key}</div>
100
+ </div>
101
+ `;
77
102
  }
78
103
 
79
104
  render() {
80
105
  if (this._error) {
81
106
  return html`<div class="error">${i18n('gv-stats.error')}</div>`;
82
107
  }
83
-
84
108
  if (this._empty) {
85
109
  return html`<div class="empty">${i18n('gv-stats.empty')}</div>`;
86
110
  }
87
-
88
- return html`<div class="${classMap({
89
- stats: true,
90
- skeleton: this._skeleton
91
- })}"> ${repeat(this.options, option => option, option => this._getStat(option))} </div> `;
111
+ return html`<div class="${classMap({ stats: true, skeleton: this._skeleton })}">
112
+ ${repeat(
113
+ this.options,
114
+ (option) => option,
115
+ (option) => this._getStat(option),
116
+ )}
117
+ </div> `;
92
118
  }
93
-
94
119
  }
120
+
95
121
  window.customElements.define('gv-stats', GvStats);
96
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1zdGF0cy5qcyJdLCJuYW1lcyI6WyJjc3MiLCJodG1sIiwiTGl0RWxlbWVudCIsInJlcGVhdCIsImNsYXNzTWFwIiwiaTE4biIsIndpdGhTa2VsZXRvbkF0dHJpYnV0ZSIsIkd2U3RhdHMiLCJwcm9wZXJ0aWVzIiwic3RhdHMiLCJ0eXBlIiwiT2JqZWN0Iiwib3B0aW9ucyIsIkFycmF5Iiwic3R5bGVzIiwiY29uc3RydWN0b3IiLCJfc2tlbGV0b25BdHRyaWJ1dGUiLCJfZ2V0U3RhdCIsIm9wdGlvbiIsInZhbHVlIiwiTWF0aCIsInJvdW5kIiwia2V5IiwiaXNOYU4iLCJmYWxsYmFjayIsImZpbmQiLCJsYWJlbCIsImNvbG9yIiwidW5pdCIsInJlbmRlciIsIl9lcnJvciIsIl9lbXB0eSIsInNrZWxldG9uIiwiX3NrZWxldG9uIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsVUFBcEIsUUFBc0MsS0FBdEM7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxpQkFBUDtBQUNBLFNBQVNDLE1BQVQsUUFBdUIsdUJBQXZCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGFBQXJCO0FBQ0EsU0FBU0MscUJBQVQsUUFBc0MsbUNBQXRDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsT0FBTixTQUFzQkQscUJBQXFCLENBQUNKLFVBQUQsQ0FBM0MsQ0FBd0Q7QUFDeEMsYUFBVk0sVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEsS0FBSyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQURGO0FBRUxDLE1BQUFBLE9BQU8sRUFBRTtBQUFFRixRQUFBQSxJQUFJLEVBQUVHO0FBQVI7QUFGSixLQUFQO0FBSUQ7O0FBRWdCLGFBQU5DLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0wsR0FBRyxNQUFNQSxNQURKLEVBRUw7QUFDQWQsSUFBQUEsR0FBRyxzUUFIRSxDQUFQO0FBOEJEOztBQUVEZSxFQUFBQSxXQUFXLEdBQUc7QUFDWjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCLE9BQTFCO0FBQ0Q7O0FBRURDLEVBQUFBLFFBQVEsQ0FBQ0MsTUFBRCxFQUFTO0FBQ2YsUUFBSSxDQUFDLEtBQUtULEtBQVYsRUFBaUI7QUFDZixhQUFPLGFBQVA7QUFDRDs7QUFDRCxRQUFJVSxLQUFLLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtaLEtBQUwsQ0FBV1MsTUFBTSxDQUFDSSxHQUFsQixDQUFYLENBQVo7O0FBQ0EsUUFBSUMsS0FBSyxDQUFDSixLQUFELENBQVQsRUFBa0I7QUFDaEJBLE1BQUFBLEtBQUssR0FBRyxDQUFSO0FBQ0Q7O0FBQ0QsUUFBSUEsS0FBSyxLQUFLLENBQVYsSUFBZUQsTUFBTSxDQUFDTSxRQUExQixFQUFvQztBQUNsQyxZQUFNQSxRQUFRLEdBQUdOLE1BQU0sQ0FBQ00sUUFBUCxDQUFnQkMsSUFBaEIsQ0FBc0JELFFBQUQsSUFBY0osSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS1osS0FBTCxDQUFXZSxRQUFRLENBQUNGLEdBQXBCLENBQVgsSUFBdUMsQ0FBMUUsQ0FBakI7O0FBQ0EsVUFBSUUsUUFBSixFQUFjO0FBQ1pOLFFBQUFBLE1BQU0sQ0FBQ0ksR0FBUCxHQUFhRSxRQUFRLENBQUNGLEdBQXRCO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ1EsS0FBUCxHQUFlRixRQUFRLENBQUNFLEtBQXhCO0FBQ0FQLFFBQUFBLEtBQUssR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS1osS0FBTCxDQUFXUyxNQUFNLENBQUNJLEdBQWxCLENBQVgsQ0FBUjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT3JCLElBQUksOENBQ29DaUIsTUFBTSxDQUFDUyxLQUQzQywrQkFFb0JSLEtBRnBCLEdBRTRCRCxNQUFNLENBQUNVLElBRm5DLG1DQUdvQlYsTUFBTSxDQUFDUSxLQUFQLElBQWdCUixNQUFNLENBQUNJLEdBSDNDLGdCQUFYO0FBTUQ7O0FBRURPLEVBQUFBLE1BQU0sR0FBRztBQUNQLFFBQUksS0FBS0MsTUFBVCxFQUFpQjtBQUNmLGFBQU83QixJQUFJLHNCQUFzQkksSUFBSSxDQUFDLGdCQUFELENBQTFCLFFBQVg7QUFDRDs7QUFDRCxRQUFJLEtBQUswQixNQUFULEVBQWlCO0FBQ2YsYUFBTzlCLElBQUksc0JBQXNCSSxJQUFJLENBQUMsZ0JBQUQsQ0FBMUIsUUFBWDtBQUNEOztBQUNELFdBQU9KLElBQUksZUFBZUcsUUFBUSxDQUFDO0FBQUVLLE1BQUFBLEtBQUssRUFBRSxJQUFUO0FBQWV1QixNQUFBQSxRQUFRLEVBQUUsS0FBS0M7QUFBOUIsS0FBRCxDQUF2QixNQUNQOUIsTUFBTSxDQUNOLEtBQUtTLE9BREMsRUFFTE0sTUFBRCxJQUFZQSxNQUZOLEVBR0xBLE1BQUQsSUFBWSxLQUFLRCxRQUFMLENBQWNDLE1BQWQsQ0FITixDQURDLFVBQVg7QUFPRDs7QUFyRjREO0FBd0YvRGdCLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIsVUFBN0IsRUFBeUM3QixPQUF6QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1idXR0b24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi10YWcnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9saWIvaTE4bic7XG5pbXBvcnQgeyB3aXRoU2tlbGV0b25BdHRyaWJ1dGUgfSBmcm9tICcuLi9taXhpbnMvd2l0aC1za2VsZXRvbi1hdHRyaWJ1dGUnO1xuXG4vKipcbiAqIFN0YXRzIGNvbXBvbmVudFxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBhdHRyIHtPYmplY3R9IHN0YXRzIC0gVGhlIHN0YXRzIChjb3VudCBieSBrZXkpLiBLZXkgY2FuIGJlOiBjb3VudCwgbWluLCBtYXgsIGF2Zywgc3VtLCBycHMsIHJwbSBvciBycGguXG4gKiBAYXR0ciB7QXJyYXk8YW55Pn0gb3B0aW9ucyAtIFRoZSBsaXN0IG9mIG9wdGlvbnMgdG8gZGlzcGxheS5cbiAqL1xuZXhwb3J0IGNsYXNzIEd2U3RhdHMgZXh0ZW5kcyB3aXRoU2tlbGV0b25BdHRyaWJ1dGUoTGl0RWxlbWVudCkge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uc3VwZXIuc3R5bGVzLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIC5zdGF0cyB7XG4gICAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdGF0cy1jb250YWluZXIge1xuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgICBtYXJnaW46IDE1cHg7XG4gICAgICAgICAgcGFkZGluZzogMTVweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdGF0cy12YWx1ZSB7XG4gICAgICAgICAgZm9udC1zaXplOiAzMHB4O1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdGF0cy1sYWJlbCB7XG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9za2VsZXRvbkF0dHJpYnV0ZSA9ICdzdGF0cyc7XG4gIH1cblxuICBfZ2V0U3RhdChvcHRpb24pIHtcbiAgICBpZiAoIXRoaXMuc3RhdHMpIHtcbiAgICAgIHJldHVybiAnPGRpdj48L2Rpdj4nO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuc3RhdHNbb3B0aW9uLmtleV0pO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAwICYmIG9wdGlvbi5mYWxsYmFjaykge1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSBvcHRpb24uZmFsbGJhY2suZmluZCgoZmFsbGJhY2spID0+IE1hdGgucm91bmQodGhpcy5zdGF0c1tmYWxsYmFjay5rZXldKSA+IDApO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIG9wdGlvbi5rZXkgPSBmYWxsYmFjay5rZXk7XG4gICAgICAgIG9wdGlvbi5sYWJlbCA9IGZhbGxiYWNrLmxhYmVsO1xuICAgICAgICB2YWx1ZSA9IE1hdGgucm91bmQodGhpcy5zdGF0c1tvcHRpb24ua2V5XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdHMtY29udGFpbmVyXCIgc3R5bGU9XCJjb2xvcjogJHtvcHRpb24uY29sb3J9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0cy12YWx1ZVwiPiR7dmFsdWV9JHtvcHRpb24udW5pdH08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzLWxhYmVsXCI+JHtvcHRpb24ubGFiZWwgfHwgb3B0aW9uLmtleX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj4ke2kxOG4oJ2d2LXN0YXRzLmVycm9yJyl9PC9kaXY+YDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VtcHR5KSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiZW1wdHlcIj4ke2kxOG4oJ2d2LXN0YXRzLmVtcHR5Jyl9PC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBzdGF0czogdHJ1ZSwgc2tlbGV0b246IHRoaXMuX3NrZWxldG9uIH0pfVwiPlxuICAgICAgJHtyZXBlYXQoXG4gICAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLFxuICAgICAgICAob3B0aW9uKSA9PiB0aGlzLl9nZXRTdGF0KG9wdGlvbiksXG4gICAgICApfVxuICAgIDwvZGl2PiBgO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXN0YXRzJywgR3ZTdGF0cyk7XG4iXX0=
@@ -19,6 +19,7 @@ import { classMap } from 'lit/directives/class-map';
19
19
  import { link } from '../styles/link';
20
20
  import { dispatchCustomEvent } from '../lib/events';
21
21
  import { i18n } from '../lib/i18n';
22
+
22
23
  /**
23
24
  * Stepper component
24
25
  *
@@ -39,29 +40,161 @@ import { i18n } from '../lib/i18n';
39
40
  * @cssprop {Color} [--gv-stepper-passed--c=#595959] - Passed color
40
41
  * @cssprop {Length} [--gv-stepper-icon--s=32px] - Height and icon width
41
42
  */
42
-
43
43
  export class GvStepper extends LitElement {
44
44
  static get properties() {
45
45
  return {
46
- current: {
47
- type: Number,
48
- reflect: true
49
- },
50
- steps: {
51
- type: Array
52
- },
53
- disabled: {
54
- type: Boolean
55
- },
56
- _error: {
57
- type: Boolean
58
- }
46
+ current: { type: Number, reflect: true },
47
+ steps: { type: Array },
48
+ disabled: { type: Boolean },
49
+ _error: { type: Boolean },
59
50
  };
60
51
  }
61
52
 
62
53
  static get styles() {
63
- return [link, // language=CSS
64
- css`:host{box-sizing:border-box;--passed--bgc:var(--gv-stepper-valid--bgc, var(--gv-theme-color, #5a7684));--passed--bdc:var(--gv-stepper-passed--bdc, var(--gv-theme-color-light, #86c3d0));--bdc:var(--gv-stepper--bdc, var(--gv-theme-neutral-color-dark, #bfbfbf));--bgc:var(--gv-stepper--bgc, var(--gv-theme-neutral-color-dark, #bfbfbf));--passed--c:var(--gv-stepper-passed--c, #595959);--c:var(--gv-stepper--c, var(--gv-theme-neutral-color-dark, #bfbfbf))}.stepper{display:flex;justify-content:center}.disabled .step{cursor:not-allowed}.step{display:flex;flex-direction:column;cursor:pointer}.graph{display:flex;flex-direction:row;min-height:22px;min-width:250px}.round{min-width:6px;width:6px;min-height:6px;height:6px;border-radius:50%;margin:2px 7px 2px 7px}.border{margin-top:4px;min-width:100px;width:100%;height:2px;clear:both}.round{background-color:var(--bgc);transition:all .2s ease-in}.border{background-color:var(--bdc);margin-bottom:5px;transition:all .2s ease-in}.passed .round{background-color:var(--passed--bgc)}.passed .border{background-color:var(--passed--bdc)}.passed .round{height:10px;width:10px;min-height:10px;min-width:10px;margin:0 5px 0 5px}.first .border:first-of-type{visibility:hidden}.end .border:last-of-type{visibility:hidden}.content{display:flex;flex-direction:column;align-items:center;padding:5px;line-height:24px;font-size:var(--gv-theme-font-size-l,16px);color:var(--c)}.passed .content{color:var(--passed--c)}.title{font-weight:700}.description{font-size:var(--gv-theme-font-size-m,14px)}.error{text-align:center}.circle{border:1px solid var(--passed--bgc);margin-top:-12px;border-radius:50%;animation:validate .2s ease-in}gv-icon{--gv-icon--c:var(--passed--bgc);--gv-icon--s:var(--gv-stepper-icon--s, 32px)}.invalid gv-icon{--gv-icon--c:var(--gv-theme-color-danger)}@keyframes validate{from{opacity:0}to{opacity:1}}`];
54
+ return [
55
+ link,
56
+ // language=CSS
57
+ css`
58
+ :host {
59
+ box-sizing: border-box;
60
+ --passed--bgc: var(--gv-stepper-valid--bgc, var(--gv-theme-color, #5a7684));
61
+ --passed--bdc: var(--gv-stepper-passed--bdc, var(--gv-theme-color-light, #86c3d0));
62
+ --bdc: var(--gv-stepper--bdc, var(--gv-theme-neutral-color-dark, #bfbfbf));
63
+ --bgc: var(--gv-stepper--bgc, var(--gv-theme-neutral-color-dark, #bfbfbf));
64
+ --passed--c: var(--gv-stepper-passed--c, #595959);
65
+ --c: var(--gv-stepper--c, var(--gv-theme-neutral-color-dark, #bfbfbf));
66
+ }
67
+
68
+ .stepper {
69
+ display: flex;
70
+ justify-content: center;
71
+ }
72
+
73
+ .disabled .step {
74
+ cursor: not-allowed;
75
+ }
76
+
77
+ .step {
78
+ display: flex;
79
+ flex-direction: column;
80
+ cursor: pointer;
81
+ }
82
+
83
+ .graph {
84
+ display: flex;
85
+ flex-direction: row;
86
+ min-height: 22px;
87
+ min-width: 250px;
88
+ }
89
+
90
+ .round {
91
+ min-width: 6px;
92
+ width: 6px;
93
+ min-height: 6px;
94
+ height: 6px;
95
+ border-radius: 50%;
96
+ margin: 2px 7px 2px 7px;
97
+ }
98
+
99
+ .border {
100
+ margin-top: 4px;
101
+ min-width: 100px;
102
+ width: 100%;
103
+ height: 2px;
104
+ clear: both;
105
+ }
106
+
107
+ .round {
108
+ background-color: var(--bgc);
109
+ transition: all 0.2s ease-in;
110
+ }
111
+
112
+ .border {
113
+ background-color: var(--bdc);
114
+ margin-bottom: 5px;
115
+ transition: all 0.2s ease-in;
116
+ }
117
+
118
+ .passed .round {
119
+ background-color: var(--passed--bgc);
120
+ }
121
+
122
+ .passed .border {
123
+ background-color: var(--passed--bdc);
124
+ }
125
+
126
+ .passed .round {
127
+ height: 10px;
128
+ width: 10px;
129
+ min-height: 10px;
130
+ min-width: 10px;
131
+ margin: 0 5px 0 5px;
132
+ }
133
+
134
+ .first .border:first-of-type {
135
+ visibility: hidden;
136
+ }
137
+
138
+ .end .border:last-of-type {
139
+ visibility: hidden;
140
+ }
141
+
142
+ .content {
143
+ display: flex;
144
+ flex-direction: column;
145
+ align-items: center;
146
+
147
+ padding: 5px;
148
+ line-height: 24px;
149
+ font-size: var(--gv-theme-font-size-l, 16px);
150
+ color: var(--c);
151
+ }
152
+
153
+ .passed .content {
154
+ color: var(--passed--c);
155
+ }
156
+
157
+ .title {
158
+ font-weight: bold;
159
+ }
160
+
161
+ .description {
162
+ font-size: var(--gv-theme-font-size-m, 14px);
163
+ }
164
+
165
+ .error {
166
+ text-align: center;
167
+ }
168
+
169
+ .circle {
170
+ border: 1px solid var(--passed--bgc);
171
+ margin-top: -12px;
172
+ border-radius: 50%;
173
+ animation: validate 0.2s ease-in;
174
+ }
175
+
176
+ .invalid.circle {
177
+ }
178
+
179
+ gv-icon {
180
+ --gv-icon--c: var(--passed--bgc);
181
+ --gv-icon--s: var(--gv-stepper-icon--s, 32px);
182
+ }
183
+
184
+ .invalid gv-icon {
185
+ --gv-icon--c: var(--gv-theme-color-danger);
186
+ }
187
+
188
+ @keyframes validate {
189
+ from {
190
+ opacity: 0;
191
+ }
192
+ to {
193
+ opacity: 1;
194
+ }
195
+ }
196
+ `,
197
+ ];
65
198
  }
66
199
 
67
200
  constructor() {
@@ -75,24 +208,24 @@ export class GvStepper extends LitElement {
75
208
  _onClick(index) {
76
209
  if (this.disabled !== true) {
77
210
  this.current = index + 1;
78
- dispatchCustomEvent(this, 'change', {
79
- current: this.current
80
- });
211
+ dispatchCustomEvent(this, 'change', { current: this.current });
81
212
  }
82
213
  }
83
214
 
84
215
  async performUpdate() {
85
- await Promise.all([this.steps, this.current]).then(([steps, current]) => {
86
- this._steps = steps.map((step, _index) => {
87
- step.passed = step.valid === true || current > 0 && _index + 1 <= current;
88
- return step;
216
+ await Promise.all([this.steps, this.current])
217
+ .then(([steps, current]) => {
218
+ this._steps = steps.map((step, _index) => {
219
+ step.passed = step.valid === true || (current > 0 && _index + 1 <= current);
220
+ return step;
221
+ });
222
+ this._error = false;
223
+ this._empty = !(this._steps && this._steps.length > 0);
224
+ })
225
+ .catch(() => {
226
+ this._error = true;
227
+ this._empty = false;
89
228
  });
90
- this._error = false;
91
- this._empty = !(this._steps && this._steps.length > 0);
92
- }).catch(() => {
93
- this._error = true;
94
- this._empty = false;
95
- });
96
229
  super.performUpdate();
97
230
  }
98
231
 
@@ -100,11 +233,9 @@ export class GvStepper extends LitElement {
100
233
  if (step.invalid) {
101
234
  return html`<div class="circle invalid"><gv-icon shape="code:error"></gv-icon></div>`;
102
235
  }
103
-
104
236
  if (step.valid) {
105
237
  return html`<div class="circle"><gv-icon shape="code:check"></gv-icon></div>`;
106
238
  }
107
-
108
239
  return html`<div class="round"></div>`;
109
240
  }
110
241
 
@@ -114,31 +245,44 @@ export class GvStepper extends LitElement {
114
245
  valid: step.valid,
115
246
  step: true,
116
247
  first: index === 0,
117
- end: index === this._steps.length - 1
248
+ end: index === this._steps.length - 1,
118
249
  };
250
+
119
251
  const contentClasses = {
120
252
  content: true,
121
- link: !this.disabled
253
+ link: !this.disabled,
122
254
  };
123
- return html` <div class="${classMap(classes)}" @click="${this._onClick.bind(this, index)}" title="${step.title}"> <div class="graph"> <div class="border"></div> ${this._getIcon(step)} <div class="border"></div> </div> <div class="${classMap(contentClasses)}"> <div class="title">${step.title}</div> <div class="description">${step.description}</div> </div> </div> `;
255
+ return html`
256
+ <div class="${classMap(classes)}" @click="${this._onClick.bind(this, index)}" title="${step.title}">
257
+ <div class="graph">
258
+ <div class="border"></div>
259
+ ${this._getIcon(step)}
260
+ <div class="border"></div>
261
+ </div>
262
+ <div class="${classMap(contentClasses)}">
263
+ <div class="title">${step.title}</div>
264
+ <div class="description">${step.description}</div>
265
+ </div>
266
+ </div>
267
+ `;
124
268
  }
125
269
 
126
270
  render() {
127
271
  if (this._error) {
128
272
  return html`<div class="error">${i18n('gv-stepper.error')}</div>`;
129
273
  }
130
-
131
274
  if (this._empty) {
132
275
  return html`<div></div>`;
133
276
  }
134
-
135
- const classes = {
136
- stepper: true,
137
- disabled: this.disabled
138
- };
139
- return html`<div class="${classMap(classes)}"> ${repeat(this._steps, step => step, (step, index) => this._getStep(step, index))} </div> `;
277
+ const classes = { stepper: true, disabled: this.disabled };
278
+ return html`<div class="${classMap(classes)}">
279
+ ${repeat(
280
+ this._steps,
281
+ (step) => step,
282
+ (step, index) => this._getStep(step, index),
283
+ )}
284
+ </div> `;
140
285
  }
141
-
142
286
  }
287
+
143
288
  window.customElements.define('gv-stepper', GvStepper);
144
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1zdGVwcGVyLmpzIl0sIm5hbWVzIjpbImNzcyIsImh0bWwiLCJMaXRFbGVtZW50IiwicmVwZWF0IiwiY2xhc3NNYXAiLCJsaW5rIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsImkxOG4iLCJHdlN0ZXBwZXIiLCJwcm9wZXJ0aWVzIiwiY3VycmVudCIsInR5cGUiLCJOdW1iZXIiLCJyZWZsZWN0Iiwic3RlcHMiLCJBcnJheSIsImRpc2FibGVkIiwiQm9vbGVhbiIsIl9lcnJvciIsInN0eWxlcyIsImNvbnN0cnVjdG9yIiwiX3N0ZXBzIiwiX2VtcHR5IiwiX29uQ2xpY2siLCJpbmRleCIsInBlcmZvcm1VcGRhdGUiLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsIm1hcCIsInN0ZXAiLCJfaW5kZXgiLCJwYXNzZWQiLCJ2YWxpZCIsImxlbmd0aCIsImNhdGNoIiwiX2dldEljb24iLCJpbnZhbGlkIiwiX2dldFN0ZXAiLCJjbGFzc2VzIiwiZmlyc3QiLCJlbmQiLCJjb250ZW50Q2xhc3NlcyIsImNvbnRlbnQiLCJiaW5kIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInJlbmRlciIsInN0ZXBwZXIiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBVCxFQUFjQyxJQUFkLEVBQW9CQyxVQUFwQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLE1BQVQsUUFBdUIsdUJBQXZCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGdCQUFyQjtBQUNBLFNBQVNDLG1CQUFULFFBQW9DLGVBQXBDO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxTQUFOLFNBQXdCTixVQUF4QixDQUFtQztBQUNuQixhQUFWTyxVQUFVLEdBQUc7QUFDdEIsV0FBTztBQUNMQyxNQUFBQSxPQUFPLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCQyxRQUFBQSxPQUFPLEVBQUU7QUFBekIsT0FESjtBQUVMQyxNQUFBQSxLQUFLLEVBQUU7QUFBRUgsUUFBQUEsSUFBSSxFQUFFSTtBQUFSLE9BRkY7QUFHTEMsTUFBQUEsUUFBUSxFQUFFO0FBQUVMLFFBQUFBLElBQUksRUFBRU07QUFBUixPQUhMO0FBSUxDLE1BQUFBLE1BQU0sRUFBRTtBQUFFUCxRQUFBQSxJQUFJLEVBQUVNO0FBQVI7QUFKSCxLQUFQO0FBTUQ7O0FBRWdCLGFBQU5FLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0xkLElBREssRUFFTDtBQUNBTCxJQUFBQSxHQUFHLDZ6REFIRSxDQUFQO0FBZ0pEOztBQUVEb0IsRUFBQUEsV0FBVyxHQUFHO0FBQ1o7QUFDQSxTQUFLVixPQUFMLEdBQWUsQ0FBZjtBQUNBLFNBQUtXLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0gsTUFBTCxHQUFjLEtBQWQ7QUFDQSxTQUFLSSxNQUFMLEdBQWMsSUFBZDtBQUNEOztBQUVEQyxFQUFBQSxRQUFRLENBQUNDLEtBQUQsRUFBUTtBQUNkLFFBQUksS0FBS1IsUUFBTCxLQUFrQixJQUF0QixFQUE0QjtBQUMxQixXQUFLTixPQUFMLEdBQWVjLEtBQUssR0FBRyxDQUF2QjtBQUNBbEIsTUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUI7QUFBRUksUUFBQUEsT0FBTyxFQUFFLEtBQUtBO0FBQWhCLE9BQWpCLENBQW5CO0FBQ0Q7QUFDRjs7QUFFa0IsUUFBYmUsYUFBYSxHQUFHO0FBQ3BCLFVBQU1DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLENBQUMsS0FBS2IsS0FBTixFQUFhLEtBQUtKLE9BQWxCLENBQVosRUFDSGtCLElBREcsQ0FDRSxDQUFDLENBQUNkLEtBQUQsRUFBUUosT0FBUixDQUFELEtBQXNCO0FBQzFCLFdBQUtXLE1BQUwsR0FBY1AsS0FBSyxDQUFDZSxHQUFOLENBQVUsQ0FBQ0MsSUFBRCxFQUFPQyxNQUFQLEtBQWtCO0FBQ3hDRCxRQUFBQSxJQUFJLENBQUNFLE1BQUwsR0FBY0YsSUFBSSxDQUFDRyxLQUFMLEtBQWUsSUFBZixJQUF3QnZCLE9BQU8sR0FBRyxDQUFWLElBQWVxQixNQUFNLEdBQUcsQ0FBVCxJQUFjckIsT0FBbkU7QUFDQSxlQUFPb0IsSUFBUDtBQUNELE9BSGEsQ0FBZDtBQUlBLFdBQUtaLE1BQUwsR0FBYyxLQUFkO0FBQ0EsV0FBS0ksTUFBTCxHQUFjLEVBQUUsS0FBS0QsTUFBTCxJQUFlLEtBQUtBLE1BQUwsQ0FBWWEsTUFBWixHQUFxQixDQUF0QyxDQUFkO0FBQ0QsS0FSRyxFQVNIQyxLQVRHLENBU0csTUFBTTtBQUNYLFdBQUtqQixNQUFMLEdBQWMsSUFBZDtBQUNBLFdBQUtJLE1BQUwsR0FBYyxLQUFkO0FBQ0QsS0FaRyxDQUFOO0FBYUEsVUFBTUcsYUFBTjtBQUNEOztBQUVEVyxFQUFBQSxRQUFRLENBQUNOLElBQUQsRUFBTztBQUNiLFFBQUlBLElBQUksQ0FBQ08sT0FBVCxFQUFrQjtBQUNoQixhQUFPcEMsSUFBSSwwRUFBWDtBQUNEOztBQUNELFFBQUk2QixJQUFJLENBQUNHLEtBQVQsRUFBZ0I7QUFDZCxhQUFPaEMsSUFBSSxrRUFBWDtBQUNEOztBQUNELFdBQU9BLElBQUksMkJBQVg7QUFDRDs7QUFFRHFDLEVBQUFBLFFBQVEsQ0FBQ1IsSUFBRCxFQUFPTixLQUFQLEVBQWM7QUFDcEIsVUFBTWUsT0FBTyxHQUFHO0FBQ2RQLE1BQUFBLE1BQU0sRUFBRUYsSUFBSSxDQUFDRSxNQURDO0FBRWRDLE1BQUFBLEtBQUssRUFBRUgsSUFBSSxDQUFDRyxLQUZFO0FBR2RILE1BQUFBLElBQUksRUFBRSxJQUhRO0FBSWRVLE1BQUFBLEtBQUssRUFBRWhCLEtBQUssS0FBSyxDQUpIO0FBS2RpQixNQUFBQSxHQUFHLEVBQUVqQixLQUFLLEtBQUssS0FBS0gsTUFBTCxDQUFZYSxNQUFaLEdBQXFCO0FBTHRCLEtBQWhCO0FBUUEsVUFBTVEsY0FBYyxHQUFHO0FBQ3JCQyxNQUFBQSxPQUFPLEVBQUUsSUFEWTtBQUVyQnRDLE1BQUFBLElBQUksRUFBRSxDQUFDLEtBQUtXO0FBRlMsS0FBdkI7QUFJQSxXQUFPZixJQUFJLGdCQUNLRyxRQUFRLENBQUNtQyxPQUFELENBRGIsYUFDbUMsS0FBS2hCLFFBQUwsQ0FBY3FCLElBQWQsQ0FBbUIsSUFBbkIsRUFBeUJwQixLQUF6QixDQURuQyxZQUM4RU0sSUFBSSxDQUFDZSxLQURuRixxREFJSCxLQUFLVCxRQUFMLENBQWNOLElBQWQsQ0FKRyxrREFPTzFCLFFBQVEsQ0FBQ3NDLGNBQUQsQ0FQZix5QkFRZ0JaLElBQUksQ0FBQ2UsS0FSckIsbUNBU3NCZixJQUFJLENBQUNnQixXQVQzQix1QkFBWDtBQWFEOztBQUVEQyxFQUFBQSxNQUFNLEdBQUc7QUFDUCxRQUFJLEtBQUs3QixNQUFULEVBQWlCO0FBQ2YsYUFBT2pCLElBQUksc0JBQXNCTSxJQUFJLENBQUMsa0JBQUQsQ0FBMUIsUUFBWDtBQUNEOztBQUNELFFBQUksS0FBS2UsTUFBVCxFQUFpQjtBQUNmLGFBQU9yQixJQUFJLGFBQVg7QUFDRDs7QUFDRCxVQUFNc0MsT0FBTyxHQUFHO0FBQUVTLE1BQUFBLE9BQU8sRUFBRSxJQUFYO0FBQWlCaEMsTUFBQUEsUUFBUSxFQUFFLEtBQUtBO0FBQWhDLEtBQWhCO0FBQ0EsV0FBT2YsSUFBSSxlQUFlRyxRQUFRLENBQUNtQyxPQUFELENBQXZCLE1BQ1BwQyxNQUFNLENBQ04sS0FBS2tCLE1BREMsRUFFTFMsSUFBRCxJQUFVQSxJQUZKLEVBR04sQ0FBQ0EsSUFBRCxFQUFPTixLQUFQLEtBQWlCLEtBQUtjLFFBQUwsQ0FBY1IsSUFBZCxFQUFvQk4sS0FBcEIsQ0FIWCxDQURDLFVBQVg7QUFPRDs7QUFsUHVDO0FBcVAxQ3lCLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIsWUFBN0IsRUFBMkMzQyxTQUEzQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IGxpbmsgfSBmcm9tICcuLi9zdHlsZXMvbGluayc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbGliL2kxOG4nO1xuXG4vKipcbiAqIFN0ZXBwZXIgY29tcG9uZW50XG4gKlxuICogIyMgRGV0YWlsc1xuICogKiBoYXMgQHRoZW1lIGZhY2V0XG4gKlxuICogQGZpcmVzIGd2LXN0ZXBwZXI6Y2hhbmdlIC0gd2hlbiBzdGVwIGNoYW5nZVxuICpcbiAqIEBhdHRyIHtMZW5ndGh9IGN1cnJlbnQgLSBUaGUgY3VycmVudCBzZWxlY3RlZCBzdGVwXG4gKiBAYXR0ciB7QXJyYXl9IHN0ZXBzIC0gQXJyYXkgb2Ygc3RlcCB7dGl0bGU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZywgdmFsaWQ6IGJvb2xlYW4sIGludmFsaWQ6IGJvb2xlYW59XG4gKiBAYXR0ciB7Qm9vbGVhbn0gW2Rpc2FibGVkPWZhbHNlXSAtIEluZGljYXRlIGlmIHN0ZXBwZXIgaXMgZGlzYWJsZWRcbiAqXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LXN0ZXBwZXItdmFsaWQtLWJnYz12YXIoLS1ndi10aGVtZS1jb2xvciwgIzVhNzY4NCldIC0gVmFsaWQgYmFja2dyb3VuZCBjb2xvclxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1zdGVwcGVyLXBhc3NlZC0tYmRjPXZhcigtLWd2LXRoZW1lLWNvbG9yLWxpZ2h0LCAjODZjM2QwKV0gLSBQYXNzZWQgYm9yZGVyIGNvbG9yXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LXN0ZXBwZXItLWJnYz12YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWRhcmssICNiZmJmYmYpXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3Ytc3RlcHBlci0tYmRjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItZGFyaywgI2JmYmZiZildIC0gQm9yZGVyIGNvbG9yXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LXN0ZXBwZXItLWM9dmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1kYXJrLCAjYmZiZmJmKV0gLSBDb2xvclxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1zdGVwcGVyLXBhc3NlZC0tYz0jNTk1OTU5XSAtIFBhc3NlZCBjb2xvclxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3Ytc3RlcHBlci1pY29uLS1zPTMycHhdIC0gSGVpZ2h0IGFuZCBpY29uIHdpZHRoXG4gKi9cbmV4cG9ydCBjbGFzcyBHdlN0ZXBwZXIgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50OiB7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgc3RlcHM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIF9lcnJvcjogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBsaW5rLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIC0tcGFzc2VkLS1iZ2M6IHZhcigtLWd2LXN0ZXBwZXItdmFsaWQtLWJnYywgdmFyKC0tZ3YtdGhlbWUtY29sb3IsICM1YTc2ODQpKTtcbiAgICAgICAgICAtLXBhc3NlZC0tYmRjOiB2YXIoLS1ndi1zdGVwcGVyLXBhc3NlZC0tYmRjLCB2YXIoLS1ndi10aGVtZS1jb2xvci1saWdodCwgIzg2YzNkMCkpO1xuICAgICAgICAgIC0tYmRjOiB2YXIoLS1ndi1zdGVwcGVyLS1iZGMsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItZGFyaywgI2JmYmZiZikpO1xuICAgICAgICAgIC0tYmdjOiB2YXIoLS1ndi1zdGVwcGVyLS1iZ2MsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItZGFyaywgI2JmYmZiZikpO1xuICAgICAgICAgIC0tcGFzc2VkLS1jOiB2YXIoLS1ndi1zdGVwcGVyLXBhc3NlZC0tYywgIzU5NTk1OSk7XG4gICAgICAgICAgLS1jOiB2YXIoLS1ndi1zdGVwcGVyLS1jLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWRhcmssICNiZmJmYmYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdGVwcGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmRpc2FibGVkIC5zdGVwIHtcbiAgICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgLnN0ZXAge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuZ3JhcGgge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBtaW4taGVpZ2h0OiAyMnB4O1xuICAgICAgICAgIG1pbi13aWR0aDogMjUwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAucm91bmQge1xuICAgICAgICAgIG1pbi13aWR0aDogNnB4O1xuICAgICAgICAgIHdpZHRoOiA2cHg7XG4gICAgICAgICAgbWluLWhlaWdodDogNnB4O1xuICAgICAgICAgIGhlaWdodDogNnB4O1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgICBtYXJnaW46IDJweCA3cHggMnB4IDdweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3JkZXIge1xuICAgICAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICAgIGNsZWFyOiBib3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLnJvdW5kIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZ2MpO1xuICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2UtaW47XG4gICAgICAgIH1cblxuICAgICAgICAuYm9yZGVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZGMpO1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLnBhc3NlZCAucm91bmQge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhc3NlZC0tYmdjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wYXNzZWQgLmJvcmRlciB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFzc2VkLS1iZGMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLnBhc3NlZCAucm91bmQge1xuICAgICAgICAgIGhlaWdodDogMTBweDtcbiAgICAgICAgICB3aWR0aDogMTBweDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiAxMHB4O1xuICAgICAgICAgIG1pbi13aWR0aDogMTBweDtcbiAgICAgICAgICBtYXJnaW46IDAgNXB4IDAgNXB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmZpcnN0IC5ib3JkZXI6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLmVuZCAuYm9yZGVyOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRlbnQge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgICAgICAgcGFkZGluZzogNXB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZ3YtdGhlbWUtZm9udC1zaXplLWwsIDE2cHgpO1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wYXNzZWQgLmNvbnRlbnQge1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1wYXNzZWQtLWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLnRpdGxlIHtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kZXNjcmlwdGlvbiB7XG4gICAgICAgICAgZm9udC1zaXplOiB2YXIoLS1ndi10aGVtZS1mb250LXNpemUtbSwgMTRweCk7XG4gICAgICAgIH1cblxuICAgICAgICAuZXJyb3Ige1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaXJjbGUge1xuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXBhc3NlZC0tYmdjKTtcbiAgICAgICAgICBtYXJnaW4tdG9wOiAtMTJweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgICAgYW5pbWF0aW9uOiB2YWxpZGF0ZSAwLjJzIGVhc2UtaW47XG4gICAgICAgIH1cblxuICAgICAgICAuaW52YWxpZC5jaXJjbGUge1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1jOiB2YXIoLS1wYXNzZWQtLWJnYyk7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1ndi1zdGVwcGVyLWljb24tLXMsIDMycHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmludmFsaWQgZ3YtaWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1jOiB2YXIoLS1ndi10aGVtZS1jb2xvci1kYW5nZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgQGtleWZyYW1lcyB2YWxpZGF0ZSB7XG4gICAgICAgICAgZnJvbSB7XG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0byB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIHRoaXMuX3N0ZXBzID0gW107XG4gICAgdGhpcy5fZXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLl9lbXB0eSA9IHRydWU7XG4gIH1cblxuICBfb25DbGljayhpbmRleCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBpbmRleCArIDE7XG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2UnLCB7IGN1cnJlbnQ6IHRoaXMuY3VycmVudCB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwZXJmb3JtVXBkYXRlKCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnN0ZXBzLCB0aGlzLmN1cnJlbnRdKVxuICAgICAgLnRoZW4oKFtzdGVwcywgY3VycmVudF0pID0+IHtcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBzdGVwcy5tYXAoKHN0ZXAsIF9pbmRleCkgPT4ge1xuICAgICAgICAgIHN0ZXAucGFzc2VkID0gc3RlcC52YWxpZCA9PT0gdHJ1ZSB8fCAoY3VycmVudCA+IDAgJiYgX2luZGV4ICsgMSA8PSBjdXJyZW50KTtcbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2Vycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VtcHR5ID0gISh0aGlzLl9zdGVwcyAmJiB0aGlzLl9zdGVwcy5sZW5ndGggPiAwKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VtcHR5ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICBzdXBlci5wZXJmb3JtVXBkYXRlKCk7XG4gIH1cblxuICBfZ2V0SWNvbihzdGVwKSB7XG4gICAgaWYgKHN0ZXAuaW52YWxpZCkge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImNpcmNsZSBpbnZhbGlkXCI+PGd2LWljb24gc2hhcGU9XCJjb2RlOmVycm9yXCI+PC9ndi1pY29uPjwvZGl2PmA7XG4gICAgfVxuICAgIGlmIChzdGVwLnZhbGlkKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiY2lyY2xlXCI+PGd2LWljb24gc2hhcGU9XCJjb2RlOmNoZWNrXCI+PC9ndi1pY29uPjwvZGl2PmA7XG4gICAgfVxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJyb3VuZFwiPjwvZGl2PmA7XG4gIH1cblxuICBfZ2V0U3RlcChzdGVwLCBpbmRleCkge1xuICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICBwYXNzZWQ6IHN0ZXAucGFzc2VkLFxuICAgICAgdmFsaWQ6IHN0ZXAudmFsaWQsXG4gICAgICBzdGVwOiB0cnVlLFxuICAgICAgZmlyc3Q6IGluZGV4ID09PSAwLFxuICAgICAgZW5kOiBpbmRleCA9PT0gdGhpcy5fc3RlcHMubGVuZ3RoIC0gMSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29udGVudENsYXNzZXMgPSB7XG4gICAgICBjb250ZW50OiB0cnVlLFxuICAgICAgbGluazogIXRoaXMuZGlzYWJsZWQsXG4gICAgfTtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKGNsYXNzZXMpfVwiIEBjbGljaz1cIiR7dGhpcy5fb25DbGljay5iaW5kKHRoaXMsIGluZGV4KX1cIiB0aXRsZT1cIiR7c3RlcC50aXRsZX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyYXBoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlclwiPjwvZGl2PlxuICAgICAgICAgICR7dGhpcy5fZ2V0SWNvbihzdGVwKX1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcChjb250ZW50Q2xhc3Nlcyl9XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHtzdGVwLnRpdGxlfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7c3RlcC5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImVycm9yXCI+JHtpMThuKCdndi1zdGVwcGVyLmVycm9yJyl9PC9kaXY+YDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VtcHR5KSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2PjwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzZXMgPSB7IHN0ZXBwZXI6IHRydWUsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkIH07XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoY2xhc3Nlcyl9XCI+XG4gICAgICAke3JlcGVhdChcbiAgICAgICAgdGhpcy5fc3RlcHMsXG4gICAgICAgIChzdGVwKSA9PiBzdGVwLFxuICAgICAgICAoc3RlcCwgaW5kZXgpID0+IHRoaXMuX2dldFN0ZXAoc3RlcCwgaW5kZXgpLFxuICAgICAgKX1cbiAgICA8L2Rpdj4gYDtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1zdGVwcGVyJywgR3ZTdGVwcGVyKTtcbiJdfQ==