ctt-babylon 0.25.4 → 0.25.5

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.
@@ -78,13 +78,10 @@ export class BabylonBookingWidgetComponent {
78
78
  this.injectMarketingParams(el);
79
79
  }
80
80
  injectMarketingParams(element) {
81
- // PROTECCIÓN SSR: Si estamos en el servidor de Node, abortamos para evitar cuelgues
81
+ // PROTECCIÓN SSR
82
82
  if (typeof window === 'undefined' ||
83
- typeof sessionStorage === 'undefined') {
83
+ typeof sessionStorage === 'undefined')
84
84
  return;
85
- }
86
- // 1. DICCIONARIOS DE NOMENCLATURAS ESTÁNDAR
87
- // Clic IDs automáticos de las principales plataformas publicitarias[cite: 16]
88
85
  const CLICK_IDS = [
89
86
  'gclid',
90
87
  'gbraid',
@@ -108,9 +105,8 @@ export class BabylonBookingWidgetComponent {
108
105
  'dicbo',
109
106
  'ad_id',
110
107
  'irclickid',
111
- 'cjevent', // Afiliados (Impact, CJ)[cite: 16]
108
+ 'cjevent',
112
109
  ];
113
- // Estándar manual UTM
114
110
  const UTMS = [
115
111
  'utm_source',
116
112
  'utm_medium',
@@ -120,39 +116,33 @@ export class BabylonBookingWidgetComponent {
120
116
  ];
121
117
  const marketingData = {};
122
118
  const params = new URLSearchParams(window.location.search);
123
- // --- CAPA 1: ESCANEO DE LA URL ---
119
+ // --- CAPA 1: URL ---
124
120
  [...CLICK_IDS, ...UTMS, 'origin'].forEach((key) => {
125
121
  const value = params.get(key);
126
122
  if (value)
127
123
  marketingData[key] = value;
128
124
  });
129
- // --- CAPA 2: ESCANEO DE COOKIES (Si la URL está limpia pero hay rastro publicitario) ---
125
+ // --- CAPA 2: COOKIES ---
130
126
  const getCookie = (name) => {
131
127
  const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
132
128
  return match ? match[2] : null;
133
129
  };
134
130
  if (Object.keys(marketingData).length === 0) {
135
- // Google Ads guarda su GCLID en la cookie _gcl_aw (formato: GCL.timestamp.id)
136
131
  const gclAw = getCookie('_gcl_aw');
137
- if (gclAw && gclAw.split('.').length >= 3) {
132
+ if (gclAw && gclAw.split('.').length >= 3)
138
133
  marketingData['gclid'] = gclAw.split('.')[2];
139
- }
140
- // Facebook guarda su FBCLID en la cookie _fbp
141
134
  const fbp = getCookie('_fbp');
142
- if (fbp) {
135
+ if (fbp)
143
136
  marketingData['fbclid'] = fbp;
144
- }
145
137
  }
146
- // --- CAPA 3: ESCANEO DEL DATALAYER (Inyecciones silenciosas de Tag Manager) ---
138
+ // --- CAPA 3: DATALAYER ---
147
139
  if (Object.keys(marketingData).length === 0 &&
148
140
  window.dataLayer) {
149
141
  const dl = window.dataLayer;
150
- // Recorremos de más reciente a más antiguo
151
142
  for (let i = dl.length - 1; i >= 0; i--) {
152
143
  const item = dl[i];
153
144
  [...CLICK_IDS, ...UTMS, 'traffic_source', 'origin'].forEach((key) => {
154
145
  if (item[key] && !marketingData[key]) {
155
- // Mapear un nombre interno (ej. traffic_source) al estándar
156
146
  const finalKey = key === 'traffic_source' ? 'origin' : key;
157
147
  marketingData[finalKey] = item[key];
158
148
  }
@@ -161,9 +151,9 @@ export class BabylonBookingWidgetComponent {
161
151
  break;
162
152
  }
163
153
  }
164
- // --- CAPA 4: RECUPERAR / GUARDAR SESIÓN (Protección SPA en Angular) ---
154
+ // --- CAPA 4: RECUPERAR DE SESIÓN O DETERMINAR ORGÁNICO ---
165
155
  if (Object.keys(marketingData).length === 0) {
166
- // No hay datos nuevos, recuperamos todo lo que tenga prefijo 'mkt_'
156
+ // Intentar recuperar de navegaciones anteriores
167
157
  const storedKeys = Object.keys(sessionStorage).filter((k) => k.startsWith('mkt_'));
168
158
  storedKeys.forEach((k) => {
169
159
  const originalKey = k.replace('mkt_', '');
@@ -171,21 +161,43 @@ export class BabylonBookingWidgetComponent {
171
161
  if (val)
172
162
  marketingData[originalKey] = val;
173
163
  });
174
- }
175
- else {
176
- // Hay datos nuevos, los guardamos para la próxima vez que navegue por la web
177
- try {
178
- Object.entries(marketingData).forEach(([key, value]) => {
179
- sessionStorage.setItem(`mkt_${key}`, value);
180
- });
181
- }
182
- catch (error) {
183
- console.warn('Acceso a sessionStorage bloqueado por el navegador.');
164
+ // Si después de buscar en sesión sigue vacío, es TRÁFICO NUEVO SIN CAMPAÑAS.
165
+ // Aquí averiguamos el origen orgánico para poder GUARDARLO en el siguiente paso.
166
+ if (Object.keys(marketingData).length === 0) {
167
+ const referrer = document.referrer
168
+ ? document.referrer.toLowerCase()
169
+ : '';
170
+ if (referrer) {
171
+ if (referrer.includes('google.'))
172
+ marketingData['origin'] = 'google_organic';
173
+ else if (referrer.includes('bing.'))
174
+ marketingData['origin'] = 'bing_organic';
175
+ else if (referrer.includes('yahoo.'))
176
+ marketingData['origin'] = 'yahoo_organic';
177
+ else if (referrer.includes('duckduckgo.'))
178
+ marketingData['origin'] = 'duckduckgo_organic';
179
+ else if (referrer.includes('yandex.'))
180
+ marketingData['origin'] = 'yandex_organic';
181
+ else if (referrer.includes('baidu.'))
182
+ marketingData['origin'] = 'baidu_organic';
183
+ else if (referrer.includes('ecosia.'))
184
+ marketingData['origin'] = 'ecosia_organic';
185
+ else if (referrer.includes('qwant.'))
186
+ marketingData['origin'] = 'qwant_organic';
187
+ else if (referrer.includes('ask.'))
188
+ marketingData['origin'] = 'ask_organic';
189
+ else if (referrer.includes('naver.'))
190
+ marketingData['origin'] = 'naver_organic';
191
+ else
192
+ marketingData['origin'] = 'referral_other';
193
+ }
194
+ else {
195
+ marketingData['origin'] = 'web'; // Tráfico directo
196
+ }
184
197
  }
185
198
  }
186
- // --- ENVÍO AL WIDGET ---
187
- if (Object.keys(marketingData).length > 0) {
188
- // Siempre evaluamos el origin, porque si viene vacío, lo rellenamos con el orgánico o 'web'
199
+ else {
200
+ // Si capturamos datos nuevos (URL, Cookies, GTM) pero no traen "origin", se lo asignamos
189
201
  if (!marketingData['origin']) {
190
202
  if (marketingData['utm_source']) {
191
203
  marketingData['origin'] =
@@ -205,49 +217,22 @@ export class BabylonBookingWidgetComponent {
205
217
  else if (marketingData['ttclid']) {
206
218
  marketingData['origin'] = 'tiktok_ads';
207
219
  }
208
- else {
209
- // 5. RED DE SEGURIDAD ORGÁNICA FRONTEND
210
- const referrer = document.referrer
211
- ? document.referrer.toLowerCase()
212
- : '';
213
- if (referrer) {
214
- if (referrer.includes('google.'))
215
- marketingData['origin'] = 'google_organic';
216
- else if (referrer.includes('bing.'))
217
- marketingData['origin'] = 'bing_organic';
218
- else if (referrer.includes('yahoo.'))
219
- marketingData['origin'] = 'yahoo_organic';
220
- else if (referrer.includes('duckduckgo.'))
221
- marketingData['origin'] = 'duckduckgo_organic';
222
- else if (referrer.includes('yandex.'))
223
- marketingData['origin'] = 'yandex_organic';
224
- else if (referrer.includes('baidu.'))
225
- marketingData['origin'] = 'baidu_organic';
226
- else if (referrer.includes('ecosia.'))
227
- marketingData['origin'] = 'ecosia_organic';
228
- else if (referrer.includes('qwant.'))
229
- marketingData['origin'] = 'qwant_organic';
230
- else if (referrer.includes('ask.'))
231
- marketingData['origin'] = 'ask_organic';
232
- else if (referrer.includes('naver.'))
233
- marketingData['origin'] = 'naver_organic';
234
- else
235
- marketingData['origin'] = 'referral_other'; // Tráfico desde otra web
236
- }
237
- else {
238
- // Tráfico directo (URL tecleada a mano o referrer oculto)
239
- marketingData['origin'] = 'web'; // Valor por defecto seguro para Witbooking
240
- }
241
- }
242
220
  }
243
- // El evento se dispara SIEMPRE, ya que como mínimo llevará { origin: 'web' }
244
- setTimeout(() => {
245
- const event = new CustomEvent('widgetUpdateParams', {
246
- detail: marketingData,
247
- });
248
- element.dispatchEvent(event);
249
- }, 500);
250
221
  }
222
+ // --- CAPA 5: GUARDAR SIEMPRE EN SESSION STORAGE ---
223
+ try {
224
+ Object.entries(marketingData).forEach(([key, value]) => {
225
+ sessionStorage.setItem(`mkt_${key}`, value);
226
+ });
227
+ }
228
+ catch (error) { }
229
+ // --- ENVÍO AL WIDGET ---
230
+ setTimeout(() => {
231
+ const event = new CustomEvent('widgetUpdateParams', {
232
+ detail: marketingData,
233
+ });
234
+ element.dispatchEvent(event);
235
+ }, 500);
251
236
  }
252
237
  ngOnChanges(changes) {
253
238
  if (changes['ticker']) {
@@ -448,4 +433,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
448
433
  }], monthsToDisplay: [{
449
434
  type: Input
450
435
  }] } });
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tYm9va2luZy13aWRnZXQvYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsSUFBSSxtQkFBbUIsR0FBeUIsSUFBSSxDQUFDO0FBRXJELFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDekIsSUFBSSxtQkFBbUI7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBRXBELG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hELDJCQUEyQjtRQUMzQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO1lBQ3RELE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUNiLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENB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LEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhYnlsb25XaWRnZXRTZWFyY2hMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFieWxvbi13aWRnZXQtc2VhcmNoLWxvYWRlci5zZXJ2aWNlJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBXaWRnZXRTZWFyY2g6IGFueTtcbiAgICAgICAgaW5pdGlhbGl6ZVdpZGdldFNlYXJjaD86ICgpID0+IHZvaWQ7XG4gICAgICAgIGdldFdpZGdldEluc3RhbmNlPzogKGlkOiBzdHJpbmcpID0+IGFueTtcbiAgICB9XG59XG5cbmxldCB3aWRnZXRTY3JpcHRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGxvYWRPbmNlKHNyYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHdpZGdldFNjcmlwdFByb21pc2UpIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xuXG4gICAgd2lkZ2V0U2NyaXB0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gU2kgeWEgZXhpc3RlLCByZXNvbHZlbW9zXG4gICAgICAgIGlmICh3aW5kb3cuV2lkZ2V0U2VhcmNoIHx8IHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHMuc3JjID0gc3JjO1xuICAgICAgICBzLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHMub25lcnJvciA9ICgpID0+XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBzZSBwdWRvIGNhcmdhciBlbCBzY3JpcHQgZGVsIHdpZGdldCcpKTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1iYWJ5bG9uLWJvb2tpbmctd2lkZ2V0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN3aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJvb2staWRdPVwiaG90ZWxJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsXT1cInRpY2tlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWVuZ2luZV09XCJlbmdpbmVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aGVtZV09XCJ0aGVtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1sYXlvdXQtY29sdW1uXT1cImxheW91dENvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWRlZmF1bHQtYWR1bHRzXT1cImRlZmF1bHRBZHVsdHNcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kZWZhdWx0LWp1bmlvcl09XCJkZWZhdWx0SnVuaW9yXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZGVmYXVsdC1jaGlsZHJlbl09XCJkZWZhdWx0Q2hpbGRyZW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByaWNlXT1cInNob3dQcmljZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctaG90ZWwtc2VsZWN0b3JdPVwic2hvd0hvdGVsU2VsZWN0b3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByb21vLWNvZGVdPVwic2hvd1Byb21vQ29kZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctY2hpbGQtYWdlc109XCJzaG93Q2hpbGRBZ2VzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWNoaWxkcmVuXT1cIm1heENoaWxkcmVuXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWp1bmlvcl09XCJtYXhKdW5pb3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1iYXNlLXVybF09XCJiYXNlVXJsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWNoYWluXT1cInVybENoYWluXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWhvdGVsXT1cInVybEhvdGVsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYnV0dG9uLXRleHRdPVwiYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1yb29tc109XCJtYXhSb29tc1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctYWxsLWhvdGVscy1vcHRpb25dPVwic2hvd0FsbEhvdGVsc09wdGlvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRhcmdldC1ibGFua109XCJ0YXJnZXRCbGFua1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsLXRleHRdPVwiaG90ZWxUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWluLWRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1kYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kaXNwbGF5LW1vbnRoc109XCJtb250aHNUb0Rpc3BsYXlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFieWxvbkJvb2tpbmdXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3dpZGdldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgd2lkZ2V0Q29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBASW5wdXQoKSB3aWRnZXRJZCA9ICd3aWRnZXQtc2VhcmNoJztcbiAgICBASW5wdXQoKSBob3RlbElkID0gJ2FsZWNhZCc7XG4gICAgQElucHV0KCkgdGlja2VyID0gJ2hvdGVsbWFyaXN0ZWwuY29tJztcbiAgICBASW5wdXQoKSB0eXBlOiAnY2hhaW4nIHwgJ2hvdGVsJyB8IHN0cmluZyA9ICdjaGFpbic7XG4gICAgQElucHV0KCkgZW5naW5lOiAnd2l0Ym9va2luZycgfCAncm9pYmFjaycgfCBzdHJpbmcgPSAnd2l0Ym9va2luZyc7XG4gICAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCBzdHJpbmcgPSAnbGlnaHQnO1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5ID0gJ0VVUic7XG4gICAgQElucHV0KCkgbG9jYWxlPzogc3RyaW5nID0gJ2VzLUVTJztcbiAgICBASW5wdXQoKSBsYXlvdXQ6ICdpbmxpbmUnIHwgJ2NvbHVtbicgfCBzdHJpbmcgPSAnaW5saW5lJztcbiAgICBASW5wdXQoKSBkZWZhdWx0QWR1bHRzID0gMjtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2hpbGRyZW4gPSAwO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRKdW5pb3IgPSAwO1xuICAgIEBJbnB1dCgpIHNob3dQcmljZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dIb3RlbFNlbGVjdG9yID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93UHJvbW9Db2RlID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93Q2hpbGRBZ2VzID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBtYXhDaGlsZHJlbj86IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhKdW5pb3I/OiBudW1iZXI7XG4gICAgQElucHV0KCkgYmFzZVVybD86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxDaGFpbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxIb3RlbCA9ICdob3RlbCc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXlvdXRDb2x1bW4/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4Um9vbXM/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FsbEhvdGVsc09wdGlvbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB0YXJnZXRCbGFuaz86IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG90ZWxUZXh0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGU/OiBzdHJpbmc7IC8qIDIwMjgtMDEtMDEgKi9cbiAgICBASW5wdXQoKSBtaW5EYXRlPzogc3RyaW5nOyAvKiAyMDI4LTAxLTAxICovXG5cbiAgICBASW5wdXQoKSBmbGFnVGltZT86IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIG1vbnRoc1RvRGlzcGxheT86IG51bWJlciA9IDE7XG5cbiAgICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGVuZGluZ1RpY2tlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXRyeVRpbWVvdXQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgbG9hZGVyOiBCYWJ5bG9uV2lkZ2V0U2VhcmNoTG9hZGVyU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDirIfvuI8gUE9OIEFRVcONIGxhIFVSTCByZWFsIGRlbCBzY3JpcHQgZGUgV2l0Ym9va2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkZXIubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFnVGltZSA/IDMwMCA6IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gT3BjacOzbiBBIChzaSBleGlzdGUpOiBpbml0IGdsb2JhbCBtYW51YWxcbiAgICAgICAgaWYgKHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZVdpZGdldFNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9wY2nDs24gQjogY29uc3RydWN0b3IgKFNvbG8gZW50cmEgc2kgbm8gZXhpc3RlIGxhIEEpXG4gICAgICAgIGVsc2UgaWYgKHdpbmRvdy5XaWRnZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuV2lkZ2V0U2VhcmNoKGVsLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluamVjdE1hcmtldGluZ1BhcmFtcyhlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmplY3RNYXJrZXRpbmdQYXJhbXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gUFJPVEVDQ0nDk04gU1NSOiBTaSBlc3RhbW9zIGVuIGVsIHNlcnZpZG9yIGRlIE5vZGUsIGFib3J0YW1vcyBwYXJhIGV2aXRhciBjdWVsZ3Vlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIERJQ0NJT05BUklPUyBERSBOT01FTkNMQVRVUkFTIEVTVMOBTkRBUlxuICAgICAgICAvLyBDbGljIElEcyBhdXRvbcOhdGljb3MgZGUgbGFzIHByaW5jaXBhbGVzIHBsYXRhZm9ybWFzIHB1YmxpY2l0YXJpYXNbY2l0ZTogMTZdXG4gICAgICAgIGNvbnN0IENMSUNLX0lEUyA9IFtcbiAgICAgICAgICAgICdnY2xpZCcsXG4gICAgICAgICAgICAnZ2JyYWlkJyxcbiAgICAgICAgICAgICd3YnJhaWQnLFxuICAgICAgICAgICAgJ2RjbGlkJywgLy8gR29vZ2xlW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ21zY2xraWQnLCAvLyBNaWNyb3NvZnQgLyBCaW5nW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3ZtY2lkJywgLy8gWWFob29bY2l0ZTogMTZdXG4gICAgICAgICAgICAneWNsaWQnLFxuICAgICAgICAgICAgJ3ltY2xpZCcsIC8vIFlhbmRleFtjaXRlOiAxNl1cbiAgICAgICAgICAgICdmYmNsaWQnLCAvLyBNZXRhIChGYWNlYm9vaywgSW5zdGFncmFtLCBXaGF0c0FwcClbY2l0ZTogMTZdXG4gICAgICAgICAgICAndHRjbGlkJywgLy8gVGlrVG9rW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2xpX2ZhdF9pZCcsIC8vIExpbmtlZEluW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3R3Y2xpZCcsIC8vIFggKFR3aXR0ZXIpW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2VwaWsnLCAvLyBQaW50ZXJlc3RbY2l0ZTogMTZdXG4gICAgICAgICAgICAncmR0X2NpZCcsIC8vIFJlZGRpdFtjaXRlOiAxNl1cbiAgICAgICAgICAgICdTY0NpZCcsIC8vIFNuYXBjaGF0W2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3FjbGlkJywgLy8gUXVvcmFbY2l0ZTogMTZdXG4gICAgICAgICAgICAnc2knLCAvLyBZb3VUdWJlW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2F3Y2xpZCcsIC8vIEFtYXpvbiBBZHNbY2l0ZTogMTZdXG4gICAgICAgICAgICAndGJsY2knLCAvLyBUYWJvb2xhW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2RpY2JvJywgLy8gT3V0YnJhaW5bY2l0ZTogMTZdXG4gICAgICAgICAgICAnYWRfaWQnLCAvLyBBZFJvbGxbY2l0ZTogMTZdXG4gICAgICAgICAgICAnaXJjbGlja2lkJyxcbiAgICAgICAgICAgICdjamV2ZW50JywgLy8gQWZpbGlhZG9zIChJbXBhY3QsIENKKVtjaXRlOiAxNl1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBFc3TDoW5kYXIgbWFudWFsIFVUTVxuICAgICAgICBjb25zdCBVVE1TID0gW1xuICAgICAgICAgICAgJ3V0bV9zb3VyY2UnLFxuICAgICAgICAgICAgJ3V0bV9tZWRpdW0nLFxuICAgICAgICAgICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgICAgICAgICAndXRtX3Rlcm0nLFxuICAgICAgICAgICAgJ3V0bV9jb250ZW50JyxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBtYXJrZXRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMTogRVNDQU5FTyBERSBMQSBVUkwgLS0tXG4gICAgICAgIFsuLi5DTElDS19JRFMsIC4uLlVUTVMsICdvcmlnaW4nXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSBtYXJrZXRpbmdEYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMjogRVNDQU5FTyBERSBDT09LSUVTIChTaSBsYSBVUkwgZXN0w6EgbGltcGlhIHBlcm8gaGF5IHJhc3RybyBwdWJsaWNpdGFyaW8pIC0tLVxuICAgICAgICBjb25zdCBnZXRDb29raWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCcoXnwgKScgKyBuYW1lICsgJz0oW147XSspJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR29vZ2xlIEFkcyBndWFyZGEgc3UgR0NMSUQgZW4gbGEgY29va2llIF9nY2xfYXcgKGZvcm1hdG86IEdDTC50aW1lc3RhbXAuaWQpXG4gICAgICAgICAgICBjb25zdCBnY2xBdyA9IGdldENvb2tpZSgnX2djbF9hdycpO1xuICAgICAgICAgICAgaWYgKGdjbEF3ICYmIGdjbEF3LnNwbGl0KCcuJykubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydnY2xpZCddID0gZ2NsQXcuc3BsaXQoJy4nKVsyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFjZWJvb2sgZ3VhcmRhIHN1IEZCQ0xJRCBlbiBsYSBjb29raWUgX2ZicFxuICAgICAgICAgICAgY29uc3QgZmJwID0gZ2V0Q29va2llKCdfZmJwJyk7XG4gICAgICAgICAgICBpZiAoZmJwKSB7XG4gICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZmJjbGlkJ10gPSBmYnA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSAzOiBFU0NBTkVPIERFTCBEQVRBTEFZRVIgKElueWVjY2lvbmVzIHNpbGVuY2lvc2FzIGRlIFRhZyBNYW5hZ2VyKSAtLS1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAod2luZG93IGFzIGFueSkuZGF0YUxheWVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgZGwgPSAod2luZG93IGFzIGFueSkuZGF0YUxheWVyIGFzIGFueVtdO1xuICAgICAgICAgICAgLy8gUmVjb3JyZW1vcyBkZSBtw6FzIHJlY2llbnRlIGEgbcOhcyBhbnRpZ3VvXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGxbaV07XG4gICAgICAgICAgICAgICAgWy4uLkNMSUNLX0lEUywgLi4uVVRNUywgJ3RyYWZmaWNfc291cmNlJywgJ29yaWdpbiddLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgIChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtW2tleV0gJiYgIW1hcmtldGluZ0RhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcGVhciB1biBub21icmUgaW50ZXJubyAoZWouIHRyYWZmaWNfc291cmNlKSBhbCBlc3TDoW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEtleSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3RyYWZmaWNfc291cmNlJyA/ICdvcmlnaW4nIDoga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbZmluYWxLZXldID0gaXRlbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID4gMCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSA0OiBSRUNVUEVSQVIgLyBHVUFSREFSIFNFU0nDk04gKFByb3RlY2Npw7NuIFNQQSBlbiBBbmd1bGFyKSAtLS1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gaGF5IGRhdG9zIG51ZXZvcywgcmVjdXBlcmFtb3MgdG9kbyBsbyBxdWUgdGVuZ2EgcHJlZmlqbyAnbWt0XydcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZEtleXMgPSBPYmplY3Qua2V5cyhzZXNzaW9uU3RvcmFnZSkuZmlsdGVyKChrKSA9PlxuICAgICAgICAgICAgICAgIGsuc3RhcnRzV2l0aCgnbWt0XycpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RvcmVkS2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBrLnJlcGxhY2UoJ21rdF8nLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsKSBtYXJrZXRpbmdEYXRhW29yaWdpbmFsS2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGF5IGRhdG9zIG51ZXZvcywgbG9zIGd1YXJkYW1vcyBwYXJhIGxhIHByw7N4aW1hIHZleiBxdWUgbmF2ZWd1ZSBwb3IgbGEgd2ViXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG1hcmtldGluZ0RhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBta3RfJHtrZXl9YCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdBY2Nlc28gYSBzZXNzaW9uU3RvcmFnZSBibG9xdWVhZG8gcG9yIGVsIG5hdmVnYWRvci4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBFTlbDjU8gQUwgV0lER0VUIC0tLVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gU2llbXByZSBldmFsdWFtb3MgZWwgb3JpZ2luLCBwb3JxdWUgc2kgdmllbmUgdmFjw61vLCBsbyByZWxsZW5hbW9zIGNvbiBlbCBvcmfDoW5pY28gbyAnd2ViJ1xuICAgICAgICAgICAgaWYgKCFtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSkge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXRpbmdEYXRhWyd1dG1fc291cmNlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsndXRtX3NvdXJjZSddICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChtYXJrZXRpbmdEYXRhWyd1dG1fbWVkaXVtJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBfJHttYXJrZXRpbmdEYXRhWyd1dG1fbWVkaXVtJ119YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ2djbGlkJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnd2JyYWlkJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2JyYWlkJ11cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZ29vZ2xlX2NwYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrZXRpbmdEYXRhWydmYmNsaWQnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdtZXRhX2Fkcyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrZXRpbmdEYXRhWyd0dGNsaWQnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICd0aWt0b2tfYWRzJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyA1LiBSRUQgREUgU0VHVVJJREFEIE9SR8OBTklDQSBGUk9OVEVORFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRvY3VtZW50LnJlZmVycmVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2dvb2dsZS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdnb29nbGVfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYmluZy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdiaW5nX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ3lhaG9vLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3lhaG9vX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2R1Y2tkdWNrZ28uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZHVja2R1Y2tnb19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YW5kZXguJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAneWFuZGV4X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2JhaWR1LicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2JhaWR1X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2Vjb3NpYS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdlY29zaWFfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygncXdhbnQuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncXdhbnRfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYXNrLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Fza19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCduYXZlci4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICduYXZlcl9vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncmVmZXJyYWxfb3RoZXInOyAvLyBUcsOhZmljbyBkZXNkZSBvdHJhIHdlYlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHLDoWZpY28gZGlyZWN0byAoVVJMIHRlY2xlYWRhIGEgbWFubyBvIHJlZmVycmVyIG9jdWx0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3dlYic7IC8vIFZhbG9yIHBvciBkZWZlY3RvIHNlZ3VybyBwYXJhIFdpdGJvb2tpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRWwgZXZlbnRvIHNlIGRpc3BhcmEgU0lFTVBSRSwgeWEgcXVlIGNvbW8gbcOtbmltbyBsbGV2YXLDoSB7IG9yaWdpbjogJ3dlYicgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3dpZGdldFVwZGF0ZVBhcmFtcycsIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtYXJrZXRpbmdEYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1sndGlja2VyJ10pIHtcbiAgICAgICAgICAgIC8vIEd1YXJkYW1vcyBzaWVtcHJlIGVsIMOaTFRJTU8gdmFsb3IgcXVlIEFuZ3VsYXIgbm9zIG1hbmRlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdUaWNrZXIgPSBjaGFuZ2VzWyd0aWNrZXInXS5jdXJyZW50VmFsdWUgfHwgJ2FsbC1ob3RlbHMnO1xuXG4gICAgICAgICAgICAvLyBEaXNwYXJhbW9zIGxhIGFjdHVhbGl6YWNpw7NuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXaWRnZXRVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5yZXRyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJXaWRnZXRVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5yZXRyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLndpZGdldENvbnRhaW5lclxuICAgICAgICAgICAgICAgID8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyRWwpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gMS4gRXNwZXJhbW9zIGEgcXVlIGVsIHdpZGdldCBoYXlhIGRlc2NhcmdhZG8geSBkaWJ1amFkbyBsb3MgaG90ZWxlcyBlbiBlbCBET01cbiAgICAgICAgICAgIGNvbnN0IGhvdGVsT3B0aW9ucyA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ob3RlbC1vcHRpb24nKTtcblxuICAgICAgICAgICAgaWYgKGhvdGVsT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0VGlja2VyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nVGlja2VyICYmIHRoaXMucGVuZGluZ1RpY2tlcj8udHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBlbmRpbmdUaWNrZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYWxsLWhvdGVscyc7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVG9DbGljazogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIDIuIEJ1c2NhbW9zIGxhIG9wY2nDs24gZGUgaG90ZWwgcmVhbCBxdWUgY29pbmNpZGEgY29uIGVsIHRpY2tlclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG90ZWxPcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGhvdGVsT3B0aW9uc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0SWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmdldEF0dHJpYnV0ZSgnZGF0YS1ob3RlbC1pZCcpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvaW5jaWRlbmNpYSBleGFjdGEgbyBwYXJjaWFsIChwb3Igc2kgZWwgd2lkZ2V0IGxlIGHDsWFkZSBzdWZpam9zIGFsIElEKVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRJZCA9PT0gdGFyZ2V0VGlja2VyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRJZC5pbmNsdWRlcyh0YXJnZXRUaWNrZXIpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVG9DbGljayA9IG9wdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvblRvQ2xpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uVG9DbGljay5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQcO6biBubyBzZSBoYW4gZGlidWphZG8gbGFzIG9wY2lvbmVzLCBlbCBtb3RvciBzaWd1ZSBjYXJnYW5kby4uLlxuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy50cmlnZ2VyV2lkZ2V0VXBkYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIDMwMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tYm9va2luZy13aWRnZXQvYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsSUFBSSxtQkFBbUIsR0FBeUIsSUFBSSxDQUFDO0FBRXJELFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDekIsSUFBSSxtQkFBbUI7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBRXBELG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hELDJCQUEyQjtRQUMzQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO1lBQ3RELE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUNiLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENB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QkE0Q1EsTUFBTTsyQkFBQyxXQUFXOzZHQXpDdkIsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckMsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhYnlsb25XaWRnZXRTZWFyY2hMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFieWxvbi13aWRnZXQtc2VhcmNoLWxvYWRlci5zZXJ2aWNlJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBXaWRnZXRTZWFyY2g6IGFueTtcbiAgICAgICAgaW5pdGlhbGl6ZVdpZGdldFNlYXJjaD86ICgpID0+IHZvaWQ7XG4gICAgICAgIGdldFdpZGdldEluc3RhbmNlPzogKGlkOiBzdHJpbmcpID0+IGFueTtcbiAgICB9XG59XG5cbmxldCB3aWRnZXRTY3JpcHRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGxvYWRPbmNlKHNyYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHdpZGdldFNjcmlwdFByb21pc2UpIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xuXG4gICAgd2lkZ2V0U2NyaXB0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gU2kgeWEgZXhpc3RlLCByZXNvbHZlbW9zXG4gICAgICAgIGlmICh3aW5kb3cuV2lkZ2V0U2VhcmNoIHx8IHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHMuc3JjID0gc3JjO1xuICAgICAgICBzLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHMub25lcnJvciA9ICgpID0+XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBzZSBwdWRvIGNhcmdhciBlbCBzY3JpcHQgZGVsIHdpZGdldCcpKTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1iYWJ5bG9uLWJvb2tpbmctd2lkZ2V0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN3aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJvb2staWRdPVwiaG90ZWxJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsXT1cInRpY2tlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWVuZ2luZV09XCJlbmdpbmVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aGVtZV09XCJ0aGVtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1sYXlvdXQtY29sdW1uXT1cImxheW91dENvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWRlZmF1bHQtYWR1bHRzXT1cImRlZmF1bHRBZHVsdHNcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kZWZhdWx0LWp1bmlvcl09XCJkZWZhdWx0SnVuaW9yXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZGVmYXVsdC1jaGlsZHJlbl09XCJkZWZhdWx0Q2hpbGRyZW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByaWNlXT1cInNob3dQcmljZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctaG90ZWwtc2VsZWN0b3JdPVwic2hvd0hvdGVsU2VsZWN0b3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByb21vLWNvZGVdPVwic2hvd1Byb21vQ29kZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctY2hpbGQtYWdlc109XCJzaG93Q2hpbGRBZ2VzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWNoaWxkcmVuXT1cIm1heENoaWxkcmVuXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWp1bmlvcl09XCJtYXhKdW5pb3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1iYXNlLXVybF09XCJiYXNlVXJsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWNoYWluXT1cInVybENoYWluXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWhvdGVsXT1cInVybEhvdGVsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYnV0dG9uLXRleHRdPVwiYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1yb29tc109XCJtYXhSb29tc1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctYWxsLWhvdGVscy1vcHRpb25dPVwic2hvd0FsbEhvdGVsc09wdGlvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRhcmdldC1ibGFua109XCJ0YXJnZXRCbGFua1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsLXRleHRdPVwiaG90ZWxUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWluLWRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1kYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kaXNwbGF5LW1vbnRoc109XCJtb250aHNUb0Rpc3BsYXlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFieWxvbkJvb2tpbmdXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3dpZGdldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgd2lkZ2V0Q29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBASW5wdXQoKSB3aWRnZXRJZCA9ICd3aWRnZXQtc2VhcmNoJztcbiAgICBASW5wdXQoKSBob3RlbElkID0gJ2FsZWNhZCc7XG4gICAgQElucHV0KCkgdGlja2VyID0gJ2hvdGVsbWFyaXN0ZWwuY29tJztcbiAgICBASW5wdXQoKSB0eXBlOiAnY2hhaW4nIHwgJ2hvdGVsJyB8IHN0cmluZyA9ICdjaGFpbic7XG4gICAgQElucHV0KCkgZW5naW5lOiAnd2l0Ym9va2luZycgfCAncm9pYmFjaycgfCBzdHJpbmcgPSAnd2l0Ym9va2luZyc7XG4gICAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCBzdHJpbmcgPSAnbGlnaHQnO1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5ID0gJ0VVUic7XG4gICAgQElucHV0KCkgbG9jYWxlPzogc3RyaW5nID0gJ2VzLUVTJztcbiAgICBASW5wdXQoKSBsYXlvdXQ6ICdpbmxpbmUnIHwgJ2NvbHVtbicgfCBzdHJpbmcgPSAnaW5saW5lJztcbiAgICBASW5wdXQoKSBkZWZhdWx0QWR1bHRzID0gMjtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2hpbGRyZW4gPSAwO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRKdW5pb3IgPSAwO1xuICAgIEBJbnB1dCgpIHNob3dQcmljZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dIb3RlbFNlbGVjdG9yID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93UHJvbW9Db2RlID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93Q2hpbGRBZ2VzID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBtYXhDaGlsZHJlbj86IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhKdW5pb3I/OiBudW1iZXI7XG4gICAgQElucHV0KCkgYmFzZVVybD86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxDaGFpbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxIb3RlbCA9ICdob3RlbCc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXlvdXRDb2x1bW4/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4Um9vbXM/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FsbEhvdGVsc09wdGlvbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB0YXJnZXRCbGFuaz86IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG90ZWxUZXh0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGU/OiBzdHJpbmc7IC8qIDIwMjgtMDEtMDEgKi9cbiAgICBASW5wdXQoKSBtaW5EYXRlPzogc3RyaW5nOyAvKiAyMDI4LTAxLTAxICovXG5cbiAgICBASW5wdXQoKSBmbGFnVGltZT86IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIG1vbnRoc1RvRGlzcGxheT86IG51bWJlciA9IDE7XG5cbiAgICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGVuZGluZ1RpY2tlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXRyeVRpbWVvdXQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgbG9hZGVyOiBCYWJ5bG9uV2lkZ2V0U2VhcmNoTG9hZGVyU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDirIfvuI8gUE9OIEFRVcONIGxhIFVSTCByZWFsIGRlbCBzY3JpcHQgZGUgV2l0Ym9va2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkZXIubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFnVGltZSA/IDMwMCA6IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gT3BjacOzbiBBIChzaSBleGlzdGUpOiBpbml0IGdsb2JhbCBtYW51YWxcbiAgICAgICAgaWYgKHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZVdpZGdldFNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9wY2nDs24gQjogY29uc3RydWN0b3IgKFNvbG8gZW50cmEgc2kgbm8gZXhpc3RlIGxhIEEpXG4gICAgICAgIGVsc2UgaWYgKHdpbmRvdy5XaWRnZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuV2lkZ2V0U2VhcmNoKGVsLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluamVjdE1hcmtldGluZ1BhcmFtcyhlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmplY3RNYXJrZXRpbmdQYXJhbXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gUFJPVEVDQ0nDk04gU1NSXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygc2Vzc2lvblN0b3JhZ2UgPT09ICd1bmRlZmluZWQnXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBDTElDS19JRFMgPSBbXG4gICAgICAgICAgICAnZ2NsaWQnLFxuICAgICAgICAgICAgJ2dicmFpZCcsXG4gICAgICAgICAgICAnd2JyYWlkJyxcbiAgICAgICAgICAgICdkY2xpZCcsXG4gICAgICAgICAgICAnbXNjbGtpZCcsXG4gICAgICAgICAgICAndm1jaWQnLFxuICAgICAgICAgICAgJ3ljbGlkJyxcbiAgICAgICAgICAgICd5bWNsaWQnLFxuICAgICAgICAgICAgJ2ZiY2xpZCcsXG4gICAgICAgICAgICAndHRjbGlkJyxcbiAgICAgICAgICAgICdsaV9mYXRfaWQnLFxuICAgICAgICAgICAgJ3R3Y2xpZCcsXG4gICAgICAgICAgICAnZXBpaycsXG4gICAgICAgICAgICAncmR0X2NpZCcsXG4gICAgICAgICAgICAnU2NDaWQnLFxuICAgICAgICAgICAgJ3FjbGlkJyxcbiAgICAgICAgICAgICdzaScsXG4gICAgICAgICAgICAnYXdjbGlkJyxcbiAgICAgICAgICAgICd0YmxjaScsXG4gICAgICAgICAgICAnZGljYm8nLFxuICAgICAgICAgICAgJ2FkX2lkJyxcbiAgICAgICAgICAgICdpcmNsaWNraWQnLFxuICAgICAgICAgICAgJ2NqZXZlbnQnLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBVVE1TID0gW1xuICAgICAgICAgICAgJ3V0bV9zb3VyY2UnLFxuICAgICAgICAgICAgJ3V0bV9tZWRpdW0nLFxuICAgICAgICAgICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgICAgICAgICAndXRtX3Rlcm0nLFxuICAgICAgICAgICAgJ3V0bV9jb250ZW50JyxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBtYXJrZXRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMTogVVJMIC0tLVxuICAgICAgICBbLi4uQ0xJQ0tfSURTLCAuLi5VVE1TLCAnb3JpZ2luJ10uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgbWFya2V0aW5nRGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC0tLSBDQVBBIDI6IENPT0tJRVMgLS0tXG4gICAgICAgIGNvbnN0IGdldENvb2tpZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoJyhefCApJyArIG5hbWUgKyAnPShbXjtdKyknKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBnY2xBdyA9IGdldENvb2tpZSgnX2djbF9hdycpO1xuICAgICAgICAgICAgaWYgKGdjbEF3ICYmIGdjbEF3LnNwbGl0KCcuJykubGVuZ3RoID49IDMpXG4gICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2NsaWQnXSA9IGdjbEF3LnNwbGl0KCcuJylbMl07XG5cbiAgICAgICAgICAgIGNvbnN0IGZicCA9IGdldENvb2tpZSgnX2ZicCcpO1xuICAgICAgICAgICAgaWYgKGZicCkgbWFya2V0aW5nRGF0YVsnZmJjbGlkJ10gPSBmYnA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSAzOiBEQVRBTEFZRVIgLS0tXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLmRhdGFMYXllclxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGRsID0gKHdpbmRvdyBhcyBhbnkpLmRhdGFMYXllciBhcyBhbnlbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBkbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkbFtpXTtcbiAgICAgICAgICAgICAgICBbLi4uQ0xJQ0tfSURTLCAuLi5VVE1TLCAndHJhZmZpY19zb3VyY2UnLCAnb3JpZ2luJ10uZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1ba2V5XSAmJiAhbWFya2V0aW5nRGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxLZXkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICd0cmFmZmljX3NvdXJjZScgPyAnb3JpZ2luJyA6IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhW2ZpbmFsS2V5XSA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA+IDApIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIENBUEEgNDogUkVDVVBFUkFSIERFIFNFU0nDk04gTyBERVRFUk1JTkFSIE9SR8OBTklDTyAtLS1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gSW50ZW50YXIgcmVjdXBlcmFyIGRlIG5hdmVnYWNpb25lcyBhbnRlcmlvcmVzXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXMoc2Vzc2lvblN0b3JhZ2UpLmZpbHRlcigoaykgPT5cbiAgICAgICAgICAgICAgICBrLnN0YXJ0c1dpdGgoJ21rdF8nKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN0b3JlZEtleXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0gay5yZXBsYWNlKCdta3RfJywgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oayk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCkgbWFya2V0aW5nRGF0YVtvcmlnaW5hbEtleV0gPSB2YWw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gU2kgZGVzcHXDqXMgZGUgYnVzY2FyIGVuIHNlc2nDs24gc2lndWUgdmFjw61vLCBlcyBUUsOBRklDTyBOVUVWTyBTSU4gQ0FNUEHDkUFTLlxuICAgICAgICAgICAgLy8gQXF1w60gYXZlcmlndWFtb3MgZWwgb3JpZ2VuIG9yZ8OhbmljbyBwYXJhIHBvZGVyIEdVQVJEQVJMTyBlbiBlbCBzaWd1aWVudGUgcGFzby5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXJrZXRpbmdEYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyXG4gICAgICAgICAgICAgICAgICAgID8gZG9jdW1lbnQucmVmZXJyZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICA6ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZ29vZ2xlLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZ29vZ2xlX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYmluZy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Jpbmdfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YWhvby4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3lhaG9vX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZHVja2R1Y2tnby4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2R1Y2tkdWNrZ29fb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YW5kZXguJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICd5YW5kZXhfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCdiYWlkdS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2JhaWR1X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZWNvc2lhLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZWNvc2lhX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygncXdhbnQuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdxd2FudF9vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2Fzay4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Fza19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ25hdmVyLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnbmF2ZXJfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncmVmZXJyYWxfb3RoZXInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3dlYic7IC8vIFRyw6FmaWNvIGRpcmVjdG9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTaSBjYXB0dXJhbW9zIGRhdG9zIG51ZXZvcyAoVVJMLCBDb29raWVzLCBHVE0pIHBlcm8gbm8gdHJhZW4gXCJvcmlnaW5cIiwgc2UgbG8gYXNpZ25hbW9zXG4gICAgICAgICAgICBpZiAoIW1hcmtldGluZ0RhdGFbJ29yaWdpbiddKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtldGluZ0RhdGFbJ3V0bV9zb3VyY2UnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWyd1dG1fc291cmNlJ10gK1xuICAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtldGluZ0RhdGFbJ3V0bV9tZWRpdW0nXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYF8ke21hcmtldGluZ0RhdGFbJ3V0bV9tZWRpdW0nXX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2NsaWQnXSB8fFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWyd3YnJhaWQnXSB8fFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydnYnJhaWQnXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdnb29nbGVfY3BjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtldGluZ0RhdGFbJ2ZiY2xpZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ21ldGFfYWRzJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtldGluZ0RhdGFbJ3R0Y2xpZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3Rpa3Rva19hZHMnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBDQVBBIDU6IEdVQVJEQVIgU0lFTVBSRSBFTiBTRVNTSU9OIFNUT1JBR0UgLS0tXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhtYXJrZXRpbmdEYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBta3RfJHtrZXl9YCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICAgIC8vIC0tLSBFTlbDjU8gQUwgV0lER0VUIC0tLVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCd3aWRnZXRVcGRhdGVQYXJhbXMnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtYXJrZXRpbmdEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RpY2tlciddKSB7XG4gICAgICAgICAgICAvLyBHdWFyZGFtb3Mgc2llbXByZSBlbCDDmkxUSU1PIHZhbG9yIHF1ZSBBbmd1bGFyIG5vcyBtYW5kZVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVGlja2VyID0gY2hhbmdlc1sndGlja2VyJ10uY3VycmVudFZhbHVlIHx8ICdhbGwtaG90ZWxzJztcblxuICAgICAgICAgICAgLy8gRGlzcGFyYW1vcyBsYSBhY3R1YWxpemFjacOzblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV2lkZ2V0VXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0cnlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV2lkZ2V0VXBkYXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucmV0cnlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy53aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgICAgICA/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIDEuIEVzcGVyYW1vcyBhIHF1ZSBlbCB3aWRnZXQgaGF5YSBkZXNjYXJnYWRvIHkgZGlidWphZG8gbG9zIGhvdGVsZXMgZW4gZWwgRE9NXG4gICAgICAgICAgICBjb25zdCBob3RlbE9wdGlvbnMgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuaG90ZWwtb3B0aW9uJyk7XG5cbiAgICAgICAgICAgIGlmIChob3RlbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFRpY2tlciA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ1RpY2tlciAmJiB0aGlzLnBlbmRpbmdUaWNrZXI/LnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5wZW5kaW5nVGlja2VyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2FsbC1ob3RlbHMnO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvblRvQ2xpY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvLyAyLiBCdXNjYW1vcyBsYSBvcGNpw7NuIGRlIGhvdGVsIHJlYWwgcXVlIGNvaW5jaWRhIGNvbiBlbCB0aWNrZXJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvdGVsT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBob3RlbE9wdGlvbnNbaV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdElkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaG90ZWwtaWQnKT8udG9Mb3dlckNhc2UoKSB8fCAnJztcblxuICAgICAgICAgICAgICAgICAgICAvLyBDb2luY2lkZW5jaWEgZXhhY3RhIG8gcGFyY2lhbCAocG9yIHNpIGVsIHdpZGdldCBsZSBhw7FhZGUgc3VmaWpvcyBhbCBJRClcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0SWQgPT09IHRhcmdldFRpY2tlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0SWQuaW5jbHVkZXModGFyZ2V0VGlja2VyKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblRvQ2xpY2sgPSBvcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25Ub0NsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvblRvQ2xpY2suY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEHDum4gbm8gc2UgaGFuIGRpYnVqYWRvIGxhcyBvcGNpb25lcywgZWwgbW90b3Igc2lndWUgY2FyZ2FuZG8uLi5cbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMudHJpZ2dlcldpZGdldFVwZGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAzMDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
@@ -8659,13 +8659,10 @@ class BabylonBookingWidgetComponent {
8659
8659
  this.injectMarketingParams(el);
8660
8660
  }
8661
8661
  injectMarketingParams(element) {
8662
- // PROTECCIÓN SSR: Si estamos en el servidor de Node, abortamos para evitar cuelgues
8662
+ // PROTECCIÓN SSR
8663
8663
  if (typeof window === 'undefined' ||
8664
- typeof sessionStorage === 'undefined') {
8664
+ typeof sessionStorage === 'undefined')
8665
8665
  return;
8666
- }
8667
- // 1. DICCIONARIOS DE NOMENCLATURAS ESTÁNDAR
8668
- // Clic IDs automáticos de las principales plataformas publicitarias[cite: 16]
8669
8666
  const CLICK_IDS = [
8670
8667
  'gclid',
8671
8668
  'gbraid',
@@ -8689,9 +8686,8 @@ class BabylonBookingWidgetComponent {
8689
8686
  'dicbo',
8690
8687
  'ad_id',
8691
8688
  'irclickid',
8692
- 'cjevent', // Afiliados (Impact, CJ)[cite: 16]
8689
+ 'cjevent',
8693
8690
  ];
8694
- // Estándar manual UTM
8695
8691
  const UTMS = [
8696
8692
  'utm_source',
8697
8693
  'utm_medium',
@@ -8701,39 +8697,33 @@ class BabylonBookingWidgetComponent {
8701
8697
  ];
8702
8698
  const marketingData = {};
8703
8699
  const params = new URLSearchParams(window.location.search);
8704
- // --- CAPA 1: ESCANEO DE LA URL ---
8700
+ // --- CAPA 1: URL ---
8705
8701
  [...CLICK_IDS, ...UTMS, 'origin'].forEach((key) => {
8706
8702
  const value = params.get(key);
8707
8703
  if (value)
8708
8704
  marketingData[key] = value;
8709
8705
  });
8710
- // --- CAPA 2: ESCANEO DE COOKIES (Si la URL está limpia pero hay rastro publicitario) ---
8706
+ // --- CAPA 2: COOKIES ---
8711
8707
  const getCookie = (name) => {
8712
8708
  const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
8713
8709
  return match ? match[2] : null;
8714
8710
  };
8715
8711
  if (Object.keys(marketingData).length === 0) {
8716
- // Google Ads guarda su GCLID en la cookie _gcl_aw (formato: GCL.timestamp.id)
8717
8712
  const gclAw = getCookie('_gcl_aw');
8718
- if (gclAw && gclAw.split('.').length >= 3) {
8713
+ if (gclAw && gclAw.split('.').length >= 3)
8719
8714
  marketingData['gclid'] = gclAw.split('.')[2];
8720
- }
8721
- // Facebook guarda su FBCLID en la cookie _fbp
8722
8715
  const fbp = getCookie('_fbp');
8723
- if (fbp) {
8716
+ if (fbp)
8724
8717
  marketingData['fbclid'] = fbp;
8725
- }
8726
8718
  }
8727
- // --- CAPA 3: ESCANEO DEL DATALAYER (Inyecciones silenciosas de Tag Manager) ---
8719
+ // --- CAPA 3: DATALAYER ---
8728
8720
  if (Object.keys(marketingData).length === 0 &&
8729
8721
  window.dataLayer) {
8730
8722
  const dl = window.dataLayer;
8731
- // Recorremos de más reciente a más antiguo
8732
8723
  for (let i = dl.length - 1; i >= 0; i--) {
8733
8724
  const item = dl[i];
8734
8725
  [...CLICK_IDS, ...UTMS, 'traffic_source', 'origin'].forEach((key) => {
8735
8726
  if (item[key] && !marketingData[key]) {
8736
- // Mapear un nombre interno (ej. traffic_source) al estándar
8737
8727
  const finalKey = key === 'traffic_source' ? 'origin' : key;
8738
8728
  marketingData[finalKey] = item[key];
8739
8729
  }
@@ -8742,9 +8732,9 @@ class BabylonBookingWidgetComponent {
8742
8732
  break;
8743
8733
  }
8744
8734
  }
8745
- // --- CAPA 4: RECUPERAR / GUARDAR SESIÓN (Protección SPA en Angular) ---
8735
+ // --- CAPA 4: RECUPERAR DE SESIÓN O DETERMINAR ORGÁNICO ---
8746
8736
  if (Object.keys(marketingData).length === 0) {
8747
- // No hay datos nuevos, recuperamos todo lo que tenga prefijo 'mkt_'
8737
+ // Intentar recuperar de navegaciones anteriores
8748
8738
  const storedKeys = Object.keys(sessionStorage).filter((k) => k.startsWith('mkt_'));
8749
8739
  storedKeys.forEach((k) => {
8750
8740
  const originalKey = k.replace('mkt_', '');
@@ -8752,21 +8742,43 @@ class BabylonBookingWidgetComponent {
8752
8742
  if (val)
8753
8743
  marketingData[originalKey] = val;
8754
8744
  });
8755
- }
8756
- else {
8757
- // Hay datos nuevos, los guardamos para la próxima vez que navegue por la web
8758
- try {
8759
- Object.entries(marketingData).forEach(([key, value]) => {
8760
- sessionStorage.setItem(`mkt_${key}`, value);
8761
- });
8762
- }
8763
- catch (error) {
8764
- console.warn('Acceso a sessionStorage bloqueado por el navegador.');
8745
+ // Si después de buscar en sesión sigue vacío, es TRÁFICO NUEVO SIN CAMPAÑAS.
8746
+ // Aquí averiguamos el origen orgánico para poder GUARDARLO en el siguiente paso.
8747
+ if (Object.keys(marketingData).length === 0) {
8748
+ const referrer = document.referrer
8749
+ ? document.referrer.toLowerCase()
8750
+ : '';
8751
+ if (referrer) {
8752
+ if (referrer.includes('google.'))
8753
+ marketingData['origin'] = 'google_organic';
8754
+ else if (referrer.includes('bing.'))
8755
+ marketingData['origin'] = 'bing_organic';
8756
+ else if (referrer.includes('yahoo.'))
8757
+ marketingData['origin'] = 'yahoo_organic';
8758
+ else if (referrer.includes('duckduckgo.'))
8759
+ marketingData['origin'] = 'duckduckgo_organic';
8760
+ else if (referrer.includes('yandex.'))
8761
+ marketingData['origin'] = 'yandex_organic';
8762
+ else if (referrer.includes('baidu.'))
8763
+ marketingData['origin'] = 'baidu_organic';
8764
+ else if (referrer.includes('ecosia.'))
8765
+ marketingData['origin'] = 'ecosia_organic';
8766
+ else if (referrer.includes('qwant.'))
8767
+ marketingData['origin'] = 'qwant_organic';
8768
+ else if (referrer.includes('ask.'))
8769
+ marketingData['origin'] = 'ask_organic';
8770
+ else if (referrer.includes('naver.'))
8771
+ marketingData['origin'] = 'naver_organic';
8772
+ else
8773
+ marketingData['origin'] = 'referral_other';
8774
+ }
8775
+ else {
8776
+ marketingData['origin'] = 'web'; // Tráfico directo
8777
+ }
8765
8778
  }
8766
8779
  }
8767
- // --- ENVÍO AL WIDGET ---
8768
- if (Object.keys(marketingData).length > 0) {
8769
- // Siempre evaluamos el origin, porque si viene vacío, lo rellenamos con el orgánico o 'web'
8780
+ else {
8781
+ // Si capturamos datos nuevos (URL, Cookies, GTM) pero no traen "origin", se lo asignamos
8770
8782
  if (!marketingData['origin']) {
8771
8783
  if (marketingData['utm_source']) {
8772
8784
  marketingData['origin'] =
@@ -8786,49 +8798,22 @@ class BabylonBookingWidgetComponent {
8786
8798
  else if (marketingData['ttclid']) {
8787
8799
  marketingData['origin'] = 'tiktok_ads';
8788
8800
  }
8789
- else {
8790
- // 5. RED DE SEGURIDAD ORGÁNICA FRONTEND
8791
- const referrer = document.referrer
8792
- ? document.referrer.toLowerCase()
8793
- : '';
8794
- if (referrer) {
8795
- if (referrer.includes('google.'))
8796
- marketingData['origin'] = 'google_organic';
8797
- else if (referrer.includes('bing.'))
8798
- marketingData['origin'] = 'bing_organic';
8799
- else if (referrer.includes('yahoo.'))
8800
- marketingData['origin'] = 'yahoo_organic';
8801
- else if (referrer.includes('duckduckgo.'))
8802
- marketingData['origin'] = 'duckduckgo_organic';
8803
- else if (referrer.includes('yandex.'))
8804
- marketingData['origin'] = 'yandex_organic';
8805
- else if (referrer.includes('baidu.'))
8806
- marketingData['origin'] = 'baidu_organic';
8807
- else if (referrer.includes('ecosia.'))
8808
- marketingData['origin'] = 'ecosia_organic';
8809
- else if (referrer.includes('qwant.'))
8810
- marketingData['origin'] = 'qwant_organic';
8811
- else if (referrer.includes('ask.'))
8812
- marketingData['origin'] = 'ask_organic';
8813
- else if (referrer.includes('naver.'))
8814
- marketingData['origin'] = 'naver_organic';
8815
- else
8816
- marketingData['origin'] = 'referral_other'; // Tráfico desde otra web
8817
- }
8818
- else {
8819
- // Tráfico directo (URL tecleada a mano o referrer oculto)
8820
- marketingData['origin'] = 'web'; // Valor por defecto seguro para Witbooking
8821
- }
8822
- }
8823
8801
  }
8824
- // El evento se dispara SIEMPRE, ya que como mínimo llevará { origin: 'web' }
8825
- setTimeout(() => {
8826
- const event = new CustomEvent('widgetUpdateParams', {
8827
- detail: marketingData,
8828
- });
8829
- element.dispatchEvent(event);
8830
- }, 500);
8831
8802
  }
8803
+ // --- CAPA 5: GUARDAR SIEMPRE EN SESSION STORAGE ---
8804
+ try {
8805
+ Object.entries(marketingData).forEach(([key, value]) => {
8806
+ sessionStorage.setItem(`mkt_${key}`, value);
8807
+ });
8808
+ }
8809
+ catch (error) { }
8810
+ // --- ENVÍO AL WIDGET ---
8811
+ setTimeout(() => {
8812
+ const event = new CustomEvent('widgetUpdateParams', {
8813
+ detail: marketingData,
8814
+ });
8815
+ element.dispatchEvent(event);
8816
+ }, 500);
8832
8817
  }
8833
8818
  ngOnChanges(changes) {
8834
8819
  if (changes['ticker']) {