@gravitee/ui-components 3.24.3-migrate-codemirror-f56ff96 → 3.24.4

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/assets/css/codemirror/all.css +476 -0
  2. package/package.json +2 -17
  3. package/src/atoms/gv-autocomplete.js +132 -156
  4. package/src/atoms/gv-button.js +73 -256
  5. package/src/atoms/gv-checkbox.js +45 -103
  6. package/src/atoms/gv-date-picker-calendar.js +312 -393
  7. package/src/atoms/gv-date-picker-cell.js +57 -81
  8. package/src/atoms/gv-date-picker.js +180 -319
  9. package/src/atoms/gv-file-upload.js +85 -195
  10. package/src/atoms/gv-icon.js +13 -34
  11. package/src/atoms/gv-image.js +31 -66
  12. package/src/atoms/gv-input-message.js +12 -37
  13. package/src/atoms/gv-input.js +120 -144
  14. package/src/atoms/gv-link.js +47 -125
  15. package/src/atoms/gv-message.js +18 -69
  16. package/src/atoms/gv-metric.js +19 -68
  17. package/src/atoms/gv-relative-time.js +67 -38
  18. package/src/atoms/gv-select-native.js +96 -215
  19. package/src/atoms/gv-select.js +110 -230
  20. package/src/atoms/gv-spinner.js +5 -26
  21. package/src/atoms/gv-state.js +25 -66
  22. package/src/atoms/gv-switch.js +40 -160
  23. package/src/atoms/gv-tag.js +26 -78
  24. package/src/atoms/gv-text.js +22 -83
  25. package/src/charts/gv-chart-bar.js +22 -18
  26. package/src/charts/gv-chart-gauge.js +28 -31
  27. package/src/charts/gv-chart-histogram.js +18 -10
  28. package/src/charts/gv-chart-line.js +70 -59
  29. package/src/charts/gv-chart-map.js +44 -42
  30. package/src/charts/gv-chart-pie.js +18 -14
  31. package/src/index.js +2 -0
  32. package/src/lib/cron-expression.js +40 -35
  33. package/src/lib/date.js +10 -1
  34. package/src/lib/events.js +3 -1
  35. package/src/lib/http-client-schema-form.js +13 -12
  36. package/src/lib/http.js +57 -56
  37. package/src/lib/i18n.js +30 -22
  38. package/src/lib/item.js +13 -12
  39. package/src/lib/properties.js +77 -42
  40. package/src/lib/schema-form.js +4 -5
  41. package/src/lib/studio.js +13 -60
  42. package/src/lib/style.js +8 -8
  43. package/src/lib/text-format.js +14 -7
  44. package/src/lib/theme.js +8 -5
  45. package/src/lib/utils.js +17 -18
  46. package/src/mixins/chart-element.js +31 -54
  47. package/src/mixins/input-element.js +59 -44
  48. package/src/mixins/item-resource.js +34 -32
  49. package/src/mixins/keyboard-element.js +6 -5
  50. package/src/mixins/update-after-browser.js +4 -1
  51. package/src/mixins/with-resize-observer.js +23 -13
  52. package/src/mixins/with-skeleton-attribute.js +54 -48
  53. package/src/molecules/gv-card-full.js +26 -147
  54. package/src/molecules/gv-card-list.js +13 -42
  55. package/src/molecules/gv-card.js +17 -91
  56. package/src/molecules/gv-category-list.js +6 -17
  57. package/src/molecules/gv-category.js +23 -103
  58. package/src/molecules/gv-code-hint.js +49 -0
  59. package/src/molecules/gv-code.js +185 -392
  60. package/src/molecules/gv-confirm.js +41 -71
  61. package/src/molecules/gv-cron-editor.js +143 -389
  62. package/src/molecules/gv-dropdown-menu.js +14 -46
  63. package/src/molecules/gv-expandable.js +31 -59
  64. package/src/molecules/gv-expression-language.js +591 -7
  65. package/src/molecules/gv-identity-picture.js +42 -65
  66. package/src/molecules/gv-list.js +42 -134
  67. package/src/molecules/gv-metrics.js +37 -49
  68. package/src/molecules/gv-modal.js +28 -95
  69. package/src/molecules/gv-nav.js +49 -75
  70. package/src/molecules/gv-option.js +57 -130
  71. package/src/molecules/gv-plans.js +86 -209
  72. package/src/molecules/gv-popover.js +57 -177
  73. package/src/molecules/gv-promote.js +28 -146
  74. package/src/molecules/gv-rating-list.js +69 -195
  75. package/src/molecules/gv-rating.js +52 -105
  76. package/src/molecules/gv-row-expandable.js +5 -11
  77. package/src/molecules/gv-row.js +21 -147
  78. package/src/molecules/gv-stats.js +23 -48
  79. package/src/molecules/gv-stepper.js +43 -187
  80. package/src/molecules/gv-table.js +199 -309
  81. package/src/molecules/gv-tree.js +33 -156
  82. package/src/organisms/gv-documentation.js +44 -127
  83. package/src/organisms/gv-header.js +37 -195
  84. package/src/organisms/gv-http-client.js +32 -168
  85. package/src/organisms/gv-menu.js +37 -158
  86. package/src/organisms/gv-newsletter-subscription.js +48 -189
  87. package/src/organisms/gv-pagination.js +49 -77
  88. package/src/organisms/gv-properties.js +271 -492
  89. package/src/organisms/gv-resizable-views.js +41 -259
  90. package/src/organisms/gv-resources.js +168 -275
  91. package/src/organisms/gv-schema-form-array.js +49 -159
  92. package/src/organisms/gv-schema-form-control-object.js +59 -73
  93. package/src/organisms/gv-schema-form-control.js +107 -134
  94. package/src/organisms/gv-schema-form.js +195 -280
  95. package/src/organisms/gv-tabs.js +66 -98
  96. package/src/organisms/gv-user-menu.js +36 -201
  97. package/src/organisms/gv-vertical-menu.js +20 -61
  98. package/src/policy-studio/gv-flow-step.js +105 -245
  99. package/src/policy-studio/gv-flow.js +125 -304
  100. package/src/policy-studio/gv-policy-studio-menu.js +157 -471
  101. package/src/policy-studio/gv-policy-studio.js +688 -761
  102. package/src/styles/empty.js +3 -20
  103. package/src/styles/input.js +3 -245
  104. package/src/styles/link.js +3 -16
  105. package/src/styles/shapes.js +1 -0
  106. package/src/styles/skeleton.js +3 -37
  107. package/src/styles/zoom.js +3 -24
  108. package/src/theme/gv-theme.js +21 -60
  109. package/wc/gv-code-hint.js +1 -0
  110. package/CHANGELOG.md +0 -1244
  111. package/LICENSE.txt +0 -202
  112. package/README.md +0 -195
  113. package/src/.eslintrc.js +0 -19
  114. package/src/theme/definition.json +0 -1762
@@ -20,7 +20,6 @@ import { classMap } from 'lit/directives/class-map';
20
20
  import { dispatchCustomEvent } from '../lib/events';
21
21
  import { ifDefined } from 'lit/directives/if-defined';
22
22
  import { styleMap } from 'lit/directives/style-map';
23
-
24
23
  /**
25
24
  * Option component
26
25
  *
@@ -39,94 +38,47 @@ import { styleMap } from 'lit/directives/style-map';
39
38
  * @cssprop {Length} [--gv-option-button--maw=200px] - Button max width
40
39
  * @cssprop {Length} [--gv-option-icon--s=64px] - Icon size
41
40
  */
41
+
42
42
  export class GvOption extends LitElement {
43
43
  static get properties() {
44
44
  return {
45
- options: { type: Array },
46
- _options: { type: Array, attribute: false },
47
- _hasDescription: { type: Array, attribute: false },
48
- value: { type: String, reflect: true },
49
- multiple: { type: Boolean },
50
- reverse: { type: Boolean },
51
- small: { type: Boolean },
52
- outlined: { type: Boolean },
53
- disabled: { type: Boolean, reflect: true },
45
+ options: {
46
+ type: Array
47
+ },
48
+ _options: {
49
+ type: Array,
50
+ attribute: false
51
+ },
52
+ _hasDescription: {
53
+ type: Array,
54
+ attribute: false
55
+ },
56
+ value: {
57
+ type: String,
58
+ reflect: true
59
+ },
60
+ multiple: {
61
+ type: Boolean
62
+ },
63
+ reverse: {
64
+ type: Boolean
65
+ },
66
+ small: {
67
+ type: Boolean
68
+ },
69
+ outlined: {
70
+ type: Boolean
71
+ },
72
+ disabled: {
73
+ type: Boolean,
74
+ reflect: true
75
+ }
54
76
  };
55
77
  }
56
78
 
57
79
  static get styles() {
58
- return [
59
- // language=CSS
60
- css`
61
- :host {
62
- box-sizing: border-box;
63
- display: inline-block;
64
- --gv-button--p: 5px;
65
- margin: 0.2rem;
66
- --bdrs: var(--gv-option--bdrs, 0.15rem);
67
- --maw: var(--gv-option-button--maw, 200px);
68
- }
69
-
70
- .box.description {
71
- display: grid;
72
- grid-gap: 0.5rem;
73
- }
74
-
75
- gv-button {
76
- margin: 0;
77
- }
78
-
79
- gv-button.description {
80
- flex: 1 1 var(--maw);
81
- max-width: var(--maw);
82
- }
83
-
84
- gv-button:not(.description) {
85
- margin: 0;
86
- --gv-button--bdrs: 0;
87
- --gv-button--bgc: var(--gv-option--bgc, var(--gv-theme-neutral-color-dark, #bfbfbf));
88
- }
89
-
90
- gv-button:not(.description).entry {
91
- --gv-button--bdrs: var(--bdrs) 0 0 var(--bdrs);
92
- }
93
-
94
- gv-button:not(.description).exit {
95
- --gv-button--bdrs: 0 var(--bdrs) var(--bdrs) 0;
96
- }
97
-
98
- .content {
99
- white-space: pre-line;
100
- --gv-icon--s: var(--gv-option-icon--s, 64px);
101
- display: flex;
102
- flex-direction: column;
103
- align-items: center;
104
- height: 100%;
105
- text-transform: none;
106
- }
107
-
108
- gv-image {
109
- height: 64px;
110
- width: 64px;
111
- --gv-image--of: fill;
112
- display: inline-flex;
113
- }
114
-
115
- .reverse .content {
116
- flex-direction: column-reverse;
117
- }
118
-
119
- .title {
120
- font-size: var(--gv-theme-font-size-l, 18px);
121
- font-weight: bold;
122
- margin: 0.5rem 0;
123
- }
124
-
125
- gv-button.description {
126
- margin: 0.5rem;
127
- }
128
- `,
129
- ];
80
+ return [// language=CSS
81
+ css`:host{box-sizing:border-box;display:inline-block;--gv-button--p:5px;margin:.2rem;--bdrs:var(--gv-option--bdrs, 0.15rem);--maw:var(--gv-option-button--maw, 200px)}.box.description{display:grid;grid-gap:.5rem}gv-button{margin:0}gv-button.description{flex:1 1 var(--maw);max-width:var(--maw)}gv-button:not(.description){margin:0;--gv-button--bdrs:0;--gv-button--bgc:var(--gv-option--bgc, var(--gv-theme-neutral-color-dark, #bfbfbf))}gv-button:not(.description).entry{--gv-button--bdrs:var(--bdrs) 0 0 var(--bdrs)}gv-button:not(.description).exit{--gv-button--bdrs:0 var(--bdrs) var(--bdrs) 0}.content{white-space:pre-line;--gv-icon--s:var(--gv-option-icon--s, 64px);display:flex;flex-direction:column;align-items:center;height:100%;text-transform:none}gv-image{height:64px;width:64px;--gv-image--of:fill;display:inline-flex}.reverse .content{flex-direction:column-reverse}.title{font-size:var(--gv-theme-font-size-l,18px);font-weight:700;margin:.5rem 0}gv-button.description{margin:.5rem}`];
130
82
  }
131
83
 
132
84
  constructor() {
@@ -138,11 +90,14 @@ export class GvOption extends LitElement {
138
90
  _onClick(option) {
139
91
  this.setValue(option);
140
92
  dispatchCustomEvent(this, 'select', option);
141
- this.dispatchEvent(new Event('input'), { bubbles: true, cancelable: true });
93
+ this.dispatchEvent(new Event('input'), {
94
+ bubbles: true,
95
+ cancelable: true
96
+ });
142
97
  }
143
98
 
144
99
  async performUpdate() {
145
- this.shadowRoot.querySelectorAll('gv-button').forEach((btn) => btn.performUpdate());
100
+ this.shadowRoot.querySelectorAll('gv-button').forEach(btn => btn.performUpdate());
146
101
  return super.performUpdate();
147
102
  }
148
103
 
@@ -150,7 +105,7 @@ export class GvOption extends LitElement {
150
105
  if (option) {
151
106
  if (this.multiple) {
152
107
  if (this.value.includes(option.id)) {
153
- this.value = this.value.filter((optId) => {
108
+ this.value = this.value.filter(optId => {
154
109
  return optId !== option.id;
155
110
  });
156
111
  } else {
@@ -164,9 +119,9 @@ export class GvOption extends LitElement {
164
119
 
165
120
  set options(options) {
166
121
  if (options) {
167
- Promise.all(options).then((_options) => {
122
+ Promise.all(options).then(_options => {
168
123
  this._options = _options;
169
- this._hasDescription = this._options.find((opt) => opt.description != null) != null;
124
+ this._hasDescription = this._options.find(opt => opt.description != null) != null;
170
125
  });
171
126
  }
172
127
  }
@@ -179,42 +134,19 @@ export class GvOption extends LitElement {
179
134
  return this.value === option.id;
180
135
  }
181
136
  }
137
+
182
138
  return false;
183
139
  }
184
140
 
185
141
  _renderOption(option, index) {
186
142
  const isActive = this.isActive(option);
187
- const outlined = this.outlined || (!isActive && this._hasDescription);
188
- return html`<gv-button
189
- .icon=${ifDefined(!this._hasDescription ? option.icon : null)}
190
- .iconRight=${ifDefined(!option.icon && option.iconRight ? option.iconRight : null)}
191
- .title="${ifDefined(option.title)}"
192
- .primary="${isActive}"
193
- .small="${this.small}"
194
- .disabled="${option.disabled || this.disabled}"
195
- @click="${this._onClick.bind(this, option)}"
196
- .outlined="${outlined}"
197
- class="${classMap({
198
- active: isActive,
199
- entry: index === 0,
200
- exit: index === this._options.length - 1,
201
- description: option.description != null,
202
- })}"
203
- >
204
- ${!this._hasDescription
205
- ? option.title != null
206
- ? option.label || option.title
207
- : ''
208
- : html`<div class="content">
209
- ${option.icon
210
- ? html`<gv-icon shape="${option.icon}"></gv-icon>`
211
- : option.image
212
- ? html`<gv-image src="${option.image}"></gv-image>`
213
- : ''}
214
- <div class="title">${option.title}</div>
215
- <div class="description-content" .innerHTML="${option.description}"></div>
216
- </div>`}
217
- </gv-button>`;
143
+ const outlined = this.outlined || !isActive && this._hasDescription;
144
+ return html`<gv-button .icon="${ifDefined(!this._hasDescription ? option.icon : null)}" .iconRight="${ifDefined(!option.icon && option.iconRight ? option.iconRight : null)}" .title="${ifDefined(option.title)}" .primary="${isActive}" .small="${this.small}" .disabled="${option.disabled || this.disabled}" @click="${this._onClick.bind(this, option)}" .outlined="${outlined}" class="${classMap({
145
+ active: isActive,
146
+ entry: index === 0,
147
+ exit: index === this._options.length - 1,
148
+ description: option.description != null
149
+ })}"> ${!this._hasDescription ? option.title != null ? option.label || option.title : '' : html`<div class="content"> ${option.icon ? html`<gv-icon shape="${option.icon}"></gv-icon>` : option.image ? html`<gv-image src="${option.image}"></gv-image>` : ''} <div class="title">${option.title}</div> <div class="description-content" .innerHTML="${option.description}"></div> </div>`} </gv-button>`;
218
150
  }
219
151
 
220
152
  render() {
@@ -222,21 +154,16 @@ export class GvOption extends LitElement {
222
154
  const classes = {
223
155
  box: true,
224
156
  description: this._hasDescription,
225
- reverse: this.reverse,
157
+ reverse: this.reverse
226
158
  };
227
- return html`<div
228
- class="${classMap(classes)}"
229
- style="${styleMap({ 'grid-template-columns': `repeat(${this._options.length}, auto)` })}"
230
- >
231
- ${repeat(
232
- this._options,
233
- (option) => option,
234
- (option, index) => html`${this._renderOption(option, index)}`,
235
- )}
236
- </div>`;
159
+ return html`<div class="${classMap(classes)}" style="${styleMap({
160
+ 'grid-template-columns': `repeat(${this._options.length}, auto)`
161
+ })}"> ${repeat(this._options, option => option, (option, index) => html`${this._renderOption(option, index)}`)} </div>`;
237
162
  }
163
+
238
164
  return html``;
239
165
  }
240
- }
241
166
 
167
+ }
242
168
  window.customElements.define('gv-option', GvOption);
169
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1vcHRpb24uanMiXSwibmFtZXMiOlsiY3NzIiwiTGl0RWxlbWVudCIsImh0bWwiLCJyZXBlYXQiLCJjbGFzc01hcCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJpZkRlZmluZWQiLCJzdHlsZU1hcCIsIkd2T3B0aW9uIiwicHJvcGVydGllcyIsIm9wdGlvbnMiLCJ0eXBlIiwiQXJyYXkiLCJfb3B0aW9ucyIsImF0dHJpYnV0ZSIsIl9oYXNEZXNjcmlwdGlvbiIsInZhbHVlIiwiU3RyaW5nIiwicmVmbGVjdCIsIm11bHRpcGxlIiwiQm9vbGVhbiIsInJldmVyc2UiLCJzbWFsbCIsIm91dGxpbmVkIiwiZGlzYWJsZWQiLCJzdHlsZXMiLCJjb25zdHJ1Y3RvciIsIl9vbkNsaWNrIiwib3B0aW9uIiwic2V0VmFsdWUiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsInBlcmZvcm1VcGRhdGUiLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJidG4iLCJpbmNsdWRlcyIsImlkIiwiZmlsdGVyIiwib3B0SWQiLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsImZpbmQiLCJvcHQiLCJkZXNjcmlwdGlvbiIsImlzQWN0aXZlIiwiX3JlbmRlck9wdGlvbiIsImluZGV4IiwiaWNvbiIsImljb25SaWdodCIsInRpdGxlIiwiYmluZCIsImFjdGl2ZSIsImVudHJ5IiwiZXhpdCIsImxlbmd0aCIsImxhYmVsIiwiaW1hZ2UiLCJyZW5kZXIiLCJjbGFzc2VzIiwiYm94Iiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFB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QVg7QUE4QkQ7O0FBRURjLEVBQUFBLE1BQU0sR0FBRztBQUNQLFFBQUksS0FBS2pELFFBQVQsRUFBbUI7QUFDakIsWUFBTWtELE9BQU8sR0FBRztBQUNkQyxRQUFBQSxHQUFHLEVBQUUsSUFEUztBQUVkaEIsUUFBQUEsV0FBVyxFQUFFLEtBQUtqQyxlQUZKO0FBR2RNLFFBQUFBLE9BQU8sRUFBRSxLQUFLQTtBQUhBLE9BQWhCO0FBS0EsYUFBT25CLElBQUksZUFDQUUsUUFBUSxDQUFDMkQsT0FBRCxDQURSLFlBRUF4RCxRQUFRLENBQUM7QUFBRSxpQ0FBMEIsVUFBUyxLQUFLTSxRQUFMLENBQWM4QyxNQUFPO0FBQTFELE9BQUQsQ0FGUixNQUlQeEQsTUFBTSxDQUNOLEtBQUtVLFFBREMsRUFFTGUsTUFBRCxJQUFZQSxNQUZOLEVBR04sQ0FBQ0EsTUFBRCxFQUFTdUIsS0FBVCxLQUFtQmpELElBQUksR0FBRyxLQUFLZ0QsYUFBTCxDQUFtQnRCLE1BQW5CLEVBQTJCdUIsS0FBM0IsQ0FBSCxFQUhqQixDQUpDLFNBQVg7QUFVRDs7QUFDRCxXQUFPakQsSUFBSSxFQUFYO0FBQ0Q7O0FBck1zQztBQXdNekMrRCxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLFdBQTdCLEVBQTBDM0QsUUFBMUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtYnV0dG9uJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdCc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwJztcblxuLyoqXG4gKiBPcHRpb24gY29tcG9uZW50XG4gKlxuICogIyMgRGV0YWlsc1xuICogKiBoYXMgQHRoZW1lIGZhY2V0XG4gKlxuICogQGF0dHIge0FycmF5PHtpZCwgdGl0bGUsIGljb24/LCBhY3RpdmU/LCBkZXNjcmlwdGlvbj8sIGxhYmVsP30+fSBvcHRpb25zIC0gQW4gYXJyYXkgb2Ygb3B0aW9ucy5cbiAqIEBhdHRyIHtTdHJpbmd8QXJyYXl9IHZhbHVlIC0gU2VsZWN0ZWQgdmFsdWUgaWQsIGFycmF5IHdpdGggbXVsdGlwbGUgb3B0aW9uIGlkcy5cbiAqIEBhdHRyIHtCb29sZWFufSBtdWx0aXBsZSAtIElmIHRydWUsIGNhbiBjaG9vc2Ugc2V2ZXJhbCBvcHRpb25cbiAqIEBhdHRyIHtCb29sZWFufSByZXZlcnNlIC0gSWYgdHJ1ZSwgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSByZXZlcnNlZC5cbiAqIEBhdHRyIHtCb29sZWFufSBzbWFsbCAtIElmIHRydWUsIHVzZSBzbWFsbCBidXR0b24gZm9yIG9wdGlvbnNcbiAqIEBhdHRyIHtCb29sZWFufSBvdXRsaW5lZCAtIElmIHRydWUsIHVzZSBvdXRsaW5lZCBidXR0b24gZm9yIG9wdGlvbnNcbiAqXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LW9wdGlvbi0tYmdjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItZGFyaywgI2JmYmZiZildIC0gQmFja2dyb3VuZCBjb2xvclxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3Ytb3B0aW9uLS1iZHJzPTAuMTVyZW1dIC0gQm9yZGVyIHJhZGl1c1xuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3Ytb3B0aW9uLWJ1dHRvbi0tbWF3PTIwMHB4XSAtIEJ1dHRvbiBtYXggd2lkdGhcbiAqIEBjc3Nwcm9wIHtMZW5ndGh9IFstLWd2LW9wdGlvbi1pY29uLS1zPTY0cHhdIC0gSWNvbiBzaXplXG4gKi9cbmV4cG9ydCBjbGFzcyBHdk9wdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIF9vcHRpb25zOiB7IHR5cGU6IEFycmF5LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfaGFzRGVzY3JpcHRpb246IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgcmV2ZXJzZTogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICBvdXRsaW5lZDogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgIC0tZ3YtYnV0dG9uLS1wOiA1cHg7XG4gICAgICAgICAgbWFyZ2luOiAwLjJyZW07XG4gICAgICAgICAgLS1iZHJzOiB2YXIoLS1ndi1vcHRpb24tLWJkcnMsIDAuMTVyZW0pO1xuICAgICAgICAgIC0tbWF3OiB2YXIoLS1ndi1vcHRpb24tYnV0dG9uLS1tYXcsIDIwMHB4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3guZGVzY3JpcHRpb24ge1xuICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgICAgZ3JpZC1nYXA6IDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWJ1dHRvbiB7XG4gICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtYnV0dG9uLmRlc2NyaXB0aW9uIHtcbiAgICAgICAgICBmbGV4OiAxIDEgdmFyKC0tbWF3KTtcbiAgICAgICAgICBtYXgtd2lkdGg6IHZhcigtLW1hdyk7XG4gICAgICAgIH1cblxuICAgICAgICBndi1idXR0b246bm90KC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAtLWd2LWJ1dHRvbi0tYmRyczogMDtcbiAgICAgICAgICAtLWd2LWJ1dHRvbi0tYmdjOiB2YXIoLS1ndi1vcHRpb24tLWJnYywgdmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1kYXJrLCAjYmZiZmJmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBndi1idXR0b246bm90KC5kZXNjcmlwdGlvbikuZW50cnkge1xuICAgICAgICAgIC0tZ3YtYnV0dG9uLS1iZHJzOiB2YXIoLS1iZHJzKSAwIDAgdmFyKC0tYmRycyk7XG4gICAgICAgIH1cblxuICAgICAgICBndi1idXR0b246bm90KC5kZXNjcmlwdGlvbikuZXhpdCB7XG4gICAgICAgICAgLS1ndi1idXR0b24tLWJkcnM6IDAgdmFyKC0tYmRycykgdmFyKC0tYmRycykgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250ZW50IHtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1ndi1vcHRpb24taWNvbi0tcywgNjRweCk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW1hZ2Uge1xuICAgICAgICAgIGhlaWdodDogNjRweDtcbiAgICAgICAgICB3aWR0aDogNjRweDtcbiAgICAgICAgICAtLWd2LWltYWdlLS1vZjogZmlsbDtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5yZXZlcnNlIC5jb250ZW50IHtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICAgIH1cblxuICAgICAgICAudGl0bGUge1xuICAgICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZ3YtdGhlbWUtZm9udC1zaXplLWwsIDE4cHgpO1xuICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgICAgIG1hcmdpbjogMC41cmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICBndi1idXR0b24uZGVzY3JpcHRpb24ge1xuICAgICAgICAgIG1hcmdpbjogMC41cmVtO1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIF07XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubXVsdGlwbGUgPSBmYWxzZTtcbiAgICB0aGlzLnJldmVyc2UgPSBmYWxzZTtcbiAgfVxuXG4gIF9vbkNsaWNrKG9wdGlvbikge1xuICAgIHRoaXMuc2V0VmFsdWUob3B0aW9uKTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzZWxlY3QnLCBvcHRpb24pO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JyksIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm1VcGRhdGUoKSB7XG4gICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2d2LWJ1dHRvbicpLmZvckVhY2goKGJ0bikgPT4gYnRuLnBlcmZvcm1VcGRhdGUoKSk7XG4gICAgcmV0dXJuIHN1cGVyLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIHNldFZhbHVlKG9wdGlvbikge1xuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvbi5pZCkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKG9wdElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb3B0SWQgIT09IG9wdGlvbi5pZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIG9wdGlvbi5pZF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb24uaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IG9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBQcm9taXNlLmFsbChvcHRpb25zKS50aGVuKChfb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuX2hhc0Rlc2NyaXB0aW9uID0gdGhpcy5fb3B0aW9ucy5maW5kKChvcHQpID0+IG9wdC5kZXNjcmlwdGlvbiAhPSBudWxsKSAhPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNBY3RpdmUob3B0aW9uKSB7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvbi5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gb3B0aW9uLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfcmVuZGVyT3B0aW9uKG9wdGlvbiwgaW5kZXgpIHtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuaXNBY3RpdmUob3B0aW9uKTtcbiAgICBjb25zdCBvdXRsaW5lZCA9IHRoaXMub3V0bGluZWQgfHwgKCFpc0FjdGl2ZSAmJiB0aGlzLl9oYXNEZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIGh0bWxgPGd2LWJ1dHRvblxuICAgICAgLmljb249JHtpZkRlZmluZWQoIXRoaXMuX2hhc0Rlc2NyaXB0aW9uID8gb3B0aW9uLmljb24gOiBudWxsKX1cbiAgICAgIC5pY29uUmlnaHQ9JHtpZkRlZmluZWQoIW9wdGlvbi5pY29uICYmIG9wdGlvbi5pY29uUmlnaHQgPyBvcHRpb24uaWNvblJpZ2h0IDogbnVsbCl9XG4gICAgICAudGl0bGU9XCIke2lmRGVmaW5lZChvcHRpb24udGl0bGUpfVwiXG4gICAgICAucHJpbWFyeT1cIiR7aXNBY3RpdmV9XCJcbiAgICAgIC5zbWFsbD1cIiR7dGhpcy5zbWFsbH1cIlxuICAgICAgLmRpc2FibGVkPVwiJHtvcHRpb24uZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZH1cIlxuICAgICAgQGNsaWNrPVwiJHt0aGlzLl9vbkNsaWNrLmJpbmQodGhpcywgb3B0aW9uKX1cIlxuICAgICAgLm91dGxpbmVkPVwiJHtvdXRsaW5lZH1cIlxuICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgYWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgZW50cnk6IGluZGV4ID09PSAwLFxuICAgICAgICBleGl0OiBpbmRleCA9PT0gdGhpcy5fb3B0aW9ucy5sZW5ndGggLSAxLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9uLmRlc2NyaXB0aW9uICE9IG51bGwsXG4gICAgICB9KX1cIlxuICAgID5cbiAgICAgICR7IXRoaXMuX2hhc0Rlc2NyaXB0aW9uXG4gICAgICAgID8gb3B0aW9uLnRpdGxlICE9IG51bGxcbiAgICAgICAgICA/IG9wdGlvbi5sYWJlbCB8fCBvcHRpb24udGl0bGVcbiAgICAgICAgICA6ICcnXG4gICAgICAgIDogaHRtbGA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgICAgJHtvcHRpb24uaWNvblxuICAgICAgICAgICAgICA/IGh0bWxgPGd2LWljb24gc2hhcGU9XCIke29wdGlvbi5pY29ufVwiPjwvZ3YtaWNvbj5gXG4gICAgICAgICAgICAgIDogb3B0aW9uLmltYWdlXG4gICAgICAgICAgICAgID8gaHRtbGA8Z3YtaW1hZ2Ugc3JjPVwiJHtvcHRpb24uaW1hZ2V9XCI+PC9ndi1pbWFnZT5gXG4gICAgICAgICAgICAgIDogJyd9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke29wdGlvbi50aXRsZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvbi1jb250ZW50XCIgLmlubmVySFRNTD1cIiR7b3B0aW9uLmRlc2NyaXB0aW9ufVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PmB9XG4gICAgPC9ndi1idXR0b24+YDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucykge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgYm94OiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5faGFzRGVzY3JpcHRpb24sXG4gICAgICAgIHJldmVyc2U6IHRoaXMucmV2ZXJzZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2XG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcChjbGFzc2VzKX1cIlxuICAgICAgICBzdHlsZT1cIiR7c3R5bGVNYXAoeyAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzogYHJlcGVhdCgke3RoaXMuX29wdGlvbnMubGVuZ3RofSwgYXV0bylgIH0pfVwiXG4gICAgICA+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIHRoaXMuX29wdGlvbnMsXG4gICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLFxuICAgICAgICAgIChvcHRpb24sIGluZGV4KSA9PiBodG1sYCR7dGhpcy5fcmVuZGVyT3B0aW9uKG9wdGlvbiwgaW5kZXgpfWAsXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LW9wdGlvbicsIEd2T3B0aW9uKTtcbiJdfQ==