@sbb-esta/lyne-elements-experimental-dev 4.7.0-dev.1773648109 → 4.7.0-dev.1773648663

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 (191) hide show
  1. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +65 -76
  2. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +72 -52
  3. package/autocomplete-grid/autocomplete-grid-button.js +3 -6
  4. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -17
  5. package/autocomplete-grid/autocomplete-grid-cell.js +4 -7
  6. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +20 -21
  7. package/autocomplete-grid/autocomplete-grid-optgroup.js +3 -6
  8. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -33
  9. package/autocomplete-grid/autocomplete-grid-option.js +4 -9
  10. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -22
  11. package/autocomplete-grid/autocomplete-grid-row.js +4 -7
  12. package/autocomplete-grid/autocomplete-grid.js +3 -6
  13. package/autocomplete-grid-cell.component-Dak9wlBr.js +24 -0
  14. package/autocomplete-grid-option.component-DNRFHOwc.js +37 -0
  15. package/autocomplete-grid-row.component-DBHZQ0GQ.js +27 -0
  16. package/autocomplete-grid.js +9 -21
  17. package/autocomplete-grid.pure.js +7 -15
  18. package/core/datetime/date-helper.js +2 -191
  19. package/core/datetime.js +2 -5
  20. package/core/timetable/access-leg-helper.js +76 -71
  21. package/core/timetable/timetable-helper.js +9 -11
  22. package/core/timetable/timetable-properties.js +0 -1
  23. package/core/timetable.js +3 -7
  24. package/date-helper-CGproP5d.js +185 -0
  25. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +114 -122
  26. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +92 -70
  27. package/development/autocomplete-grid/autocomplete-grid-button.js +6 -4
  28. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -29
  29. package/development/autocomplete-grid/autocomplete-grid-cell.js +7 -5
  30. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +27 -22
  31. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +6 -4
  32. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -109
  33. package/development/autocomplete-grid/autocomplete-grid-option.js +7 -7
  34. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -91
  35. package/development/autocomplete-grid/autocomplete-grid-row.js +7 -5
  36. package/development/autocomplete-grid/autocomplete-grid.js +6 -4
  37. package/development/autocomplete-grid-cell.component-BBvM4o2H.js +42 -0
  38. package/development/autocomplete-grid-option.component-QzfM5eIE.js +123 -0
  39. package/development/autocomplete-grid-row.component-H8sCTCkT.js +104 -0
  40. package/development/autocomplete-grid.js +10 -14
  41. package/development/autocomplete-grid.pure.js +4 -13
  42. package/development/core/datetime/date-helper.js +2 -285
  43. package/development/core/datetime.js +2 -6
  44. package/development/core/timetable/access-leg-helper.js +104 -82
  45. package/development/core/timetable/timetable-helper.js +16 -17
  46. package/development/core/timetable/timetable-properties.js +0 -2
  47. package/development/core/timetable.js +3 -8
  48. package/development/date-helper-8_Y-PuHh.js +520 -0
  49. package/development/differenceInMinutes-DN_1Rk3O.js +110 -0
  50. package/development/format-Bbrn2bgo.js +1848 -0
  51. package/development/isValid-C-HzKv4v.js +178 -0
  52. package/development/journey-summary/journey-summary.component.js +2 -288
  53. package/development/journey-summary.component-uGhZvA4p.js +385 -0
  54. package/development/journey-summary.js +8 -5
  55. package/development/journey-summary.pure.js +2 -5
  56. package/development/mapper-hWWm7Uke.js +11454 -0
  57. package/development/pearl-chain/pearl-chain.component.js +2 -634
  58. package/development/pearl-chain-time/pearl-chain-time.component.js +2 -306
  59. package/development/pearl-chain-time.component-B8mayTWD.js +415 -0
  60. package/development/pearl-chain-time.js +8 -5
  61. package/development/pearl-chain-time.pure.js +2 -5
  62. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -28
  63. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -393
  64. package/development/pearl-chain-vertical-item.component-BDzbcIaf.js +435 -0
  65. package/development/pearl-chain-vertical-item.js +8 -5
  66. package/development/pearl-chain-vertical-item.pure.js +2 -5
  67. package/development/pearl-chain-vertical.component-CswE7b3M.js +39 -0
  68. package/development/pearl-chain-vertical.js +8 -5
  69. package/development/pearl-chain-vertical.pure.js +2 -5
  70. package/development/pearl-chain.component-wpsTvoSe.js +704 -0
  71. package/development/pearl-chain.js +8 -5
  72. package/development/pearl-chain.pure.js +2 -5
  73. package/development/seat-reservation/common/mapper/icon-mapper.js +168 -71
  74. package/development/seat-reservation/common/mapper/mapper.js +2 -11429
  75. package/development/seat-reservation/common/mapper.js +2 -9
  76. package/development/seat-reservation/common/svgs.js +2 -46
  77. package/development/seat-reservation/common/translations/i18n.js +1118 -900
  78. package/development/seat-reservation/common/translations.js +1 -4
  79. package/development/seat-reservation/common/types.js +0 -2
  80. package/development/seat-reservation/common.js +8 -12
  81. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1307 -1231
  82. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +2 -862
  83. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -106
  84. package/development/seat-reservation/seat-reservation-area.js +7 -5
  85. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +35 -34
  86. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -162
  87. package/development/seat-reservation/seat-reservation-graphic.js +7 -5
  88. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -713
  89. package/development/seat-reservation/seat-reservation-navigation-coach.js +7 -5
  90. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -131
  91. package/development/seat-reservation/seat-reservation-navigation-services.js +7 -5
  92. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -601
  93. package/development/seat-reservation/seat-reservation-place-control.js +7 -5
  94. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -22
  95. package/development/seat-reservation/seat-reservation-scoped.js +7 -5
  96. package/development/seat-reservation/seat-reservation.js +7 -6
  97. package/development/seat-reservation-area.component-ORuli_DC.js +138 -0
  98. package/development/seat-reservation-graphic.component-lZXqHWIz.js +193 -0
  99. package/development/seat-reservation-navigation-coach.component-D2QXTMJJ.js +828 -0
  100. package/development/seat-reservation-navigation-services.component-Bg1adRlU.js +179 -0
  101. package/development/seat-reservation-place-control.component-CwUX-QYO.js +726 -0
  102. package/development/seat-reservation-scoped.component-uLT33P9y.js +31 -0
  103. package/development/seat-reservation.component-MOv5kHDC.js +821 -0
  104. package/development/seat-reservation.js +16 -29
  105. package/development/seat-reservation.pure.js +11 -29
  106. package/development/svgs-kDpBCto5.js +28 -0
  107. package/development/timetable-duration/timetable-duration.component.js +2 -108
  108. package/development/timetable-duration.component-D21SXsQq.js +125 -0
  109. package/development/timetable-duration.js +8 -5
  110. package/development/timetable-duration.pure.js +2 -5
  111. package/development/timetable-row/timetable-row.component.js +2 -781
  112. package/development/timetable-row.component-Y5w8vEwP.js +932 -0
  113. package/development/timetable-row.js +8 -13
  114. package/development/timetable-row.pure.js +2 -12
  115. package/development/toDate-Biiv3kyf.js +150 -0
  116. package/differenceInMinutes-Dr9gRqtu.js +27 -0
  117. package/format-CM5exOsN.js +1103 -0
  118. package/isValid-B9oVW3lA.js +36 -0
  119. package/journey-summary/journey-summary.component.js +2 -194
  120. package/journey-summary.component-Cq_4kaOp.js +264 -0
  121. package/journey-summary.js +5 -4
  122. package/journey-summary.pure.js +2 -4
  123. package/mapper-DkiDDseD.js +11382 -0
  124. package/package.json +2 -2
  125. package/pearl-chain/pearl-chain.component.js +2 -165
  126. package/pearl-chain-time/pearl-chain-time.component.js +2 -157
  127. package/pearl-chain-time.component-DGDW5S1c.js +239 -0
  128. package/pearl-chain-time.js +5 -4
  129. package/pearl-chain-time.pure.js +2 -4
  130. package/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -17
  131. package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -77
  132. package/pearl-chain-vertical-item.component-G22bWhLU.js +108 -0
  133. package/pearl-chain-vertical-item.js +5 -4
  134. package/pearl-chain-vertical-item.pure.js +2 -4
  135. package/pearl-chain-vertical.component-CXIDT5RD.js +21 -0
  136. package/pearl-chain-vertical.js +5 -4
  137. package/pearl-chain-vertical.pure.js +2 -4
  138. package/pearl-chain.component-DmjkVIva.js +194 -0
  139. package/pearl-chain.js +5 -4
  140. package/pearl-chain.pure.js +2 -4
  141. package/seat-reservation/common/mapper/icon-mapper.js +71 -71
  142. package/seat-reservation/common/mapper/mapper.js +2 -11386
  143. package/seat-reservation/common/mapper.js +3 -9
  144. package/seat-reservation/common/svgs.js +2 -242
  145. package/seat-reservation/common/translations/i18n.js +1084 -891
  146. package/seat-reservation/common/translations.js +2 -4
  147. package/seat-reservation/common/types.js +0 -1
  148. package/seat-reservation/common.js +9 -15
  149. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +834 -812
  150. package/seat-reservation/seat-reservation/seat-reservation.component.js +2 -420
  151. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -51
  152. package/seat-reservation/seat-reservation-area.js +4 -7
  153. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +68 -71
  154. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -75
  155. package/seat-reservation/seat-reservation-graphic.js +4 -7
  156. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -234
  157. package/seat-reservation/seat-reservation-navigation-coach.js +4 -7
  158. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -85
  159. package/seat-reservation/seat-reservation-navigation-services.js +4 -7
  160. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -203
  161. package/seat-reservation/seat-reservation-place-control.js +4 -7
  162. package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -13
  163. package/seat-reservation/seat-reservation-scoped.js +4 -7
  164. package/seat-reservation/seat-reservation.js +5 -9
  165. package/seat-reservation-area.component-COD6CXhP.js +75 -0
  166. package/seat-reservation-graphic.component-BNfU5tQM.js +102 -0
  167. package/seat-reservation-navigation-coach.component-Bh9ILq60.js +333 -0
  168. package/seat-reservation-navigation-services.component-QL0UnilZ.js +127 -0
  169. package/seat-reservation-place-control.component-BfnZUyHv.js +322 -0
  170. package/seat-reservation-scoped.component-CY04BT_4.js +17 -0
  171. package/seat-reservation.component-zrQHTRl3.js +364 -0
  172. package/seat-reservation.js +17 -39
  173. package/seat-reservation.pure.js +15 -32
  174. package/svgs-D5DhLHxC.js +26 -0
  175. package/timetable-duration/timetable-duration.component.js +2 -57
  176. package/timetable-duration.component-DaYoJUGS.js +65 -0
  177. package/timetable-duration.js +5 -4
  178. package/timetable-duration.pure.js +2 -4
  179. package/timetable-row/timetable-row.component.js +2 -427
  180. package/timetable-row.component-BDMAEsbR.js +559 -0
  181. package/timetable-row.js +6 -13
  182. package/timetable-row.pure.js +2 -11
  183. package/toDate-p-Tpkb7t.js +16 -0
  184. package/development/differenceInMinutes-B0dawX-5.js +0 -26
  185. package/development/format-BMkeaqaF.js +0 -1433
  186. package/development/isValid-BYRch7pV.js +0 -53
  187. package/development/toDate-BWb6Z1JD.js +0 -24
  188. package/differenceInMinutes-COvvdYsJ.js +0 -23
  189. package/format-CmKROkbc.js +0 -1186
  190. package/isValid-m3_OsPaB.js +0 -45
  191. package/toDate-Bw2KTWeq.js +0 -15
@@ -1,862 +1,2 @@
1
- import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
2
- import { boxSizingStyles } from "@sbb-esta/lyne-elements/core/styles.js";
3
- import { css, html, nothing, isServer } from "lit";
4
- import { classMap } from "lit/directives/class-map.js";
5
- import { repeat } from "lit/directives/repeat.js";
6
- import { styleMap } from "lit/directives/style-map.js";
7
- import { getI18nSeatReservation } from "../common/translations.js";
8
- import { SbbSeatReservationAreaElement } from "../seat-reservation-area/seat-reservation-area.component.js";
9
- import { SbbSeatReservationGraphicElement } from "../seat-reservation-graphic/seat-reservation-graphic.component.js";
10
- import { SbbSeatReservationNavigationCoachElement } from "../seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js";
11
- import { SbbSeatReservationPlaceControlElement } from "../seat-reservation-place-control/seat-reservation-place-control.component.js";
12
- import { SbbSeatReservationScopedElement } from "../seat-reservation-scoped/seat-reservation-scoped.component.js";
13
- import { SeatReservationBaseElement } from "./seat-reservation-base-element.js";
14
- import "@sbb-esta/lyne-elements/button.js";
15
- import "@sbb-esta/lyne-elements/screen-reader-only.js";
16
- import "@sbb-esta/lyne-elements/popover.js";
17
- const style = css`:host {
18
- --sbb-seat-reservation-grid-size: 16px;
19
- --sbb-seat-reservation-height: 0;
20
- --sbb-seat-reservation-decks: 1;
21
- display: block;
22
- height: inherit;
23
- }
24
- :host ::part(coach-floor) {
25
- fill: var(--sbb-background-color-2);
26
- }
27
- @media (forced-colors: active) {
28
- :host ::part(coach-floor) {
29
- fill: transparent;
30
- }
31
- }
32
-
33
- :host(:dir(rtl)) :not(.sbb-sr-place-ctrl--type-bicycle,
34
- .sbb-sr-place-ctrl--orientation-90,
35
- .sbb-sr-place-ctrl--orientation-270,
36
- .sbb-sr-place-ctrl--state-selected) ::part(coach-floor) {
37
- rotate: calc(180 * 1deg);
38
- }
39
-
40
- [popover]:where(sbb-popover) {
41
- margin: 0;
42
- padding: 0;
43
- border: none;
44
- width: auto;
45
- height: auto;
46
- background-color: transparent;
47
- color: inherit;
48
- pointer-events: none;
49
- }
50
- [popover]:where(sbb-popover) .sbb-sr-popover {
51
- margin-block: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
52
- }
53
-
54
- :host([align-vertical]) .sbb-sr__component {
55
- flex-direction: row-reverse;
56
- justify-content: flex-end;
57
- gap: calc(22 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
58
- height: inherit;
59
- }
60
- @media (min-width: calc(37.5rem)) {
61
- :host([align-vertical]) .sbb-sr__component {
62
- gap: calc(54 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
63
- }
64
- }
65
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation,
66
- :host([align-vertical]) .sbb-sr__component ul.sbb-sr-navigation__list-coaches {
67
- flex-direction: column;
68
- }
69
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation {
70
- padding: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;
71
- }
72
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {
73
- left: calc(1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
74
- top: 0;
75
- rotate: 90deg;
76
- }
77
- @media (min-width: calc(64rem)) {
78
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {
79
- left: calc(-1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
80
- }
81
- }
82
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches {
83
- max-width: initial;
84
- padding: calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
85
- overflow: hidden scroll;
86
- }
87
- :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches li {
88
- display: flex;
89
- }
90
- :host([align-vertical]) .sbb-sr__wrapper-coach-decks {
91
- flex-direction: column;
92
- }
93
- :host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {
94
- flex-direction: column-reverse;
95
- width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
96
- height: initial;
97
- }
98
- :host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {
99
- inline-size: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
100
- block-size: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
101
- margin-bottom: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
102
- rotate: initial;
103
- writing-mode: initial;
104
- }
105
- :host([align-vertical]) .sbb-sr__wrapper-scrollarea {
106
- width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
107
- height: 100%;
108
- overflow: hidden scroll;
109
- }
110
- :host([align-vertical]) .sbb-sr__wrapper-scrollarea .sbb-sr__parent {
111
- rotate: 90deg;
112
- }
113
- :host([align-vertical]) .sbb-sr-travel-direction-wrapper {
114
- width: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
115
- margin-block-start: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
116
- }
117
-
118
- .sbb-sr-navigation {
119
- gap: calc(3 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
120
- }
121
-
122
- .sbb-sr-navigation .sbb-sr__navigation-control-button {
123
- position: relative;
124
- top: calc(2 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
125
- }
126
- @media (min-width: calc(64rem)) {
127
- .sbb-sr-navigation .sbb-sr__navigation-control-button {
128
- top: 0;
129
- }
130
- }
131
-
132
- .sbb-sr__component {
133
- display: flex;
134
- flex-direction: column;
135
- gap: calc(64 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem) - 16px);
136
- }
137
-
138
- .sbb-sr-travel-direction-wrapper {
139
- display: flex;
140
- justify-content: center;
141
- align-items: center;
142
- column-gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
143
- margin-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
144
- font-size: var(--sbb-text-font-size-s);
145
- }
146
- .sbb-sr-travel-direction-wrapper .sbb-sr__travel-direction--arrow {
147
- display: flex;
148
- align-items: center;
149
- }
150
-
151
- .sbb-sr-navigation-wrapper {
152
- display: flex;
153
- }
154
-
155
- .sbb-sr-navigation {
156
- display: flex;
157
- justify-content: center;
158
- width: 100%;
159
- padding-inline: 16px;
160
- }
161
-
162
- .sbb-sr-navigation__list-coaches {
163
- list-style: none;
164
- margin: 0;
165
- padding: 0;
166
- font-size: inherit;
167
- --sbb-scrollbar-thumb-width: 0.125rem;
168
- --sbb-scrollbar-thumb-width-hover: 0.25rem;
169
- --sbb-scrollbar-width-firefox: thin;
170
- --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);
171
- --sbb-scrollbar-color: light-dark(
172
- color-mix(in srgb, var(--sbb-color-black) 30%, transparent),
173
- color-mix(in srgb, var(--sbb-color-white) 30%, transparent)
174
- );
175
- --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);
176
- --sbb-scrollbar-color-hover: light-dark(
177
- color-mix(in srgb, var(--sbb-color-black) 60%, transparent),
178
- color-mix(in srgb, var(--sbb-color-white) 60%, transparent)
179
- );
180
- --sbb-scrollbar-track-color: transparent;
181
- --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);
182
- }
183
- .sbb-sr-navigation__list-coaches::-webkit-scrollbar {
184
- width: var(--sbb-scrollbar-width);
185
- height: var(--sbb-scrollbar-width);
186
- background-color: var(--sbb-scrollbar-track-color, transparent);
187
- }
188
- .sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {
189
- background-color: var(--sbb-scrollbar-track-color, transparent);
190
- }
191
- .sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb {
192
- background-color: var(--sbb-scrollbar-color, currentcolor);
193
- border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;
194
- border-radius: var(--sbb-border-radius-4x);
195
- background-clip: padding-box;
196
- }
197
- .sbb-sr-navigation__list-coaches::-webkit-scrollbar-thumb:hover {
198
- background-color: var(--sbb-scrollbar-color-hover, currentcolor);
199
- border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));
200
- }
201
- .sbb-sr-navigation__list-coaches::-webkit-scrollbar-button, .sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {
202
- display: none;
203
- }
204
- @supports not selector(::-webkit-scrollbar) {
205
- .sbb-sr-navigation__list-coaches {
206
- scrollbar-width: var(--sbb-scrollbar-width-firefox);
207
- scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);
208
- }
209
- }
210
- .sbb-sr-navigation__list-coaches {
211
- display: flex;
212
- flex-wrap: nowrap;
213
- gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
214
- padding: calc(6 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;
215
- max-width: 856px;
216
- --sbb-scrollbar-color: transparent;
217
- overflow: scroll hidden;
218
- position: relative;
219
- }
220
-
221
- .sbb-sr__wrapper-coach-decks {
222
- display: flex;
223
- overflow: hidden;
224
- height: inherit;
225
- }
226
- .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {
227
- display: flex;
228
- justify-content: space-between;
229
- height: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
230
- writing-mode: vertical-lr;
231
- }
232
- .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {
233
- height: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
234
- width: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
235
- margin-block-end: 16px;
236
- rotate: 180deg;
237
- text-align: center;
238
- line-height: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
239
- }
240
-
241
- .sbb-sr__wrapper-scrollarea {
242
- --sbb-scrollbar-thumb-width: 0.125rem;
243
- --sbb-scrollbar-thumb-width-hover: 0.25rem;
244
- --sbb-scrollbar-width-firefox: thin;
245
- --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);
246
- --sbb-scrollbar-color: light-dark(
247
- color-mix(in srgb, var(--sbb-color-black) 30%, transparent),
248
- color-mix(in srgb, var(--sbb-color-white) 30%, transparent)
249
- );
250
- --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);
251
- --sbb-scrollbar-color-hover: light-dark(
252
- color-mix(in srgb, var(--sbb-color-black) 60%, transparent),
253
- color-mix(in srgb, var(--sbb-color-white) 60%, transparent)
254
- );
255
- --sbb-scrollbar-track-color: transparent;
256
- --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);
257
- }
258
- .sbb-sr__wrapper-scrollarea::-webkit-scrollbar {
259
- width: var(--sbb-scrollbar-width);
260
- height: var(--sbb-scrollbar-width);
261
- background-color: var(--sbb-scrollbar-track-color, transparent);
262
- }
263
- .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {
264
- background-color: var(--sbb-scrollbar-track-color, transparent);
265
- }
266
- .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb {
267
- background-color: var(--sbb-scrollbar-color, currentcolor);
268
- border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;
269
- border-radius: var(--sbb-border-radius-4x);
270
- background-clip: padding-box;
271
- }
272
- .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-thumb:hover {
273
- background-color: var(--sbb-scrollbar-color-hover, currentcolor);
274
- border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));
275
- }
276
- .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-button, .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {
277
- display: none;
278
- }
279
- @supports not selector(::-webkit-scrollbar) {
280
- .sbb-sr__wrapper-scrollarea {
281
- scrollbar-width: var(--sbb-scrollbar-width-firefox);
282
- scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);
283
- }
284
- }
285
- .sbb-sr__wrapper-scrollarea {
286
- overflow: scroll hidden;
287
- padding-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
288
- }
289
- .sbb-sr__wrapper-scrollarea .sbb-sr__parent {
290
- display: flex;
291
- flex-direction: column;
292
- position: relative;
293
- }
294
-
295
- .sbb-sr__list-decks {
296
- list-style: none;
297
- margin: 0;
298
- padding: 0;
299
- font-size: inherit;
300
- display: flex;
301
- flex-direction: column;
302
- }
303
-
304
- .sbb-sr__list-decks--gap {
305
- gap: calc(48 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
306
- }
307
-
308
- .sbb-sr__list-item-deck {
309
- position: relative;
310
- }
311
-
312
- .sbb-sr__list-coaches {
313
- list-style: none;
314
- margin: 0;
315
- padding: 0;
316
- font-size: inherit;
317
- display: flex;
318
- gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
319
- }
320
-
321
- .sbb-sr__list-decks:has(.sbb-sr-coach-has-overhanging-elements) .sbb-sr__list-coaches {
322
- gap: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
323
- }
324
-
325
- .sbb-sr__item-coach {
326
- position: relative;
327
- }
328
-
329
- .sbb-sr-coach-wrapper__table {
330
- outline: 0;
331
- }`;
332
- SbbSeatReservationAreaElement.define();
333
- SbbSeatReservationGraphicElement.define();
334
- SbbSeatReservationPlaceControlElement.define();
335
- SbbSeatReservationNavigationCoachElement.define();
336
- SbbSeatReservationScopedElement.define();
337
- const _SbbSeatReservationElement = class _SbbSeatReservationElement extends SeatReservationBaseElement {
338
- constructor() {
339
- super(...arguments);
340
- this._language = new SbbLanguageController(this);
341
- this._notFixedRotatableAreaIcons = ["ENTRY_EXIT"];
342
- }
343
- willUpdate(changedProperties) {
344
- super.willUpdate(changedProperties);
345
- if (changedProperties.has("hasNavigation")) {
346
- if (this.hasNavigation) {
347
- this.shadowRoot?.querySelectorAll("table").forEach((table) => table.removeAttribute("tabindex"));
348
- } else {
349
- this.shadowRoot?.querySelectorAll("table").forEach((table) => table.setAttribute("tabindex", "0"));
350
- }
351
- }
352
- }
353
- firstUpdated(changedProperties) {
354
- super.firstUpdated(changedProperties);
355
- this.updateComplete.then(() => {
356
- this.initNavigationSelectionByScrollEvent();
357
- });
358
- }
359
- render() {
360
- this._initVehicleSeatReservationConstruction();
361
- return this._coachesHtmlTemplate || null;
362
- }
363
- _initVehicleSeatReservationConstruction() {
364
- this._coachesHtmlTemplate = html`
365
- ${this._renderTravelDirection()}
366
- <div class="sbb-sr__component">
367
- ${this._renderNavigation()}
368
- <div
369
- class="sbb-sr__wrapper-coach-decks"
370
- @keydown=${(evt) => this.keyboardSeatmapEventHandling(evt)}
371
- >
372
- <div class="sbb-sr__wrapper-deck-labels">${this._renderDeckLabels()}</div>
373
- <div
374
- @scroll=${() => this.coachAreaScrollend()}
375
- id="sbb-sr__wrapper-scrollarea"
376
- class="sbb-sr__wrapper-scrollarea"
377
- tabindex="-1"
378
- >
379
- <div id="sbb-sr__parent-area" class="sbb-sr__parent">
380
- <ul
381
- class="${classMap({
382
- "sbb-sr__list-decks": true,
383
- "sbb-sr__list-decks--gap": this.hasMultipleDecks
384
- })}"
385
- >
386
- ${this.seatReservations?.map((seatReservation, coachDeckIndex) => {
387
- return html`<li class="sbb-sr__list-item-deck">
388
- <ul class="sbb-sr__list-coaches" role="presentation">
389
- ${this._renderCoaches(seatReservation, coachDeckIndex)}
390
- </ul>
391
- </li>`;
392
- })}
393
- </ul>
394
- </div>
395
- </div>
396
- </div>
397
- </div>
398
- `;
399
- }
400
- _renderDeckLabels() {
401
- if (!this.hasMultipleDecks)
402
- return null;
403
- return this.seatReservations.map((seatReservation) => {
404
- const deckDescription = getI18nSeatReservation(seatReservation.deckCoachLevel, this._language.current);
405
- return html`<b aria-hidden="true">${deckDescription}</b>`;
406
- });
407
- }
408
- _renderNavigationControlButton(btnDirection) {
409
- if (!this.hasNavigation || !this.seatReservations)
410
- return null;
411
- const btnNavigationDirectionId = btnDirection == "DIRECTION_RIGHT" ? "sbb-sr-navigation__wrapper-button-direction--right" : "sbb-sr-navigation__wrapper-button-direction--left";
412
- const btnIcon = btnDirection == "DIRECTION_RIGHT" ? "chevron-small-right-small" : "chevron-small-left-small";
413
- const btnAriaDescription = btnDirection == "DIRECTION_RIGHT" ? getI18nSeatReservation("SEAT_RESERVATION_END", this._language.current) : getI18nSeatReservation("SEAT_RESERVATION_BEGIN", this._language.current);
414
- let btnDisabled = true;
415
- if (btnDirection == "DIRECTION_LEFT" && this.selectedCoachIndex > 0) {
416
- btnDisabled = false;
417
- } else if (btnDirection == "DIRECTION_RIGHT" && this.selectedCoachIndex < this.coachItemDetailsElements.length - 1) {
418
- btnDisabled = false;
419
- }
420
- return html`<div class="sbb-sr-navigation__wrapper-button-direction">
421
- <sbb-secondary-button
422
- @click="${() => this.navigateByDirectionBtn(btnDirection)}"
423
- @focus="${() => this.onFocusNavDirectionButton()}"
424
- id="${btnNavigationDirectionId}"
425
- class="sbb-sr__navigation-control-button"
426
- size="m"
427
- icon-name="${btnIcon}"
428
- type="button"
429
- aria-label="${btnAriaDescription}"
430
- role="button"
431
- .disabledInteractive="${btnDisabled || nothing}"
432
- .disabled="${btnDisabled || nothing}"
433
- ></sbb-secondary-button>
434
- </div>`;
435
- }
436
- _renderTravelDirection() {
437
- if (!this.travelDirection || this.travelDirection === "NONE")
438
- return null;
439
- const labelText = getI18nSeatReservation("SEAT_RESERVATION_TRAVEL_DIRECTION", this._language.current);
440
- const arrowDirection = this.alignVertical ? this.travelDirection === "RIGHT" ? "down" : "up" : this.travelDirection === "RIGHT" ? "right" : "left";
441
- const iconName = `arrow-${arrowDirection}-small`;
442
- return html`<div class="sbb-sr-travel-direction-wrapper">
443
- <div class="sbb-sr__travel-direction--arrow">
444
- <sbb-icon slot="icon" name="${iconName}"></sbb-icon>
445
- </div>
446
- <div class="sbb-sr__travel-direction--label">${labelText}</div>
447
- </div>`;
448
- }
449
- _renderNavigation() {
450
- if (isServer || !this.hasNavigation || !this.seatReservations)
451
- return null;
452
- return html`<div class="sbb-sr-navigation-wrapper">
453
- <nav id="sbb-sr-navigation" class="sbb-sr-navigation">
454
- ${this._renderNavigationControlButton("DIRECTION_LEFT")}
455
- <ul
456
- id="sbb-sr__navigation-list-coaches"
457
- class="sbb-sr-navigation__list-coaches"
458
- aria-label="${getI18nSeatReservation("SEAT_RESERVATION_NAVIGATION", this._language.current)}"
459
- >
460
- ${this.coachItemDetailsElements.map((coachItemDetails, index) => {
461
- return html`<li>
462
- <sbb-seat-reservation-navigation-coach
463
- @selectcoach=${(event) => this._onSelectNavCoach(event)}
464
- @focuscoach=${() => this._onFocusNavCoach()}
465
- @keyup=${(evt) => this.onKeyNavigationNavCoachButton(evt, index)}
466
- index="${index}"
467
- .selected=${this.selectedCoachIndex === index}
468
- .focused=${this.focusedCoachIndex === index}
469
- .hovered=${this.hoveredCoachIndex === index}
470
- .nativeFocusActive=${this.hasSeatReservationNativeFocus}
471
- .coachItemDetails="${coachItemDetails}"
472
- ?vertical="${this.alignVertical}"
473
- ?showTitleInfo="${this.showTitleInfo}"
474
- >
475
- </sbb-seat-reservation-navigation-coach>
476
- </li>`;
477
- })}
478
- </ul>
479
- ${this._renderNavigationControlButton("DIRECTION_RIGHT")}
480
- </nav>
481
- </div>`;
482
- }
483
- /**
484
- *
485
- * @returns
486
- * @param seatReservation
487
- * @param coachDeckIndex
488
- */
489
- _renderCoaches(seatReservation, coachDeckIndex) {
490
- const coaches = JSON.parse(JSON.stringify(seatReservation?.coachItems));
491
- if (!coaches || isServer) {
492
- return null;
493
- }
494
- return coaches.map((coachItem, coachIndex) => {
495
- return html`
496
- <li class="sbb-sr__item-coach">
497
- ${this._renderCoachElement(coachItem, coachIndex, coachDeckIndex, seatReservation.deckCoachIndex)}
498
- </li>
499
- `;
500
- });
501
- }
502
- _renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
503
- const calculatedCoachDimension = this.getCalculatedDimension(coachItem.dimension);
504
- const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
505
- return html`<sbb-seat-reservation-scoped
506
- style=${styleMap({
507
- "--sbb-seat-reservation-scoped-width": calculatedCoachDimension.w,
508
- "--sbb-seat-reservation-scoped-height": calculatedCoachDimension.h
509
- })}
510
- >
511
- ${this._getRenderedCoachBorders(coachItem, coachIndex)}
512
- ${this._getRenderedGraphicalElements(coachItem.graphicElements || [], coachItem.dimension, coachIndex, coachDeckIndex)}
513
- ${this._getRenderedServiceElements(coachIndex, coachDeckIndex, coachItem.serviceElements)}
514
-
515
- <table
516
- @focus=${() => this.onFocusTableCoachAndPreselectPlace(coachIndex)}
517
- id="sbb-sr-coach-${coachIndex}"
518
- class="sbb-sr-coach-wrapper__table"
519
- aria-describedby="sbb-sr-coach-caption-${coachIndex}"
520
- tabindex="-1"
521
- >
522
- <caption id="sbb-sr-coach-caption-${coachIndex}" tabindex="-1">
523
- <sbb-screen-reader-only>${descriptionTableCoachWithServices}</sbb-screen-reader-only>
524
- </caption>
525
- ${this._getRenderedRowPlaces(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
526
- </table>
527
- </sbb-seat-reservation-scoped>`;
528
- }
529
- /**
530
- * @returns Returns the border graphic (COACH_BORDER_MIDDLE) of a coach with calculated border gap and coach width,
531
- * depending on whether the coach is with a driver area or without.
532
- */
533
- _getRenderedCoachBorders(coachItem, coachIndex) {
534
- if (!coachItem.graphicElements)
535
- return null;
536
- const COACH_PASSAGE_WIDTH = 1;
537
- const driverArea = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverArea;
538
- const driverAreaNoVerticalWall = this.coachItemDetailsElements[coachIndex]?.driverAreaElements?.driverAreaNoVerticalWall;
539
- let borderWidth = driverArea ? coachItem.dimension.w - driverArea.dimension.w - COACH_PASSAGE_WIDTH : coachItem.dimension.w - COACH_PASSAGE_WIDTH * 2;
540
- borderWidth *= this.baseGridSize;
541
- const borderHeight = (coachItem.dimension.h + this.coachBorderOffset * 2) * this.baseGridSize;
542
- let borderOffsetX = driverArea && driverArea.position.x === 0 ? driverArea?.dimension.w * this.baseGridSize : this.baseGridSize;
543
- if (driverAreaNoVerticalWall) {
544
- const coachWidth = this.getCalculatedDimension(coachItem.dimension).w;
545
- borderWidth = coachWidth - 2 * (driverAreaNoVerticalWall.dimension.w * this.baseGridSize);
546
- borderOffsetX = driverAreaNoVerticalWall.dimension.w * this.baseGridSize;
547
- }
548
- const currentCoachOverlappingInfo = this.overHangingElementInformation.find((el) => el.coachId === coachItem.id);
549
- if (currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas) {
550
- borderWidth += 2 * this.baseGridSize;
551
- borderOffsetX = 0;
552
- }
553
- return html`
554
- <sbb-seat-reservation-graphic
555
- class="${classMap({
556
- "sbb-sr-coach-has-overhanging-elements": currentCoachOverlappingInfo?.overhangingPlaces || currentCoachOverlappingInfo?.overhangingGraphicAreas || false
557
- })}"
558
- style=${styleMap({
559
- "--sbb-seat-reservation-graphic-width": borderWidth,
560
- "--sbb-seat-reservation-graphic-height": borderHeight,
561
- "--sbb-seat-reservation-graphic-top": this.coachBorderPadding * -1,
562
- "--sbb-seat-reservation-graphic-left": borderOffsetX,
563
- "--sbb-seat-reservation-graphic-position": "absolute"
564
- })}
565
- name="COACH_BORDER_MIDDLE"
566
- ?stretch=${true}
567
- role="presentation"
568
- ></sbb-seat-reservation-graphic>
569
- `;
570
- }
571
- _getRenderedRowPlaces(coach, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
572
- if (!coach.places) {
573
- return null;
574
- }
575
- const tableRowPlaces = {};
576
- for (const place of coach.places) {
577
- if (!tableRowPlaces[place.position.y]) {
578
- tableRowPlaces[place.position.y] = [place];
579
- } else {
580
- tableRowPlaces[place.position.y].push(place);
581
- }
582
- }
583
- return Object.values(tableRowPlaces).map((rowPlaces, index) => {
584
- return html`
585
- <tr id="row-${coachIndex}-${rowPlaces[0].position.y}" data-row-index=${index}>
586
- ${this._getRenderedColumnPlaces(rowPlaces, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
587
- </tr>
588
- `;
589
- }).flatMap((rowTemplate) => rowTemplate);
590
- }
591
- _getRenderedColumnPlaces(places, coachIndex, deckIndex, placeCoachDeckIndex) {
592
- places.sort((placeA, placeB) => Number(placeA.position.x) - Number(placeB.position.x));
593
- const trackPlaceId = coachIndex + "-" + placeCoachDeckIndex;
594
- return html`${repeat(places, (place) => trackPlaceId + "-" + place.number, (place, index) => {
595
- const calculatedDimension = this.getCalculatedDimension(place.dimension);
596
- const calculatedPosition = this.getCalculatedPosition(place.position);
597
- const rotation = place.rotation || 0;
598
- const textRotation = this.alignVertical ? -90 : 0;
599
- const placeId = this.getPlaceElementId(deckIndex, coachIndex, place.number);
600
- return html`
601
- <td
602
- id="cell-${deckIndex}-${coachIndex}-${place.position.y}-${index}"
603
- class="graphical-element"
604
- >
605
- <sbb-seat-reservation-place-control
606
- style=${styleMap({
607
- "--sbb-seat-reservation-place-control-text-scale-value": Math.min(calculatedDimension.w, calculatedDimension.h),
608
- "--sbb-seat-reservation-place-control-width": calculatedDimension.w,
609
- "--sbb-seat-reservation-place-control-height": calculatedDimension.h,
610
- "--sbb-seat-reservation-place-control-top": calculatedPosition.y,
611
- "--sbb-seat-reservation-place-control-left": calculatedPosition.x,
612
- "--sbb-seat-reservation-place-control-rotation": rotation,
613
- "--sbb-seat-reservation-place-control-text-rotation": textRotation
614
- })}
615
- @selectplace=${(selectPlaceEvent) => this._onSelectPlace(selectPlaceEvent)}
616
- exportparts="sbb-sr-place-part"
617
- id=${placeId}
618
- class="seat-reservation-place-control"
619
- text=${place.number}
620
- type=${place.type}
621
- state=${place.state}
622
- travel-direction=${this.travelDirection}
623
- coach-index=${coachIndex}
624
- deck-index=${placeCoachDeckIndex}
625
- data-deck-index=${deckIndex}
626
- .propertyIds=${place.propertyIds}
627
- .preventClick=${this.preventPlaceClick}
628
- ?showTitleInfo="${this.showTitleInfo}"
629
- ></sbb-seat-reservation-place-control>
630
- </td>
631
- `;
632
- })}`;
633
- }
634
- _getRenderedGraphicalElements(graphicalElements, coachDimension, coachIndex, coachDeckIndex) {
635
- if (!graphicalElements)
636
- return null;
637
- return graphicalElements?.map((graphicalElement) => {
638
- const icon = graphicalElement.icon ?? "";
639
- const elementRotation = graphicalElement.rotation || 0;
640
- const isNotFixedRotationGraphicalElement = this._notFixedRotatableAreaIcons.indexOf(graphicalElement.icon) === -1;
641
- const elementFixedRotation = this.alignVertical && isNotFixedRotationGraphicalElement ? elementRotation - 90 : elementRotation;
642
- if (this.notAreaElements.findIndex((notAreaElement) => notAreaElement === icon) > -1) {
643
- return this._getRenderElementWithoutArea(graphicalElement, elementRotation, coachDimension);
644
- }
645
- return this._getRenderElementWithArea(graphicalElement, elementFixedRotation, coachDimension, coachIndex, coachDeckIndex);
646
- });
647
- }
648
- /**
649
- * creates a rendered element with an area component
650
- * @param graphicalElement
651
- * @param rotation
652
- * @param coachDimension
653
- * @param coachIndex used to generate a unique id for the popover trigger
654
- * @param coachDeckIndex used to generate a unique id
655
- * @private
656
- */
657
- _getRenderElementWithArea(graphicalElement, rotation, coachDimension, coachIndex, coachDeckIndex) {
658
- const isNotTableGraphic = graphicalElement.icon?.indexOf("TABLE") === -1;
659
- const areaProperty = graphicalElement.icon && isNotTableGraphic ? graphicalElement.icon : null;
660
- const stretchHeight = this.isElementDirectlyOnBorder(graphicalElement, coachDimension) && areaProperty !== "ENTRY_EXIT";
661
- const ariaLabelForArea = graphicalElement.icon ? getI18nSeatReservation(graphicalElement.icon, this._language.current) : nothing;
662
- const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension, true, stretchHeight);
663
- const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension, true);
664
- const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
665
- let elementMounting = "free";
666
- if (graphicalElement.position.y === this.coachBorderOffset * -1) {
667
- elementMounting = "upper-border";
668
- } else if (graphicalElement.position.y + graphicalElement.dimension.h === coachDimension.h + this.coachBorderOffset) {
669
- elementMounting = "lower-border";
670
- }
671
- if (elementMounting !== "free") {
672
- calculatedPosition.y += elementMounting === "upper-border" ? 2 : 1;
673
- calculatedDimension.h -= 3;
674
- }
675
- return html`
676
- <sbb-seat-reservation-area
677
- id="${triggerId}"
678
- class="${classMap({ "sbb-seat-reservation-area--cursor-pointer": areaProperty !== null })}"
679
- style=${styleMap({
680
- "--sbb-seat-reservation-area-width": calculatedDimension.w,
681
- "--sbb-seat-reservation-area-height": calculatedDimension.h,
682
- "--sbb-seat-reservation-area-top": calculatedPosition.y,
683
- "--sbb-seat-reservation-area-left": calculatedPosition.x
684
- })}
685
- mounting=${elementMounting}
686
- background="dark"
687
- aria-hidden="true"
688
- >
689
- ${areaProperty ? html`
690
- <sbb-seat-reservation-graphic
691
- style=${styleMap({
692
- "--sbb-seat-reservation-graphic-max-width": calculatedDimension.w,
693
- "--sbb-seat-reservation-graphic-height": this.baseGridSize,
694
- "--sbb-seat-reservation-graphic-rotation": rotation
695
- })}
696
- name=${areaProperty}
697
- role="img"
698
- aria-hidden="true"
699
- class="auto-width"
700
- ></sbb-seat-reservation-graphic>
701
- ` : nothing}
702
- </sbb-seat-reservation-area>
703
- ${areaProperty ? this._popover(triggerId, ariaLabelForArea) : nothing}
704
- `;
705
- }
706
- _getRenderElementWithoutArea(graphicalElement, rotation, coachDimension) {
707
- const calculatedDimension = this.getCalculatedDimension(graphicalElement.dimension, coachDimension);
708
- const calculatedPosition = this.getCalculatedPosition(graphicalElement.position, graphicalElement.dimension, coachDimension);
709
- const icon = graphicalElement.icon && graphicalElement.icon.endsWith("DRIVER_AREA") ? graphicalElement.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : graphicalElement.icon;
710
- return html` <sbb-seat-reservation-graphic
711
- style=${styleMap({
712
- "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
713
- "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
714
- "--sbb-seat-reservation-graphic-top": calculatedPosition.y,
715
- "--sbb-seat-reservation-graphic-left": calculatedPosition.x,
716
- "--sbb-seat-reservation-graphic-position": "absolute",
717
- "--sbb-seat-reservation-graphic-rotation": rotation
718
- })}
719
- name=${icon ?? nothing}
720
- aria-hidden="true"
721
- ?stretch=${true}
722
- ></sbb-seat-reservation-graphic>`;
723
- }
724
- _getRenderedServiceElements(coachIndex, coachDeckIndex, serviceElements) {
725
- if (!serviceElements)
726
- return null;
727
- return serviceElements?.map((serviceElement) => {
728
- const titleDescription = serviceElement.icon ? getI18nSeatReservation(serviceElement.icon, this._language.current) : null;
729
- const calculatedDimension = this.getCalculatedDimension(serviceElement.dimension);
730
- const calculatedPosition = this.getCalculatedPosition(serviceElement.position);
731
- const elementRotation = serviceElement.rotation || 0;
732
- const elementFixedRotation = this.alignVertical ? elementRotation - 90 : elementRotation;
733
- const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${calculatedPosition.x}-${calculatedPosition.y}`;
734
- return html`
735
- <sbb-seat-reservation-graphic
736
- id="${triggerId}"
737
- style=${styleMap({
738
- "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
739
- "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
740
- "--sbb-seat-reservation-graphic-top": calculatedPosition.y,
741
- "--sbb-seat-reservation-graphic-left": calculatedPosition.x,
742
- "--sbb-seat-reservation-graphic-position": "absolute",
743
- "--sbb-seat-reservation-graphic-rotation": elementFixedRotation
744
- })}
745
- class="sbb-seat-reservation-graphic--cursor-pointer"
746
- name=${serviceElement.icon ?? nothing}
747
- role="img"
748
- aria-hidden="true"
749
- ></sbb-seat-reservation-graphic>
750
- ${this._popover(triggerId, titleDescription)}
751
- `;
752
- });
753
- }
754
- /**
755
- * Manages the selected place event triggered from the place
756
- * Each selection emits an array of all selected places
757
- * @param selectPlaceEvent
758
- */
759
- _onSelectPlace(selectPlaceEvent) {
760
- const selectedPlace = selectPlaceEvent.detail;
761
- this.preventCoachScrollByPlaceClick = true;
762
- this.isCoachGridFocusable = false;
763
- this.focusedCoachIndex = -1;
764
- if (!this.hasSeatReservationNativeFocus) {
765
- this.hasSeatReservationNativeFocus = true;
766
- }
767
- if (!this.preventPlaceClick) {
768
- this.updateSelectedSeatReservationPlaces(selectedPlace);
769
- this.updateCurrentSelectedPlaceInCoach(selectedPlace);
770
- }
771
- }
772
- _onSelectNavCoach(event) {
773
- const selectedNavCoachIndex = event.detail;
774
- this.isKeyboardNavigation = false;
775
- this.preventCoachScrollByPlaceClick = false;
776
- this.hasSeatReservationNativeFocus = true;
777
- if (selectedNavCoachIndex !== null && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
778
- this.unfocusPlaceElement();
779
- this.scrollToSelectedNavCoach(selectedNavCoachIndex);
780
- } else if (selectedNavCoachIndex === this.currSelectedCoachIndex) {
781
- this.updateCurrentSelectedCoach();
782
- this.preselectPlaceInCoach();
783
- }
784
- this._closePopover();
785
- }
786
- _onFocusNavCoach() {
787
- if (!this.preventCoachScrollByPlaceClick) {
788
- this.preselectPlaceInCoach();
789
- } else {
790
- this.focusPlaceElement(this.currSelectedPlace);
791
- }
792
- this.isAutoScrolling = false;
793
- }
794
- /**
795
- * Creates a popover for extra service information
796
- * @param triggerId
797
- * @param popoverContent
798
- * @private
799
- */
800
- _popover(triggerId, popoverContent) {
801
- return html`
802
- <sbb-popover trigger="${triggerId}" hover-trigger="">
803
- <p class="sbb-text-s sbb-sr-popover">${popoverContent}</p>
804
- </sbb-popover>
805
- `;
806
- }
807
- /**
808
- * trigger to close all opened popovers (normally only one is opened at a time)
809
- * @private
810
- */
811
- _closePopover() {
812
- this.shadowRoot?.querySelectorAll("sbb-popover:is(:state(state-opened),[state--state-opened])").forEach((popover) => popover.close());
813
- }
814
- _getDescriptionTableCoach(coachItem) {
815
- if (coachItem.type === "LOCOMOTIVE_COACH") {
816
- return getI18nSeatReservation("COACH_LOCOMOTIVE", this._language.current);
817
- }
818
- if (!coachItem.places?.length) {
819
- return getI18nSeatReservation("COACH_BLOCKED_TABLE_CAPTION", this._language.current, [
820
- coachItem.id
821
- ]);
822
- }
823
- let tableCoachDescription;
824
- const areaDescriptions = this._getTitleDescriptionListString(coachItem.graphicElements);
825
- const serviceDescriptions = this._getTitleDescriptionListString(coachItem.serviceElements);
826
- tableCoachDescription = getI18nSeatReservation("COACH_TABLE_CAPTION", this._language.current, [
827
- coachItem.id
828
- ]);
829
- if (!this.hasNavigation) {
830
- const freePlaces = this.getAvailableFreePlacesNumFromCoach(coachItem.places);
831
- const freePlacesTxt = getI18nSeatReservation("COACH_AVAILABLE_NUMBER_OF_PLACES", this._language.current, [freePlaces.seats, freePlaces.bicycles]);
832
- tableCoachDescription = tableCoachDescription.concat(". ").concat(freePlacesTxt).concat(". ");
833
- }
834
- if (!!areaDescriptions || !!serviceDescriptions) {
835
- tableCoachDescription += ". " + getI18nSeatReservation("COACH_AVAILABLE_SERVICES", this._language.current) + ": ";
836
- tableCoachDescription += serviceDescriptions + ", " + areaDescriptions + ".";
837
- }
838
- return tableCoachDescription;
839
- }
840
- _getTitleDescriptionListString(descriptionsElements) {
841
- const uniqueDescriptions = [];
842
- return descriptionsElements?.map((descriptionElement) => {
843
- const icon = descriptionElement.icon;
844
- if (!icon)
845
- return null;
846
- const descriptionAlreadyExist = uniqueDescriptions.indexOf(icon) > -1;
847
- const translation = getI18nSeatReservation(descriptionElement.icon, this._language.current);
848
- const isValidDescription = this._notFixedRotatableAreaIcons.indexOf(icon) === -1 && this.notAreaElements.indexOf(icon) === -1;
849
- if (!descriptionAlreadyExist) {
850
- uniqueDescriptions.push(descriptionElement.icon);
851
- }
852
- return !!translation && !descriptionAlreadyExist && isValidDescription ? translation : null;
853
- }).filter((description) => !!description).join(", ");
854
- }
855
- };
856
- _SbbSeatReservationElement.elementName = "sbb-seat-reservation";
857
- _SbbSeatReservationElement.styles = [boxSizingStyles, style];
858
- let SbbSeatReservationElement = _SbbSeatReservationElement;
859
- export {
860
- SbbSeatReservationElement
861
- };
862
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJQb3BvdmVyRWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3BvcG92ZXIuanMnO1xuaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24vdHJhbnNsYXRpb25zLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29hY2hJdGVtLFxuICBDb2FjaEl0ZW1EZXRhaWxzLFxuICBQbGFjZSxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgQmFzZUVsZW1lbnQsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS9zZWF0LXJlc2VydmF0aW9uLWFyZWEuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uTmF2aWdhdGlvbkNvYWNoRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2guY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQvc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9saXQmaW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9idXR0b24uanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcblxuU2JiU2VhdFJlc2VydmF0aW9uQXJlYUVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25OYXZpZ2F0aW9uQ29hY2hFbGVtZW50LmRlZmluZSgpO1xuU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudC5kZWZpbmUoKTtcblxuLyoqXG4gKiBNYWluIGNvbXBvbmVudCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24uXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudCBleHRlbmRzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1zZWF0LXJlc2VydmF0aW9uJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgc3R5bGVdO1xuXG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfY29hY2hlc0h0bWxUZW1wbGF0ZT86IFRlbXBsYXRlUmVzdWx0O1xuXG4gIC8vIEFyZWEgaWNvbnMgdGhhdCBzaG91bGQgbm90IGJlIGZpeGVkIGR1cmluZyByb3RhdGlvbiB3aGVuIHZlcnRpY2FsIG1vZGUgaXMgc2VsZWN0ZWRcbiAgcHJpdmF0ZSBfbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMgPSBbJ0VOVFJZX0VYSVQnXTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hhc05hdmlnYXRpb24nKSkge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgICAgICAuZm9yRWFjaCgodGFibGUpID0+IHRhYmxlLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgICAgICAuZm9yRWFjaCgodGFibGUpID0+IHRhYmxlLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGZpcnN0IHVwZGF0ZSBpcyBjb21wbGV0ZSB0byBpbml0IGRpZmZlcmVudCBIVE1MIGVsZW1lbnQgZGltZW5zaW9uc1xuICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIHRoaXMuX2luaXRWZWhpY2xlU2VhdFJlc2VydmF0aW9uQ29uc3RydWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvYWNoZXNIdG1sVGVtcGxhdGUgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRWZWhpY2xlU2VhdFJlc2VydmF0aW9uQ29uc3RydWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvYWNoZXNIdG1sVGVtcGxhdGUgPSBodG1sYFxuICAgICAgJHt0aGlzLl9yZW5kZXJUcmF2ZWxEaXJlY3Rpb24oKX1cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX2NvbXBvbmVudFwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb24oKX1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzXCJcbiAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldnQpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVsc1wiPiR7dGhpcy5fcmVuZGVyRGVja0xhYmVscygpfTwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBzY3JvbGw9JHsoKSA9PiB0aGlzLmNvYWNoQXJlYVNjcm9sbGVuZCgpfVxuICAgICAgICAgICAgaWQ9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYVwiXG4gICAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzYmItc3JfX3BhcmVudC1hcmVhXCIgY2xhc3M9XCJzYmItc3JfX3BhcmVudFwiPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzLS1nYXAnOiB0aGlzLmhhc011bHRpcGxlRGVja3MsXG4gICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpIGNsYXNzPVwic2JiLXNyX19saXN0LWl0ZW0tZGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNiYi1zcl9fbGlzdC1jb2FjaGVzXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaGVzKHNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNrTGFiZWxzKCk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVEZWNrcykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLm1hcCgoc2VhdFJlc2VydmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkZWNrRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoTGV2ZWwsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGh0bWxgPGIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkZWNrRGVzY3JpcHRpb259PC9iPmA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbihidG5EaXJlY3Rpb246IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24gfHwgIXRoaXMuc2VhdFJlc2VydmF0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJ1xuICAgICAgICA/ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1yaWdodCdcbiAgICAgICAgOiAnc2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvbi0tbGVmdCc7XG4gICAgY29uc3QgYnRuSWNvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgPyAnY2hldnJvbi1zbWFsbC1yaWdodC1zbWFsbCcgOiAnY2hldnJvbi1zbWFsbC1sZWZ0LXNtYWxsJztcbiAgICBjb25zdCBidG5BcmlhRGVzY3JpcHRpb24gPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9FTkQnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ1NFQVRfUkVTRVJWQVRJT05fQkVHSU4nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICBsZXQgYnRuRGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID4gMCkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA8IHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIGJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb25cIj5cbiAgICAgIDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgICBAY2xpY2s9XCIkeygpID0+IHRoaXMubmF2aWdhdGVCeURpcmVjdGlvbkJ0bihidG5EaXJlY3Rpb24pfVwiXG4gICAgICAgIEBmb2N1cz1cIiR7KCkgPT4gdGhpcy5vbkZvY3VzTmF2RGlyZWN0aW9uQnV0dG9uKCl9XCJcbiAgICAgICAgaWQ9XCIke2J0bk5hdmlnYXRpb25EaXJlY3Rpb25JZH1cIlxuICAgICAgICBjbGFzcz1cInNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvblwiXG4gICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgaWNvbi1uYW1lPVwiJHtidG5JY29ufVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtidG5BcmlhRGVzY3JpcHRpb259XCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIC5kaXNhYmxlZEludGVyYWN0aXZlPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICAgIC5kaXNhYmxlZD1cIiR7YnRuRGlzYWJsZWQgfHwgbm90aGluZ31cIlxuICAgICAgPjwvc2JiLXNlY29uZGFyeS1idXR0b24+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclRyYXZlbERpcmVjdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy50cmF2ZWxEaXJlY3Rpb24gfHwgdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdOT05FJykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBsYWJlbFRleHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fVFJBVkVMX0RJUkVDVElPTicsXG4gICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICk7XG5cbiAgICBjb25zdCBhcnJvd0RpcmVjdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdkb3duJ1xuICAgICAgICA6ICd1cCdcbiAgICAgIDogdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdSSUdIVCdcbiAgICAgICAgPyAncmlnaHQnXG4gICAgICAgIDogJ2xlZnQnO1xuXG4gICAgY29uc3QgaWNvbk5hbWUgPSBgYXJyb3ctJHthcnJvd0RpcmVjdGlvbn0tc21hbGxgO1xuXG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93XCI+XG4gICAgICAgIDxzYmItaWNvbiBzbG90PVwiaWNvblwiIG5hbWU9XCIke2ljb25OYW1lfVwiPjwvc2JiLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWxhYmVsXCI+JHtsYWJlbFRleHR9PC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb24td3JhcHBlclwiPlxuICAgICAgPG5hdiBpZD1cInNiYi1zci1uYXZpZ2F0aW9uXCIgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvblwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKCdESVJFQ1RJT05fTEVGVCcpfVxuICAgICAgICA8dWxcbiAgICAgICAgICBpZD1cInNiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXNcIlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX2xpc3QtY29hY2hlc1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICAgICdTRUFUX1JFU0VSVkFUSU9OX05BVklHQVRJT04nLFxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgICApfVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAgIChjb2FjaEl0ZW1EZXRhaWxzOiBDb2FjaEl0ZW1EZXRhaWxzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaFxuICAgICAgICAgICAgICAgICAgQHNlbGVjdGNvYWNoPSR7KGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KSA9PiB0aGlzLl9vblNlbGVjdE5hdkNvYWNoKGV2ZW50KX1cbiAgICAgICAgICAgICAgICAgIEBmb2N1c2NvYWNoPSR7KCkgPT4gdGhpcy5fb25Gb2N1c05hdkNvYWNoKCl9XG4gICAgICAgICAgICAgICAgICBAa2V5dXA9JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLm9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKGV2dCwgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgICAuc2VsZWN0ZWQ9JHt0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuZm9jdXNlZD0ke3RoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmhvdmVyZWQ9JHt0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5uYXRpdmVGb2N1c0FjdGl2ZT0ke3RoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXN9XG4gICAgICAgICAgICAgICAgICAuY29hY2hJdGVtRGV0YWlscz1cIiR7Y29hY2hJdGVtRGV0YWlsc31cIlxuICAgICAgICAgICAgICAgICAgP3ZlcnRpY2FsPVwiJHt0aGlzLmFsaWduVmVydGljYWx9XCJcbiAgICAgICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoPlxuICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9SSUdIVCcpfVxuICAgICAgPC9uYXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQHBhcmFtIHNlYXRSZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoZXMoXG4gICAgc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoZXM6IENvYWNoSXRlbVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXMpKTtcblxuICAgIGlmICghY29hY2hlcyB8fCBpc1NlcnZlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2FjaGVzLm1hcCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxsaSBjbGFzcz1cInNiYi1zcl9faXRlbS1jb2FjaFwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvbGk+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaEl0ZW0uZGltZW5zaW9uKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXMgPSB0aGlzLl9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtKTtcblxuICAgIHJldHVybiBodG1sYDxzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWRcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnOiBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgfSl9XG4gICAgPlxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhjb2FjaEl0ZW0sIGNvYWNoSW5kZXgpfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgICAgICBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzIHx8IFtdLFxuICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKGNvYWNoSW5kZXgsIGNvYWNoRGVja0luZGV4LCBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzKX1cblxuICAgICAgPHRhYmxlXG4gICAgICAgIEBmb2N1cz0keygpID0+IHRoaXMub25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShjb2FjaEluZGV4KX1cbiAgICAgICAgaWQ9XCJzYmItc3ItY29hY2gtJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyLWNvYWNoLXdyYXBwZXJfX3RhYmxlXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAgPGNhcHRpb24gaWQ9XCJzYmItc3ItY29hY2gtY2FwdGlvbi0ke2NvYWNoSW5kZXh9XCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgPC9jYXB0aW9uPlxuICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkUm93UGxhY2VzKGNvYWNoSXRlbSwgY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIHBsYWNlQ29hY2hEZWNrSW5kZXgpfVxuICAgICAgPC90YWJsZT5cbiAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZD5gO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGJvcmRlciBncmFwaGljIChDT0FDSF9CT1JERVJfTUlERExFKSBvZiBhIGNvYWNoIHdpdGggY2FsY3VsYXRlZCBib3JkZXIgZ2FwIGFuZCBjb2FjaCB3aWR0aCxcbiAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvYWNoIGlzIHdpdGggYSBkcml2ZXIgYXJlYSBvciB3aXRob3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBDT0FDSF9QQVNTQUdFX1dJRFRIID0gMTtcbiAgICBjb25zdCBkcml2ZXJBcmVhID0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY29hY2hJbmRleF0/LmRyaXZlckFyZWFFbGVtZW50cz8uZHJpdmVyQXJlYTtcbiAgICBjb25zdCBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwgPVxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY29hY2hJbmRleF0/LmRyaXZlckFyZWFFbGVtZW50cz8uZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsO1xuXG4gICAgbGV0IGJvcmRlcldpZHRoID0gZHJpdmVyQXJlYVxuICAgICAgPyBjb2FjaEl0ZW0uZGltZW5zaW9uLncgLSBkcml2ZXJBcmVhLmRpbWVuc2lvbi53IC0gQ09BQ0hfUEFTU0FHRV9XSURUSFxuICAgICAgOiBjb2FjaEl0ZW0uZGltZW5zaW9uLncgLSBDT0FDSF9QQVNTQUdFX1dJRFRIICogMjtcblxuICAgIC8vbXVsdGlwbHkgd2l0aCBiYXNlIGdyaWQgc2l6ZSBhbHdheXMgZm9yIGFsbCBraW5kIG9mIGJvcmRlcldpZHRoXG4gICAgYm9yZGVyV2lkdGggKj0gdGhpcy5iYXNlR3JpZFNpemU7XG5cbiAgICBjb25zdCBib3JkZXJIZWlnaHQgPSAoY29hY2hJdGVtLmRpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDIpICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgbGV0IGJvcmRlck9mZnNldFggPVxuICAgICAgZHJpdmVyQXJlYSAmJiBkcml2ZXJBcmVhLnBvc2l0aW9uLnggPT09IDBcbiAgICAgICAgPyBkcml2ZXJBcmVhPy5kaW1lbnNpb24udyAqIHRoaXMuYmFzZUdyaWRTaXplXG4gICAgICAgIDogdGhpcy5iYXNlR3JpZFNpemU7XG5cbiAgICAvL3JlY2FsY3VsYXRlIHRoZSBib3JkZXIgd2lkdGggYW5kIG9mZnNldCBpZiB0aGVyZSBpcyBhIGRyaXZlciBhcmVhIHdpdGhvdXQgdmVydGljYWwgd2FsbCBvbiBib3RoIHNpZGVzXG4gICAgaWYgKGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCkge1xuICAgICAgY29uc3QgY29hY2hXaWR0aCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaEl0ZW0uZGltZW5zaW9uKS53O1xuXG4gICAgICAvL3JlY2FsY3VsYXRlZCBib3JkZXJXaWR0aCA9IGNvYWNoV2lkdGggLSAyICogZHJpdmVyIGFyZWEgd2lkdGgsIHNpbmNlIHRoZSBkcml2ZXIgYXJlYSBpcyBvbiBib3RoIHNpZGVzXG4gICAgICBib3JkZXJXaWR0aCA9IGNvYWNoV2lkdGggLSAyICogKGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbC5kaW1lbnNpb24udyAqIHRoaXMuYmFzZUdyaWRTaXplKTtcblxuICAgICAgLy9yZWNhbGN1bGF0ZWQgYm9yZGVyT2Zmc2V0WCA9IGRyaXZlciBhcmVhIHdpZHRoLCBzaW5jZSB0aGUgYm9yZGVyIHN0YXJ0cyBhZnRlciB0aGUgZHJpdmVyIGFyZWEgb24gdGhlIGxlZnQgc2lkZVxuICAgICAgYm9yZGVyT2Zmc2V0WCA9IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbC5kaW1lbnNpb24udyAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbyA9IHRoaXMub3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb24uZmluZChcbiAgICAgIChlbCkgPT4gZWwuY29hY2hJZCA9PT0gY29hY2hJdGVtLmlkLFxuICAgICk7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgb3ZlcmhhbmdpbmcgcGxhY2VzIG9yIGdyYXBoaWNhbCBlbGVtZW50cyB0byBhZGp1c3QgdGhlIGJvcmRlciB3aWR0aCBhbmQgb2Zmc2V0ICsgZ2FwXG4gICAgLy8gV2UgZG8gbm90IGRpZmZlcmVudGlhdGUgd2hldGhlciB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYmUgZG9uZSBvbiBib3RoIHNpZGVzIGFzIHRoaXMgd291bGQgbGVhZCB0byB1bm5lY2Vzc2FyeVxuICAgIC8vIGNvbXBsZXhpdHkuIFNvIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBvbiBvbmUgc2lkZSwgd2UganVzdCBpbmNyZWFzZSB0aGUgY29hY2gtYm9yZGVyIG9uIGJvdGggc2lkZXMuXG4gICAgaWYgKFxuICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ1BsYWNlcyB8fFxuICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhc1xuICAgICkge1xuICAgICAgYm9yZGVyV2lkdGggKz0gMiAqIHRoaXMuYmFzZUdyaWRTaXplOyAvLyB3ZSBpbmNyZWFzZSB0aGUgd2lkdGggYnkgMiBncmlkIHNpemVzIHRvIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBwcm90cnVkZWQgcGxhY2VzIG9uIGJvdGggc2lkZXNcbiAgICAgIGJvcmRlck9mZnNldFggPSAwOyAvLyB3ZSBzdGFydCBhdCAwIHRvIGhhdmUgZW5vdWdoIHNwYWNlIG9uIHRoZSBsZWZ0IHNpZGUgYXMgd2VsbFxuICAgIH1cblxuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgICAnc2JiLXNyLWNvYWNoLWhhcy1vdmVyaGFuZ2luZy1lbGVtZW50cyc6XG4gICAgICAgICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICAgICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzIHx8XG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgfSl9XCJcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGJvcmRlcldpZHRoLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogYm9yZGVySGVpZ2h0LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgKiAtMSxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBib3JkZXJPZmZzZXRYLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICB9KX1cbiAgICAgICAgbmFtZT1cIkNPQUNIX0JPUkRFUl9NSURETEVcIlxuICAgICAgICA/c3RyZXRjaD0ke3RydWV9XG4gICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRSb3dQbGFjZXMoXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIWNvYWNoLnBsYWNlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSByb3dzIHdpdGggdGhlIHBsYWNlcyB0byByZW5kZXIgYSB0YWJsZVxuICAgIGNvbnN0IHRhYmxlUm93UGxhY2VzOiBSZWNvcmQ8bnVtYmVyLCBQbGFjZVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2gucGxhY2VzKSB7XG4gICAgICBpZiAoIXRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldKSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldID0gW3BsYWNlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYmxlUm93UGxhY2VzW3BsYWNlLnBvc2l0aW9uLnldLnB1c2gocGxhY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRhYmxlUm93UGxhY2VzKVxuICAgICAgLm1hcCgocm93UGxhY2VzOiBQbGFjZVtdLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dHIgaWQ9XCJyb3ctJHtjb2FjaEluZGV4fS0ke3Jvd1BsYWNlc1swXS5wb3NpdGlvbi55fVwiIGRhdGEtcm93LWluZGV4PSR7aW5kZXh9PlxuICAgICAgICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICAgICAgICAgICAgcm93UGxhY2VzLFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICAgcGxhY2VDb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgYDtcbiAgICAgIH0pXG4gICAgICAuZmxhdE1hcCgocm93VGVtcGxhdGUpID0+IHJvd1RlbXBsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgIHBsYWNlczogUGxhY2VbXSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgZGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIC8vU29ydHMgZWFjaCBwbGFjZSBieSBpdHMgYXNjZW5kaW5nIHggY29vcmRpbmF0ZVxuICAgIHBsYWNlcy5zb3J0KFxuICAgICAgKHBsYWNlQTogUGxhY2UsIHBsYWNlQjogUGxhY2UpID0+IE51bWJlcihwbGFjZUEucG9zaXRpb24ueCkgLSBOdW1iZXIocGxhY2VCLnBvc2l0aW9uLngpLFxuICAgICk7XG5cbiAgICAvLyBGb3IgcmVuZGVyaW5nIHRoZSBwbGFjZXMgd2l0aGluIGEgdGQgZWxlbWVudCwgaGVyZSB3ZSB1c2UgcmVwZWF0IGRpcmVjdGl2ZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGZvciByZXVzaW5nIGVsZW1lbnRzICh0cmFjayBieSBpZCkuXG4gICAgY29uc3QgdHJhY2tQbGFjZUlkID0gY29hY2hJbmRleCArICctJyArIHBsYWNlQ29hY2hEZWNrSW5kZXg7XG4gICAgcmV0dXJuIGh0bWxgJHtyZXBlYXQoXG4gICAgICBwbGFjZXMsXG4gICAgICAocGxhY2UpID0+IHRyYWNrUGxhY2VJZCArICctJyArIHBsYWNlLm51bWJlcixcbiAgICAgIChwbGFjZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihwbGFjZS5kaW1lbnNpb24pO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihwbGFjZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcGxhY2Uucm90YXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgdGV4dFJvdGF0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsID8gLTkwIDogMDtcbiAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoZGVja0luZGV4LCBjb2FjaEluZGV4LCBwbGFjZS5udW1iZXIpO1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGlkPVwiY2VsbC0ke2RlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke3BsYWNlLnBvc2l0aW9uLnl9LSR7aW5kZXh9XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JhcGhpY2FsLWVsZW1lbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1zY2FsZS12YWx1ZSc6IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtcm90YXRpb24nOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtcm90YXRpb24nOiB0ZXh0Um90YXRpb24sXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBAc2VsZWN0cGxhY2U9JHsoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudCl9XG4gICAgICAgICAgICAgIGV4cG9ydHBhcnRzPVwic2JiLXNyLXBsYWNlLXBhcnRcIlxuICAgICAgICAgICAgICBpZD0ke3BsYWNlSWR9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sXCJcbiAgICAgICAgICAgICAgdGV4dD0ke3BsYWNlLm51bWJlcn1cbiAgICAgICAgICAgICAgdHlwZT0ke3BsYWNlLnR5cGV9XG4gICAgICAgICAgICAgIHN0YXRlPSR7cGxhY2Uuc3RhdGV9XG4gICAgICAgICAgICAgIHRyYXZlbC1kaXJlY3Rpb249JHt0aGlzLnRyYXZlbERpcmVjdGlvbn1cbiAgICAgICAgICAgICAgY29hY2gtaW5kZXg9JHtjb2FjaEluZGV4fVxuICAgICAgICAgICAgICBkZWNrLWluZGV4PSR7cGxhY2VDb2FjaERlY2tJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1kZWNrLWluZGV4PSR7ZGVja0luZGV4fVxuICAgICAgICAgICAgICAucHJvcGVydHlJZHM9JHtwbGFjZS5wcm9wZXJ0eUlkc31cbiAgICAgICAgICAgICAgLnByZXZlbnRDbGljaz0ke3RoaXMucHJldmVudFBsYWNlQ2xpY2t9XG4gICAgICAgICAgICAgID9zaG93VGl0bGVJbmZvPVwiJHt0aGlzLnNob3dUaXRsZUluZm99XCJcbiAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2w+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgYDtcbiAgICAgIH0sXG4gICAgKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRHcmFwaGljYWxFbGVtZW50cyhcbiAgICBncmFwaGljYWxFbGVtZW50czogQmFzZUVsZW1lbnRbXSxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghZ3JhcGhpY2FsRWxlbWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGdyYXBoaWNhbEVsZW1lbnRzPy5tYXAoKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBpY29uID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uID8/ICcnO1xuICAgICAgY29uc3QgZWxlbWVudFJvdGF0aW9uID0gZ3JhcGhpY2FsRWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICAgIHRoaXMuX25vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zLmluZGV4T2YoZ3JhcGhpY2FsRWxlbWVudC5pY29uISkgPT09IC0xO1xuICAgICAgY29uc3QgZWxlbWVudEZpeGVkUm90YXRpb24gPVxuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgJiYgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudFxuICAgICAgICAgID8gZWxlbWVudFJvdGF0aW9uIC0gOTBcbiAgICAgICAgICA6IGVsZW1lbnRSb3RhdGlvbjtcblxuICAgICAgLy9jaGVjayBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIG5vdCBhbiBhcmVhIGVsZW1lbnQsIHNpbmNlIHRoaXMgZWxlbWVudCBpcyBkcmF3biB3aXRob3V0IGFuIGFyZWEgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5ub3RBcmVhRWxlbWVudHMuZmluZEluZGV4KChub3RBcmVhRWxlbWVudCkgPT4gbm90QXJlYUVsZW1lbnQgPT09IGljb24pID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShncmFwaGljYWxFbGVtZW50LCBlbGVtZW50Um90YXRpb24sIGNvYWNoRGltZW5zaW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9nZXRSZW5kZXJFbGVtZW50V2l0aEFyZWEoXG4gICAgICAgIGdyYXBoaWNhbEVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRGaXhlZFJvdGF0aW9uLFxuICAgICAgICBjb2FjaERpbWVuc2lvbixcbiAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZXMgYSByZW5kZXJlZCBlbGVtZW50IHdpdGggYW4gYXJlYSBjb21wb25lbnRcbiAgICogQHBhcmFtIGdyYXBoaWNhbEVsZW1lbnRcbiAgICogQHBhcmFtIHJvdGF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERpbWVuc2lvblxuICAgKiBAcGFyYW0gY29hY2hJbmRleCB1c2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGlkIGZvciB0aGUgcG9wb3ZlciB0cmlnZ2VyXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleCB1c2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGlkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJFbGVtZW50V2l0aEFyZWEoXG4gICAgZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgcm90YXRpb246IG51bWJlcixcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIC8vIGZvciBUQUJMRSwgd2UgdXNlIHRoZSBhcmVhIGNvbXBvbmVudCBpdHNlbGYgdG8gZGlzcGxheSB0aGUgdGFibGUgaW5zdGVhZCBvZiB0aGUgU1ZHIGdyYXBoaWMuXG4gICAgLy8gRHVlIHRvIGRpZmZlcmVudCBoZWlnaHRzIGFuZCB3aWR0aHMsIGl0IHdvdWxkbid0IHNob3cgY29ycmVjdGx5LiBUbyBjb3JyZWN0IHRoaXMsIHdlIHdvdWxkXG4gICAgLy8gbmVlZCBkaWZmaWN1bHQgY2FsY3VsYXRpb25zIGZvciBwb3NpdGlvbiwgcm90YXRpb24gYW5kIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvbj8uaW5kZXhPZignVEFCTEUnKSA9PT0gLTE7XG4gICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uIDogbnVsbDtcbiAgICBjb25zdCBzdHJldGNoSGVpZ2h0ID1cbiAgICAgIHRoaXMuaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihncmFwaGljYWxFbGVtZW50LCBjb2FjaERpbWVuc2lvbikgJiZcbiAgICAgIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuICAgIGNvbnN0IGFyaWFMYWJlbEZvckFyZWEgPSBncmFwaGljYWxFbGVtZW50Lmljb25cbiAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihncmFwaGljYWxFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICA6IG5vdGhpbmc7XG5cbiAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICAgIHRydWUsXG4gICAgICBzdHJldGNoSGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnl9YDtcbiAgICBsZXQgZWxlbWVudE1vdW50aW5nID0gJ2ZyZWUnO1xuXG4gICAgaWYgKGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24ueSA9PT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIC0xKSB7XG4gICAgICBlbGVtZW50TW91bnRpbmcgPSAndXBwZXItYm9yZGVyJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ICsgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24uaCA9PT1cbiAgICAgIGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0XG4gICAgKSB7XG4gICAgICBlbGVtZW50TW91bnRpbmcgPSAnbG93ZXItYm9yZGVyJztcbiAgICB9XG5cbiAgICAvLyBUSU1PLTQ1ODMwXG4gICAgLy8gSWYgYXJlYSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhdCB0aGUgYm9yZGVyIG9mIGNvYWNoLFxuICAgIC8vIHdlIGhhdmUgdG8gbWFudWFsbHkgbW9kaWZ5IHRoZSBwb3NpdGlvbiBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGVsZW1lbnQsXG4gICAgLy8gc28gdGhhdCB3ZSBnZXQgYSBnYXAgZnJvbSB0aGUgdmlzdWVsIGNvYWNoIGJvcmRlclxuICAgIGlmIChlbGVtZW50TW91bnRpbmcgIT09ICdmcmVlJykge1xuICAgICAgY2FsY3VsYXRlZFBvc2l0aW9uLnkgKz0gZWxlbWVudE1vdW50aW5nID09PSAndXBwZXItYm9yZGVyJyA/IDIgOiAxO1xuICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi5oIC09IDM7XG4gICAgfVxuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWFcbiAgICAgICAgaWQ9XCIke3RyaWdnZXJJZH1cIlxuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoeyAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS0tY3Vyc29yLXBvaW50ZXInOiBhcmVhUHJvcGVydHkgIT09IG51bGwgfSl9XCJcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICB9KX1cbiAgICAgICAgbW91bnRpbmc9JHtlbGVtZW50TW91bnRpbmd9XG4gICAgICAgIGJhY2tncm91bmQ9XCJkYXJrXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgJHthcmVhUHJvcGVydHlcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLW1heC13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogdGhpcy5iYXNlR3JpZFNpemUsXG4gICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgbmFtZT0ke2FyZWFQcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXV0by13aWR0aFwiXG4gICAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhPlxuICAgICAgJHthcmVhUHJvcGVydHkgPyB0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgYXJpYUxhYmVsRm9yQXJlYSkgOiBub3RoaW5nfVxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJFbGVtZW50V2l0aG91dEFyZWEoXG4gICAgZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgcm90YXRpb246IG51bWJlcixcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG4gICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICApO1xuXG4gICAgLy8gSWYgdGhlIGljb24gaXMgdGhlIGRyaXZlciBhcmVhLCB0aGVuIGhlcmUgY29uY2F0IHRoZSB2ZWhpY2xlIHR5cGUgdG8gZ2V0IHRoZSByaWdodCB2ZWhpY2xlIGNoYXNzaXMgaWNvblxuICAgIGNvbnN0IGljb24gPVxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5pY29uICYmIGdyYXBoaWNhbEVsZW1lbnQuaWNvbi5lbmRzV2l0aCgnRFJJVkVSX0FSRUEnKVxuICAgICAgICA/IGdyYXBoaWNhbEVsZW1lbnQuaWNvbj8uY29uY2F0KFxuICAgICAgICAgICAgJ18nLFxuICAgICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS52ZWhpY2xlVHlwZSxcbiAgICAgICAgICApXG4gICAgICAgIDogZ3JhcGhpY2FsRWxlbWVudC5pY29uO1xuXG4gICAgcmV0dXJuIGh0bWxgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgfSl9XG4gICAgICBuYW1lPSR7aWNvbiA/PyBub3RoaW5nfVxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPmA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFNlcnZpY2VFbGVtZW50cyhcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBzZXJ2aWNlRWxlbWVudHM/OiBCYXNlRWxlbWVudFtdLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFzZXJ2aWNlRWxlbWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50cz8ubWFwKChzZXJ2aWNlRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihzZXJ2aWNlRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHNlcnZpY2VFbGVtZW50LmRpbWVuc2lvbik7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBzZXJ2aWNlRWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgZWxlbWVudEZpeGVkUm90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyBlbGVtZW50Um90YXRpb24gLSA5MCA6IGVsZW1lbnRSb3RhdGlvbjtcblxuICAgICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuXG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiBlbGVtZW50Rml4ZWRSb3RhdGlvbixcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBjbGFzcz1cInNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBuYW1lPSR7c2VydmljZUVsZW1lbnQuaWNvbiA/PyBub3RoaW5nfVxuICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICR7dGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIHRpdGxlRGVzY3JpcHRpb24pfVxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2VzIHRoZSBzZWxlY3RlZCBwbGFjZSBldmVudCB0cmlnZ2VyZWQgZnJvbSB0aGUgcGxhY2VcbiAgICogRWFjaCBzZWxlY3Rpb24gZW1pdHMgYW4gYXJyYXkgb2YgYWxsIHNlbGVjdGVkIHBsYWNlc1xuICAgKiBAcGFyYW0gc2VsZWN0UGxhY2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlID0gc2VsZWN0UGxhY2VFdmVudC5kZXRhaWw7XG4gICAgLy8gV2UgaGF2ZSB0byBzZXQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrIHRvIHRydWUsIHRvIHByZXZlbnQgYXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgbmV3IGZvY3VzZWQgcGxhY2VcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IHRydWU7XG4gICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAvLyBDaGVjayBhbnkga2V5Ym9hcmQgZXZlbnQgd2FzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50LFxuICAgIC8vIHNvIHdlIGNhbiBzYXkgdGhlIG5hdGl2ZSBicm93c2VyIGZvY3VzIGxpZXMgb24gdGhlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cykge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICAvLyBBZGQgcGxhY2UgdG8gcGxhY2UgY29sbGVjdGlvblxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhzZWxlY3RlZFBsYWNlKTtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHNlbGVjdGVkUGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0TmF2Q29hY2goZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZE5hdkNvYWNoSW5kZXggPSBldmVudC5kZXRhaWw7XG5cbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcblxuICAgIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IG51bGwgJiYgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cblxuICAgIC8vY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVyc1xuICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Gb2N1c05hdkNvYWNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcG9wb3ZlciBmb3IgZXh0cmEgc2VydmljZSBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gdHJpZ2dlcklkXG4gICAqIEBwYXJhbSBwb3BvdmVyQ29udGVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcG9wb3ZlcihcbiAgICB0cmlnZ2VySWQ6IHN0cmluZyxcbiAgICBwb3BvdmVyQ29udGVudDogc3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBub3RoaW5nLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXBvcG92ZXIgdHJpZ2dlcj1cIiR7dHJpZ2dlcklkfVwiIGhvdmVyLXRyaWdnZXI9XCJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzYmItdGV4dC1zIHNiYi1zci1wb3BvdmVyXCI+JHtwb3BvdmVyQ29udGVudH08L3A+XG4gICAgICA8L3NiYi1wb3BvdmVyPlxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlciB0byBjbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzIChub3JtYWxseSBvbmx5IG9uZSBpcyBvcGVuZWQgYXQgYSB0aW1lKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfY2xvc2VQb3BvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsPFNiYlBvcG92ZXJFbGVtZW50Pignc2JiLXBvcG92ZXI6c3RhdGUoc3RhdGUtb3BlbmVkKScpXG4gICAgICAuZm9yRWFjaCgocG9wb3ZlcikgPT4gcG9wb3Zlci5jbG9zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW06IENvYWNoSXRlbSk6IHN0cmluZyB7XG4gICAgLy9zaG93IGRpZmZlcmVudCB0YWJsZSBjYXB0aW9uIGZvciBzY3JlZW5yZWFkZXIgaWYgaXQgaXMgYSBsb2NvbW90aXZlXG4gICAgaWYgKGNvYWNoSXRlbS50eXBlID09PSAnTE9DT01PVElWRV9DT0FDSCcpIHtcbiAgICAgIHJldHVybiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9MT0NPTU9USVZFJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2FjaEl0ZW0ucGxhY2VzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9CTE9DS0VEX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUNvYWNoRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb25zdCBhcmVhRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cyEpO1xuICAgIGNvbnN0IHNlcnZpY2VEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzISk7XG5cbiAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgY29hY2hJdGVtLmlkLFxuICAgIF0pO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIC8vIEV4cGFuZHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgc2VhdHMgYW5kIGJpY3ljbGUgc3BhY2VzIGFzIGluZm9cbiAgICAgIGNvbnN0IGZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2hJdGVtLnBsYWNlcyk7XG4gICAgICBjb25zdCBmcmVlUGxhY2VzVHh0ID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgJ0NPQUNIX0FWQUlMQUJMRV9OVU1CRVJfT0ZfUExBQ0VTJyxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgW2ZyZWVQbGFjZXMuc2VhdHMsIGZyZWVQbGFjZXMuYmljeWNsZXNdLFxuICAgICAgKTtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IHRhYmxlQ29hY2hEZXNjcmlwdGlvbi5jb25jYXQoJy4gJykuY29uY2F0KGZyZWVQbGFjZXNUeHQpLmNvbmNhdCgnLiAnKTtcbiAgICB9XG5cbiAgICBpZiAoISFhcmVhRGVzY3JpcHRpb25zIHx8ICEhc2VydmljZURlc2NyaXB0aW9ucykge1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9XG4gICAgICAgICcuICcgKyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9BVkFJTEFCTEVfU0VSVklDRVMnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KSArICc6ICc7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz0gc2VydmljZURlc2NyaXB0aW9ucyArICcsICcgKyBhcmVhRGVzY3JpcHRpb25zICsgJy4nO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGVDb2FjaERlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoZGVzY3JpcHRpb25zRWxlbWVudHM6IEJhc2VFbGVtZW50W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIHJldHVybiBkZXNjcmlwdGlvbnNFbGVtZW50c1xuICAgICAgPy5tYXAoKGRlc2NyaXB0aW9uRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpY29uID0gZGVzY3JpcHRpb25FbGVtZW50Lmljb247XG4gICAgICAgIGlmICghaWNvbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgPSB1bmlxdWVEZXNjcmlwdGlvbnMuaW5kZXhPZihpY29uKSA+IC0xO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50Lmljb24hLFxuICAgICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWREZXNjcmlwdGlvbiA9XG4gICAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihpY29uKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmRleE9mKGljb24pID09PSAtMTtcblxuICAgICAgICBpZiAoIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0KSB7XG4gICAgICAgICAgdW5pcXVlRGVzY3JpcHRpb25zLnB1c2goZGVzY3JpcHRpb25FbGVtZW50Lmljb24hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0cmFuc2xhdGlvbiAmJiAhZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgJiYgaXNWYWxpZERlc2NyaXB0aW9uID8gdHJhbnNsYXRpb24gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGRlc2NyaXB0aW9uKSA9PiAhIWRlc2NyaXB0aW9uKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uJzogU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsOEJBQThCLE9BQUE7QUFDOUIsaUNBQWlDLE9BQUE7QUFDakMsc0NBQXNDLE9BQUE7QUFDdEMseUNBQXlDLE9BQUE7QUFDekMsZ0NBQWdDLE9BQUE7QUFNMUIsTUFBTyw2QkFBUCxNQUFPLG1DQUFrQywyQkFBMEI7QUFBQSxFQUF6RSxjQUFBOztBQUlVLFNBQUEsWUFBWSxJQUFJLHNCQUFzQixJQUFJO0FBSTFDLFNBQUEsOEJBQThCLENBQUMsWUFBWTtBQUFBLEVBOHdCckQ7QUFBQSxFQTV3QnFCLFdBQVcsbUJBQXVDO0FBQ25FLFVBQU0sV0FBVyxpQkFBaUI7QUFFbEMsUUFBSSxrQkFBa0IsSUFBSSxlQUFlLEdBQUc7QUFDMUMsVUFBSSxLQUFLLGVBQWU7QUFDdEIsYUFBSyxZQUNELGlCQUFpQixPQUFPLEVB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
1
+ import { t as SbbSeatReservationElement } from "../../seat-reservation.component-MOv5kHDC.js";
2
+ export { SbbSeatReservationElement };