@sbb-esta/lyne-elements-experimental 5.0.0-next → 5.0.0-next.2

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 (153) hide show
  1. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +2 -1
  2. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +18 -18
  3. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  4. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  5. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  6. package/{autocomplete-grid-cell.component-BFzREPWp.js → autocomplete-grid-cell.component-DAsWZlTn.js} +6 -6
  7. package/{autocomplete-grid-option.component-DhmoLeEw.js → autocomplete-grid-option.component-iEj9qreq.js} +9 -9
  8. package/{autocomplete-grid-row.component-BQxCxOI6.js → autocomplete-grid-row.component-VbyYP0U-.js} +7 -7
  9. package/autocomplete-grid.js +3 -3
  10. package/autocomplete-grid.pure.js +3 -3
  11. package/custom-elements.json +309 -188
  12. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +3 -2
  13. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  14. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +3 -3
  15. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts.map +1 -1
  16. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  17. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  18. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  19. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts.map +1 -1
  20. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  21. package/development/autocomplete-grid-cell.component-BF8i4388.js +33 -0
  22. package/development/{autocomplete-grid-option.component-B4SXR9_v.js → autocomplete-grid-option.component-BQwwanAf.js} +3 -3
  23. package/development/{autocomplete-grid-row.component-CY4UDuuj.js → autocomplete-grid-row.component-CBHh50jC.js} +3 -3
  24. package/development/autocomplete-grid.js +4 -4
  25. package/development/autocomplete-grid.pure.js +3 -3
  26. package/development/date-helper-DGz-ztQM.js +1 -1
  27. package/development/format-DFx4997p.js +1 -1
  28. package/development/journey-summary/journey-summary.component.d.ts.map +1 -1
  29. package/development/journey-summary/journey-summary.component.js +1 -1
  30. package/development/journey-summary.component-De1ioDRq.js +341 -0
  31. package/development/journey-summary.js +1 -1
  32. package/development/journey-summary.pure.js +1 -1
  33. package/development/pearl-chain/pearl-chain.component.d.ts.map +1 -1
  34. package/development/pearl-chain/pearl-chain.component.js +1 -1
  35. package/development/pearl-chain-time/pearl-chain-time.component.d.ts.map +1 -1
  36. package/development/pearl-chain-time/pearl-chain-time.component.js +1 -1
  37. package/development/{pearl-chain-time.component-DDnGnI77.js → pearl-chain-time.component-BxVQ1z-Z.js} +4 -4
  38. package/development/pearl-chain-time.js +1 -1
  39. package/development/pearl-chain-time.pure.js +1 -1
  40. package/development/pearl-chain-vertical/pearl-chain-vertical.component.d.ts.map +1 -1
  41. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  42. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.d.ts.map +1 -1
  43. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  44. package/development/{pearl-chain-vertical-item.component-CRh0l20F.js → pearl-chain-vertical-item.component-DJioJtxP.js} +4 -4
  45. package/development/pearl-chain-vertical-item.js +1 -1
  46. package/development/pearl-chain-vertical-item.pure.js +1 -1
  47. package/development/pearl-chain-vertical.component-zSOeIkhh.js +30 -0
  48. package/development/pearl-chain-vertical.js +1 -1
  49. package/development/pearl-chain-vertical.pure.js +1 -1
  50. package/development/{pearl-chain.component-Dl2RvtJo.js → pearl-chain.component-B83OsEx8.js} +5 -5
  51. package/development/pearl-chain.js +1 -1
  52. package/development/pearl-chain.pure.js +1 -1
  53. package/development/seat-reservation/common/translations/i18n.d.ts.map +1 -1
  54. package/development/seat-reservation/common/translations/i18n.js +1 -1
  55. package/development/seat-reservation/common/types.d.ts +3 -4
  56. package/development/seat-reservation/common/types.d.ts.map +1 -1
  57. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +39 -8
  58. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  59. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +143 -32
  60. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -13
  61. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  62. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  63. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.d.ts.map +1 -1
  64. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  65. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.d.ts.map +1 -1
  66. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  67. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
  68. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  69. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.d.ts.map +1 -1
  70. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  71. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +1 -1
  72. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
  73. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  74. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.d.ts.map +1 -1
  75. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  76. package/development/seat-reservation-area.component-CMqjbUtV.js +94 -0
  77. package/development/seat-reservation-graphic.component-C2r57590.js +129 -0
  78. package/development/{seat-reservation-navigation-coach.component-DRCcI2ss.js → seat-reservation-navigation-coach.component-BwLbiHCG.js} +8 -8
  79. package/development/{seat-reservation-navigation-services.component-ZNm77ZG-.js → seat-reservation-navigation-services.component-Do8JLJh3.js} +8 -6
  80. package/development/{seat-reservation-place-control.component-QF_px_in.js → seat-reservation-place-control.component-BfuOGZYq.js} +7 -7
  81. package/development/{seat-reservation-scoped.component-X-Kq0-w5.js → seat-reservation-scoped.component-D-Mvw-Q3.js} +3 -3
  82. package/development/seat-reservation.component-B2nJ13F1.js +472 -0
  83. package/development/seat-reservation.js +8 -8
  84. package/development/seat-reservation.pure.js +7 -7
  85. package/development/svgs-kDpBCto5.js +1 -1
  86. package/development/timetable-duration/timetable-duration.component.d.ts.map +1 -1
  87. package/development/timetable-duration/timetable-duration.component.js +1 -1
  88. package/development/timetable-duration.component-fBla8Kue.js +96 -0
  89. package/development/timetable-duration.js +1 -1
  90. package/development/timetable-duration.pure.js +1 -1
  91. package/development/timetable-row/timetable-row.component.d.ts +1 -1
  92. package/development/timetable-row/timetable-row.component.d.ts.map +1 -1
  93. package/development/timetable-row/timetable-row.component.js +1 -1
  94. package/development/timetable-row.component-C9Y9Rev1.js +732 -0
  95. package/development/timetable-row.js +1 -1
  96. package/development/timetable-row.pure.js +1 -1
  97. package/development/toDate-DOFAOjP-.js +1 -1
  98. package/journey-summary/journey-summary.component.js +1 -1
  99. package/{journey-summary.component-C7WPKx8k.js → journey-summary.component-CkDRawn9.js} +53 -54
  100. package/journey-summary.js +1 -1
  101. package/journey-summary.pure.js +1 -1
  102. package/package.json +2 -2
  103. package/pearl-chain/pearl-chain.component.js +1 -1
  104. package/pearl-chain-time/pearl-chain-time.component.js +1 -1
  105. package/{pearl-chain-time.component-awU4lFdO.js → pearl-chain-time.component-D5OCEBJ_.js} +11 -11
  106. package/pearl-chain-time.js +1 -1
  107. package/pearl-chain-time.pure.js +1 -1
  108. package/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  109. package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  110. package/{pearl-chain-vertical-item.component-BynmUBXa.js → pearl-chain-vertical-item.component-IdquCJMy.js} +28 -28
  111. package/pearl-chain-vertical-item.js +1 -1
  112. package/pearl-chain-vertical-item.pure.js +1 -1
  113. package/{pearl-chain-vertical.component-Lx47SlJU.js → pearl-chain-vertical.component-CDOWaup3.js} +6 -6
  114. package/pearl-chain-vertical.js +1 -1
  115. package/pearl-chain-vertical.pure.js +1 -1
  116. package/{pearl-chain.component-BAtmfmpA.js → pearl-chain.component-C6lcD7Xl.js} +5 -5
  117. package/pearl-chain.js +1 -1
  118. package/pearl-chain.pure.js +1 -1
  119. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +130 -77
  120. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  121. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  122. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  123. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  124. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  125. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  126. package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  127. package/seat-reservation-area.component-BcmwKJSK.js +73 -0
  128. package/seat-reservation-graphic.component-C3wc4DKr.js +102 -0
  129. package/{seat-reservation-navigation-coach.component-CGfmiQJq.js → seat-reservation-navigation-coach.component-D1SgS8BU.js} +51 -51
  130. package/{seat-reservation-navigation-services.component-DQviLWvy.js → seat-reservation-navigation-services.component-CfAQa7pa.js} +29 -27
  131. package/{seat-reservation-place-control.component-BYJi6aYS.js → seat-reservation-place-control.component-DrzEDW8Z.js} +42 -42
  132. package/{seat-reservation-scoped.component-CdB7HYzl.js → seat-reservation-scoped.component-BohQUGVW.js} +6 -6
  133. package/{seat-reservation.component-DBtJhrR_.js → seat-reservation.component-CB2IWgM9.js} +84 -88
  134. package/seat-reservation.js +7 -7
  135. package/seat-reservation.pure.js +7 -7
  136. package/timetable-duration/timetable-duration.component.js +1 -1
  137. package/{timetable-duration.component-PmvoOKVw.js → timetable-duration.component-DPRcG1LP.js} +7 -7
  138. package/timetable-duration.js +1 -1
  139. package/timetable-duration.pure.js +1 -1
  140. package/timetable-row/timetable-row.component.js +1 -1
  141. package/{timetable-row.component-BnmrhD2d.js → timetable-row.component-BqIVlISS.js} +34 -34
  142. package/timetable-row.js +1 -1
  143. package/timetable-row.pure.js +1 -1
  144. package/development/autocomplete-grid-cell.component-Buvsof-Y.js +0 -33
  145. package/development/journey-summary.component-B9P1PAJv.js +0 -342
  146. package/development/pearl-chain-vertical.component-Cmc3QXgd.js +0 -30
  147. package/development/seat-reservation-area.component-BQEtJhk0.js +0 -94
  148. package/development/seat-reservation-graphic.component-XpqxL5nq.js +0 -129
  149. package/development/seat-reservation.component-C-ttTPW5.js +0 -515
  150. package/development/timetable-duration.component-2JBYobDt.js +0 -96
  151. package/development/timetable-row.component-Binmks-o.js +0 -732
  152. package/seat-reservation-area.component-CVc6uuMG.js +0 -73
  153. package/seat-reservation-graphic.component-Dzkv9tyR.js +0 -102
@@ -0,0 +1,732 @@
1
+ import { t as format } from "./format-DFx4997p.js";
2
+ import { __esDecorate, __runInitializers } from "tslib";
3
+ import { SbbElement, SbbLanguageController, defaultDateAdapter, forceType, i18nArrival, i18nClass, i18nDeparture, i18nDirection, i18nFromPlatform, i18nMeansOfTransport, i18nNew, i18nOccupancy, i18nRealTimeInfo, i18nSupersaver, i18nTransferProcedure, i18nTransferProcedures, i18nTravelhints, i18nTripDuration, i18nTripQuayChange, screenReaderOnlyStyles, setOrRemoveAttribute } from "@sbb-esta/lyne-elements/core.js";
4
+ import { SbbIconElement } from "@sbb-esta/lyne-elements/icon.pure.js";
5
+ import { html, nothing, unsafeCSS } from "lit";
6
+ import { property } from "lit/decorators.js";
7
+ import { durationToTime, getDepartureArrivalTimeAttribute, isRideLeg, removeTimezoneFromISOTimeString } from "./core.js";
8
+ import { SbbPearlChainTimeElement } from "./pearl-chain-time.pure.js";
9
+ import { SbbCardBadgeElement, SbbCardButtonElement, SbbCardElement } from "@sbb-esta/lyne-elements/card.pure.js";
10
+ import { SbbTimetableOccupancyElement } from "@sbb-esta/lyne-elements/timetable-occupancy.pure.js";
11
+ //#region src/elements-experimental/timetable-row/timetable-row.scss?inline
12
+ var timetable_row_default = ":host {\n --sbb-timetable-row-gap: var(--sbb-spacing-fixed-2x);\n --sbb-timetable-row-height: 1.5625rem;\n --sbb-timetable-row-height-header: 1.25rem;\n --sbb-timetable-row-height-footer: 1rem;\n --sbb-timetable-row-skeleton-pulse-duration: 1800ms;\n display: block;\n}\n\n:host([disable-animation]) {\n --sbb-timetable-row-skeleton-pulse-duration: 0;\n}\n\n.sbb-timetable__row-transport-icon {\n --sbb-icon-svg-width: 1.25rem;\n --sbb-icon-svg-height: 1.25rem;\n}\n\n.sbb-travel-hints__item {\n --sbb-icon-svg-height: 0.875rem;\n}\n\n.sbb-timetable__row--quay {\n margin-inline-end: var(--sbb-spacing-fixed-1x);\n}\n\n.sbb-timetable__row--quay-type {\n float: left;\n}\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: inline-flex;\n}\n\nli {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transport {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transportnumber,\n.sbb-timetable__row-time {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n font-weight: bold;\n line-height: unset;\n white-space: nowrap;\n align-self: center;\n}\n\n.sbb-timetable__row {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: flex;\n flex-direction: column;\n gap: var(--sbb-timetable-row-gap);\n}\n\n.sbb-timetable__row-header,\n.sbb-timetable__row-footer {\n animation: none;\n}\n\n.sbb-timetable__row-header {\n display: flex;\n gap: var(--sbb-spacing-fixed-2x);\n align-items: center;\n line-height: var(--sbb-timetable-row-height-header);\n}\n\n.sbb-timetable__row-details,\n.sbb-timetable__row-hints {\n display: inline-flex;\n gap: var(--sbb-spacing-fixed-1x);\n align-items: center;\n}\n\n.sbb-timetable__row-header p {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0;\n align-self: center;\n}\n\n.sbb-timetable__row-footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n gap: var(--sbb-spacing-fixed-2x);\n line-height: var(--sbb-timetable-row-height-footer);\n}\n.sbb-timetable__row-footer > span {\n align-self: center;\n}\n.sbb-timetable__row-footer :only-child {\n margin-inline-start: auto;\n}\n\n.sbb-timetable__row-quay--changed {\n color: var(--sbb-color-primary);\n}\n\n.sbb-timetable__row-transport-wrapper,\n.sbb-timetable__row-warning {\n display: inline-flex;\n}\n\n.sbb-loading {\n pointer-events: none;\n}\n\n.sbb-loading__wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--sbb-spacing-fixed-2x);\n}\n\n.sbb-loading__row {\n width: 100%;\n border-radius: var(--sbb-border-radius-1x);\n height: var(--sbb-timetable-row-height);\n}\n@media (min-width: calc(64rem)) {\n .sbb-loading__row {\n height: 1.75rem;\n }\n}\n@media (forced-colors: active) {\n .sbb-loading__row {\n border: var(--sbb-border-width-1x) solid ButtonBorder !important;\n }\n}\n\n.sbb-loading__row,\n.sbb-loading__badge {\n background: var(--sbb-background-color-4);\n animation: skeleton-pulse var(--sbb-timetable-row-skeleton-pulse-duration) ease-out infinite;\n}\n\n.sbb-loading__row:first-of-type {\n height: var(--sbb-timetable-row-height-header);\n width: 50%;\n}\n\n.sbb-loading__row:last-of-type {\n height: var(--sbb-timetable-row-height-footer);\n}\n\n.sbb-loading__badge {\n margin-inline: auto calc(var(--sbb-spacing-fixed-3x) * -1);\n padding-inline-end: var(--sbb-spacing-fixed-6x);\n border-end-start-radius: var(--sbb-card-badge-border-radius);\n transform: var(--sbb-card-badge-skew);\n width: 7.1875rem;\n height: 1.25rem;\n}\n\n@keyframes skeleton-pulse {\n 0% {\n background: var(--sbb-background-color-4);\n }\n 17% {\n background: var(--sbb-background-color-4);\n }\n 50% {\n background: var(--sbb-background-color-3);\n }\n 67% {\n background: var(--sbb-background-color-3);\n }\n 100% {\n background: var(--sbb-background-color-4);\n }\n}";
13
+ //#endregion
14
+ //#region src/elements-experimental/timetable-row/timetable-row.component.ts
15
+ var renderIconProduct = (icon, name) => {
16
+ return html`<span class="sbb-timetable__row-transport">
17
+ <sbb-icon name=${icon}></sbb-icon>
18
+ <span class="sbb-screen-reader-only">${name}</span>
19
+ </span>`;
20
+ };
21
+ var renderStringProduct = (vehicleName, line) => {
22
+ const space = [
23
+ "M",
24
+ "B",
25
+ "T"
26
+ ].includes(vehicleName) ? " " : "";
27
+ return html`<span class="sbb-timetable__row-transportnumber">
28
+ ${line !== null ? vehicleName + space + line : vehicleName}
29
+ </span>`;
30
+ };
31
+ var getReachableText = (legs) => {
32
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.reachableText)?.serviceJourney?.serviceAlteration?.reachableText;
33
+ };
34
+ var getDelayText = (legs) => {
35
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.delayText)?.serviceJourney?.serviceAlteration?.delayText;
36
+ };
37
+ var getRedirectedText = (legs) => {
38
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.redirectedText)?.serviceJourney?.serviceAlteration?.redirectedText;
39
+ };
40
+ var getUnplannedStop = (legs) => {
41
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.unplannedStopPointsText)?.serviceJourney?.serviceAlteration?.unplannedStopPointsText;
42
+ };
43
+ var sortSituation = (situations) => {
44
+ const priorities = {
45
+ DISTURBANCE: 0,
46
+ INFORMATION: 1,
47
+ DELAY: 2,
48
+ TRAIN_REPLACEMENT_BY_BUS: 3,
49
+ CONSTRUCTION_SITE: 4,
50
+ END_MESSAGE: 5
51
+ };
52
+ return [...situations]?.sort((a, b) => priorities[a.cause] - priorities[b.cause]);
53
+ };
54
+ var getHimIcon = (situation) => {
55
+ switch (situation?.cause) {
56
+ case "DISTURBANCE": return {
57
+ name: "disruption",
58
+ text: situation?.broadcastMessages?.length ? situation?.broadcastMessages[0].title : ""
59
+ };
60
+ case "INFORMATION": return {
61
+ name: "info",
62
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
63
+ };
64
+ case "DELAY": return {
65
+ name: "delay",
66
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
67
+ };
68
+ case "TRAIN_REPLACEMENT_BY_BUS": return {
69
+ name: "replacementbus",
70
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
71
+ };
72
+ case "CONSTRUCTION_SITE": return {
73
+ name: "construction",
74
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
75
+ };
76
+ default: return {
77
+ name: "info",
78
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
79
+ };
80
+ }
81
+ };
82
+ var getCus = (trip, currentLanguage) => {
83
+ const { summary, legs } = trip || {};
84
+ const rideLegs = legs?.filter((leg) => isRideLeg(leg));
85
+ const { tripStatus } = summary || {};
86
+ if (tripStatus?.cancelled || tripStatus?.partiallyCancelled) return {
87
+ name: "cancellation",
88
+ text: tripStatus?.cancelledText
89
+ };
90
+ if (getReachableText(rideLegs)) return {
91
+ name: "missed-connection",
92
+ text: getReachableText(rideLegs)
93
+ };
94
+ if (tripStatus?.alternative) return {
95
+ name: "alternative",
96
+ text: tripStatus.alternativeText
97
+ };
98
+ if (getRedirectedText(rideLegs)) return {
99
+ name: "reroute",
100
+ text: getRedirectedText(rideLegs)
101
+ };
102
+ if (getUnplannedStop(rideLegs)) return {
103
+ name: "add-stop",
104
+ text: getUnplannedStop(rideLegs)
105
+ };
106
+ if (tripStatus?.delayed || tripStatus?.delayedUnknown) return {
107
+ name: "delay",
108
+ text: getDelayText(rideLegs)
109
+ };
110
+ if (tripStatus?.quayChanged) {
111
+ const departure = rideLegs[0].departure;
112
+ return {
113
+ name: "platform-change",
114
+ text: departure.quayChanged ? departure.quayChangedText : i18nTripQuayChange[currentLanguage]
115
+ };
116
+ }
117
+ return {};
118
+ };
119
+ var findAndReplaceNotice = (notices) => {
120
+ const reservationNotice = [
121
+ "RR",
122
+ "RK",
123
+ "RC",
124
+ "RL",
125
+ "RM",
126
+ "RS",
127
+ "RU",
128
+ "XP",
129
+ "XR",
130
+ "XT"
131
+ ];
132
+ return notices.reduce((foundNotice, notice) => {
133
+ if (foundNotice) return foundNotice;
134
+ if (reservationNotice.includes(notice.name)) return {
135
+ ...notice,
136
+ name: "RR"
137
+ };
138
+ }, void 0);
139
+ };
140
+ var filterNotices = (notices) => {
141
+ const allowedNames = [
142
+ "Z",
143
+ "SB",
144
+ "SZ",
145
+ "VR",
146
+ "TG"
147
+ ];
148
+ return notices.filter((notice, index) => {
149
+ return notices.findIndex((n) => n.name === notice.name) === index;
150
+ }).filter((notice) => allowedNames.includes(notice.name)).sort((a, b) => allowedNames.indexOf(a.name) - allowedNames.indexOf(b.name));
151
+ };
152
+ var handleNotices = (notices) => {
153
+ const reservationNotice = findAndReplaceNotice(notices);
154
+ const filteredNotices = filterNotices(notices);
155
+ if (reservationNotice === void 0) return filteredNotices;
156
+ if (!filteredNotices.length) return [reservationNotice];
157
+ if (filteredNotices[0].name === "Z" && filteredNotices[1]) return [
158
+ filteredNotices[0],
159
+ reservationNotice,
160
+ filteredNotices[1]
161
+ ].concat(filteredNotices.slice(2));
162
+ return [reservationNotice, ...filteredNotices];
163
+ };
164
+ /**
165
+ * It displays information about the trip, acting as a container for all the `sbb-timetable-*` components.
166
+ * */
167
+ var SbbTimetableRowElement = (() => {
168
+ let _classSuper = SbbElement;
169
+ let _instanceExtraInitializers = [];
170
+ let _trip_decorators;
171
+ let _trip_initializers = [];
172
+ let _trip_extraInitializers = [];
173
+ let _price_decorators;
174
+ let _price_initializers = [];
175
+ let _price_extraInitializers = [];
176
+ let _disableAnimation_decorators;
177
+ let _disableAnimation_initializers = [];
178
+ let _disableAnimation_extraInitializers = [];
179
+ let _boarding_decorators;
180
+ let _boarding_initializers = [];
181
+ let _boarding_extraInitializers = [];
182
+ let _loadingTrip_decorators;
183
+ let _loadingTrip_initializers = [];
184
+ let _loadingTrip_extraInitializers = [];
185
+ let _a11yFootpath_decorators;
186
+ let _a11yFootpath_initializers = [];
187
+ let _a11yFootpath_extraInitializers = [];
188
+ let _loadingPrice_decorators;
189
+ let _loadingPrice_initializers = [];
190
+ let _loadingPrice_extraInitializers = [];
191
+ let _cardActionLabel_decorators;
192
+ let _cardActionLabel_initializers = [];
193
+ let _cardActionLabel_extraInitializers = [];
194
+ let _accessibilityExpanded_decorators;
195
+ let _accessibilityExpanded_initializers = [];
196
+ let _accessibilityExpanded_extraInitializers = [];
197
+ let _active_decorators;
198
+ let _active_initializers = [];
199
+ let _active_extraInitializers = [];
200
+ let _set_now_decorators;
201
+ return class SbbTimetableRowElement extends _classSuper {
202
+ constructor() {
203
+ super(...arguments);
204
+ this.#trip_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _trip_initializers, null));
205
+ this.#price_accessor_storage = (__runInitializers(this, _trip_extraInitializers), __runInitializers(this, _price_initializers, null));
206
+ this.#disableAnimation_accessor_storage = (__runInitializers(this, _price_extraInitializers), __runInitializers(this, _disableAnimation_initializers, false));
207
+ this.#boarding_accessor_storage = (__runInitializers(this, _disableAnimation_extraInitializers), __runInitializers(this, _boarding_initializers, null));
208
+ this.#loadingTrip_accessor_storage = (__runInitializers(this, _boarding_extraInitializers), __runInitializers(this, _loadingTrip_initializers, false));
209
+ this.#a11yFootpath_accessor_storage = (__runInitializers(this, _loadingTrip_extraInitializers), __runInitializers(this, _a11yFootpath_initializers, false));
210
+ this.#loadingPrice_accessor_storage = (__runInitializers(this, _a11yFootpath_extraInitializers), __runInitializers(this, _loadingPrice_initializers, false));
211
+ this.#cardActionLabel_accessor_storage = (__runInitializers(this, _loadingPrice_extraInitializers), __runInitializers(this, _cardActionLabel_initializers, ""));
212
+ this.#accessibilityExpanded_accessor_storage = (__runInitializers(this, _cardActionLabel_extraInitializers), __runInitializers(this, _accessibilityExpanded_initializers, false));
213
+ this.#active_accessor_storage = (__runInitializers(this, _accessibilityExpanded_extraInitializers), __runInitializers(this, _active_initializers, false));
214
+ this._now = (__runInitializers(this, _active_extraInitializers), null);
215
+ this._language = new SbbLanguageController(this);
216
+ }
217
+ static {
218
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
219
+ _trip_decorators = [property({ type: Object })];
220
+ _price_decorators = [property({ type: Object })];
221
+ _disableAnimation_decorators = [forceType(), property({
222
+ attribute: "disable-animation",
223
+ reflect: true,
224
+ type: Boolean
225
+ })];
226
+ _boarding_decorators = [property({ type: Object })];
227
+ _loadingTrip_decorators = [forceType(), property({
228
+ attribute: "loading-trip",
229
+ type: Boolean
230
+ })];
231
+ _a11yFootpath_decorators = [forceType(), property({
232
+ attribute: "a11y-footpath",
233
+ type: Boolean
234
+ })];
235
+ _loadingPrice_decorators = [forceType(), property({
236
+ attribute: "loading-price",
237
+ type: Boolean
238
+ })];
239
+ _cardActionLabel_decorators = [forceType(), property({ attribute: "card-action-label" })];
240
+ _accessibilityExpanded_decorators = [forceType(), property({
241
+ attribute: "accessibility-expanded",
242
+ type: Boolean
243
+ })];
244
+ _active_decorators = [forceType(), property({ type: Boolean })];
245
+ _set_now_decorators = [property()];
246
+ __esDecorate(this, null, _trip_decorators, {
247
+ kind: "accessor",
248
+ name: "trip",
249
+ static: false,
250
+ private: false,
251
+ access: {
252
+ has: (obj) => "trip" in obj,
253
+ get: (obj) => obj.trip,
254
+ set: (obj, value) => {
255
+ obj.trip = value;
256
+ }
257
+ },
258
+ metadata: _metadata
259
+ }, _trip_initializers, _trip_extraInitializers);
260
+ __esDecorate(this, null, _price_decorators, {
261
+ kind: "accessor",
262
+ name: "price",
263
+ static: false,
264
+ private: false,
265
+ access: {
266
+ has: (obj) => "price" in obj,
267
+ get: (obj) => obj.price,
268
+ set: (obj, value) => {
269
+ obj.price = value;
270
+ }
271
+ },
272
+ metadata: _metadata
273
+ }, _price_initializers, _price_extraInitializers);
274
+ __esDecorate(this, null, _disableAnimation_decorators, {
275
+ kind: "accessor",
276
+ name: "disableAnimation",
277
+ static: false,
278
+ private: false,
279
+ access: {
280
+ has: (obj) => "disableAnimation" in obj,
281
+ get: (obj) => obj.disableAnimation,
282
+ set: (obj, value) => {
283
+ obj.disableAnimation = value;
284
+ }
285
+ },
286
+ metadata: _metadata
287
+ }, _disableAnimation_initializers, _disableAnimation_extraInitializers);
288
+ __esDecorate(this, null, _boarding_decorators, {
289
+ kind: "accessor",
290
+ name: "boarding",
291
+ static: false,
292
+ private: false,
293
+ access: {
294
+ has: (obj) => "boarding" in obj,
295
+ get: (obj) => obj.boarding,
296
+ set: (obj, value) => {
297
+ obj.boarding = value;
298
+ }
299
+ },
300
+ metadata: _metadata
301
+ }, _boarding_initializers, _boarding_extraInitializers);
302
+ __esDecorate(this, null, _loadingTrip_decorators, {
303
+ kind: "accessor",
304
+ name: "loadingTrip",
305
+ static: false,
306
+ private: false,
307
+ access: {
308
+ has: (obj) => "loadingTrip" in obj,
309
+ get: (obj) => obj.loadingTrip,
310
+ set: (obj, value) => {
311
+ obj.loadingTrip = value;
312
+ }
313
+ },
314
+ metadata: _metadata
315
+ }, _loadingTrip_initializers, _loadingTrip_extraInitializers);
316
+ __esDecorate(this, null, _a11yFootpath_decorators, {
317
+ kind: "accessor",
318
+ name: "a11yFootpath",
319
+ static: false,
320
+ private: false,
321
+ access: {
322
+ has: (obj) => "a11yFootpath" in obj,
323
+ get: (obj) => obj.a11yFootpath,
324
+ set: (obj, value) => {
325
+ obj.a11yFootpath = value;
326
+ }
327
+ },
328
+ metadata: _metadata
329
+ }, _a11yFootpath_initializers, _a11yFootpath_extraInitializers);
330
+ __esDecorate(this, null, _loadingPrice_decorators, {
331
+ kind: "accessor",
332
+ name: "loadingPrice",
333
+ static: false,
334
+ private: false,
335
+ access: {
336
+ has: (obj) => "loadingPrice" in obj,
337
+ get: (obj) => obj.loadingPrice,
338
+ set: (obj, value) => {
339
+ obj.loadingPrice = value;
340
+ }
341
+ },
342
+ metadata: _metadata
343
+ }, _loadingPrice_initializers, _loadingPrice_extraInitializers);
344
+ __esDecorate(this, null, _cardActionLabel_decorators, {
345
+ kind: "accessor",
346
+ name: "cardActionLabel",
347
+ static: false,
348
+ private: false,
349
+ access: {
350
+ has: (obj) => "cardActionLabel" in obj,
351
+ get: (obj) => obj.cardActionLabel,
352
+ set: (obj, value) => {
353
+ obj.cardActionLabel = value;
354
+ }
355
+ },
356
+ metadata: _metadata
357
+ }, _cardActionLabel_initializers, _cardActionLabel_extraInitializers);
358
+ __esDecorate(this, null, _accessibilityExpanded_decorators, {
359
+ kind: "accessor",
360
+ name: "accessibilityExpanded",
361
+ static: false,
362
+ private: false,
363
+ access: {
364
+ has: (obj) => "accessibilityExpanded" in obj,
365
+ get: (obj) => obj.accessibilityExpanded,
366
+ set: (obj, value) => {
367
+ obj.accessibilityExpanded = value;
368
+ }
369
+ },
370
+ metadata: _metadata
371
+ }, _accessibilityExpanded_initializers, _accessibilityExpanded_extraInitializers);
372
+ __esDecorate(this, null, _active_decorators, {
373
+ kind: "accessor",
374
+ name: "active",
375
+ static: false,
376
+ private: false,
377
+ access: {
378
+ has: (obj) => "active" in obj,
379
+ get: (obj) => obj.active,
380
+ set: (obj, value) => {
381
+ obj.active = value;
382
+ }
383
+ },
384
+ metadata: _metadata
385
+ }, _active_initializers, _active_extraInitializers);
386
+ __esDecorate(this, null, _set_now_decorators, {
387
+ kind: "setter",
388
+ name: "now",
389
+ static: false,
390
+ private: false,
391
+ access: {
392
+ has: (obj) => "now" in obj,
393
+ set: (obj, value) => {
394
+ obj.now = value;
395
+ }
396
+ },
397
+ metadata: _metadata
398
+ }, null, _instanceExtraInitializers);
399
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
400
+ enumerable: true,
401
+ configurable: true,
402
+ writable: true,
403
+ value: _metadata
404
+ });
405
+ }
406
+ static {
407
+ this.elementName = "sbb-timetable-row";
408
+ }
409
+ static {
410
+ this.elementDependencies = [
411
+ SbbCardElement,
412
+ SbbCardBadgeElement,
413
+ SbbCardButtonElement,
414
+ SbbIconElement,
415
+ SbbTimetableOccupancyElement,
416
+ SbbPearlChainTimeElement
417
+ ];
418
+ }
419
+ static {
420
+ this.styles = [screenReaderOnlyStyles, unsafeCSS(timetable_row_default)];
421
+ }
422
+ #trip_accessor_storage;
423
+ /** The trip Prop. */
424
+ get trip() {
425
+ return this.#trip_accessor_storage;
426
+ }
427
+ set trip(value) {
428
+ this.#trip_accessor_storage = value;
429
+ }
430
+ #price_accessor_storage;
431
+ /** The price Prop, which consists of the data for the badge. */
432
+ get price() {
433
+ return this.#price_accessor_storage;
434
+ }
435
+ set price(value) {
436
+ this.#price_accessor_storage = value;
437
+ }
438
+ #disableAnimation_accessor_storage;
439
+ /** This will be forwarded to the sbb-pearl-chain component - if true the position won't be animated. */
440
+ get disableAnimation() {
441
+ return this.#disableAnimation_accessor_storage;
442
+ }
443
+ set disableAnimation(value) {
444
+ this.#disableAnimation_accessor_storage = value;
445
+ }
446
+ #boarding_accessor_storage;
447
+ /** This will be forwarded to the notices section */
448
+ get boarding() {
449
+ return this.#boarding_accessor_storage;
450
+ }
451
+ set boarding(value) {
452
+ this.#boarding_accessor_storage = value;
453
+ }
454
+ #loadingTrip_accessor_storage;
455
+ /**
456
+ * The loading state -
457
+ * when this is true it will be render skeleton with an idling animation
458
+ */
459
+ get loadingTrip() {
460
+ return this.#loadingTrip_accessor_storage;
461
+ }
462
+ set loadingTrip(value) {
463
+ this.#loadingTrip_accessor_storage = value;
464
+ }
465
+ #a11yFootpath_accessor_storage;
466
+ /**
467
+ * The Footpath attribute for rendering different icons
468
+ * true: render a11y-icon
469
+ * false: render walk-icon
470
+ * default: render walk-icon
471
+ */
472
+ get a11yFootpath() {
473
+ return this.#a11yFootpath_accessor_storage;
474
+ }
475
+ set a11yFootpath(value) {
476
+ this.#a11yFootpath_accessor_storage = value;
477
+ }
478
+ #loadingPrice_accessor_storage;
479
+ /**
480
+ * The loading state -
481
+ * when this is true it will be render skeleton with an idling animation
482
+ */
483
+ get loadingPrice() {
484
+ return this.#loadingPrice_accessor_storage;
485
+ }
486
+ set loadingPrice(value) {
487
+ this.#loadingPrice_accessor_storage = value;
488
+ }
489
+ #cardActionLabel_accessor_storage;
490
+ /**
491
+ * Hidden label for the card action. It overrides the automatically generated accessibility text for the component. Use this prop to provide custom accessibility information for the component.
492
+ */
493
+ get cardActionLabel() {
494
+ return this.#cardActionLabel_accessor_storage;
495
+ }
496
+ set cardActionLabel(value) {
497
+ this.#cardActionLabel_accessor_storage = value;
498
+ }
499
+ #accessibilityExpanded_accessor_storage;
500
+ /** This will be forwarded to the sbb-card component as aria-expanded. */
501
+ get accessibilityExpanded() {
502
+ return this.#accessibilityExpanded_accessor_storage;
503
+ }
504
+ set accessibilityExpanded(value) {
505
+ this.#accessibilityExpanded_accessor_storage = value;
506
+ }
507
+ #active_accessor_storage;
508
+ /** When this prop is true the sbb-card will be in the active state. */
509
+ get active() {
510
+ return this.#active_accessor_storage;
511
+ }
512
+ set active(value) {
513
+ this.#active_accessor_storage = value;
514
+ }
515
+ /**
516
+ * A configured date which acts as the current date instead of the real current date.
517
+ * Only recommended for testing purposes.
518
+ */
519
+ set now(value) {
520
+ this._now = defaultDateAdapter.getValidDateOrNull(defaultDateAdapter.deserialize(value));
521
+ }
522
+ get now() {
523
+ return this._now ?? /* @__PURE__ */ new Date();
524
+ }
525
+ willUpdate(changedProperties) {
526
+ super.willUpdate(changedProperties);
527
+ if (changedProperties.has("loadingTrip")) setOrRemoveAttribute(this, "role", !this.loadingTrip ? "rowgroup" : null);
528
+ }
529
+ /** The skeleton render function for the loading state */
530
+ _renderSkeleton() {
531
+ return html`
532
+ <sbb-card class="sbb-loading sbb-card-spacing-4x-xxs">
533
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
534
+ <div class="sbb-loading__wrapper">
535
+ <div class="sbb-loading__row"></div>
536
+ <div class="sbb-loading__row"></div>
537
+ <div class="sbb-loading__row"></div>
538
+ </div>
539
+ </sbb-card>
540
+ `;
541
+ }
542
+ _getRideLegs() {
543
+ return this.trip?.legs?.filter((leg) => isRideLeg(leg)) ?? [];
544
+ }
545
+ _getQuayTypeStrings() {
546
+ if (!this.trip.summary?.product) return null;
547
+ const rideLegs = this._getRideLegs();
548
+ const short = this.trip.summary.product?.vehicleMode === "TRAIN" ? rideLegs[0].serviceJourney.quayTypeShortName || "" : rideLegs[0].serviceJourney.quayTypeName || "";
549
+ return {
550
+ long: i18nFromPlatform[this._language.current] + " " + short,
551
+ short
552
+ };
553
+ }
554
+ /** map Quay */
555
+ _renderQuayType() {
556
+ if (!this.trip.summary?.product) return;
557
+ const quayTypeStrings = this._getQuayTypeStrings();
558
+ return html`
559
+ <span class="sbb-timetable__row--quay">
560
+ <span class="sbb-screen-reader-only">${quayTypeStrings?.long}&nbsp;</span>
561
+ <span class="sbb-timetable__row--quay-type" aria-hidden="true"
562
+ >${quayTypeStrings?.short}</span
563
+ >
564
+ </span>
565
+ `;
566
+ }
567
+ _handleHimCus(trip) {
568
+ const { situations } = trip || {};
569
+ const sortedSituations = situations && sortSituation(situations);
570
+ const cus = getCus(trip, this._language.current);
571
+ return {
572
+ cus: Object.keys(cus)?.length ? cus : null,
573
+ him: situations?.length ? getHimIcon(sortedSituations[0]) : null
574
+ };
575
+ }
576
+ _getAccessibilityText(trip) {
577
+ const { summary, legs, notices } = trip || {};
578
+ const { departureWalk, arrivalWalk, departure, arrival, product, direction, occupancy, duration } = summary || {};
579
+ const { departureTimeAttribute, arrivalTimeAttribute } = getDepartureArrivalTimeAttribute(legs, departureWalk || 0, arrivalWalk || 0, this._language.current, this.a11yFootpath);
580
+ const rideLegs = this._getRideLegs();
581
+ const departureTime = departure?.time ? removeTimezoneFromISOTimeString(departure.time) : void 0;
582
+ const arrivalTime = arrival?.time ? removeTimezoneFromISOTimeString(arrival.time) : void 0;
583
+ const departureWalkText = departureTimeAttribute ? `${departureTimeAttribute.text} ${departureTimeAttribute.duration}, ` : "";
584
+ const arrivalWalkText = arrivalTimeAttribute ? `${arrivalTimeAttribute.text} ${arrivalTimeAttribute.duration}, ` : "";
585
+ const departureTimeText = departureTime ? `${i18nDeparture[this._language.current]}: ${format(departureTime, "HH:mm")}, ` : "";
586
+ const getDepartureQuayText = () => {
587
+ if (!departure?.quayFormatted) return "";
588
+ return `${departure?.quayChanged ? `${i18nNew[this._language.current]} ` : ""}${this._getQuayTypeStrings()?.long} ${departure?.quayFormatted}, `;
589
+ };
590
+ const meansOfTransportText = product && product.vehicleMode ? i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && `${i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}, ` : "";
591
+ const vehicleSubModeText = product?.vehicleSubModeShortName ? `${product.vehicleSubModeShortName} ${product.line || ""}, ` : "";
592
+ const directionText = `${i18nDirection[this._language.current]} ${direction}, `;
593
+ const himCus = this._handleHimCus(trip);
594
+ const cusText = himCus?.cus?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.cus?.text}, ` : "";
595
+ const himText = himCus?.him?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.him?.text}, ` : "";
596
+ const boardingText = this.boarding ? `${this.boarding.text}, ` : "";
597
+ const priceText = `${this.price?.isDiscount ? i18nSupersaver[this._language.current] : ""} ${this.price?.text && this.price?.price ? (this.price?.text || "") + " " + (this.price?.price || "") + ", " : ""}`;
598
+ const transferProcedures = rideLegs.length > 2 ? `${rideLegs.length - 1} ${i18nTransferProcedures[this._language.current]}, ` : rideLegs.length > 1 ? `${rideLegs.length - 1} ${i18nTransferProcedure[this._language.current]}, ` : "";
599
+ const arrivalTimeText = arrivalTime ? `${i18nArrival[this._language.current]}: ${format(arrivalTime, "HH:mm")}, ` : "";
600
+ let occupancyText = "";
601
+ if (occupancy) {
602
+ if (occupancy.firstClass && occupancy.firstClass !== "UNKNOWN") occupancyText += `${i18nClass.first[this._language.current]} ${i18nOccupancy[occupancy.firstClass.toLowerCase()]?.[this._language.current]}.`;
603
+ if (occupancy.secondClass && occupancy.secondClass !== "UNKNOWN") occupancyText += ` ${i18nClass.second[this._language.current]} ${i18nOccupancy[occupancy.secondClass.toLowerCase()]?.[this._language.current]}.`;
604
+ }
605
+ const attributes = notices && handleNotices(notices).length && handleNotices(notices)?.map((notice, index) => index < 4 && notice.text?.template).join(", ") + ", ";
606
+ const attributesText = attributes ? `${i18nTravelhints[this._language.current]}: ${attributes}` : "";
607
+ const durationText = !!duration && duration > 0 ? `${i18nTripDuration[this._language.current]} ${durationToTime(duration, this._language.current).long}, ` : "";
608
+ return [
609
+ departureWalkText,
610
+ departureTimeText,
611
+ getDepartureQuayText(),
612
+ meansOfTransportText,
613
+ vehicleSubModeText,
614
+ directionText,
615
+ cusText,
616
+ boardingText,
617
+ priceText,
618
+ cusText ? "" : himText,
619
+ arrivalTimeText,
620
+ arrivalWalkText,
621
+ durationText,
622
+ transferProcedures,
623
+ occupancyText,
624
+ attributesText
625
+ ].map((e) => e?.trim()).filter((e) => e && e.length > 0).join(" ");
626
+ }
627
+ render() {
628
+ if (this.loadingTrip) return this._renderSkeleton();
629
+ const { legs, id, notices, summary } = this.trip || {};
630
+ const { product, direction, departureWalk, departure, arrival, arrivalWalk, occupancy, duration } = summary || {};
631
+ const himCus = this._handleHimCus(this.trip);
632
+ const hasHimCus = !!himCus.cus || !!himCus.him;
633
+ const noticeAttributes = notices && handleNotices(notices);
634
+ const durationObj = duration ? durationToTime(duration, this._language.current) : null;
635
+ return html`
636
+ <sbb-card class="sbb-card-spacing-4x-xxs" id=${id}>
637
+ <sbb-card-button
638
+ ?active=${this.active}
639
+ aria-expanded=${this.accessibilityExpanded ? "true" : nothing}
640
+ >
641
+ ${this.cardActionLabel ? this.cardActionLabel : this._getAccessibilityText(this.trip)}
642
+ </sbb-card-button>
643
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
644
+ ${this.price && !this.loadingPrice ? html`<sbb-card-badge color=${this.price.isDiscount ? "charcoal" : "white"}>
645
+ ${this.price.isDiscount ? html`<span aria-hidden="true">
646
+ %<span class="sbb-screen-reader-only"
647
+ >${i18nSupersaver[this._language.current]}</span
648
+ >
649
+ </span>` : nothing}
650
+ ${this.price.text ? html`<span>${this.price.text}</span>` : nothing}
651
+ ${this.price.price ? html`<span>${this.price.price}</span>` : nothing}
652
+ </sbb-card-badge>` : nothing}
653
+ <div class="sbb-timetable__row" role="row">
654
+ <div class="sbb-timetable__row-header" role="gridcell">
655
+ <div class="sbb-timetable__row-details">
656
+ ${product?.corporateIdentityPictogram && html`<span class="sbb-timetable__row-transport-wrapper">
657
+ <sbb-icon
658
+ class="sbb-timetable__row-transport-icon"
659
+ name="picto:${product.corporateIdentityPictogram}"
660
+ ></sbb-icon>
661
+ <span class="sbb-screen-reader-only">
662
+ ${product && product.vehicleMode && i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}
663
+ &nbsp;
664
+ </span>
665
+ </span>`}
666
+ ${product && (product.corporateIdentityIcon ? renderIconProduct(product.corporateIdentityIcon, product.name) : product.vehicleSubModeShortName && renderStringProduct(product.vehicleSubModeShortName, product?.line))}
667
+ </div>
668
+ ${direction ? html`<p>${`${i18nDirection[this._language.current]} ${direction}`}</p>` : nothing}
669
+ </div>
670
+ <sbb-pearl-chain-time
671
+ role="gridcell"
672
+ .legs=${legs}
673
+ .departureTime=${departure?.time}
674
+ .arrivalTime=${arrival?.time}
675
+ .departureWalk=${departureWalk}
676
+ .arrivalWalk=${arrivalWalk}
677
+ ?disable-animation=${this.disableAnimation}
678
+ ?a11y-footpath=${this.a11yFootpath}
679
+ .now=${this.now}
680
+ ></sbb-pearl-chain-time>
681
+ <div class="sbb-timetable__row-footer" role="gridcell">
682
+ ${product && departure?.quayFormatted ? html`<span
683
+ class=${departure?.quayChanged ? `sbb-timetable__row-quay--changed` : nothing}
684
+ >
685
+ <span class="sbb-screen-reader-only">
686
+ ${`${i18nDeparture[this._language.current]} ${departure?.quayChanged ? i18nNew[this._language.current] : ""}`}
687
+ &nbsp;
688
+ </span>
689
+ ${this._renderQuayType()} ${departure?.quayFormatted}
690
+ </span>` : nothing}
691
+ ${occupancy?.firstClass && occupancy?.firstClass !== "UNKNOWN" || occupancy?.secondClass && occupancy.secondClass !== "UNKNOWN" ? html`<sbb-timetable-occupancy
692
+ .firstClassOccupancy=${occupancy?.firstClass?.toLowerCase()}
693
+ .secondClassOccupancy=${occupancy?.secondClass?.toLowerCase()}
694
+ ></sbb-timetable-occupancy>` : nothing}
695
+ ${noticeAttributes && noticeAttributes.length || this.boarding ? html`<ul class="sbb-timetable__row-hints" role="list">
696
+ ${noticeAttributes?.map((notice, index) => index < 4 ? html`<li>
697
+ <sbb-icon
698
+ class="sbb-travel-hints__item"
699
+ name=${"sa-" + notice.name?.toLowerCase()}
700
+ ></sbb-icon>
701
+ <span class="sbb-screen-reader-only">${notice.text?.template}</span>
702
+ </li>` : nothing)}
703
+ ${this.boarding ? html`<li>
704
+ <sbb-icon
705
+ class="sbb-travel-hints__item"
706
+ name=${this.boarding?.name}
707
+ aria-label=${this.boarding?.text}
708
+ aria-hidden="false"
709
+ ></sbb-icon>
710
+ </li>` : nothing}
711
+ </ul>` : nothing}
712
+ ${duration && duration > 0 ? html`<time>
713
+ <span class="sbb-screen-reader-only">
714
+ ${`${i18nTripDuration[this._language.current]} ${durationObj.long}`}
715
+ </span>
716
+ <span aria-hidden="true">${durationObj.short}</span>
717
+ </time>` : nothing}
718
+ ${hasHimCus && (himCus.cus || himCus.him) ? html`<span class="sbb-timetable__row-warning">
719
+ <sbb-icon name=${(himCus.cus || himCus.him).name}></sbb-icon>
720
+ <span class="sbb-screen-reader-only">${(himCus.cus || himCus.him).text}</span>
721
+ </span>` : nothing}
722
+ </div>
723
+ </div>
724
+ </sbb-card>
725
+ `;
726
+ }
727
+ };
728
+ })();
729
+ //#endregion
730
+ export { handleNotices as a, sortSituation as c, getHimIcon as i, filterNotices as n, renderIconProduct as o, getCus as r, renderStringProduct as s, SbbTimetableRowElement as t };
731
+
732
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLXJvdy5jb21wb25lbnQtQzlZOVJldjEuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC90aW1ldGFibGUtcm93L3RpbWV0YWJsZS1yb3cuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3RpbWV0YWJsZS1yb3cvdGltZXRhYmxlLXJvdy5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10aW1ldGFibGUtcm93LWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICAtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDI1KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWhlYWRlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWZvb3RlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDE2KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctc2tlbGV0b24tcHVsc2UtZHVyYXRpb246IDE4MDBtcztcblxuICBkaXNwbGF5OiBibG9jaztcbn1cblxuOmhvc3QoW2Rpc2FibGUtYW5pbWF0aW9uXSkge1xuICAtLXNiYi10aW1ldGFibGUtcm93LXNrZWxldG9uLXB1bHNlLWR1cmF0aW9uOiAwO1xufVxuXG4vLyBvdmVycmlkZSBpY29ucyBzaXplc1xuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtaWNvbiB7XG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbn1cblxuLy8gb3ZlcnJpZGUgaWNvbnMgc2l6ZXNcbi5zYmItdHJhdmVsLWhpbnRzX19pdGVtIHtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMTQpfTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy0tcXVheSB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xeCk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctLXF1YXktdHlwZSB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4vLyByZXNldHMgbGlzdHNcbnVsIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG5cbmxpIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydG51bWJlcixcbi5zYmItdGltZXRhYmxlX19yb3ctdGltZSB7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LXMtLWJvbGQ7XG5cbiAgbGluZS1oZWlnaHQ6IHVuc2V0O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3cge1xuICBAaW5jbHVkZSBzYmIudGV4dC1zLS1yZWd1bGFyO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctZ2FwKTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXIsXG4uc2JiLXRpbWV0YWJsZV9fcm93LWZvb3RlciB7XG4gIC8vIER1ZSB0byBhIGJ1ZyBpbiBTYWZhcmkgd2hpY2ggZGlzcGxheXMgc2tlbGV0b24gYW5pbWF0aW9uIGV2ZW4gb24gbG9hZGVkIGNvbnRlbnQsIHdlIG5lZWQgdG8gbWFudWFsbHkgZGlzYWJsZSBhbmltYXRpb24uXG4gIGFuaW1hdGlvbjogbm9uZTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodC1oZWFkZXIpO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWRldGFpbHMsXG4uc2JiLXRpbWV0YWJsZV9fcm93LWhpbnRzIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWhlYWRlciBwIHtcbiAgQGluY2x1ZGUgc2JiLmVsbGlwc2lzO1xuXG4gIG1hcmdpbjogMDtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWZvb3RlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodC1mb290ZXIpO1xuXG4gID4gc3BhbiB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICB9XG5cbiAgOm9ubHktY2hpbGQge1xuICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGF1dG87XG4gIH1cbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1xdWF5LS1jaGFuZ2VkIHtcbiAgY29sb3I6IHZhcigtLXNiYi1jb2xvci1wcmltYXJ5KTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtd3JhcHBlcixcbi5zYmItdGltZXRhYmxlX19yb3ctd2FybmluZyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4uc2JiLWxvYWRpbmcge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnNiYi1sb2FkaW5nX193cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG59XG5cbi5zYmItbG9hZGluZ19fcm93IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi1ib3JkZXItcmFkaXVzLTF4KTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICBoZWlnaHQ6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgyOCl9O1xuICB9XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIGJvcmRlcjogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0xeCkgc29saWQgQnV0dG9uQm9yZGVyICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnNiYi1sb2FkaW5nX19yb3csXG4uc2JiLWxvYWRpbmdfX2JhZGdlIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItNCk7XG4gIGFuaW1hdGlvbjogc2tlbGV0b24tcHVsc2UgdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctc2tlbGV0b24tcHVsc2UtZHVyYXRpb24pIGVhc2Utb3V0IGluZmluaXRlO1xufVxuXG4uc2JiLWxvYWRpbmdfX3JvdzpmaXJzdC1vZi10eXBlIHtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtaGVhZGVyKTtcbiAgd2lkdGg6IDUwJTtcbn1cblxuLnNiYi1sb2FkaW5nX19yb3c6bGFzdC1vZi10eXBlIHtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtZm9vdGVyKTtcbn1cblxuLnNiYi1sb2FkaW5nX19iYWRnZSB7XG4gIG1hcmdpbi1pbmxpbmU6IGF1dG8gY2FsYyh2YXIoLS1zYmItc3BhY2luZy1maXhlZC0zeCkgKiAtMSk7XG4gIHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNngpO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogdmFyKC0tc2JiLWNhcmQtYmFkZ2UtYm9yZGVyLXJhZGl1cyk7XG4gIHRyYW5zZm9ybTogdmFyKC0tc2JiLWNhcmQtYmFkZ2Utc2tldyk7XG4gIHdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMTE1KX07XG4gIGhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG59XG5cbkBrZXlmcmFtZXMgc2tlbGV0b24tcHVsc2Uge1xuICAwJSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItNCk7XG4gIH1cblxuICAxNyUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQpO1xuICB9XG5cbiAgNTAlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0zKTtcbiAgfVxuXG4gIDY3JSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMyk7XG4gIH1cblxuICAxMDAlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci00KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgU2JiQ2FyZEJhZGdlRWxlbWVudCxcbiAgU2JiQ2FyZEJ1dHRvbkVsZW1lbnQsXG4gIFNiYkNhcmRFbGVtZW50LFxufSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jYXJkLnB1cmUuanMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdERhdGVBZGFwdGVyLFxuICBmb3JjZVR5cGUsXG4gIGkxOG5BcnJpdmFsLFxuICBpMThuQ2xhc3MsXG4gIGkxOG5EZXBhcnR1cmUsXG4gIGkxOG5EaXJlY3Rpb24sXG4gIGkxOG5Gcm9tUGxhdGZvcm0sXG4gIGkxOG5NZWFuc09mVHJhbnNwb3J0LFxuICBpMThuTmV3LFxuICBpMThuT2NjdXBhbmN5LFxuICBpMThuUmVhbFRpbWVJbmZvLFxuICBpMThuU3VwZXJzYXZlcixcbiAgaTE4blRyYW5zZmVyUHJvY2VkdXJlLFxuICBpMThuVHJhbnNmZXJQcm9jZWR1cmVzLFxuICBpMThuVHJhdmVsaGludHMsXG4gIGkxOG5UcmlwRHVyYXRpb24sXG4gIGkxOG5UcmlwUXVheUNoYW5nZSxcbiAgU2JiRWxlbWVudCxcbiAgdHlwZSBTYmJFbGVtZW50VHlwZSxcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICB0eXBlIFNiYk9jY3VwYW5jeSxcbiAgc2NyZWVuUmVhZGVyT25seVN0eWxlcyxcbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgU2JiSWNvbkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9pY29uLnB1cmUuanMnO1xuaW1wb3J0IHsgU2JiVGltZXRhYmxlT2NjdXBhbmN5RWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3RpbWV0YWJsZS1vY2N1cGFuY3kucHVyZS5qcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBub3RoaW5nLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBJVHJpcEl0ZW0sIE5vdGljZSwgUHRSaWRlTGVnLCBQdFNpdHVhdGlvbiB9IGZyb20gJy4uL2NvcmUudHMnO1xuaW1wb3J0IHtcbiAgZHVyYXRpb25Ub1RpbWUsXG4gIGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlLFxuICBpc1JpZGVMZWcsXG4gIHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcsXG59IGZyb20gJy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiUGVhcmxDaGFpblRpbWVFbGVtZW50IH0gZnJvbSAnLi4vcGVhcmwtY2hhaW4tdGltZS5wdXJlLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdGltZXRhYmxlLXJvdy5zY3NzP2lubGluZSc7XG5cbi8qKiBIaW1DdXMgaW50ZXJmYWNlIGZvciBtYXBwZWQgaWNvbiBuYW1lIGFuZCB0ZXh0ICovXG5leHBvcnQgaW50ZXJmYWNlIEhpbUN1cyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBCb2FyZGluZyBpY29uIGludGVyZmFjZSBmb3IgbWFwcGVkIGljb24gbmFtZSBhbmQgdGV4dCAqL1xuZXhwb3J0IGludGVyZmFjZSBCb2FyZGluZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNlIHtcbiAgcHJpY2U/OiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGlzRGlzY291bnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVySWNvblByb2R1Y3QgPSAoaWNvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCA9PiB7XG4gIHJldHVybiBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydFwiPlxuICAgIDxzYmItaWNvbiBuYW1lPSR7aWNvbn0+PC9zYmItaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke25hbWV9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn07XG5cbmV4cG9ydCBjb25zdCByZW5kZXJTdHJpbmdQcm9kdWN0ID0gKHZlaGljbGVOYW1lOiBzdHJpbmcsIGxpbmU/OiBzdHJpbmcgfCBudWxsKTogVGVtcGxhdGVSZXN1bHQgPT4ge1xuICBjb25zdCBzcGFjZSA9IFsnTScsICdCJywgJ1QnXS5pbmNsdWRlcyh2ZWhpY2xlTmFtZSkgPyAnICcgOiAnJztcbiAgcmV0dXJuIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0bnVtYmVyXCI+XG4gICAgJHtsaW5lICE9PSBudWxsID8gdmVoaWNsZU5hbWUgKyBzcGFjZSArIGxpbmUgOiB2ZWhpY2xlTmFtZX1cbiAgPC9zcGFuPmA7XG59O1xuXG5jb25zdCBnZXRSZWFjaGFibGVUZXh0ID0gKGxlZ3M6IFB0UmlkZUxlZ1tdKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBsZWdzPy5maW5kKChsZWcpID0+IGxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnJlYWNoYWJsZVRleHQpPy5zZXJ2aWNlSm91cm5leVxuICAgID8uc2VydmljZUFsdGVyYXRpb24/LnJlYWNoYWJsZVRleHQ7XG59O1xuXG5jb25zdCBnZXREZWxheVRleHQgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8uZGVsYXlUZXh0KT8uc2VydmljZUpvdXJuZXlcbiAgICA/LnNlcnZpY2VBbHRlcmF0aW9uPy5kZWxheVRleHQ7XG59O1xuXG5jb25zdCBnZXRSZWRpcmVjdGVkVGV4dCA9IChsZWdzOiBQdFJpZGVMZWdbXSk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4gbGVncz8uZmluZCgobGVnKSA9PiAhIWxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnJlZGlyZWN0ZWRUZXh0KVxuICAgID8uc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5yZWRpcmVjdGVkVGV4dDtcbn07XG5cbmNvbnN0IGdldFVucGxhbm5lZFN0b3AgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gISFsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy51bnBsYW5uZWRTdG9wUG9pbnRzVGV4dClcbiAgICA/LnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8udW5wbGFubmVkU3RvcFBvaW50c1RleHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc29ydFNpdHVhdGlvbiA9IChzaXR1YXRpb25zOiBQdFNpdHVhdGlvbltdKTogUHRTaXR1YXRpb25bXSA9PiB7XG4gIGNvbnN0IHByaW9yaXRpZXMgPSB7XG4gICAgRElTVFVSQkFOQ0U6IDAsXG4gICAgSU5GT1JNQVRJT046IDEsXG4gICAgREVMQVk6IDIsXG4gICAgVFJBSU5fUkVQTEFDRU1FTlRfQllfQlVTOiAzLFxuICAgIENPTlNUUlVDVElPTl9TSVRFOiA0LFxuICAgIEVORF9NRVNTQUdFOiA1LFxuICB9O1xuXG4gIHJldHVybiBbLi4uc2l0dWF0aW9uc10/LnNvcnQoXG4gICAgKGE6IFB0U2l0dWF0aW9uLCBiOiBQdFNpdHVhdGlvbikgPT4gcHJpb3JpdGllc1thLmNhdXNlIV0gLSBwcmlvcml0aWVzW2IuY2F1c2UhXSxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaW1JY29uID0gKHNpdHVhdGlvbjogUHRTaXR1YXRpb24pOiBIaW1DdXMgPT4ge1xuICBzd2l0Y2ggKHNpdHVhdGlvbj8uY2F1c2UpIHtcbiAgICBjYXNlICdESVNUVVJCQU5DRSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnZGlzcnVwdGlvbicsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXM/Lmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnSU5GT1JNQVRJT04nOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2luZm8nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnREVMQVknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2RlbGF5JyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGNhc2UgJ1RSQUlOX1JFUExBQ0VNRU5UX0JZX0JVUyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAncmVwbGFjZW1lbnRidXMnLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnQ09OU1RSVUNUSU9OX1NJVEUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2NvbnN0cnVjdGlvbicsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2luZm8nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXMgPSAodHJpcDogSVRyaXBJdGVtLCBjdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyk6IEhpbUN1cyA9PiB7XG4gIGNvbnN0IHsgc3VtbWFyeSwgbGVncyB9ID0gdHJpcCB8fCB7fTtcbiAgY29uc3QgcmlkZUxlZ3MgPSBsZWdzPy5maWx0ZXIoKGxlZykgPT4gaXNSaWRlTGVnKGxlZykpIGFzIFB0UmlkZUxlZ1tdO1xuICBjb25zdCB7IHRyaXBTdGF0dXMgfSA9IHN1bW1hcnkgfHwge307XG5cbiAgaWYgKHRyaXBTdGF0dXM/LmNhbmNlbGxlZCB8fCB0cmlwU3RhdHVzPy5wYXJ0aWFsbHlDYW5jZWxsZWQpIHtcbiAgICByZXR1cm4geyBuYW1lOiAnY2FuY2VsbGF0aW9uJywgdGV4dDogdHJpcFN0YXR1cz8uY2FuY2VsbGVkVGV4dCB9O1xuICB9XG4gIGlmIChnZXRSZWFjaGFibGVUZXh0KHJpZGVMZWdzKSkge1xuICAgIHJldHVybiB7IG5hbWU6ICdtaXNzZWQtY29ubmVjdGlvbicsIHRleHQ6IGdldFJlYWNoYWJsZVRleHQocmlkZUxlZ3MpIH07XG4gIH1cbiAgaWYgKHRyaXBTdGF0dXM/LmFsdGVybmF0aXZlKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2FsdGVybmF0aXZlJywgdGV4dDogdHJpcFN0YXR1cy5hbHRlcm5hdGl2ZVRleHQgfTtcbiAgfVxuICBpZiAoZ2V0UmVkaXJlY3RlZFRleHQocmlkZUxlZ3MpKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ3Jlcm91dGUnLCB0ZXh0OiBnZXRSZWRpcmVjdGVkVGV4dChyaWRlTGVncykgfTtcbiAgfVxuICBpZiAoZ2V0VW5wbGFubmVkU3RvcChyaWRlTGVncykpIHtcbiAgICByZXR1cm4geyBuYW1lOiAnYWRkLXN0b3AnLCB0ZXh0OiBnZXRVbnBsYW5uZWRTdG9wKHJpZGVMZWdzKSB9O1xuICB9XG4gIGlmICh0cmlwU3RhdHVzPy5kZWxheWVkIHx8IHRyaXBTdGF0dXM/LmRlbGF5ZWRVbmtub3duKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2RlbGF5JywgdGV4dDogZ2V0RGVsYXlUZXh0KHJpZGVMZWdzKSB9O1xuICB9XG4gIGlmICh0cmlwU3RhdHVzPy5xdWF5Q2hhbmdlZCkge1xuICAgIGNvbnN0IGRlcGFydHVyZSA9IHJpZGVMZWdzWzBdLmRlcGFydHVyZTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ3BsYXRmb3JtLWNoYW5nZScsXG4gICAgICB0ZXh0OiBkZXBhcnR1cmUucXVheUNoYW5nZWQgPyBkZXBhcnR1cmUucXVheUNoYW5nZWRUZXh0IDogaTE4blRyaXBRdWF5Q2hhbmdlW2N1cnJlbnRMYW5ndWFnZV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7fSBhcyBIaW1DdXM7XG59O1xuXG5jb25zdCBmaW5kQW5kUmVwbGFjZU5vdGljZSA9IChub3RpY2VzOiBOb3RpY2VbXSk6IE5vdGljZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJlc2VydmF0aW9uTm90aWNlID0gWydSUicsICdSSycsICdSQycsICdSTCcsICdSTScsICdSUycsICdSVScsICdYUCcsICdYUicsICdYVCddO1xuXG4gIHJldHVybiBub3RpY2VzLnJlZHVjZSgoZm91bmROb3RpY2U6IE5vdGljZSB8IHVuZGVmaW5lZCwgbm90aWNlOiBOb3RpY2UpOiBOb3RpY2UgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChmb3VuZE5vdGljZSkge1xuICAgICAgcmV0dXJuIGZvdW5kTm90aWNlO1xuICAgIH1cbiAgICBpZiAocmVzZXJ2YXRpb25Ob3RpY2UuaW5jbHVkZXMobm90aWNlLm5hbWUpKSB7XG4gICAgICByZXR1cm4geyAuLi5ub3RpY2UsIG5hbWU6ICdSUicgfSBhcyBOb3RpY2U7XG4gICAgfVxuICB9LCB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlck5vdGljZXMgPSAobm90aWNlczogTm90aWNlW10pOiBOb3RpY2VbXSA9PiB7XG4gIGNvbnN0IGFsbG93ZWROYW1lcyA9IFsnWicsICdTQicsICdTWicsICdWUicsICdURyddO1xuXG4gIGNvbnN0IGZpbHRlck5vdGljZSA9IG5vdGljZXMuZmlsdGVyKChub3RpY2UsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5vdGljZXMuZmluZEluZGV4KChuKSA9PiBuLm5hbWUgPT09IG5vdGljZS5uYW1lKSA9PT0gaW5kZXg7XG4gIH0pO1xuXG4gIHJldHVybiBmaWx0ZXJOb3RpY2VcbiAgICAuZmlsdGVyKChub3RpY2UpID0+IGFsbG93ZWROYW1lcy5pbmNsdWRlcyhub3RpY2UubmFtZSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGFsbG93ZWROYW1lcy5pbmRleE9mKGEubmFtZSkgLSBhbGxvd2VkTmFtZXMuaW5kZXhPZihiLm5hbWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVOb3RpY2VzID0gKG5vdGljZXM6IE5vdGljZVtdKTogTm90aWNlW10gPT4ge1xuICBjb25zdCByZXNlcnZhdGlvbk5vdGljZSA9IGZpbmRBbmRSZXBsYWNlTm90aWNlKG5vdGljZXMpO1xuICBjb25zdCBmaWx0ZXJlZE5vdGljZXMgPSBmaWx0ZXJOb3RpY2VzKG5vdGljZXMpO1xuXG4gIGlmIChyZXNlcnZhdGlvbk5vdGljZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZpbHRlcmVkTm90aWNlcztcbiAgfVxuICBpZiAoIWZpbHRlcmVkTm90aWNlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW3Jlc2VydmF0aW9uTm90aWNlXTtcbiAgfVxuXG4gIGlmIChmaWx0ZXJlZE5vdGljZXNbMF0ubmFtZSA9PT0gJ1onICYmIGZpbHRlcmVkTm90aWNlc1sxXSkge1xuICAgIHJldHVybiBbZmlsdGVyZWROb3RpY2VzWzBdLCByZXNlcnZhdGlvbk5vdGljZSwgZmlsdGVyZWROb3RpY2VzWzFdXS5jb25jYXQoXG4gICAgICBmaWx0ZXJlZE5vdGljZXMuc2xpY2UoMiksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzZXJ2YXRpb25Ob3RpY2UsIC4uLmZpbHRlcmVkTm90aWNlc107XG59O1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmlwLCBhY3RpbmcgYXMgYSBjb250YWluZXIgZm9yIGFsbCB0aGUgYHNiYi10aW1ldGFibGUtKmAgY29tcG9uZW50cy5cbiAqICovXG5leHBvcnQgY2xhc3MgU2JiVGltZXRhYmxlUm93RWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXRpbWV0YWJsZS1yb3cnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiQ2FyZEVsZW1lbnQsXG4gICAgU2JiQ2FyZEJhZGdlRWxlbWVudCxcbiAgICBTYmJDYXJkQnV0dG9uRWxlbWVudCxcbiAgICBTYmJJY29uRWxlbWVudCxcbiAgICBTYmJUaW1ldGFibGVPY2N1cGFuY3lFbGVtZW50LFxuICAgIFNiYlBlYXJsQ2hhaW5UaW1lRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW3NjcmVlblJlYWRlck9ubHlTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIC8qKiBUaGUgdHJpcCBQcm9wLiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIGFjY2Vzc29yIHRyaXA6IElUcmlwSXRlbSA9IG51bGwhO1xuXG4gIC8qKiBUaGUgcHJpY2UgUHJvcCwgd2hpY2ggY29uc2lzdHMgb2YgdGhlIGRhdGEgZm9yIHRoZSBiYWRnZS4gKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pIHB1YmxpYyBhY2Nlc3NvciBwcmljZTogUHJpY2UgPSBudWxsITtcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgc2JiLXBlYXJsLWNoYWluIGNvbXBvbmVudCAtIGlmIHRydWUgdGhlIHBvc2l0aW9uIHdvbid0IGJlIGFuaW1hdGVkLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZS1hbmltYXRpb24nLCByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoaXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIG5vdGljZXMgc2VjdGlvbiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIGFjY2Vzc29yIGJvYXJkaW5nOiBCb2FyZGluZyA9IG51bGwhO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBzdGF0ZSAtXG4gICAqIHdoZW4gdGhpcyBpcyB0cnVlIGl0IHdpbGwgYmUgcmVuZGVyIHNrZWxldG9uIHdpdGggYW4gaWRsaW5nIGFuaW1hdGlvblxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvYWRpbmctdHJpcCcsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGxvYWRpbmdUcmlwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBGb290cGF0aCBhdHRyaWJ1dGUgZm9yIHJlbmRlcmluZyBkaWZmZXJlbnQgaWNvbnNcbiAgICogdHJ1ZTogcmVuZGVyIGExMXktaWNvblxuICAgKiBmYWxzZTogcmVuZGVyIHdhbGstaWNvblxuICAgKiBkZWZhdWx0OiByZW5kZXIgd2Fsay1pY29uXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYTExeS1mb290cGF0aCcsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGExMXlGb290cGF0aDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBzdGF0ZSAtXG4gICAqIHdoZW4gdGhpcyBpcyB0cnVlIGl0IHdpbGwgYmUgcmVuZGVyIHNrZWxldG9uIHdpdGggYW4gaWRsaW5nIGFuaW1hdGlvblxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvYWRpbmctcHJpY2UnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBsb2FkaW5nUHJpY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogSGlkZGVuIGxhYmVsIGZvciB0aGUgY2FyZCBhY3Rpb24uIEl0IG92ZXJyaWRlcyB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWNjZXNzaWJpbGl0eSB0ZXh0IGZvciB0aGUgY29tcG9uZW50LiBVc2UgdGhpcyBwcm9wIHRvIHByb3ZpZGUgY3VzdG9tIGFjY2Vzc2liaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnY2FyZC1hY3Rpb24tbGFiZWwnIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBjYXJkQWN0aW9uTGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBzYmItY2FyZCBjb21wb25lbnQgYXMgYXJpYS1leHBhbmRlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktZXhwYW5kZWQnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhY2Nlc3NpYmlsaXR5RXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hlbiB0aGlzIHByb3AgaXMgdHJ1ZSB0aGUgc2JiLWNhcmQgd2lsbCBiZSBpbiB0aGUgYWN0aXZlIHN0YXRlLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgY29uZmlndXJlZCBkYXRlIHdoaWNoIGFjdHMgYXMgdGhlIGN1cnJlbnQgZGF0ZSBpbnN0ZWFkIG9mIHRoZSByZWFsIGN1cnJlbnQgZGF0ZS5cbiAgICogT25seSByZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbm93KHZhbHVlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX25vdyA9IGRlZmF1bHREYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwoZGVmYXVsdERhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyBuZXcgRGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xvYWRpbmdUcmlwJykpIHtcbiAgICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKHRoaXMsICdyb2xlJywgIXRoaXMubG9hZGluZ1RyaXAgPyAncm93Z3JvdXAnIDogbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBza2VsZXRvbiByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSBsb2FkaW5nIHN0YXRlICovXG4gIHByaXZhdGUgX3JlbmRlclNrZWxldG9uKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItY2FyZCBjbGFzcz1cInNiYi1sb2FkaW5nIHNiYi1jYXJkLXNwYWNpbmctNHgteHhzXCI+XG4gICAgICAgICR7dGhpcy5sb2FkaW5nUHJpY2UgPyBodG1sYDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fYmFkZ2VcIiBzbG90PVwiYmFkZ2VcIj48L2Rpdj5gIDogbm90aGluZ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX193cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX19yb3dcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX3Jvd1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fcm93XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zYmItY2FyZD5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmlkZUxlZ3MoKTogUHRSaWRlTGVnW10ge1xuICAgIHJldHVybiB0aGlzLnRyaXA/LmxlZ3M/LmZpbHRlcigobGVnKSA9PiBpc1JpZGVMZWcobGVnKSkgPz8gW107XG4gIH1cblxuICBwcml2YXRlIF9nZXRRdWF5VHlwZVN0cmluZ3MoKTogeyBsb25nOiBzdHJpbmc7IHNob3J0OiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy50cmlwLnN1bW1hcnk/LnByb2R1Y3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByaWRlTGVncyA9IHRoaXMuX2dldFJpZGVMZWdzKCk7XG4gICAgY29uc3QgaXNTaG9ydCA9IHRoaXMudHJpcC5zdW1tYXJ5LnByb2R1Y3Q/LnZlaGljbGVNb2RlID09PSAnVFJBSU4nO1xuICAgIGNvbnN0IHNob3J0ID0gaXNTaG9ydFxuICAgICAgPyByaWRlTGVnc1swXS5zZXJ2aWNlSm91cm5leS5xdWF5VHlwZVNob3J0TmFtZSB8fCAnJ1xuICAgICAgOiByaWRlTGVnc1swXS5zZXJ2aWNlSm91cm5leS5xdWF5VHlwZU5hbWUgfHwgJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9uZzogaTE4bkZyb21QbGF0Zm9ybVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSArICcgJyArIHNob3J0LFxuICAgICAgc2hvcnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBtYXAgUXVheSAqL1xuICBwcml2YXRlIF9yZW5kZXJRdWF5VHlwZSgpOiBUZW1wbGF0ZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnRyaXAuc3VtbWFyeT8ucHJvZHVjdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcXVheVR5cGVTdHJpbmdzID0gdGhpcy5fZ2V0UXVheVR5cGVTdHJpbmdzKCk7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy0tcXVheVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke3F1YXlUeXBlU3RyaW5ncz8ubG9uZ30mbmJzcDs8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LS1xdWF5LXR5cGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgID4ke3F1YXlUeXBlU3RyaW5ncz8uc2hvcnR9PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvc3Bhbj5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSGltQ3VzKHRyaXA6IElUcmlwSXRlbSk6IHsgY3VzOiBIaW1DdXMgfCBudWxsOyBoaW06IEhpbUN1cyB8IG51bGwgfSB7XG4gICAgY29uc3QgeyBzaXR1YXRpb25zIH0gPSB0cmlwIHx8IHt9O1xuICAgIGNvbnN0IHNvcnRlZFNpdHVhdGlvbnMgPSBzaXR1YXRpb25zICYmIHNvcnRTaXR1YXRpb24oc2l0dWF0aW9ucyk7XG4gICAgY29uc3QgY3VzID0gZ2V0Q3VzKHRyaXAsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1czogT2JqZWN0LmtleXMoY3VzKT8ubGVuZ3RoID8gY3VzIDogbnVsbCxcbiAgICAgIGhpbTogc2l0dWF0aW9ucz8ubGVuZ3RoID8gZ2V0SGltSWNvbihzb3J0ZWRTaXR1YXRpb25zWzBdKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEFjY2Vzc2liaWxpdHlUZXh0KHRyaXA6IElUcmlwSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBzdW1tYXJ5LCBsZWdzLCBub3RpY2VzIH0gPSB0cmlwIHx8IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIGRlcGFydHVyZVdhbGssXG4gICAgICBhcnJpdmFsV2FsayxcbiAgICAgIGRlcGFydHVyZSxcbiAgICAgIGFycml2YWwsXG4gICAgICBwcm9kdWN0LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgb2NjdXBhbmN5LFxuICAgICAgZHVyYXRpb24sXG4gICAgfSA9IHN1bW1hcnkgfHwge307XG5cbiAgICBjb25zdCB7IGRlcGFydHVyZVRpbWVBdHRyaWJ1dGUsIGFycml2YWxUaW1lQXR0cmlidXRlIH0gPSBnZXREZXBhcnR1cmVBcnJpdmFsVGltZUF0dHJpYnV0ZShcbiAgICAgIGxlZ3MsXG4gICAgICBkZXBhcnR1cmVXYWxrIHx8IDAsXG4gICAgICBhcnJpdmFsV2FsayB8fCAwLFxuICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgIHRoaXMuYTExeUZvb3RwYXRoLFxuICAgICk7XG5cbiAgICBjb25zdCByaWRlTGVncyA9IHRoaXMuX2dldFJpZGVMZWdzKCk7XG5cbiAgICBjb25zdCBkZXBhcnR1cmVUaW1lOiBEYXRlIHwgdW5kZWZpbmVkID0gZGVwYXJ0dXJlPy50aW1lXG4gICAgICA/IHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcoZGVwYXJ0dXJlLnRpbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFycml2YWxUaW1lOiBEYXRlIHwgdW5kZWZpbmVkID0gYXJyaXZhbD8udGltZVxuICAgICAgPyByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGFycml2YWwudGltZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZGVwYXJ0dXJlV2Fsa1RleHQgPSBkZXBhcnR1cmVUaW1lQXR0cmlidXRlXG4gICAgICA/IGAke2RlcGFydHVyZVRpbWVBdHRyaWJ1dGUudGV4dH0gJHtkZXBhcnR1cmVUaW1lQXR0cmlidXRlLmR1cmF0aW9ufSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGFycml2YWxXYWxrVGV4dCA9IGFycml2YWxUaW1lQXR0cmlidXRlXG4gICAgICA/IGAke2Fycml2YWxUaW1lQXR0cmlidXRlLnRleHR9ICR7YXJyaXZhbFRpbWVBdHRyaWJ1dGUuZHVyYXRpb259LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZGVwYXJ0dXJlVGltZVRleHQgPSBkZXBhcnR1cmVUaW1lXG4gICAgICA/IGAke2kxOG5EZXBhcnR1cmVbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2Zvcm1hdChkZXBhcnR1cmVUaW1lLCAnSEg6bW0nKX0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBnZXREZXBhcnR1cmVRdWF5VGV4dCA9ICgpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKCFkZXBhcnR1cmU/LnF1YXlGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgcHJlZml4IFwibmV3XCIgaWYgcXVheSB3YXMgY2hhbmdlZFxuICAgICAgY29uc3QgY2hhbmdlZFF1YXlQcmVmaXggPSBkZXBhcnR1cmU/LnF1YXlDaGFuZ2VkID8gYCR7aTE4bk5ld1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gYCA6ICcnO1xuICAgICAgcmV0dXJuIGAke2NoYW5nZWRRdWF5UHJlZml4fSR7XG4gICAgICAgIHRoaXMuX2dldFF1YXlUeXBlU3RyaW5ncygpPy5sb25nXG4gICAgICB9ICR7ZGVwYXJ0dXJlPy5xdWF5Rm9ybWF0dGVkfSwgYDtcbiAgICB9O1xuXG4gICAgY29uc3QgbWVhbnNPZlRyYW5zcG9ydFRleHQgPVxuICAgICAgcHJvZHVjdCAmJiBwcm9kdWN0LnZlaGljbGVNb2RlXG4gICAgICAgID8gaTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXSAmJlxuICAgICAgICAgIGAke2kxOG5NZWFuc09mVHJhbnNwb3J0W3Byb2R1Y3QudmVoaWNsZU1vZGUudG9Mb3dlckNhc2UoKV1bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19LCBgXG4gICAgICAgIDogJyc7XG5cbiAgICBjb25zdCB2ZWhpY2xlU3ViTW9kZVRleHQgPSBwcm9kdWN0Py52ZWhpY2xlU3ViTW9kZVNob3J0TmFtZVxuICAgICAgPyBgJHtwcm9kdWN0LnZlaGljbGVTdWJNb2RlU2hvcnROYW1lfSAke3Byb2R1Y3QubGluZSB8fCAnJ30sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBkaXJlY3Rpb25UZXh0ID0gYCR7aTE4bkRpcmVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtkaXJlY3Rpb259LCBgO1xuXG4gICAgY29uc3QgaGltQ3VzID0gdGhpcy5faGFuZGxlSGltQ3VzKHRyaXApO1xuICAgIGNvbnN0IGN1c1RleHQgPSBoaW1DdXM/LmN1cz8udGV4dFxuICAgICAgPyBgJHtpMThuUmVhbFRpbWVJbmZvW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtoaW1DdXM/LmN1cz8udGV4dH0sIGBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaGltVGV4dCA9IGhpbUN1cz8uaGltPy50ZXh0XG4gICAgICA/IGAke2kxOG5SZWFsVGltZUluZm9bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2hpbUN1cz8uaGltPy50ZXh0fSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGJvYXJkaW5nVGV4dCA9IHRoaXMuYm9hcmRpbmcgPyBgJHt0aGlzLmJvYXJkaW5nLnRleHR9LCBgIDogJyc7XG5cbiAgICBjb25zdCBwcmljZVRleHQgPSBgJHt0aGlzLnByaWNlPy5pc0Rpc2NvdW50ID8gaTE4blN1cGVyc2F2ZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0gOiAnJ30gJHtcbiAgICAgIHRoaXMucHJpY2U/LnRleHQgJiYgdGhpcy5wcmljZT8ucHJpY2VcbiAgICAgICAgPyAodGhpcy5wcmljZT8udGV4dCB8fCAnJykgKyAnICcgKyAodGhpcy5wcmljZT8ucHJpY2UgfHwgJycpICsgJywgJ1xuICAgICAgICA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCB0cmFuc2ZlclByb2NlZHVyZXMgPVxuICAgICAgcmlkZUxlZ3MubGVuZ3RoID4gMlxuICAgICAgICA/IGAke3JpZGVMZWdzLmxlbmd0aCAtIDF9ICR7aTE4blRyYW5zZmVyUHJvY2VkdXJlc1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0sIGBcbiAgICAgICAgOiByaWRlTGVncy5sZW5ndGggPiAxXG4gICAgICAgICAgPyBgJHtyaWRlTGVncy5sZW5ndGggLSAxfSAke2kxOG5UcmFuc2ZlclByb2NlZHVyZVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0sIGBcbiAgICAgICAgICA6ICcnO1xuXG4gICAgY29uc3QgYXJyaXZhbFRpbWVUZXh0ID0gYXJyaXZhbFRpbWVcbiAgICAgID8gYCR7aTE4bkFycml2YWxbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2Zvcm1hdChhcnJpdmFsVGltZSwgJ0hIOm1tJyl9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgbGV0IG9jY3VwYW5jeVRleHQ6IHN0cmluZyA9ICcnO1xuICAgIGlmIChvY2N1cGFuY3kpIHtcbiAgICAgIGlmIChvY2N1cGFuY3kuZmlyc3RDbGFzcyAmJiBvY2N1cGFuY3kuZmlyc3RDbGFzcyAhPT0gJ1VOS05PV04nKSB7XG4gICAgICAgIG9jY3VwYW5jeVRleHQgKz0gYCR7aTE4bkNsYXNzLmZpcnN0W3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke1xuICAgICAgICAgIChcbiAgICAgICAgICAgIGkxOG5PY2N1cGFuY3lbb2NjdXBhbmN5LmZpcnN0Q2xhc3MudG9Mb3dlckNhc2UoKSBhcyBTYmJPY2N1cGFuY3ldIGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBzdHJpbmdcbiAgICAgICAgICAgID5cbiAgICAgICAgICApPy5bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF1cbiAgICAgICAgfS5gO1xuICAgICAgfVxuICAgICAgaWYgKG9jY3VwYW5jeS5zZWNvbmRDbGFzcyAmJiBvY2N1cGFuY3kuc2Vjb25kQ2xhc3MgIT09ICdVTktOT1dOJykge1xuICAgICAgICBvY2N1cGFuY3lUZXh0ICs9IGAgJHtpMThuQ2xhc3Muc2Vjb25kW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke1xuICAgICAgICAgIChcbiAgICAgICAgICAgIGkxOG5PY2N1cGFuY3lbb2NjdXBhbmN5LnNlY29uZENsYXNzLnRvTG93ZXJDYXNlKCkgYXMgU2JiT2NjdXBhbmN5XSBhcyBSZWNvcmQ8XG4gICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgc3RyaW5nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgKT8uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdXG4gICAgICAgIH0uYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID1cbiAgICAgIG5vdGljZXMgJiZcbiAgICAgIGhhbmRsZU5vdGljZXMobm90aWNlcykubGVuZ3RoICYmXG4gICAgICBoYW5kbGVOb3RpY2VzKG5vdGljZXMpXG4gICAgICAgID8ubWFwKChub3RpY2UsIGluZGV4KSA9PiBpbmRleCA8IDQgJiYgbm90aWNlLnRleHQ/LnRlbXBsYXRlKVxuICAgICAgICAuam9pbignLCAnKSArICcsICc7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzVGV4dCA9IGF0dHJpYnV0ZXNcbiAgICAgID8gYCR7aTE4blRyYXZlbGhpbnRzW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHthdHRyaWJ1dGVzfWBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBkdXJhdGlvblRleHQgPVxuICAgICAgISFkdXJhdGlvbiAmJiBkdXJhdGlvbiA+IDBcbiAgICAgICAgPyBgJHtpMThuVHJpcER1cmF0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke1xuICAgICAgICAgICAgZHVyYXRpb25Ub1RpbWUoZHVyYXRpb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpLmxvbmdcbiAgICAgICAgICB9LCBgXG4gICAgICAgIDogJyc7XG5cbiAgICByZXR1cm4gW1xuICAgICAgZGVwYXJ0dXJlV2Fsa1RleHQsXG4gICAgICBkZXBhcnR1cmVUaW1lVGV4dCxcbiAgICAgIGdldERlcGFydHVyZVF1YXlUZXh0KCksXG4gICAgICBtZWFuc09mVHJhbnNwb3J0VGV4dCxcbiAgICAgIHZlaGljbGVTdWJNb2RlVGV4dCxcbiAgICAgIGRpcmVjdGlvblRleHQsXG4gICAgICBjdXNUZXh0LFxuICAgICAgYm9hcmRpbmdUZXh0LFxuICAgICAgcHJpY2VUZXh0LFxuICAgICAgY3VzVGV4dCA/ICcnIDogaGltVGV4dCxcbiAgICAgIGFycml2YWxUaW1lVGV4dCxcbiAgICAgIGFycml2YWxXYWxrVGV4dCxcbiAgICAgIGR1cmF0aW9uVGV4dCxcbiAgICAgIHRyYW5zZmVyUHJvY2VkdXJlcyxcbiAgICAgIG9jY3VwYW5jeVRleHQsXG4gICAgICBhdHRyaWJ1dGVzVGV4dCxcbiAgICBdXG4gICAgICAubWFwKChlKSA9PiBlPy50cmltKCkpXG4gICAgICAuZmlsdGVyKChlKSA9PiBlICYmIGUubGVuZ3RoID4gMClcbiAgICAgIC5qb2luKCcgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAodGhpcy5sb2FkaW5nVHJpcCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclNrZWxldG9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsZWdzLCBpZCwgbm90aWNlcywgc3VtbWFyeSB9ID0gdGhpcy50cmlwIHx8IHt9O1xuXG4gICAgY29uc3Qge1xuICAgICAgcHJvZHVjdCxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlcGFydHVyZVdhbGssXG4gICAgICBkZXBhcnR1cmUsXG4gICAgICBhcnJpdmFsLFxuICAgICAgYXJyaXZhbFdhbGssXG4gICAgICBvY2N1cGFuY3ksXG4gICAgICBkdXJhdGlvbixcbiAgICB9ID0gc3VtbWFyeSB8fCB7fTtcblxuICAgIGNvbnN0IGhpbUN1cyA9IHRoaXMuX2hhbmRsZUhpbUN1cyh0aGlzLnRyaXApO1xuICAgIGNvbnN0IGhhc0hpbUN1cyA9ICEhaGltQ3VzLmN1cyB8fCAhIWhpbUN1cy5oaW07XG5cbiAgICBjb25zdCBub3RpY2VBdHRyaWJ1dGVzID0gbm90aWNlcyAmJiBoYW5kbGVOb3RpY2VzKG5vdGljZXMpO1xuXG4gICAgY29uc3QgZHVyYXRpb25PYmogPSBkdXJhdGlvbiA/IGR1cmF0aW9uVG9UaW1lKGR1cmF0aW9uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KSA6IG51bGw7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItY2FyZCBjbGFzcz1cInNiYi1jYXJkLXNwYWNpbmctNHgteHhzXCIgaWQ9JHtpZH0+XG4gICAgICAgIDxzYmItY2FyZC1idXR0b25cbiAgICAgICAgICA/YWN0aXZlPSR7dGhpcy5hY3RpdmV9XG4gICAgICAgICAgYXJpYS1leHBhbmRlZD0ke3RoaXMuYWNjZXNzaWJpbGl0eUV4cGFuZGVkID8gJ3RydWUnIDogbm90aGluZ31cbiAgICAgICAgPlxuICAgICAgICAgICR7dGhpcy5jYXJkQWN0aW9uTGFiZWwgPyB0aGlzLmNhcmRBY3Rpb25MYWJlbCA6IHRoaXMuX2dldEFjY2Vzc2liaWxpdHlUZXh0KHRoaXMudHJpcCl9XG4gICAgICAgIDwvc2JiLWNhcmQtYnV0dG9uPlxuICAgICAgICAke3RoaXMubG9hZGluZ1ByaWNlID8gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX2JhZGdlXCIgc2xvdD1cImJhZGdlXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgICR7dGhpcy5wcmljZSAmJiAhdGhpcy5sb2FkaW5nUHJpY2VcbiAgICAgICAgICA/IGh0bWxgPHNiYi1jYXJkLWJhZGdlIGNvbG9yPSR7dGhpcy5wcmljZS5pc0Rpc2NvdW50ID8gJ2NoYXJjb2FsJyA6ICd3aGl0ZSd9PlxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UuaXNEaXNjb3VudFxuICAgICAgICAgICAgICAgID8gaHRtbGA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgJTxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgPiR7aTE4blN1cGVyc2F2ZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UudGV4dCA/IGh0bWxgPHNwYW4+JHt0aGlzLnByaWNlLnRleHR9PC9zcGFuPmAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UucHJpY2UgPyBodG1sYDxzcGFuPiR7dGhpcy5wcmljZS5wcmljZX08L3NwYW4+YCA6IG5vdGhpbmd9XG4gICAgICAgICAgICA8L3NiYi1jYXJkLWJhZGdlPmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3dcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXJcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAke3Byb2R1Y3Q/LmNvcnBvcmF0ZUlkZW50aXR5UGljdG9ncmFtICYmXG4gICAgICAgICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydC1pY29uXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwaWN0bzoke3Byb2R1Y3QuY29ycG9yYXRlSWRlbnRpdHlQaWN0b2dyYW19XCJcbiAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICR7cHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC52ZWhpY2xlTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgaTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXSAmJlxuICAgICAgICAgICAgICAgICAgaTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPmB9XG4gICAgICAgICAgICAgICR7cHJvZHVjdCAmJlxuICAgICAgICAgICAgICAocHJvZHVjdC5jb3Jwb3JhdGVJZGVudGl0eUljb25cbiAgICAgICAgICAgICAgICA/IHJlbmRlckljb25Qcm9kdWN0KHByb2R1Y3QuY29ycG9yYXRlSWRlbnRpdHlJY29uLCBwcm9kdWN0Lm5hbWUpXG4gICAgICAgICAgICAgICAgOiBwcm9kdWN0LnZlaGljbGVTdWJNb2RlU2hvcnROYW1lICYmXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdHJpbmdQcm9kdWN0KHByb2R1Y3QudmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWUsIHByb2R1Y3Q/LmxpbmUpKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgJHtkaXJlY3Rpb25cbiAgICAgICAgICAgICAgPyBodG1sYDxwPiR7YCR7aTE4bkRpcmVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtkaXJlY3Rpb259YH08L3A+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNiYi1wZWFybC1jaGFpbi10aW1lXG4gICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgLmxlZ3M9JHtsZWdzfVxuICAgICAgICAgICAgLmRlcGFydHVyZVRpbWU9JHtkZXBhcnR1cmU/LnRpbWV9XG4gICAgICAgICAgICAuYXJyaXZhbFRpbWU9JHthcnJpdmFsPy50aW1lfVxuICAgICAgICAgICAgLmRlcGFydHVyZVdhbGs9JHtkZXBhcnR1cmVXYWxrfVxuICAgICAgICAgICAgLmFycml2YWxXYWxrPSR7YXJyaXZhbFdhbGt9XG4gICAgICAgICAgICA/ZGlzYWJsZS1hbmltYXRpb249JHt0aGlzLmRpc2FibGVBbmltYXRpb259XG4gICAgICAgICAgICA/YTExeS1mb290cGF0aD0ke3RoaXMuYTExeUZvb3RwYXRofVxuICAgICAgICAgICAgLm5vdz0ke3RoaXMubm93fVxuICAgICAgICAgID48L3NiYi1wZWFybC1jaGFpbi10aW1lPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctZm9vdGVyXCIgcm9sZT1cImdyaWRjZWxsXCI+XG4gICAgICAgICAgICAke3Byb2R1Y3QgJiYgZGVwYXJ0dXJlPy5xdWF5Rm9ybWF0dGVkXG4gICAgICAgICAgICAgID8gaHRtbGA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3M9JHtkZXBhcnR1cmU/LnF1YXlDaGFuZ2VkID8gYHNiYi10aW1ldGFibGVfX3Jvdy1xdWF5LS1jaGFuZ2VkYCA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICR7YCR7aTE4bkRlcGFydHVyZVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXBhcnR1cmU/LnF1YXlDaGFuZ2VkID8gaTE4bk5ld1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVyUXVheVR5cGUoKX0gJHtkZXBhcnR1cmU/LnF1YXlGb3JtYXR0ZWR9XG4gICAgICAgICAgICAgICAgPC9zcGFuPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHsob2NjdXBhbmN5Py5maXJzdENsYXNzICYmIG9jY3VwYW5jeT8uZmlyc3RDbGFzcyAhPT0gJ1VOS05PV04nKSB8fFxuICAgICAgICAgICAgKG9jY3VwYW5jeT8uc2Vjb25kQ2xhc3MgJiYgb2NjdXBhbmN5LnNlY29uZENsYXNzICE9PSAnVU5LTk9XTicpXG4gICAgICAgICAgICAgID8gaHRtbGA8c2JiLXRpbWV0YWJsZS1vY2N1cGFuY3lcbiAgICAgICAgICAgICAgICAgIC5maXJzdENsYXNzT2NjdXBhbmN5PSR7b2NjdXBhbmN5Py5maXJzdENsYXNzPy50b0xvd2VyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgLnNlY29uZENsYXNzT2NjdXBhbmN5PSR7b2NjdXBhbmN5Py5zZWNvbmRDbGFzcz8udG9Mb3dlckNhc2UoKX1cbiAgICAgICAgICAgICAgICA+PC9zYmItdGltZXRhYmxlLW9jY3VwYW5jeT5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICR7KG5vdGljZUF0dHJpYnV0ZXMgJiYgbm90aWNlQXR0cmlidXRlcy5sZW5ndGgpIHx8IHRoaXMuYm9hcmRpbmdcbiAgICAgICAgICAgICAgPyBodG1sYDx1bCBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1oaW50c1wiIHJvbGU9XCJsaXN0XCI+XG4gICAgICAgICAgICAgICAgICAke25vdGljZUF0dHJpYnV0ZXM/Lm1hcCgobm90aWNlLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPCA0XG4gICAgICAgICAgICAgICAgICAgICAgPyBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdHJhdmVsLWhpbnRzX19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSR7J3NhLScgKyBub3RpY2UubmFtZT8udG9Mb3dlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2JiLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPiR7bm90aWNlLnRleHQ/LnRlbXBsYXRlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+YFxuICAgICAgICAgICAgICAgICAgICAgIDogbm90aGluZyxcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAke3RoaXMuYm9hcmRpbmdcbiAgICAgICAgICAgICAgICAgICAgPyBodG1sYDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10cmF2ZWwtaGludHNfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSR7dGhpcy5ib2FyZGluZz8ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3RoaXMuYm9hcmRpbmc/LnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2JiLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5gXG4gICAgICAgICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgICA8L3VsPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHtkdXJhdGlvbiAmJiBkdXJhdGlvbiA+IDBcbiAgICAgICAgICAgICAgPyBodG1sYDx0aW1lPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICR7YCR7aTE4blRyaXBEdXJhdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtkdXJhdGlvbk9iaiEubG9uZ31gfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkdXJhdGlvbk9iaiEuc2hvcnR9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGltZT5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICR7aGFzSGltQ3VzICYmIChoaW1DdXMuY3VzIHx8IGhpbUN1cy5oaW0pXG4gICAgICAgICAgICAgID8gaHRtbGA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy13YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c2JiLWljb24gbmFtZT0keyhoaW1DdXMuY3VzIHx8IGhpbUN1cy5oaW0pIS5uYW1lfT48L3NiYi1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHsoaGltQ3VzLmN1cyB8fCBoaW1DdXMuaGltKSEudGV4dH08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2JiLWNhcmQ+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRpbWV0YWJsZS1yb3cnOiBTYmJUaW1ldGFibGVSb3dFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FDd0VBLElBQWEscUJBQXFCLE1BQWMsU0FBZ0M7QUFDOUUsUUFBTyxJQUFJO3FCQUNRLEtBQUk7MkNBQ2tCLEtBQUk7OztBQUkvQyxJQUFhLHVCQUF1QixhQUFxQixTQUF3QztDQUMvRixNQUFNLFFBQVE7RUFBQztFQUFLO0VBQUs7RUFBSSxDQUFDLFNBQVMsWUFBWSxHQUFHLE1BQU07QUFDNUQsUUFBTyxJQUFJO01BQ1AsU0FBUyxPQUFPLGNBQWMsUUFBUSxPQUFPLFlBQUE7OztBQUluRCxJQUFNLG9CQUFvQixTQUFnRDtBQUN4RSxRQUFPLE1BQU0sTUFBTSxRQUFRLElBQUksZ0JBQWdCLG1CQUFtQixjQUFjLEVBQUUsZ0JBQzlFLG1C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