@tilde-nlp/ngx-common 6.1.29 → 6.1.30

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.
@@ -0,0 +1,16 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class ChargebeeMountService {
4
+ constructor() {
5
+ this.chargebeeMounted = false;
6
+ }
7
+ static { this.ɵfac = function ChargebeeMountService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChargebeeMountService)(); }; }
8
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ChargebeeMountService, factory: ChargebeeMountService.ɵfac, providedIn: 'root' }); }
9
+ }
10
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChargebeeMountService, [{
11
+ type: Injectable,
12
+ args: [{
13
+ providedIn: 'root'
14
+ }]
15
+ }], null, null); })();
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmdlYmVlLW1vdW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvc3Vic2NyaXB0aW9uL2NoYXJnZWJlZS1tb3VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxxQkFBcUI7SUFIbEM7UUFJRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7S0FDMUI7c0hBRlkscUJBQXFCO3VFQUFyQixxQkFBcUIsV0FBckIscUJBQXFCLG1CQUZwQixNQUFNOztpRkFFUCxxQkFBcUI7Y0FIakMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhcmdlYmVlTW91bnRTZXJ2aWNlIHtcclxuICBjaGFyZ2ViZWVNb3VudGVkID0gZmFsc2U7XHJcbn1cclxuIl19
@@ -1,2 +1,3 @@
1
1
  export * from './subscription.component';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvc3Vic2NyaXB0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbi5jb21wb25lbnQnO1xyXG4iXX0=
2
+ export * from './models';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvc3Vic2NyaXB0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbi5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL21vZGVscyc7XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmdlYmVlLXNldHRpbmdzLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3N1YnNjcmlwdGlvbi9tb2RlbHMvY2hhcmdlYmVlLXNldHRpbmdzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIENoYXJnZWJlZVNldHRpbmdze1xyXG4gIHNpdGU6IHN0cmluZztcclxuICBzY3JpcHQ6IHN0cmluZztcclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './chargebee-settings.model';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvc3Vic2NyaXB0aW9uL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jaGFyZ2ViZWUtc2V0dGluZ3MubW9kZWwnO1xyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLXF1b3RhLWRpc3BsYXkubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvc3Vic2NyaXB0aW9uL21vZGVscy9zdWJzY3JpcHRpb24tcXVvdGEtZGlzcGxheS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVvdGFVc2FnZSB9IGZyb20gXCJAdGlsZGUtbmxwL25neC1zZXJ2aWNlc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRpb25RdW90YURpc3BsYXkgZXh0ZW5kcyBRdW90YVVzYWdle1xyXG4gIGlzVW5saW1pdGVkOiBib29sZWFuO1xyXG4gIC8qKiBDb252ZXJ0ZWQgdG8gZGlzcGxheWFibGUgbWVhc3VybWVudHMuIEUuZy4gaWYgcXVvdGEgaXMgY291bnRlZCBpbiBzZWNvbmRzLCB0aGlzIG1heWJlIGNvbnZlcnRlZCB0byBtaW5zIG9yIGhvdXJzLCBkZXBlbmRpbmcgb24gcXVvdGEgdHlwZS4gKi9cclxuICBjb252ZXJ0ZWRMaW1pdDogc3RyaW5nO1xyXG4gIC8qKiBDb252ZXJ0ZWQgdG8gZGlzcGxheWFibGUgbWVhc3VybWVudHMuIEUuZy4gaWYgcXVvdGEgaXMgY291bnRlZCBpbiBzZWNvbmRzLCB0aGlzIG1heWJlIGNvbnZlcnRlZCB0byBtaW5zIG9yIGhvdXJzLCBkZXBlbmRpbmcgb24gcXVvdGEgdHlwZS4gKi9cclxuICBjb252ZXJ0ZWRVc2VkOiBzdHJpbmc7XHJcbiAgcGVyY2VudFVzZWQ6IG51bWJlcjtcclxufVxyXG4iXX0=
@@ -1,31 +1,35 @@
1
- import { Component, computed, input } from '@angular/core';
2
- import { TranslatePipe } from '@ngx-translate/core';
3
1
  import { CommonModule, DatePipe } from '@angular/common';
4
- import { SUBSCRIPTION_STATE } from './models/subscription-state.enum';
2
+ import { Component, computed, inject, input } from '@angular/core';
5
3
  import { MatProgressBarModule } from '@angular/material/progress-bar';
4
+ import { TranslatePipe } from '@ngx-translate/core';
5
+ import { QuotaType } from '@tilde-nlp/ngx-services';
6
+ import { SUBSCRIPTION_STATE } from './models/subscription-state.enum';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { ChargebeeMountService } from './chargebee-mount.service';
6
9
  import * as i0 from "@angular/core";
7
10
  import * as i1 from "@angular/material/progress-bar";
8
11
  import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/material/button";
9
13
  const _c0 = a0 => ({ date: a0 });
10
- const _c1 = (a0, a1) => ({ used: a0, limit: a1 });
14
+ const _c1 = (a0, a1, a2) => ({ used: a0, limit: a1, percent: a2 });
11
15
  function SubscriptionComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
12
16
  i0.ɵɵdeclareLet(0);
13
- i0.ɵɵelementStart(1, "h3", 0);
17
+ i0.ɵɵelementStart(1, "h3", 3);
14
18
  i0.ɵɵtext(2);
15
19
  i0.ɵɵpipe(3, "translate");
16
20
  i0.ɵɵelementEnd();
17
- i0.ɵɵelementStart(4, "div", 1)(5, "div", 2)(6, "span", 3);
21
+ i0.ɵɵelementStart(4, "div", 4)(5, "div", 5)(6, "span", 6);
18
22
  i0.ɵɵtext(7);
19
23
  i0.ɵɵpipe(8, "translate");
20
24
  i0.ɵɵelementEnd()();
21
- i0.ɵɵelementStart(9, "div", 4)(10, "span");
25
+ i0.ɵɵelementStart(9, "div", 7)(10, "span");
22
26
  i0.ɵɵtext(11);
23
27
  i0.ɵɵelementEnd()()();
24
- i0.ɵɵelementStart(12, "div", 1)(13, "div", 2)(14, "span", 3);
28
+ i0.ɵɵelementStart(12, "div", 4)(13, "div", 5)(14, "span", 6);
25
29
  i0.ɵɵtext(15);
26
30
  i0.ɵɵpipe(16, "translate");
27
31
  i0.ɵɵelementEnd()();
28
- i0.ɵɵelementStart(17, "div", 4)(18, "span");
32
+ i0.ɵɵelementStart(17, "div", 7)(18, "span");
29
33
  i0.ɵɵtext(19);
30
34
  i0.ɵɵelementEnd()()();
31
35
  } if (rf & 2) {
@@ -82,11 +86,11 @@ function SubscriptionComponent_Conditional_1_Case_12_Template(rf, ctx) { if (rf
82
86
  i0.ɵɵtextInterpolate1(" (", i0.ɵɵpipeBind2(2, 4, "SUBSCRIPTION.END_DATE", i0.ɵɵpureFunction1(7, _c0, i0.ɵɵpipeBind2(1, 1, currentSubscription_r2.EndDate, "dd.MM.yyyy."))), ") ");
83
87
  } }
84
88
  function SubscriptionComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
85
- i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "span", 3);
89
+ i0.ɵɵelementStart(0, "div", 4)(1, "div", 5)(2, "span", 6);
86
90
  i0.ɵɵtext(3);
87
91
  i0.ɵɵpipe(4, "translate");
88
92
  i0.ɵɵelementEnd()();
89
- i0.ɵɵelementStart(5, "div", 4);
93
+ i0.ɵɵelementStart(5, "div", 7);
90
94
  i0.ɵɵelementContainerStart(6);
91
95
  i0.ɵɵelementStart(7, "span");
92
96
  i0.ɵɵtext(8);
@@ -115,11 +119,11 @@ function SubscriptionComponent_Conditional_1_Conditional_14_For_7_Template(rf, c
115
119
  i0.ɵɵtextInterpolate2("", item_r3.id, "", currentSubscription_r2.Addons.length - 1 > ɵ$index_95_r4 ? "," : "", " ");
116
120
  } }
117
121
  function SubscriptionComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
118
- i0.ɵɵelementStart(0, "div", 5)(1, "div", 2)(2, "span", 3);
122
+ i0.ɵɵelementStart(0, "div", 8)(1, "div", 5)(2, "span", 6);
119
123
  i0.ɵɵtext(3);
120
124
  i0.ɵɵpipe(4, "translate");
121
125
  i0.ɵɵelementEnd()();
122
- i0.ɵɵelementStart(5, "div", 4);
126
+ i0.ɵɵelementStart(5, "div", 7);
123
127
  i0.ɵɵrepeaterCreate(6, SubscriptionComponent_Conditional_1_Conditional_14_For_7_Template, 2, 2, "span", null, i0.ɵɵrepeaterTrackByIndex);
124
128
  i0.ɵɵelementEnd()();
125
129
  } if (rf & 2) {
@@ -132,11 +136,11 @@ function SubscriptionComponent_Conditional_1_Conditional_14_Template(rf, ctx) {
132
136
  } }
133
137
  function SubscriptionComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
134
138
  i0.ɵɵdeclareLet(0);
135
- i0.ɵɵelementStart(1, "div", 5)(2, "div", 2)(3, "span", 3);
139
+ i0.ɵɵelementStart(1, "div", 8)(2, "div", 5)(3, "span", 6);
136
140
  i0.ɵɵtext(4);
137
141
  i0.ɵɵpipe(5, "translate");
138
142
  i0.ɵɵelementEnd()();
139
- i0.ɵɵelementStart(6, "div", 4);
143
+ i0.ɵɵelementStart(6, "div", 7);
140
144
  i0.ɵɵelementContainerStart(7);
141
145
  i0.ɵɵelementStart(8, "span");
142
146
  i0.ɵɵtext(9);
@@ -144,7 +148,7 @@ function SubscriptionComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
144
148
  i0.ɵɵelementEnd();
145
149
  i0.ɵɵelementContainerEnd();
146
150
  i0.ɵɵelementEnd()();
147
- i0.ɵɵtemplate(13, SubscriptionComponent_Conditional_1_Conditional_13_Template, 10, 7, "div", 1)(14, SubscriptionComponent_Conditional_1_Conditional_14_Template, 8, 3, "div", 5);
151
+ i0.ɵɵtemplate(13, SubscriptionComponent_Conditional_1_Conditional_13_Template, 10, 7, "div", 4)(14, SubscriptionComponent_Conditional_1_Conditional_14_Template, 8, 3, "div", 8);
148
152
  } if (rf & 2) {
149
153
  let tmp_4_0;
150
154
  const ctx_r4 = i0.ɵɵnextContext();
@@ -161,9 +165,9 @@ function SubscriptionComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
161
165
  i0.ɵɵconditional((currentSubscription_r6.Addons == null ? null : currentSubscription_r6.Addons.length) ? 14 : -1);
162
166
  } }
163
167
  function SubscriptionComponent_Conditional_2_For_4_Template(rf, ctx) { if (rf & 1) {
164
- i0.ɵɵelementStart(0, "div", 6);
165
- i0.ɵɵelement(1, "mat-progress-bar", 7);
166
- i0.ɵɵelementStart(2, "div", 8)(3, "span", 9);
168
+ i0.ɵɵelementStart(0, "div", 9);
169
+ i0.ɵɵelement(1, "mat-progress-bar", 10);
170
+ i0.ɵɵelementStart(2, "div", 11)(3, "span", 12);
167
171
  i0.ɵɵtext(4);
168
172
  i0.ɵɵpipe(5, "uppercase");
169
173
  i0.ɵɵpipe(6, "translate");
@@ -171,16 +175,16 @@ function SubscriptionComponent_Conditional_2_For_4_Template(rf, ctx) { if (rf &
171
175
  } if (rf & 2) {
172
176
  const currentQuota_r7 = ctx.$implicit;
173
177
  i0.ɵɵadvance();
174
- i0.ɵɵproperty("value", (currentQuota_r7.quotaLimit - currentQuota_r7.quotaRemaining) / currentQuota_r7.quotaLimit * 100);
178
+ i0.ɵɵproperty("value", currentQuota_r7.percentUsed);
175
179
  i0.ɵɵadvance(3);
176
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 4, "QUOTA." + i0.ɵɵpipeBind1(5, 2, currentQuota_r7.quotaType.toString()), i0.ɵɵpureFunction2(7, _c1, currentQuota_r7.quotaLimit - currentQuota_r7.quotaRemaining, currentQuota_r7.quotaLimit)), " ");
180
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 4, "QUOTA." + i0.ɵɵpipeBind1(5, 2, currentQuota_r7.quotaType.toString()) + (currentQuota_r7.isUnlimited ? "_UNLIMITED" : ""), i0.ɵɵpureFunction3(7, _c1, currentQuota_r7.convertedUsed, currentQuota_r7.convertedLimit, currentQuota_r7.percentUsed)), " ");
177
181
  } }
178
182
  function SubscriptionComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
179
- i0.ɵɵelementStart(0, "h3", 0);
183
+ i0.ɵɵelementStart(0, "h3", 3);
180
184
  i0.ɵɵtext(1);
181
185
  i0.ɵɵpipe(2, "translate");
182
186
  i0.ɵɵelementEnd();
183
- i0.ɵɵrepeaterCreate(3, SubscriptionComponent_Conditional_2_For_4_Template, 7, 10, "div", 6, i0.ɵɵrepeaterTrackByIndex);
187
+ i0.ɵɵrepeaterCreate(3, SubscriptionComponent_Conditional_2_For_4_Template, 7, 11, "div", 9, i0.ɵɵrepeaterTrackByIndex);
184
188
  } if (rf & 2) {
185
189
  const ctx_r4 = i0.ɵɵnextContext();
186
190
  i0.ɵɵadvance();
@@ -188,8 +192,29 @@ function SubscriptionComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
188
192
  i0.ɵɵadvance(2);
189
193
  i0.ɵɵrepeater(ctx_r4.visibleQuotas());
190
194
  } }
195
+ function SubscriptionComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelementStart(0, "a", 1);
197
+ i0.ɵɵtext(1);
198
+ i0.ɵɵpipe(2, "translate");
199
+ i0.ɵɵelementEnd();
200
+ } if (rf & 2) {
201
+ i0.ɵɵadvance();
202
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "SUBSCRIPTION.MANAGE"), " ");
203
+ } }
204
+ function SubscriptionComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "a", 2);
206
+ i0.ɵɵtext(1);
207
+ i0.ɵɵpipe(2, "translate");
208
+ i0.ɵɵelementEnd();
209
+ } if (rf & 2) {
210
+ const ctx_r4 = i0.ɵɵnextContext();
211
+ i0.ɵɵattribute("href", ctx_r4.contactUsUrl(), i0.ɵɵsanitizeUrl);
212
+ i0.ɵɵadvance();
213
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 2, "SUBSCRIPTION.CONTACT"));
214
+ } }
191
215
  export class SubscriptionComponent {
192
216
  constructor() {
217
+ this.#chargebeeMountService = inject(ChargebeeMountService);
193
218
  /** Parsed user token to get user related info */
194
219
  this.token = input.required();
195
220
  /** Current user plan that app has selected */
@@ -197,15 +222,24 @@ export class SubscriptionComponent {
197
222
  /** Quota usage */
198
223
  this.quota = input.required();
199
224
  this.visibleQuotaTypes = input();
225
+ this.contactUsUrl = input();
226
+ this.chargebeeSettings = input();
200
227
  this.visibleQuotas = computed(() => {
201
228
  const quota = this.quota();
202
229
  if (!quota?.usage) {
203
230
  return [];
204
231
  }
232
+ let filtered;
205
233
  if (!this.visibleQuotaTypes()) {
206
- return quota.usage;
234
+ filtered = quota.usage;
235
+ }
236
+ else {
237
+ filtered = quota.usage.filter(quota => this.visibleQuotaTypes()?.includes(quota.quotaType));
207
238
  }
208
- return quota.usage.filter(quota => this.visibleQuotaTypes()?.includes(quota.quotaType));
239
+ const visibleQuotas = filtered.map(quota => {
240
+ return this.#convertUsageToDisplayQuota(quota);
241
+ });
242
+ return visibleQuotas;
209
243
  });
210
244
  this.subscriptionStates = SUBSCRIPTION_STATE;
211
245
  this.subscriptionState = computed(() => {
@@ -225,18 +259,92 @@ export class SubscriptionComponent {
225
259
  }
226
260
  });
227
261
  }
262
+ #chargebeeMountService;
263
+ ngOnInit() {
264
+ this.#mountChargeBeeScript();
265
+ }
266
+ #mountChargeBeeScript() {
267
+ const chargebeeSettings = this.chargebeeSettings();
268
+ if (!chargebeeSettings?.site || !chargebeeSettings.script) {
269
+ return;
270
+ }
271
+ if (!this.#chargebeeMountService.chargebeeMounted) {
272
+ const el = document.createElement('script');
273
+ el.onload = () => {
274
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
275
+ const windowObj = window;
276
+ windowObj.Chargebee.init({
277
+ site: chargebeeSettings.site
278
+ });
279
+ windowObj.Chargebee.registerAgain();
280
+ this.#chargebeeMountService.chargebeeMounted = true;
281
+ };
282
+ el.setAttribute('src', chargebeeSettings.script);
283
+ document.head.appendChild(el);
284
+ }
285
+ else {
286
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
287
+ const windowObj = window;
288
+ windowObj.Chargebee.registerAgain();
289
+ }
290
+ }
291
+ #convertUsageToDisplayQuota(quota) {
292
+ // int max in c#
293
+ const unlimitedBenchmark = 2147483647;
294
+ const used = quota.quotaLimit - quota.quotaRemaining;
295
+ let convertedLimit = quota.quotaLimit.toString();
296
+ let convertedUsed = used.toString();
297
+ const isUnlimited = unlimitedBenchmark <= quota.quotaLimit;
298
+ const percentUsed = Math.round(((quota.quotaLimit - quota.quotaRemaining) / quota.quotaLimit) * 100);
299
+ switch (quota.quotaType) {
300
+ case QuotaType.ASR_FILE_LENGTH_SECONDS:
301
+ case QuotaType.ONLINE_ASR_USED_SECONDS:
302
+ convertedLimit = Math.ceil(quota.quotaLimit / 60).toString();
303
+ convertedUsed = Math.round(used / 60).toString();
304
+ break;
305
+ case QuotaType.ASR_FILE_SIZE_KB:
306
+ convertedLimit = this.#formatBytes(quota.quotaLimit * 1024);
307
+ convertedUsed = this.#formatBytes(used * 1024);
308
+ break;
309
+ case QuotaType.LLM_REQUESTS:
310
+ break;
311
+ }
312
+ return {
313
+ ...quota,
314
+ convertedLimit,
315
+ convertedUsed,
316
+ isUnlimited,
317
+ percentUsed
318
+ };
319
+ }
320
+ #formatBytes(bytes, decimals = 0) {
321
+ if (!+bytes)
322
+ return '0 Bytes';
323
+ const k = 1024;
324
+ const dm = decimals < 0 ? 0 : decimals;
325
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
326
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
327
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
328
+ }
228
329
  static { this.ɵfac = function SubscriptionComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SubscriptionComponent)(); }; }
229
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SubscriptionComponent, selectors: [["lib-subscription"]], inputs: { token: [1, "token"], subscription: [1, "subscription"], quota: [1, "quota"], visibleQuotaTypes: [1, "visibleQuotaTypes"] }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 3, consts: [[1, "subscription-section-title", "text-l-semi-bold"], [1, "subscription-data-row"], [1, "subscription-label"], [1, "label"], [1, "subscription-data"], ["fxLayout", "row", 1, "subscription-data-row"], [1, "subscription-limit-wrapper"], [3, "value"], [1, "subscription-limit"], [1, "text-l-semi-bold"]], template: function SubscriptionComponent_Template(rf, ctx) { if (rf & 1) {
330
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SubscriptionComponent, selectors: [["lib-subscription"]], inputs: { token: [1, "token"], subscription: [1, "subscription"], quota: [1, "quota"], visibleQuotaTypes: [1, "visibleQuotaTypes"], contactUsUrl: [1, "contactUsUrl"], chargebeeSettings: [1, "chargebeeSettings"] }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 6, vars: 5, consts: [[1, "subscription-actions-wrapper"], ["mat-flat-button", "", "color", "primary-accent-darker", "href", "javascript:void(0)", "data-cb-type", "portal", 1, "manage-sub-btn", "button-row-element"], ["mat-stroked-button", "", "target", "_blank", "color", "primary-accent-darker"], [1, "subscription-section-title", "text-l-semi-bold"], [1, "subscription-data-row"], [1, "subscription-label"], [1, "label"], [1, "subscription-data"], ["fxLayout", "row", 1, "subscription-data-row"], [1, "subscription-limit-wrapper"], [3, "value"], [1, "subscription-limit"], [1, "text-l-semi-bold"]], template: function SubscriptionComponent_Template(rf, ctx) { if (rf & 1) {
230
331
  i0.ɵɵtemplate(0, SubscriptionComponent_Conditional_0_Template, 20, 11)(1, SubscriptionComponent_Conditional_1_Template, 15, 8)(2, SubscriptionComponent_Conditional_2_Template, 5, 3);
332
+ i0.ɵɵelementStart(3, "div", 0);
333
+ i0.ɵɵtemplate(4, SubscriptionComponent_Conditional_4_Template, 3, 3, "a", 1)(5, SubscriptionComponent_Conditional_5_Template, 3, 4, "a", 2);
334
+ i0.ɵɵelementEnd();
231
335
  } if (rf & 2) {
232
336
  i0.ɵɵconditional(ctx.token() ? 0 : -1);
233
337
  i0.ɵɵadvance();
234
338
  i0.ɵɵconditional(ctx.subscription() ? 1 : -1);
235
339
  i0.ɵɵadvance();
236
340
  i0.ɵɵconditional(ctx.visibleQuotas().length ? 2 : -1);
341
+ i0.ɵɵadvance(2);
342
+ i0.ɵɵconditional(ctx.chargebeeSettings() ? 4 : -1);
343
+ i0.ɵɵadvance();
344
+ i0.ɵɵconditional(ctx.contactUsUrl() ? 5 : -1);
237
345
  } }, dependencies: [TranslatePipe,
238
346
  DatePipe,
239
- MatProgressBarModule, i1.MatProgressBar, CommonModule, i2.UpperCasePipe], styles: ["[_nghost-%COMP%]{display:block}mat-card[_ngcontent-%COMP%]{margin:1.5rem}.subscription-container[_ngcontent-%COMP%]:not(.mobile){margin:16px 32px}.subscription-section-title[_ngcontent-%COMP%]{margin:32px 0 18px}.subscription-data-row[_ngcontent-%COMP%]{border-bottom:2px solid var(--base-70);margin-bottom:18px;flex-direction:row;display:flex}.subscription-data[_ngcontent-%COMP%]{color:var(--base-30);word-wrap:break-word;margin-left:.5rem}.subscription-limit-wrapper[_ngcontent-%COMP%], .subscription-limit[_ngcontent-%COMP%]{margin-top:16px}.subscription-actions-wrapper[_ngcontent-%COMP%]{padding:32px 0 18px}.subscription-manage-link[_ngcontent-%COMP%]{text-decoration:none}.subscription-container[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:75%}.subscription-label[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:35%}.subscription-data[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:65%}.untranslated-files-disclaimer[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:10px;color:var(--base-40)}.no-subscription-message[_ngcontent-%COMP%]{margin-top:32px;color:var(--base-40)}.contact-sales-btn[_ngcontent-%COMP%]{text-align:center}.contact-sales-btn[_ngcontent-%COMP%]:hover{text-decoration:none}"] }); }
347
+ MatProgressBarModule, i1.MatProgressBar, CommonModule, i2.UpperCasePipe, MatButtonModule, i3.MatAnchor], styles: ["[_nghost-%COMP%]{display:block}mat-card[_ngcontent-%COMP%]{margin:1.5rem}.subscription-container[_ngcontent-%COMP%]:not(.mobile){margin:16px 32px}.subscription-section-title[_ngcontent-%COMP%]{margin:32px 0 18px}.subscription-data-row[_ngcontent-%COMP%]{border-bottom:2px solid var(--base-70);margin-bottom:18px;flex-direction:row;display:flex}.subscription-data[_ngcontent-%COMP%]{color:var(--base-30);word-wrap:break-word;margin-left:.5rem}.subscription-limit-wrapper[_ngcontent-%COMP%], .subscription-limit[_ngcontent-%COMP%]{margin-top:16px}.subscription-actions-wrapper[_ngcontent-%COMP%]{padding:32px 0 18px;display:flex;flex-direction:row;gap:24px}.subscription-manage-link[_ngcontent-%COMP%]{text-decoration:none}.subscription-container[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:75%}.subscription-label[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:35%}.subscription-data[_ngcontent-%COMP%]:not(.mobile, .empty)[_ngcontent-%COMP%]{width:65%}.untranslated-files-disclaimer[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:10px;color:var(--base-40)}.no-subscription-message[_ngcontent-%COMP%]{margin-top:32px;color:var(--base-40)}.contact-sales-btn[_ngcontent-%COMP%]{text-align:center}.contact-sales-btn[_ngcontent-%COMP%]:hover{text-decoration:none}"] }); }
240
348
  }
241
349
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SubscriptionComponent, [{
242
350
  type: Component,
@@ -244,8 +352,9 @@ export class SubscriptionComponent {
244
352
  TranslatePipe,
245
353
  DatePipe,
246
354
  MatProgressBarModule,
247
- CommonModule
248
- ], template: "@if(token()){\r\n <!-- narrow type to non null property -->\r\n @let userToken = token()!;\r\n\r\n <h3 class=\"subscription-section-title text-l-semi-bold\">{{ \"SUBSCRIPTION.USER_INFO\" | translate }}</h3>\r\n\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_NAME\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <span>{{ userToken.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_EMAIL\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <span>{{ userToken.email }}</span>\r\n </div>\r\n </div>\r\n}\r\n\r\n@if(subscription()){\r\n @let currentSubscription = subscription()!;\r\n\r\n <div fxLayout=\"row\" class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_SUBSCRIPTION_PLAN_ID\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <ng-container>\r\n <span>\r\n {{ currentSubscription.Label ? currentSubscription.Label : currentSubscription.PlanId }}\r\n\r\n @switch (subscriptionState()) {\r\n @case(subscriptionStates.TRIAL){\r\n <span> ({{ \"SUBSCRIPTION.TRIAL_END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }}) </span>\r\n }\r\n @case (subscriptionStates.ACTIVE) {\r\n @if(currentSubscription.EndDate){\r\n <span> ({{ \"SUBSCRIPTION.END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }}) </span>\r\n }\r\n }\r\n @case (subscriptionStates.ENDED) {\r\n ({{ \"SUBSCRIPTION.END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }})\r\n }\r\n }\r\n </span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n @if(currentSubscription.EndDate){\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_SUBSCRIPTION_END_DATE\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <ng-container>\r\n <span>{{currentSubscription.EndDate | date: \"dd.MM.yyyy\"}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if(currentSubscription.Addons?.length){\r\n <div fxLayout=\"row\" class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.ADDITIONS_PLUGINS\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n @for (item of currentSubscription.Addons; track $index; let i = $index) {\r\n <span>{{ item.id }}{{ currentSubscription.Addons!.length - 1 > i ? \",\" : \"\" }} </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n}\r\n\r\n@if(visibleQuotas().length){\r\n <h3 class=\"subscription-section-title text-l-semi-bold\">{{ \"SUBSCRIPTION.LIMITS\" | translate }}</h3>\r\n\r\n @for (currentQuota of visibleQuotas(); track $index) {\r\n <div class=\"subscription-limit-wrapper\">\r\n <mat-progress-bar [value]=\"((currentQuota.quotaLimit - currentQuota.quotaRemaining) / currentQuota.quotaLimit) * 100\"></mat-progress-bar>\r\n <div class=\"subscription-limit\">\r\n <span class=\"text-l-semi-bold\">\r\n {{ \"QUOTA.\" + (currentQuota.quotaType.toString() | uppercase) | translate: { used: currentQuota.quotaLimit - currentQuota.quotaRemaining, limit: currentQuota.quotaLimit } }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n}\r\n", styles: [":host{display:block}mat-card{margin:1.5rem}.subscription-container:not(.mobile){margin:16px 32px}.subscription-section-title{margin:32px 0 18px}.subscription-data-row{border-bottom:2px solid var(--base-70);margin-bottom:18px;flex-direction:row;display:flex}.subscription-data{color:var(--base-30);word-wrap:break-word;margin-left:.5rem}.subscription-limit-wrapper,.subscription-limit{margin-top:16px}.subscription-actions-wrapper{padding:32px 0 18px}.subscription-manage-link{text-decoration:none}.subscription-container:not(.mobile,.empty){width:75%}.subscription-label:not(.mobile,.empty){width:35%}.subscription-data:not(.mobile,.empty){width:65%}.untranslated-files-disclaimer{margin-top:16px;margin-bottom:10px;color:var(--base-40)}.no-subscription-message{margin-top:32px;color:var(--base-40)}.contact-sales-btn{text-align:center}.contact-sales-btn:hover{text-decoration:none}\n"] }]
355
+ CommonModule,
356
+ MatButtonModule
357
+ ], template: "@if(token()){\r\n <!-- narrow type to non null property -->\r\n @let userToken = token()!;\r\n\r\n <h3 class=\"subscription-section-title text-l-semi-bold\">{{ \"SUBSCRIPTION.USER_INFO\" | translate }}</h3>\r\n\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_NAME\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <span>{{ userToken.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_EMAIL\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <span>{{ userToken.email }}</span>\r\n </div>\r\n </div>\r\n}\r\n\r\n@if(subscription()){\r\n @let currentSubscription = subscription()!;\r\n\r\n <div fxLayout=\"row\" class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_SUBSCRIPTION_PLAN_ID\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <ng-container>\r\n <span>\r\n {{ currentSubscription.Label ? currentSubscription.Label : currentSubscription.PlanId }}\r\n\r\n @switch (subscriptionState()) {\r\n @case(subscriptionStates.TRIAL){\r\n <span> ({{ \"SUBSCRIPTION.TRIAL_END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }}) </span>\r\n }\r\n @case (subscriptionStates.ACTIVE) {\r\n @if(currentSubscription.EndDate){\r\n <span> ({{ \"SUBSCRIPTION.END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }}) </span>\r\n }\r\n }\r\n @case (subscriptionStates.ENDED) {\r\n ({{ \"SUBSCRIPTION.END_DATE\" | translate: { date: currentSubscription.EndDate | date: \"dd.MM.yyyy.\" } }})\r\n }\r\n }\r\n </span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n @if(currentSubscription.EndDate){\r\n <div class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.LABEL_SUBSCRIPTION_END_DATE\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n <ng-container>\r\n <span>{{currentSubscription.EndDate | date: \"dd.MM.yyyy\"}}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if(currentSubscription.Addons?.length){\r\n <div fxLayout=\"row\" class=\"subscription-data-row\">\r\n <div class=\"subscription-label\">\r\n <span class=\"label\">{{ \"SUBSCRIPTION.ADDITIONS_PLUGINS\" | translate }}</span>\r\n </div>\r\n\r\n <div class=\"subscription-data\">\r\n @for (item of currentSubscription.Addons; track $index; let i = $index) {\r\n <span>{{ item.id }}{{ currentSubscription.Addons!.length - 1 > i ? \",\" : \"\" }} </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n}\r\n\r\n@if(visibleQuotas().length){\r\n <h3 class=\"subscription-section-title text-l-semi-bold\">{{ \"SUBSCRIPTION.LIMITS\" | translate }}</h3>\r\n\r\n @for (currentQuota of visibleQuotas(); track $index) {\r\n <div class=\"subscription-limit-wrapper\">\r\n <mat-progress-bar [value]=\"currentQuota.percentUsed\"></mat-progress-bar>\r\n <div class=\"subscription-limit\">\r\n <span class=\"text-l-semi-bold\">\r\n {{ (\"QUOTA.\" + (currentQuota.quotaType.toString() | uppercase) + (currentQuota.isUnlimited? \"_UNLIMITED\": \"\")) | translate: { used: currentQuota.convertedUsed, limit: currentQuota.convertedLimit, percent: currentQuota.percentUsed} }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n}\r\n\r\n<div class=\"subscription-actions-wrapper\">\r\n @if(chargebeeSettings()){\r\n <a mat-flat-button color=\"primary-accent-darker\" class=\"manage-sub-btn button-row-element\" href=\"javascript:void(0)\" data-cb-type=\"portal\">\r\n {{ \"SUBSCRIPTION.MANAGE\" | translate }}\r\n </a>\r\n }\r\n @if(contactUsUrl()){\r\n <a mat-stroked-button [attr.href]=\"contactUsUrl()\" target=\"_blank\" color=\"primary-accent-darker\">{{\"SUBSCRIPTION.CONTACT\" | translate}}</a>\r\n }\r\n</div>\r\n", styles: [":host{display:block}mat-card{margin:1.5rem}.subscription-container:not(.mobile){margin:16px 32px}.subscription-section-title{margin:32px 0 18px}.subscription-data-row{border-bottom:2px solid var(--base-70);margin-bottom:18px;flex-direction:row;display:flex}.subscription-data{color:var(--base-30);word-wrap:break-word;margin-left:.5rem}.subscription-limit-wrapper,.subscription-limit{margin-top:16px}.subscription-actions-wrapper{padding:32px 0 18px;display:flex;flex-direction:row;gap:24px}.subscription-manage-link{text-decoration:none}.subscription-container:not(.mobile,.empty){width:75%}.subscription-label:not(.mobile,.empty){width:35%}.subscription-data:not(.mobile,.empty){width:65%}.untranslated-files-disclaimer{margin-top:16px;margin-bottom:10px;color:var(--base-40)}.no-subscription-message{margin-top:32px;color:var(--base-40)}.contact-sales-btn{text-align:center}.contact-sales-btn:hover{text-decoration:none}\n"] }]
249
358
  }], null, null); })();
250
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SubscriptionComponent, { className: "SubscriptionComponent", filePath: "lib\\subscription\\subscription.component.ts", lineNumber: 22 }); })();
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztJQ0xwRSxrQkFBeUI7SUFFdkIsNkJBQXdEO0lBQUEsWUFBMEM7O0lBQUEsaUJBQUs7SUFJbkcsQUFERixBQURGLDhCQUFtQyxhQUNELGNBQ1Y7SUFBQSxZQUEyQzs7SUFDakUsQUFEaUUsaUJBQU8sRUFDbEU7SUFHSixBQURGLDhCQUErQixZQUN2QjtJQUFBLGFBQW9CO0lBRTlCLEFBREUsQUFENEIsaUJBQU8sRUFDN0IsRUFDRjtJQUlGLEFBREYsQUFERiwrQkFBbUMsY0FDRCxlQUNWO0lBQUEsYUFBNEM7O0lBQ2xFLEFBRGtFLGlCQUFPLEVBQ25FO0lBR0osQUFERiwrQkFBK0IsWUFDdkI7SUFBQSxhQUFxQjtJQUUvQixBQURFLEFBRDZCLGlCQUFPLEVBQzlCLEVBQ0Y7O3lCQXRCUywwQkFBTztJQUVrQyxlQUEwQztJQUExQyxvRUFBMEM7SUFJMUUsZUFBMkM7SUFBM0Ms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QWE7b0JBQ2IsUUFBUTtvQkFDUixvQkFBb0I7b0JBQ3BCLFlBQVk7aUJBQ2I7O2tGQUlVLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFF1b3RhUmVzcG9uc2UsIFF1b3RhVHlwZSB9IGZyb20gJ0B0aWxkZS1ubHAvbmd4LXNlcnZpY2VzJztcclxuaW1wb3J0IHsgQXV0aFN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL2NvcmUvYXV0aC9hdXRoLXN1YnNjcmlwdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IEp3dFRva2VuIH0gZnJvbSAnLi4vY29yZS9hdXRoL2p3dC10b2tlbi5tb2RlbCc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFNVQlNDUklQVElPTl9TVEFURSB9IGZyb20gJy4vbW9kZWxzL3N1YnNjcmlwdGlvbi1zdGF0ZS5lbnVtJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3Vic2NyaXB0aW9uJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFRyYW5zbGF0ZVBpcGUsXHJcbiAgICBEYXRlUGlwZSxcclxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3Vic2NyaXB0aW9uQ29tcG9uZW50IHtcclxuICAvKiogUGFyc2VkIHVzZXIgdG9rZW4gdG8gZ2V0IHVzZXIgcmVsYXRlZCBpbmZvICovXHJcbiAgcmVhZG9ubHkgdG9rZW4gPSBpbnB1dC5yZXF1aXJlZDxKd3RUb2tlbiB8IHVuZGVmaW5lZD4oKTtcclxuICAvKiogQ3VycmVudCB1c2VyIHBsYW4gdGhhdCBhcHAgaGFzIHNlbGVjdGVkICovXHJcbiAgcmVhZG9ubHkgc3Vic2NyaXB0aW9uID0gaW5wdXQucmVxdWlyZWQ8QXV0aFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZD4oKTtcclxuICAvKiogUXVvdGEgdXNhZ2UgKi9cclxuICByZWFkb25seSBxdW90YSA9IGlucHV0LnJlcXVpcmVkPFF1b3RhUmVzcG9uc2UgfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIHJlYWRvbmx5IHZpc2libGVRdW90YVR5cGVzID0gaW5wdXQ8UXVvdGFUeXBlW10+KCk7XHJcblxyXG4gIHJlYWRvbmx5IHZpc2libGVRdW90YXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBxdW90YSA9IHRoaXMucXVvdGEoKTtcclxuICAgIGlmICghcXVvdGE/LnVzYWdlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudmlzaWJsZVF1b3RhVHlwZXMoKSkge1xyXG4gICAgICByZXR1cm4gcXVvdGEudXNhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHF1b3RhLnVzYWdlLmZpbHRlcihxdW90YSA9PiB0aGlzLnZpc2libGVRdW90YVR5cGVzKCk/LmluY2x1ZGVzKHF1b3RhLnF1b3RhVHlwZSkpO1xyXG4gIH0pXHJcblxyXG4gIHJlYWRvbmx5IHN1YnNjcmlwdGlvblN0YXRlcyA9IFNVQlNDUklQVElPTl9TVEFURTtcclxuXHJcbiAgcmVhZG9ubHkgc3Vic2NyaXB0aW9uU3RhdGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbigpO1xyXG4gICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcclxuICAgICAgcmV0dXJuIFNVQlNDUklQVElPTl9TVEFURS5OT05FO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdWJzY3JpcHRpb24uSXNUcmlhbCkge1xyXG4gICAgICByZXR1cm4gU1VCU0NSSVBUSU9OX1NUQVRFLlRSSUFMO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgaWYgKCFzdWJzY3JpcHRpb24uRW5kRGF0ZSB8fCBuZXcgRGF0ZShzdWJzY3JpcHRpb24uRW5kRGF0ZSkgPCBub3cpIHtcclxuICAgICAgcmV0dXJuIFNVQlNDUklQVElPTl9TVEFURS5BQ1RJVkU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gU1VCU0NSSVBUSU9OX1NUQVRFLkVOREVEO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsIkBpZih0b2tlbigpKXtcclxuICA8IS0tIG5hcnJvdyB0eXBlIHRvIG5vbiBudWxsIHByb3BlcnR5IC0tPlxyXG4gIEBsZXQgdXNlclRva2VuID0gdG9rZW4oKSE7XHJcblxyXG4gICAgPGgzIGNsYXNzPVwic3Vic2NyaXB0aW9uLXNlY3Rpb24tdGl0bGUgdGV4dC1sLXNlbWktYm9sZFwiPnt7IFwiU1VCU0NSSVBUSU9OLlVTRVJfSU5GT1wiIHwgdHJhbnNsYXRlIH19PC9oMz5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uLWRhdGEtcm93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tbGFiZWxcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgXCJTVUJTQ1JJUFRJT04uTEFCRUxfTkFNRVwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IHVzZXJUb2tlbi5uYW1lIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBcIlNVQlNDUklQVElPTi5MQUJFTF9FTUFJTFwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IHVzZXJUb2tlbi5lbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxufVxyXG5cclxuQGlmKHN1YnNjcmlwdGlvbigpKXtcclxuICBAbGV0IGN1cnJlbnRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24oKSE7XHJcblxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBjbGFzcz1cInN1YnNjcmlwdGlvbi1kYXRhLXJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgXCJTVUJTQ1JJUFRJT04uTEFCRUxfU1VCU0NSSVBUSU9OX1BMQU5fSURcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAge3sgY3VycmVudFN1YnNjcmlwdGlvbi5MYWJlbCA/IGN1cnJlbnRTdWJzY3JpcHRpb24uTGFiZWwgOiBjdXJyZW50U3Vic2NyaXB0aW9uLlBsYW5JZCB9fVxyXG5cclxuICAgICAgICAgIEBzd2l0Y2ggKHN1YnNjcmlwdGlvblN0YXRlKCkpIHtcclxuICAgICAgICAgICAgQGNhc2Uoc3Vic2NyaXB0aW9uU3RhdGVzLlRSSUFMKXtcclxuICAgICAgICAgICAgICA8c3Bhbj4gKHt7IFwiU1VCU0NSSVBUSU9OLlRSSUFMX0VORF9EQVRFXCIgfCB0cmFuc2xhdGU6IHsgZGF0ZTogY3VycmVudFN1YnNjcmlwdGlvbi5FbmREYXRlIHwgZGF0ZTogXCJkZC5NTS55eXl5LlwiIH0gfX0pIDwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAY2FzZSAoc3Vic2NyaXB0aW9uU3RhdGVzLkFDVElWRSkge1xyXG4gICAgICAgICAgICAgIEBpZihjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUpe1xyXG4gICAgICAgICAgICAgICAgPHNwYW4+ICh7eyBcIlNVQlNDUklQVElPTi5FTkRfREFURVwiIHwgdHJhbnNsYXRlOiB7IGRhdGU6IGN1cnJlbnRTdWJzY3JpcHRpb24uRW5kRGF0ZSB8IGRhdGU6IFwiZGQuTU0ueXl5eS5cIiB9IH19KSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBjYXNlIChzdWJzY3JpcHRpb25TdGF0ZXMuRU5ERUQpIHtcclxuICAgICAgICAgICAgKHt7IFwiU1VCU0NSSVBUSU9OLkVORF9EQVRFXCIgfCB0cmFuc2xhdGU6IHsgZGF0ZTogY3VycmVudFN1YnNjcmlwdGlvbi5FbmREYXRlIHwgZGF0ZTogXCJkZC5NTS55eXl5LlwiIH0gfX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIEBpZihjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUpe1xyXG4gIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tbGFiZWxcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IFwiU1VCU0NSSVBUSU9OLkxBQkVMX1NVQlNDUklQVElPTl9FTkRfREFURVwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1kYXRhXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgPHNwYW4+e3tjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUgfCBkYXRlOiBcImRkLk1NLnl5eXlcIn19PC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICBAaWYoY3VycmVudFN1YnNjcmlwdGlvbi5BZGRvbnM/Lmxlbmd0aCl7XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBcIlNVQlNDUklQVElPTi5BRERJVElPTlNfUExVR0lOU1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgY3VycmVudFN1YnNjcmlwdGlvbi5BZGRvbnM7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5pZCB9fXt7IGN1cnJlbnRTdWJzY3JpcHRpb24uQWRkb25zIS5sZW5ndGggLSAxID4gaSA/IFwiLFwiIDogXCJcIiB9fSA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxufVxyXG5cclxuQGlmKHZpc2libGVRdW90YXMoKS5sZW5ndGgpe1xyXG4gIDxoMyBjbGFzcz1cInN1YnNjcmlwdGlvbi1zZWN0aW9uLXRpdGxlIHRleHQtbC1zZW1pLWJvbGRcIj57eyBcIlNVQlNDUklQVElPTi5MSU1JVFNcIiB8IHRyYW5zbGF0ZSB9fTwvaDM+XHJcblxyXG4gIEBmb3IgKGN1cnJlbnRRdW90YSBvZiB2aXNpYmxlUXVvdGFzKCk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1saW1pdC13cmFwcGVyXCI+XHJcbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIFt2YWx1ZV09XCIoKGN1cnJlbnRRdW90YS5xdW90YUxpbWl0IC0gY3VycmVudFF1b3RhLnF1b3RhUmVtYWluaW5nKSAvIGN1cnJlbnRRdW90YS5xdW90YUxpbWl0KSAqIDEwMFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1saW1pdFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sLXNlbWktYm9sZFwiPlxyXG4gICAgICAgICAge3sgXCJRVU9UQS5cIiArIChjdXJyZW50UXVvdGEucXVvdGFUeXBlLnRvU3RyaW5nKCkgfCB1cHBlcmNhc2UpIHwgdHJhbnNsYXRlOiB7IHVzZWQ6IGN1cnJlbnRRdW90YS5xdW90YUxpbWl0IC0gY3VycmVudFF1b3RhLnF1b3RhUmVtYWluaW5nLCBsaW1pdDogY3VycmVudFF1b3RhLnF1b3RhTGltaXQgfSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbn1cclxuIl19
359
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SubscriptionComponent, { className: "SubscriptionComponent", filePath: "lib\\subscription\\subscription.component.ts", lineNumber: 27 }); })();
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFpQixTQUFTLEVBQWMsTUFBTSx5QkFBeUIsQ0FBQztBQUcvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0lDUmhFLGtCQUF5QjtJQUV2Qiw2QkFBd0Q7SUFBQSxZQUEwQzs7SUFBQSxpQkFBSztJQUluRyxBQURGLEFBREYsOEJBQW1DLGFBQ0QsY0FDVjtJQUFBLFlBQTJDOztJQUNqRSxBQURpRSxpQkFBTyxFQUNsRTtJQUdKLEFBREYsOEJBQStCLFlBQ3ZCO0lBQUEsYUFBb0I7SUFFOUIsQUFERSxBQUQ0QixpQkFBTyxFQUM3QixFQUNGO0lBSUYsQUFERixBQURGLCtCQUFtQyxjQUNELGVBQ1Y7SUFBQSxhQUE0Qzs7SUFDbEUs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QUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUUsQ0FBQztzSEEvSFUscUJBQXFCO29FQUFyQixxQkFBcUI7WUM2RGxDLEFBNURBLEFBM0JBLHNFQUFhLHdEQTJCTyx1REE0RFE7WUFlNUIsOEJBQTBDO1lBTXhDLEFBTEEsNEVBQXlCLCtEQUtMO1lBR3RCLGlCQUFNOztZQS9HTixzQ0F5QkM7WUFFRCxjQTBEQztZQTFERCw2Q0EwREM7WUFFRCxjQWFDO1lBYkQscURBYUM7WUFHQyxlQUlDO1lBSkQsa0RBSUM7WUFDRCxjQUVDO1lBRkQsNkNBRUM7NEJEN0ZDLGFBQWE7WUFDYixRQUFRO1lBQ1Isb0JBQW9CLHFCQUNwQixZQUFZLG9CQUNaLGVBQWU7O2lGQUtOLHFCQUFxQjtjQWJqQyxTQUFTOzJCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1A7b0JBQ1AsYUFBYTtvQkFDYixRQUFRO29CQUNSLG9CQUFvQjtvQkFDcEIsWUFBWTtvQkFDWixlQUFlO2lCQUNoQjs7a0ZBSVUscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgUXVvdGFSZXNwb25zZSwgUXVvdGFUeXBlLCBRdW90YVVzYWdlIH0gZnJvbSAnQHRpbGRlLW5scC9uZ3gtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBBdXRoU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vY29yZS9hdXRoL2F1dGgtc3Vic2NyaXB0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgSnd0VG9rZW4gfSBmcm9tICcuLi9jb3JlL2F1dGgvand0LXRva2VuLm1vZGVsJztcclxuaW1wb3J0IHsgU1VCU0NSSVBUSU9OX1NUQVRFIH0gZnJvbSAnLi9tb2RlbHMvc3Vic2NyaXB0aW9uLXN0YXRlLmVudW0nO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb25RdW90YURpc3BsYXkgfSBmcm9tICcuL21vZGVscy9zdWJzY3JpcHRpb24tcXVvdGEtZGlzcGxheS5tb2RlbCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IENoYXJnZWJlZU1vdW50U2VydmljZSB9IGZyb20gJy4vY2hhcmdlYmVlLW1vdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFyZ2ViZWVTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWxzL2NoYXJnZWJlZS1zZXR0aW5ncy5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdWJzY3JpcHRpb24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgVHJhbnNsYXRlUGlwZSxcclxuICAgIERhdGVQaXBlLFxyXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdWJzY3JpcHRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zdWJzY3JpcHRpb24uY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHJlYWRvbmx5ICNjaGFyZ2ViZWVNb3VudFNlcnZpY2UgPSBpbmplY3QoQ2hhcmdlYmVlTW91bnRTZXJ2aWNlKTtcclxuXHJcbiAgLyoqIFBhcnNlZCB1c2VyIHRva2VuIHRvIGdldCB1c2VyIHJlbGF0ZWQgaW5mbyAqL1xyXG4gIHJlYWRvbmx5IHRva2VuID0gaW5wdXQucmVxdWlyZWQ8Snd0VG9rZW4gfCB1bmRlZmluZWQ+KCk7XHJcbiAgLyoqIEN1cnJlbnQgdXNlciBwbGFuIHRoYXQgYXBwIGhhcyBzZWxlY3RlZCAqL1xyXG4gIHJlYWRvbmx5IHN1YnNjcmlwdGlvbiA9IGlucHV0LnJlcXVpcmVkPEF1dGhTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ+KCk7XHJcbiAgLyoqIFF1b3RhIHVzYWdlICovXHJcbiAgcmVhZG9ubHkgcXVvdGEgPSBpbnB1dC5yZXF1aXJlZDxRdW90YVJlc3BvbnNlIHwgdW5kZWZpbmVkPigpO1xyXG4gIHJlYWRvbmx5IHZpc2libGVRdW90YVR5cGVzID0gaW5wdXQ8UXVvdGFUeXBlW10+KCk7XHJcbiAgcmVhZG9ubHkgY29udGFjdFVzVXJsID0gaW5wdXQ8c3RyaW5nPigpO1xyXG4gIHJlYWRvbmx5IGNoYXJnZWJlZVNldHRpbmdzID0gaW5wdXQ8Q2hhcmdlYmVlU2V0dGluZ3M+KCk7XHJcblxyXG4gIHJlYWRvbmx5IHZpc2libGVRdW90YXMgPSBjb21wdXRlZDxTdWJzY3JpcHRpb25RdW90YURpc3BsYXlbXT4oKCkgPT4ge1xyXG4gICAgY29uc3QgcXVvdGEgPSB0aGlzLnF1b3RhKCk7XHJcbiAgICBpZiAoIXF1b3RhPy51c2FnZSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkOiBRdW90YVVzYWdlW107XHJcbiAgICBpZiAoIXRoaXMudmlzaWJsZVF1b3RhVHlwZXMoKSkge1xyXG4gICAgICBmaWx0ZXJlZCA9IHF1b3RhLnVzYWdlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZpbHRlcmVkID0gcXVvdGEudXNhZ2UuZmlsdGVyKHF1b3RhID0+IHRoaXMudmlzaWJsZVF1b3RhVHlwZXMoKT8uaW5jbHVkZXMocXVvdGEucXVvdGFUeXBlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmlzaWJsZVF1b3RhczogU3Vic2NyaXB0aW9uUXVvdGFEaXNwbGF5W10gPSBmaWx0ZXJlZC5tYXAocXVvdGEgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy4jY29udmVydFVzYWdlVG9EaXNwbGF5UXVvdGEocXVvdGEpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmlzaWJsZVF1b3RhcztcclxuICB9KVxyXG5cclxuICByZWFkb25seSBzdWJzY3JpcHRpb25TdGF0ZXMgPSBTVUJTQ1JJUFRJT05fU1RBVEU7XHJcblxyXG4gIHJlYWRvbmx5IHN1YnNjcmlwdGlvblN0YXRlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb24oKTtcclxuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHJldHVybiBTVUJTQ1JJUFRJT05fU1RBVEUuTk9ORTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3Vic2NyaXB0aW9uLklzVHJpYWwpIHtcclxuICAgICAgcmV0dXJuIFNVQlNDUklQVElPTl9TVEFURS5UUklBTDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGlmICghc3Vic2NyaXB0aW9uLkVuZERhdGUgfHwgbmV3IERhdGUoc3Vic2NyaXB0aW9uLkVuZERhdGUpIDwgbm93KSB7XHJcbiAgICAgIHJldHVybiBTVUJTQ1JJUFRJT05fU1RBVEUuQUNUSVZFO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFNVQlNDUklQVElPTl9TVEFURS5FTkRFRDtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLiNtb3VudENoYXJnZUJlZVNjcmlwdCgpO1xyXG4gIH1cclxuXHJcbiAgI21vdW50Q2hhcmdlQmVlU2NyaXB0KCkge1xyXG4gICAgY29uc3QgY2hhcmdlYmVlU2V0dGluZ3MgPSB0aGlzLmNoYXJnZWJlZVNldHRpbmdzKCk7XHJcbiAgICBpZiAoIWNoYXJnZWJlZVNldHRpbmdzPy5zaXRlIHx8ICFjaGFyZ2ViZWVTZXR0aW5ncy5zY3JpcHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy4jY2hhcmdlYmVlTW91bnRTZXJ2aWNlLmNoYXJnZWJlZU1vdW50ZWQpIHtcclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgZWwub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgY29uc3Qgd2luZG93T2JqOiBhbnkgPSB3aW5kb3c7XHJcbiAgICAgICAgd2luZG93T2JqLkNoYXJnZWJlZS5pbml0KHtcclxuICAgICAgICAgIHNpdGU6IGNoYXJnZWJlZVNldHRpbmdzLnNpdGVcclxuICAgICAgICB9KTtcclxuICAgICAgICB3aW5kb3dPYmouQ2hhcmdlYmVlLnJlZ2lzdGVyQWdhaW4oKTtcclxuICAgICAgICB0aGlzLiNjaGFyZ2ViZWVNb3VudFNlcnZpY2UuY2hhcmdlYmVlTW91bnRlZCA9IHRydWU7XHJcbiAgICAgIH07XHJcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgY2hhcmdlYmVlU2V0dGluZ3Muc2NyaXB0KTtcclxuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICBjb25zdCB3aW5kb3dPYmo6IGFueSA9IHdpbmRvdztcclxuICAgICAgd2luZG93T2JqLkNoYXJnZWJlZS5yZWdpc3RlckFnYWluKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjY29udmVydFVzYWdlVG9EaXNwbGF5UXVvdGEocXVvdGE6IFF1b3RhVXNhZ2UpOiBTdWJzY3JpcHRpb25RdW90YURpc3BsYXkge1xyXG4gICAgLy8gaW50IG1heCBpbiBjI1xyXG4gICAgY29uc3QgdW5saW1pdGVkQmVuY2htYXJrID0gMjE0NzQ4MzY0NztcclxuXHJcbiAgICBjb25zdCB1c2VkID0gcXVvdGEucXVvdGFMaW1pdCAtIHF1b3RhLnF1b3RhUmVtYWluaW5nO1xyXG4gICAgbGV0IGNvbnZlcnRlZExpbWl0ID0gcXVvdGEucXVvdGFMaW1pdC50b1N0cmluZygpO1xyXG4gICAgbGV0IGNvbnZlcnRlZFVzZWQgPSB1c2VkLnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCBpc1VubGltaXRlZCA9IHVubGltaXRlZEJlbmNobWFyayA8PSBxdW90YS5xdW90YUxpbWl0O1xyXG4gICAgY29uc3QgcGVyY2VudFVzZWQgPSBNYXRoLnJvdW5kKCgocXVvdGEucXVvdGFMaW1pdCAtIHF1b3RhLnF1b3RhUmVtYWluaW5nKSAvIHF1b3RhLnF1b3RhTGltaXQpICogMTAwKTtcclxuXHJcbiAgICBzd2l0Y2ggKHF1b3RhLnF1b3RhVHlwZSkge1xyXG4gICAgICBjYXNlIFF1b3RhVHlwZS5BU1JfRklMRV9MRU5HVEhfU0VDT05EUzpcclxuICAgICAgY2FzZSBRdW90YVR5cGUuT05MSU5FX0FTUl9VU0VEX1NFQ09ORFM6XHJcbiAgICAgICAgY29udmVydGVkTGltaXQgPSBNYXRoLmNlaWwocXVvdGEucXVvdGFMaW1pdCAvIDYwKS50b1N0cmluZygpO1xyXG4gICAgICAgIGNvbnZlcnRlZFVzZWQgPSBNYXRoLnJvdW5kKHVzZWQgLyA2MCkudG9TdHJpbmcoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBRdW90YVR5cGUuQVNSX0ZJTEVfU0laRV9LQjpcclxuICAgICAgICBjb252ZXJ0ZWRMaW1pdCA9IHRoaXMuI2Zvcm1hdEJ5dGVzKHF1b3RhLnF1b3RhTGltaXQgKiAxMDI0KTtcclxuICAgICAgICBjb252ZXJ0ZWRVc2VkID0gdGhpcy4jZm9ybWF0Qnl0ZXModXNlZCAqIDEwMjQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFF1b3RhVHlwZS5MTE1fUkVRVUVTVFM6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ucXVvdGEsXHJcbiAgICAgIGNvbnZlcnRlZExpbWl0LFxyXG4gICAgICBjb252ZXJ0ZWRVc2VkLFxyXG4gICAgICBpc1VubGltaXRlZCxcclxuICAgICAgcGVyY2VudFVzZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAjZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciwgZGVjaW1hbHMgPSAwKSB7XHJcbiAgICBpZiAoIStieXRlcykgcmV0dXJuICcwIEJ5dGVzJ1xyXG5cclxuICAgIGNvbnN0IGsgPSAxMDI0XHJcbiAgICBjb25zdCBkbSA9IGRlY2ltYWxzIDwgMCA/IDAgOiBkZWNpbWFsc1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ11cclxuXHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSlcclxuXHJcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpfSAke3NpemVzW2ldfWBcclxuICB9XHJcblxyXG59XHJcbiIsIkBpZih0b2tlbigpKXtcclxuICA8IS0tIG5hcnJvdyB0eXBlIHRvIG5vbiBudWxsIHByb3BlcnR5IC0tPlxyXG4gIEBsZXQgdXNlclRva2VuID0gdG9rZW4oKSE7XHJcblxyXG4gICAgPGgzIGNsYXNzPVwic3Vic2NyaXB0aW9uLXNlY3Rpb24tdGl0bGUgdGV4dC1sLXNlbWktYm9sZFwiPnt7IFwiU1VCU0NSSVBUSU9OLlVTRVJfSU5GT1wiIHwgdHJhbnNsYXRlIH19PC9oMz5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uLWRhdGEtcm93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tbGFiZWxcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgXCJTVUJTQ1JJUFRJT04uTEFCRUxfTkFNRVwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IHVzZXJUb2tlbi5uYW1lIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBcIlNVQlNDUklQVElPTi5MQUJFTF9FTUFJTFwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IHVzZXJUb2tlbi5lbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxufVxyXG5cclxuQGlmKHN1YnNjcmlwdGlvbigpKXtcclxuICBAbGV0IGN1cnJlbnRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24oKSE7XHJcblxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBjbGFzcz1cInN1YnNjcmlwdGlvbi1kYXRhLXJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgXCJTVUJTQ1JJUFRJT04uTEFCRUxfU1VCU0NSSVBUSU9OX1BMQU5fSURcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAge3sgY3VycmVudFN1YnNjcmlwdGlvbi5MYWJlbCA/IGN1cnJlbnRTdWJzY3JpcHRpb24uTGFiZWwgOiBjdXJyZW50U3Vic2NyaXB0aW9uLlBsYW5JZCB9fVxyXG5cclxuICAgICAgICAgIEBzd2l0Y2ggKHN1YnNjcmlwdGlvblN0YXRlKCkpIHtcclxuICAgICAgICAgICAgQGNhc2Uoc3Vic2NyaXB0aW9uU3RhdGVzLlRSSUFMKXtcclxuICAgICAgICAgICAgICA8c3Bhbj4gKHt7IFwiU1VCU0NSSVBUSU9OLlRSSUFMX0VORF9EQVRFXCIgfCB0cmFuc2xhdGU6IHsgZGF0ZTogY3VycmVudFN1YnNjcmlwdGlvbi5FbmREYXRlIHwgZGF0ZTogXCJkZC5NTS55eXl5LlwiIH0gfX0pIDwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAY2FzZSAoc3Vic2NyaXB0aW9uU3RhdGVzLkFDVElWRSkge1xyXG4gICAgICAgICAgICAgIEBpZihjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUpe1xyXG4gICAgICAgICAgICAgICAgPHNwYW4+ICh7eyBcIlNVQlNDUklQVElPTi5FTkRfREFURVwiIHwgdHJhbnNsYXRlOiB7IGRhdGU6IGN1cnJlbnRTdWJzY3JpcHRpb24uRW5kRGF0ZSB8IGRhdGU6IFwiZGQuTU0ueXl5eS5cIiB9IH19KSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBjYXNlIChzdWJzY3JpcHRpb25TdGF0ZXMuRU5ERUQpIHtcclxuICAgICAgICAgICAgKHt7IFwiU1VCU0NSSVBUSU9OLkVORF9EQVRFXCIgfCB0cmFuc2xhdGU6IHsgZGF0ZTogY3VycmVudFN1YnNjcmlwdGlvbi5FbmREYXRlIHwgZGF0ZTogXCJkZC5NTS55eXl5LlwiIH0gfX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIEBpZihjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUpe1xyXG4gIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tbGFiZWxcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IFwiU1VCU0NSSVBUSU9OLkxBQkVMX1NVQlNDUklQVElPTl9FTkRfREFURVwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1kYXRhXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgPHNwYW4+e3tjdXJyZW50U3Vic2NyaXB0aW9uLkVuZERhdGUgfCBkYXRlOiBcImRkLk1NLnl5eXlcIn19PC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICBAaWYoY3VycmVudFN1YnNjcmlwdGlvbi5BZGRvbnM/Lmxlbmd0aCl7XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YS1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBcIlNVQlNDUklQVElPTi5BRERJVElPTlNfUExVR0lOU1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tZGF0YVwiPlxyXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgY3VycmVudFN1YnNjcmlwdGlvbi5BZGRvbnM7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5pZCB9fXt7IGN1cnJlbnRTdWJzY3JpcHRpb24uQWRkb25zIS5sZW5ndGggLSAxID4gaSA/IFwiLFwiIDogXCJcIiB9fSA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxufVxyXG5cclxuQGlmKHZpc2libGVRdW90YXMoKS5sZW5ndGgpe1xyXG4gIDxoMyBjbGFzcz1cInN1YnNjcmlwdGlvbi1zZWN0aW9uLXRpdGxlIHRleHQtbC1zZW1pLWJvbGRcIj57eyBcIlNVQlNDUklQVElPTi5MSU1JVFNcIiB8IHRyYW5zbGF0ZSB9fTwvaDM+XHJcblxyXG4gIEBmb3IgKGN1cnJlbnRRdW90YSBvZiB2aXNpYmxlUXVvdGFzKCk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1saW1pdC13cmFwcGVyXCI+XHJcbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIFt2YWx1ZV09XCJjdXJyZW50UXVvdGEucGVyY2VudFVzZWRcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tbGltaXRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbC1zZW1pLWJvbGRcIj5cclxuICAgICAgICAgIHt7IChcIlFVT1RBLlwiICsgKGN1cnJlbnRRdW90YS5xdW90YVR5cGUudG9TdHJpbmcoKSB8IHVwcGVyY2FzZSkgKyAoY3VycmVudFF1b3RhLmlzVW5saW1pdGVkPyBcIl9VTkxJTUlURURcIjogXCJcIikpIHwgdHJhbnNsYXRlOiB7IHVzZWQ6IGN1cnJlbnRRdW90YS5jb252ZXJ0ZWRVc2VkLCBsaW1pdDogY3VycmVudFF1b3RhLmNvbnZlcnRlZExpbWl0LCBwZXJjZW50OiBjdXJyZW50UXVvdGEucGVyY2VudFVzZWR9IH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxufVxyXG5cclxuPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbi1hY3Rpb25zLXdyYXBwZXJcIj5cclxuICBAaWYoY2hhcmdlYmVlU2V0dGluZ3MoKSl7XHJcbiAgICA8YSBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5LWFjY2VudC1kYXJrZXJcIiBjbGFzcz1cIm1hbmFnZS1zdWItYnRuIGJ1dHRvbi1yb3ctZWxlbWVudFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBkYXRhLWNiLXR5cGU9XCJwb3J0YWxcIj5cclxuICAgICAge3sgXCJTVUJTQ1JJUFRJT04uTUFOQUdFXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgIDwvYT5cclxuICB9XHJcbiAgQGlmKGNvbnRhY3RVc1VybCgpKXtcclxuICAgIDxhIG1hdC1zdHJva2VkLWJ1dHRvbiBbYXR0ci5ocmVmXT1cImNvbnRhY3RVc1VybCgpXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY29sb3I9XCJwcmltYXJ5LWFjY2VudC1kYXJrZXJcIj57e1wiU1VCU0NSSVBUSU9OLkNPTlRBQ1RcIiB8IHRyYW5zbGF0ZX19PC9hPlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==