@pendo/openfeature-web-provider 0.1.0 → 0.2.0

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.
package/README.md CHANGED
@@ -10,15 +10,15 @@ npm install @pendo/openfeature-web-provider @openfeature/web-sdk
10
10
 
11
11
  ## Prerequisites
12
12
 
13
- The Pendo agent must be installed on your page. The provider reads flags from `window.pendo.segmentFlags` which is populated by the agent.
14
-
15
- ```html
16
- <script>
17
- (function(apiKey){
18
- // Pendo agent snippet
19
- // ...
20
- })('YOUR_PENDO_API_KEY');
21
- </script>
13
+ The Pendo Web SDK must be installed and initialized on your page with `requestSegmentFlags: true` enabled.
14
+
15
+ ```javascript
16
+ // Initialize Pendo with segment flags enabled
17
+ pendo.initialize({
18
+ visitor: { id: 'user-123' },
19
+ account: { id: 'account-456' },
20
+ requestSegmentFlags: true // Required for feature flags
21
+ });
22
22
  ```
23
23
 
24
24
  ## Usage
@@ -29,7 +29,7 @@ The Pendo agent must be installed on your page. The provider reads flags from `w
29
29
  import { OpenFeature } from '@openfeature/web-sdk';
30
30
  import { PendoProvider } from '@pendo/openfeature-web-provider';
31
31
 
32
- // Initialize the provider (waits for Pendo agent to be ready)
32
+ // Initialize the provider (waits for Pendo to be ready)
33
33
  await OpenFeature.setProviderAndWait(new PendoProvider());
34
34
 
35
35
  // Get a client
@@ -40,16 +40,16 @@ const client = OpenFeature.getClient();
40
40
 
41
41
  ```typescript
42
42
  // Boolean flag
43
- const showNewFeature = await client.getBooleanValue('new-checkout-flow', false);
43
+ const showNewFeature = client.getBooleanValue('new-checkout-flow', false);
44
44
 
45
45
  // String flag (returns "on" or "off")
46
- const variant = await client.getStringValue('checkout-variant', 'control');
46
+ const variant = client.getStringValue('checkout-variant', 'control');
47
47
 
48
48
  // Number flag (returns 1 or 0)
49
- const flagValue = await client.getNumberValue('feature-score', 0);
49
+ const flagValue = client.getNumberValue('feature-score', 0);
50
50
 
51
51
  // Object flag (returns { enabled: true/false })
52
- const config = await client.getObjectValue('feature-config', { enabled: false });
52
+ const config = client.getObjectValue('feature-config', { enabled: false });
53
53
  ```
54
54
 
55
55
  ### Event Tracking
@@ -57,18 +57,47 @@ const config = await client.getObjectValue('feature-config', { enabled: false })
57
57
  Track custom events to Pendo:
58
58
 
59
59
  ```typescript
60
- const provider = new PendoProvider();
61
- await OpenFeature.setProviderAndWait(provider);
60
+ const client = OpenFeature.getClient();
62
61
 
63
- // Track an event
64
- provider.track('checkout_started', undefined, { cartValue: '99.99' });
62
+ // Track an event (delegates to pendo.track)
63
+ client.track('checkout_started', { cartValue: '99.99' });
64
+ ```
65
+
66
+ ### Configuration Options
65
67
 
66
- // The context parameter is ignored in the web provider
67
- // since the Pendo agent already knows the current visitor
68
- provider.track('feature_used');
68
+ ```typescript
69
+ const provider = new PendoProvider({
70
+ // Timeout waiting for the Pendo Web SDK to be ready (default: 5000ms)
71
+ readyTimeout: 10000,
72
+ });
69
73
  ```
70
74
 
71
- ### Telemetry Hook
75
+ ## How It Works
76
+
77
+ 1. The provider waits for the Pendo Web SDK to be ready
78
+ 2. Flag evaluation checks if the flag key exists in `pendo.segmentFlags`
79
+ 3. When Pendo updates flags (on metadata/identity changes), the provider emits `ConfigurationChanged`
80
+ 4. React/Angular OpenFeature SDKs automatically re-render when flags change
81
+
82
+ ## Automatic Flag Updates
83
+
84
+ The provider subscribes to Pendo's `Events.segmentFlagsUpdated` event to detect when flags are updated. This happens automatically when:
85
+
86
+ - Pendo initializes and loads initial flags
87
+ - Visitor metadata changes
88
+ - Visitor identity changes (via `pendo.identify()`)
89
+
90
+ When flags update, the provider emits a `ConfigurationChanged` event, which triggers re-renders in React/Angular SDKs.
91
+
92
+ ## Resolution Details
93
+
94
+ | Scenario | Reason | Variant |
95
+ |----------|--------|---------|
96
+ | Flag key in segmentFlags | `TARGETING_MATCH` | `on` |
97
+ | Flag key not in segmentFlags | `DEFAULT` | `off` |
98
+ | Pendo not ready / no flags | `DEFAULT` | `default` |
99
+
100
+ ## Telemetry Hook
72
101
 
73
102
  Automatically track all flag evaluations to Pendo using the telemetry hook:
74
103
 
@@ -83,7 +112,7 @@ await OpenFeature.setProviderAndWait(provider);
83
112
  OpenFeature.addHooks(telemetryHook);
84
113
  ```
85
114
 
86
- #### Telemetry Hook Options
115
+ ### Telemetry Hook Options
87
116
 
88
117
  ```typescript
89
118
  const telemetryHook = new PendoTelemetryHook({
@@ -95,62 +124,14 @@ const telemetryHook = new PendoTelemetryHook({
95
124
  });
96
125
  ```
97
126
 
98
- #### Event Payload
99
-
100
- Each flag evaluation sends a track event with these properties:
101
-
102
- | Property | Description |
103
- |----------|-------------|
104
- | `flag_key` | The flag that was evaluated |
105
- | `flag_variant` | "on", "off", or variant name |
106
- | `flag_reason` | "TARGETING_MATCH", "DEFAULT", or "ERROR" |
107
- | `flag_value` | Stringified value |
108
- | `provider_name` | "pendo-provider" |
109
-
110
- ### Configuration Options
111
-
112
- ```typescript
113
- const provider = new PendoProvider({
114
- // API key for Pendo initialization (optional if already initialized)
115
- apiKey: 'YOUR_API_KEY',
116
-
117
- // Timeout waiting for Pendo agent to be ready (default: 5000ms)
118
- readyTimeout: 10000,
119
- });
120
- ```
121
-
122
- ## How It Works
123
-
124
- 1. The provider waits for the Pendo agent to initialize
125
- 2. Flag evaluation checks if the flag key exists in `window.pendo.segmentFlags`
126
- 3. If the flag key is present, the flag is enabled; otherwise, it returns the default value
127
-
128
- ## Context
129
-
130
- The web provider does not require explicit context for flag evaluation since the Pendo agent maintains visitor/account identity automatically. However, you can pass context for consistency with the OpenFeature API:
131
-
132
- ```typescript
133
- const enabled = await client.getBooleanValue('my-flag', false, {
134
- targetingKey: 'user-123', // Ignored by web provider
135
- accountId: 'account-456', // Ignored by web provider
136
- });
137
- ```
138
-
139
- ## Resolution Details
140
-
141
- | Scenario | Reason | Variant |
142
- |----------|--------|---------|
143
- | Flag key in segmentFlags | `TARGETING_MATCH` | `on` |
144
- | Flag key not in segmentFlags | `DEFAULT` | `off` |
145
- | Pendo not ready | `DEFAULT` | `default` |
146
-
147
127
  ## Troubleshooting
148
128
 
149
129
  ### Flags always return default values
150
130
 
151
- 1. Check that the Pendo agent is properly installed and initialized
152
- 2. Verify the visitor is in a segment that has the flag enabled
153
- 3. Check browser console for `[PendoProvider]` warnings
131
+ 1. Ensure `requestSegmentFlags: true` is set in your Pendo initialization
132
+ 2. Check that Pendo is properly initialized before the provider
133
+ 3. Verify the visitor is in a segment with the flag enabled
134
+ 4. Check browser console for `[PendoProvider]` warnings
154
135
 
155
136
  ### Provider times out
156
137
 
@@ -160,15 +141,13 @@ Increase the `readyTimeout` option:
160
141
  new PendoProvider({ readyTimeout: 15000 });
161
142
  ```
162
143
 
163
- ### Track events not appearing
144
+ ### Flags not updating
164
145
 
165
- Ensure the Pendo agent's `track` function is available:
146
+ The provider automatically detects flag changes. If flags aren't updating:
166
147
 
167
- ```typescript
168
- if (window.pendo?.track) {
169
- provider.track('my-event');
170
- }
171
- ```
148
+ 1. Verify Pendo is receiving metadata/identity updates
149
+ 2. Check that `requestSegmentFlags: true` is enabled
150
+ 3. Ensure your segments are configured correctly in Pendo
172
151
 
173
152
  ## License
174
153
 
@@ -1,23 +1,9 @@
1
1
  import type { Provider, ProviderMetadata, ResolutionDetails, EvaluationContext, JsonValue, Hook, TrackingEventDetails } from "@openfeature/web-sdk";
2
- import { ClientProviderStatus } from "@openfeature/web-sdk";
3
- declare global {
4
- interface Window {
5
- pendo?: {
6
- segmentFlags?: string[];
7
- isReady?: () => boolean;
8
- initialize?: (options: unknown) => void;
9
- track?: (event: string, properties?: Record<string, string>) => void;
10
- };
11
- }
12
- }
2
+ import { ClientProviderStatus, OpenFeatureEventEmitter } from "@openfeature/web-sdk";
3
+ import "./types";
13
4
  export interface PendoProviderOptions {
14
5
  /**
15
- * Optional: Pendo API key for initialization.
16
- * If not provided, assumes Pendo is already initialized on the page.
17
- */
18
- apiKey?: string;
19
- /**
20
- * Optional: Timeout in milliseconds to wait for Pendo to be ready.
6
+ * Timeout in milliseconds to wait for Pendo to be ready.
21
7
  * Default: 5000ms
22
8
  */
23
9
  readyTimeout?: number;
@@ -25,37 +11,55 @@ export interface PendoProviderOptions {
25
11
  /**
26
12
  * OpenFeature provider for Pendo feature flags.
27
13
  *
28
- * This provider evaluates feature flags by checking the `pendo.segmentFlags` array
29
- * which is populated by the Pendo agent based on segment membership.
14
+ * This provider integrates with the Pendo Web SDK's segment-flags plugin
15
+ * to evaluate feature flags based on segment membership.
16
+ *
17
+ * Prerequisites:
18
+ * - Pendo Web SDK must be installed and initialized on the page
19
+ * - `requestSegmentFlags: true` must be set in the Pendo configuration
30
20
  *
31
21
  * @example
32
22
  * ```typescript
33
23
  * import { OpenFeature } from '@openfeature/web-sdk';
34
24
  * import { PendoProvider } from '@pendo/openfeature-web-provider';
35
25
  *
26
+ * // Pendo must be initialized with requestSegmentFlags enabled:
27
+ * // pendo.initialize({
28
+ * // visitor: { id: 'user-123' },
29
+ * // account: { id: 'account-456' },
30
+ * // requestSegmentFlags: true
31
+ * // });
32
+ *
36
33
  * await OpenFeature.setProviderAndWait(new PendoProvider());
37
34
  *
38
35
  * const client = OpenFeature.getClient();
39
- * const enabled = await client.getBooleanValue('myFeature', false);
36
+ * const enabled = client.getBooleanValue('myFeature', false);
40
37
  * ```
41
38
  */
42
39
  export declare class PendoProvider implements Provider {
43
40
  readonly metadata: ProviderMetadata;
44
- readonly rulesChanged?: () => void;
41
+ readonly events: OpenFeatureEventEmitter;
45
42
  status: ClientProviderStatus;
46
43
  hooks?: Hook[];
47
44
  private options;
48
- private readyPromise;
45
+ private flagChangeDetectionSetup;
46
+ private flagChangeHandler;
49
47
  constructor(options?: PendoProviderOptions);
50
48
  /**
51
49
  * Initialize the provider.
52
- * Waits for Pendo to be ready before resolving.
50
+ * Waits for Pendo to be ready and sets up flag change detection.
53
51
  */
54
52
  initialize(): Promise<void>;
55
53
  /**
56
54
  * Wait for Pendo to be ready with timeout.
57
55
  */
58
56
  private waitForPendo;
57
+ /**
58
+ * Set up detection for when segment flags change.
59
+ * Listens for the segmentFlagsUpdated event from Pendo.
60
+ * Idempotent - only runs once.
61
+ */
62
+ private setupFlagChangeDetection;
59
63
  /**
60
64
  * Shutdown the provider.
61
65
  */
@@ -84,19 +88,15 @@ export declare class PendoProvider implements Provider {
84
88
  * For Pendo flags, this returns { enabled: true/false }.
85
89
  */
86
90
  resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext): ResolutionDetails<T>;
87
- /**
88
- * Get the segment flags array from Pendo.
89
- */
90
- private getSegmentFlags;
91
91
  /**
92
92
  * Track a custom event in Pendo.
93
93
  *
94
- * This method delegates to the Pendo agent's track function.
95
- * The Pendo agent must be initialized on the page for this to work.
96
- *
97
- * @param trackingEventName - The name of the event to track
98
- * @param _context - Evaluation context (unused in web provider, Pendo agent handles visitor context)
99
- * @param trackingEventDetails - Optional additional event properties
94
+ * Delegates to the Pendo Web SDK's track function.
100
95
  */
101
96
  track(trackingEventName: string, _context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void;
97
+ /**
98
+ * Get the segment flags array from Pendo.
99
+ * Returns null if Pendo is not available or flags haven't been loaded.
100
+ */
101
+ private getSegmentFlags;
102
102
  }
@@ -2,21 +2,33 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PendoProvider = void 0;
4
4
  const web_sdk_1 = require("@openfeature/web-sdk");
5
+ require("./types");
5
6
  /**
6
7
  * OpenFeature provider for Pendo feature flags.
7
8
  *
8
- * This provider evaluates feature flags by checking the `pendo.segmentFlags` array
9
- * which is populated by the Pendo agent based on segment membership.
9
+ * This provider integrates with the Pendo Web SDK's segment-flags plugin
10
+ * to evaluate feature flags based on segment membership.
11
+ *
12
+ * Prerequisites:
13
+ * - Pendo Web SDK must be installed and initialized on the page
14
+ * - `requestSegmentFlags: true` must be set in the Pendo configuration
10
15
  *
11
16
  * @example
12
17
  * ```typescript
13
18
  * import { OpenFeature } from '@openfeature/web-sdk';
14
19
  * import { PendoProvider } from '@pendo/openfeature-web-provider';
15
20
  *
21
+ * // Pendo must be initialized with requestSegmentFlags enabled:
22
+ * // pendo.initialize({
23
+ * // visitor: { id: 'user-123' },
24
+ * // account: { id: 'account-456' },
25
+ * // requestSegmentFlags: true
26
+ * // });
27
+ *
16
28
  * await OpenFeature.setProviderAndWait(new PendoProvider());
17
29
  *
18
30
  * const client = OpenFeature.getClient();
19
- * const enabled = await client.getBooleanValue('myFeature', false);
31
+ * const enabled = client.getBooleanValue('myFeature', false);
20
32
  * ```
21
33
  */
22
34
  class PendoProvider {
@@ -24,8 +36,10 @@ class PendoProvider {
24
36
  this.metadata = {
25
37
  name: "pendo-provider",
26
38
  };
39
+ this.events = new web_sdk_1.OpenFeatureEventEmitter();
27
40
  this.status = web_sdk_1.ClientProviderStatus.NOT_READY;
28
- this.readyPromise = null;
41
+ this.flagChangeDetectionSetup = false;
42
+ this.flagChangeHandler = null;
29
43
  this.options = {
30
44
  readyTimeout: 5000,
31
45
  ...options,
@@ -33,23 +47,24 @@ class PendoProvider {
33
47
  }
34
48
  /**
35
49
  * Initialize the provider.
36
- * Waits for Pendo to be ready before resolving.
50
+ * Waits for Pendo to be ready and sets up flag change detection.
37
51
  */
38
52
  async initialize() {
39
- if (this.readyPromise) {
40
- return this.readyPromise;
53
+ // Listen for pendo_ready to set up detection even if we timeout initially
54
+ if (typeof document !== "undefined") {
55
+ document.addEventListener("pendo_ready", () => this.setupFlagChangeDetection(), { once: true });
41
56
  }
42
- this.readyPromise = this.waitForPendo();
43
- await this.readyPromise;
57
+ await this.waitForPendo();
58
+ this.setupFlagChangeDetection();
44
59
  this.status = web_sdk_1.ClientProviderStatus.READY;
45
60
  }
46
61
  /**
47
62
  * Wait for Pendo to be ready with timeout.
48
63
  */
49
64
  async waitForPendo() {
50
- const timeout = this.options.readyTimeout ?? 5000;
65
+ const timeout = this.options.readyTimeout;
51
66
  const startTime = Date.now();
52
- return new Promise((resolve, reject) => {
67
+ return new Promise((resolve) => {
53
68
  const check = () => {
54
69
  // Check if pendo is available and ready
55
70
  if (typeof window !== "undefined" && window.pendo) {
@@ -60,8 +75,6 @@ class PendoProvider {
60
75
  }
61
76
  // Check timeout
62
77
  if (Date.now() - startTime > timeout) {
63
- // Don't reject - just resolve and work without Pendo
64
- // Flags will default to false
65
78
  console.warn("[PendoProvider] Pendo not ready within timeout. Flags will use default values.");
66
79
  resolve();
67
80
  return;
@@ -69,21 +82,46 @@ class PendoProvider {
69
82
  // Try again
70
83
  setTimeout(check, 100);
71
84
  };
72
- // Also listen for pendo:ready event
85
+ // Also listen for pendo_ready event
73
86
  if (typeof document !== "undefined") {
74
- document.addEventListener("pendo:ready", () => {
75
- resolve();
76
- }, { once: true });
87
+ document.addEventListener("pendo_ready", () => resolve(), { once: true });
77
88
  }
78
89
  check();
79
90
  });
80
91
  }
92
+ /**
93
+ * Set up detection for when segment flags change.
94
+ * Listens for the segmentFlagsUpdated event from Pendo.
95
+ * Idempotent - only runs once.
96
+ */
97
+ setupFlagChangeDetection() {
98
+ if (this.flagChangeDetectionSetup) {
99
+ return;
100
+ }
101
+ if (typeof window === "undefined" || !window.pendo?.Events?.segmentFlagsUpdated) {
102
+ return;
103
+ }
104
+ this.flagChangeDetectionSetup = true;
105
+ // Create handler and store reference for cleanup
106
+ this.flagChangeHandler = () => {
107
+ this.events.emit(web_sdk_1.ProviderEvents.ConfigurationChanged);
108
+ };
109
+ // Subscribe to Pendo's segmentFlagsUpdated event
110
+ window.pendo.Events.segmentFlagsUpdated.on(this.flagChangeHandler);
111
+ }
81
112
  /**
82
113
  * Shutdown the provider.
83
114
  */
84
115
  async onClose() {
116
+ // Unsubscribe from Pendo events
117
+ if (typeof window !== "undefined" &&
118
+ window.pendo?.Events?.segmentFlagsUpdated &&
119
+ this.flagChangeHandler) {
120
+ window.pendo.Events.segmentFlagsUpdated.off(this.flagChangeHandler);
121
+ }
85
122
  this.status = web_sdk_1.ClientProviderStatus.NOT_READY;
86
- this.readyPromise = null;
123
+ this.flagChangeHandler = null;
124
+ this.flagChangeDetectionSetup = false;
87
125
  }
88
126
  /**
89
127
  * Resolve a boolean flag value.
@@ -92,7 +130,7 @@ class PendoProvider {
92
130
  */
93
131
  resolveBooleanEvaluation(flagKey, defaultValue, _context) {
94
132
  const flags = this.getSegmentFlags();
95
- if (!flags) {
133
+ if (flags === null) {
96
134
  return {
97
135
  value: defaultValue,
98
136
  reason: "DEFAULT",
@@ -166,40 +204,38 @@ class PendoProvider {
166
204
  variant: boolResult.variant,
167
205
  };
168
206
  }
169
- /**
170
- * Get the segment flags array from Pendo.
171
- */
172
- getSegmentFlags() {
173
- if (typeof window === "undefined") {
174
- return undefined;
175
- }
176
- return window.pendo?.segmentFlags;
177
- }
178
207
  /**
179
208
  * Track a custom event in Pendo.
180
209
  *
181
- * This method delegates to the Pendo agent's track function.
182
- * The Pendo agent must be initialized on the page for this to work.
183
- *
184
- * @param trackingEventName - The name of the event to track
185
- * @param _context - Evaluation context (unused in web provider, Pendo agent handles visitor context)
186
- * @param trackingEventDetails - Optional additional event properties
210
+ * Delegates to the Pendo Web SDK's track function.
187
211
  */
188
212
  track(trackingEventName, _context, trackingEventDetails) {
189
213
  if (typeof window === "undefined" || !window.pendo?.track) {
190
- console.warn("[PendoProvider] Pendo agent not available for tracking");
214
+ console.warn("[PendoProvider] Pendo Web SDK not available for tracking");
191
215
  return;
192
216
  }
193
- // Convert TrackingEventDetails to Record<string, string> for Pendo agent
217
+ // Convert TrackingEventDetails to Record<string, string> for Pendo Web SDK
194
218
  const properties = {};
195
219
  for (const [key, value] of Object.entries(trackingEventDetails)) {
196
220
  if (value !== undefined && value !== null) {
197
221
  properties[key] = String(value);
198
222
  }
199
223
  }
200
- // Fire-and-forget: delegate to Pendo agent
201
224
  window.pendo.track(trackingEventName, properties);
202
225
  }
226
+ /**
227
+ * Get the segment flags array from Pendo.
228
+ * Returns null if Pendo is not available or flags haven't been loaded.
229
+ */
230
+ getSegmentFlags() {
231
+ if (typeof window === "undefined" || !window.pendo) {
232
+ return null;
233
+ }
234
+ const flags = window.pendo.segmentFlags;
235
+ // Return null if flags haven't been loaded yet (undefined)
236
+ // Return the array (even if empty) if flags have been loaded
237
+ return flags === undefined ? null : flags;
238
+ }
203
239
  }
204
240
  exports.PendoProvider = PendoProvider;
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9Qcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QZW5kb1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLGtEQUE0RDtBQTJCNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLGFBQWE7SUFZeEIsWUFBWSxVQUFnQyxFQUFFO1FBWHJDLGFBQVEsR0FBcUI7WUFDcEMsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDO1FBR0YsV0FBTSxHQUF5Qiw4QkFBb0IsQ0FBQyxTQUFTLENBQUM7UUFJdEQsaUJBQVksR0FBeUIsSUFBSSxDQUFDO1FBR2hELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyw4QkFBb0IsQ0FBQyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU3QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDakIsd0NBQXdDO2dCQUN4QyxJQUFJLE9BQU8s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QU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUNILGlCQUF5QixFQUN6QixRQUEyQixFQUMzQixvQkFBMEM7UUFFMUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQzlDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQWhQRCxzQ0FnUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIFByb3ZpZGVyLFxuICBQcm92aWRlck1ldGFkYXRhLFxuICBSZXNvbHV0aW9uRGV0YWlscyxcbiAgRXZhbHVhdGlvbkNvbnRleHQsXG4gIEpzb25WYWx1ZSxcbiAgSG9vayxcbiAgVHJhY2tpbmdFdmVudERldGFpbHMsXG59IGZyb20gXCJAb3BlbmZlYXR1cmUvd2ViLXNka1wiO1xuaW1wb3J0IHsgQ2xpZW50UHJvdmlkZXJTdGF0dXMgfSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBwZW5kbz86IHtcbiAgICAgIHNlZ21lbnRGbGFncz86IHN0cmluZ1tdO1xuICAgICAgaXNSZWFkeT86ICgpID0+IGJvb2xlYW47XG4gICAgICBpbml0aWFsaXplPzogKG9wdGlvbnM6IHVua25vd24pID0+IHZvaWQ7XG4gICAgICB0cmFjaz86IChldmVudDogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gdm9pZDtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZG9Qcm92aWRlck9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9uYWw6IFBlbmRvIEFQSSBrZXkgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGFzc3VtZXMgUGVuZG8gaXMgYWxyZWFkeSBpbml0aWFsaXplZCBvbiB0aGUgcGFnZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWw6IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5LlxuICAgKiBEZWZhdWx0OiA1MDAwbXNcbiAgICovXG4gIHJlYWR5VGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBwcm92aWRlciBmb3IgUGVuZG8gZmVhdHVyZSBmbGFncy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGV2YWx1YXRlcyBmZWF0dXJlIGZsYWdzIGJ5IGNoZWNraW5nIHRoZSBgcGVuZG8uc2VnbWVudEZsYWdzYCBhcnJheVxuICogd2hpY2ggaXMgcG9wdWxhdGVkIGJ5IHRoZSBQZW5kbyBhZ2VudCBiYXNlZCBvbiBzZWdtZW50IG1lbWJlcnNoaXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE9wZW5GZWF0dXJlIH0gZnJvbSAnQG9wZW5mZWF0dXJlL3dlYi1zZGsnO1xuICogaW1wb3J0IHsgUGVuZG9Qcm92aWRlciB9IGZyb20gJ0BwZW5kby9vcGVuZmVhdHVyZS13ZWItcHJvdmlkZXInO1xuICpcbiAqIGF3YWl0IE9wZW5GZWF0dXJlLnNldFByb3ZpZGVyQW5kV2FpdChuZXcgUGVuZG9Qcm92aWRlcigpKTtcbiAqXG4gKiBjb25zdCBjbGllbnQgPSBPcGVuRmVhdHVyZS5nZXRDbGllbnQoKTtcbiAqIGNvbnN0IGVuYWJsZWQgPSBhd2FpdCBjbGllbnQuZ2V0Qm9vbGVhblZhbHVlKCdteUZlYXR1cmUnLCBmYWxzZSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRvUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlciB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBQcm92aWRlck1ldGFkYXRhID0ge1xuICAgIG5hbWU6IFwicGVuZG8tcHJvdmlkZXJcIixcbiAgfTtcblxuICByZWFkb25seSBydWxlc0NoYW5nZWQ/OiAoKSA9PiB2b2lkO1xuICBzdGF0dXM6IENsaWVudFByb3ZpZGVyU3RhdHVzID0gQ2xpZW50UHJvdmlkZXJTdGF0dXMuTk9UX1JFQURZO1xuICBob29rcz86IEhvb2tbXTtcblxuICBwcml2YXRlIG9wdGlvbnM6IFBlbmRvUHJvdmlkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBlbmRvUHJvdmlkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICByZWFkeVRpbWVvdXQ6IDUwMDAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgcHJvdmlkZXIuXG4gICAqIFdhaXRzIGZvciBQZW5kbyB0byBiZSByZWFkeSBiZWZvcmUgcmVzb2x2aW5nLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5yZWFkeVByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5UHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IHRoaXMud2FpdEZvclBlbmRvKCk7XG4gICAgYXdhaXQgdGhpcy5yZWFkeVByb21pc2U7XG4gICAgdGhpcy5zdGF0dXMgPSBDbGllbnRQcm92aWRlclN0YXR1cy5SRUFEWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBQZW5kbyB0byBiZSByZWFkeSB3aXRoIHRpbWVvdXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JQZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRpb25zLnJlYWR5VGltZW91dCA/PyA1MDAwO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHBlbmRvIGlzIGF2YWlsYWJsZSBhbmQgcmVhZHlcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlbmRvKSB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5wZW5kby5pc1JlYWR5Py4oKSB8fCB3aW5kb3cucGVuZG8uc2VnbWVudEZsYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aW1lb3V0XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID4gdGltZW91dCkge1xuICAgICAgICAgIC8vIERvbid0IHJlamVjdCAtIGp1c3QgcmVzb2x2ZSBhbmQgd29yayB3aXRob3V0IFBlbmRvXG4gICAgICAgICAgLy8gRmxhZ3Mgd2lsbCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gbm90IHJlYWR5IHdpdGhpbiB0aW1lb3V0LiBGbGFncyB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlcy5cIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSBhZ2FpblxuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAxMDApO1xuICAgICAgfTtcblxuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIHBlbmRvOnJlYWR5IGV2ZW50XG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwZW5kbzpyZWFkeVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2h1dGRvd24gdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgYXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXR1cyA9IENsaWVudFByb3ZpZGVyU3RhdHVzLk5PVF9SRUFEWTtcbiAgICB0aGlzLnJlYWR5UHJvbWlzZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGJvb2xlYW4gZmxhZyB2YWx1ZS5cbiAgICpcbiAgICogQ2hlY2tzIGlmIHRoZSBmbGFnS2V5IGV4aXN0cyBpbiBwZW5kby5zZWdtZW50RmxhZ3MgYXJyYXkuXG4gICAqL1xuICByZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogYm9vbGVhbixcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZsYWdzID0gdGhpcy5nZXRTZWdtZW50RmxhZ3MoKTtcblxuICAgIGlmICghZmxhZ3MpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVkID0gZmxhZ3MuaW5jbHVkZXMoZmxhZ0tleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGVuYWJsZWQsXG4gICAgICByZWFzb246IGVuYWJsZWQgPyBcIlRBUkdFVElOR19NQVRDSFwiIDogXCJERUZBVUxUXCIsXG4gICAgICB2YXJpYW50OiBlbmFibGVkID8gXCJvblwiIDogXCJvZmZcIixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzdHJpbmcgZmxhZyB2YWx1ZS5cbiAgICpcbiAgICogRm9yIFBlbmRvIGZsYWdzLCB0aGlzIHJldHVybnMgXCJvblwiIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQsIFwib2ZmXCIgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVzb2x2ZVN0cmluZ0V2YWx1YXRpb24oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxuICAgIGNvbnRleHQ6IEV2YWx1YXRpb25Db250ZXh0XG4gICk6IFJlc29sdXRpb25EZXRhaWxzPHN0cmluZz4ge1xuICAgIGNvbnN0IGJvb2xSZXN1bHQgPSB0aGlzLnJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihmbGFnS2V5LCBmYWxzZSwgY29udGV4dCk7XG5cbiAgICBpZiAoYm9vbFJlc3VsdC5yZWFzb24gPT09IFwiREVGQVVMVFwiICYmICFib29sUmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBib29sUmVzdWx0LnZhbHVlID8gXCJvblwiIDogXCJvZmZcIixcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbnVtYmVyIGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIDEgaWYgZW5hYmxlZCwgMCBpZiBkaXNhYmxlZC5cbiAgICovXG4gIHJlc29sdmVOdW1iZXJFdmFsdWF0aW9uKFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bWJlcixcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxudW1iZXI+IHtcbiAgICBjb25zdCBib29sUmVzdWx0ID0gdGhpcy5yZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oZmxhZ0tleSwgZmFsc2UsIGNvbnRleHQpO1xuXG4gICAgaWYgKGJvb2xSZXN1bHQucmVhc29uID09PSBcIkRFRkFVTFRcIiAmJiAhYm9vbFJlc3VsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcmVhc29uOiBcIkRFRkFVTFRcIixcbiAgICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYm9vbFJlc3VsdC52YWx1ZSA/IDEgOiAwLFxuICAgICAgcmVhc29uOiBib29sUmVzdWx0LnJlYXNvbixcbiAgICAgIHZhcmlhbnQ6IGJvb2xSZXN1bHQudmFyaWFudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gb2JqZWN0IGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIHsgZW5hYmxlZDogdHJ1ZS9mYWxzZSB9LlxuICAgKi9cbiAgcmVzb2x2ZU9iamVjdEV2YWx1YXRpb248VCBleHRlbmRzIEpzb25WYWx1ZT4oXG4gICAgZmxhZ0tleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCxcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxUPiB7XG4gICAgY29uc3QgYm9vbFJlc3VsdCA9IHRoaXMucmVzb2x2ZUJvb2xlYW5FdmFsdWF0aW9uKGZsYWdLZXksIGZhbHNlLCBjb250ZXh0KTtcblxuICAgIGlmIChib29sUmVzdWx0LnJlYXNvbiA9PT0gXCJERUZBVUxUXCIgJiYgIWJvb2xSZXN1bHQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHsgZW5hYmxlZDogYm9vbFJlc3VsdC52YWx1ZSB9IGFzIHVua25vd24gYXMgVCxcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlZ21lbnQgZmxhZ3MgYXJyYXkgZnJvbSBQZW5kby5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2VnbWVudEZsYWdzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93LnBlbmRvPy5zZWdtZW50RmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYSBjdXN0b20gZXZlbnQgaW4gUGVuZG8uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgUGVuZG8gYWdlbnQncyB0cmFjayBmdW5jdGlvbi5cbiAgICogVGhlIFBlbmRvIGFnZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIHBhZ2UgZm9yIHRoaXMgdG8gd29yay5cbiAgICpcbiAgICogQHBhcmFtIHRyYWNraW5nRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyYWNrXG4gICAqIEBwYXJhbSBfY29udGV4dCAtIEV2YWx1YXRpb24gY29udGV4dCAodW51c2VkIGluIHdlYiBwcm92aWRlciwgUGVuZG8gYWdlbnQgaGFuZGxlcyB2aXNpdG9yIGNvbnRleHQpXG4gICAqIEBwYXJhbSB0cmFja2luZ0V2ZW50RGV0YWlscyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgZXZlbnQgcHJvcGVydGllc1xuICAgKi9cbiAgdHJhY2soXG4gICAgdHJhY2tpbmdFdmVudE5hbWU6IHN0cmluZyxcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQsXG4gICAgdHJhY2tpbmdFdmVudERldGFpbHM6IFRyYWNraW5nRXZlbnREZXRhaWxzXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8/LnRyYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gYWdlbnQgbm90IGF2YWlsYWJsZSBmb3IgdHJhY2tpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBUcmFja2luZ0V2ZW50RGV0YWlscyB0byBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IGZvciBQZW5kbyBhZ2VudFxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0cmFja2luZ0V2ZW50RGV0YWlscykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHByb3BlcnRpZXNba2V5XSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBkZWxlZ2F0ZSB0byBQZW5kbyBhZ2VudFxuICAgIHdpbmRvdy5wZW5kby50cmFjayh0cmFja2luZ0V2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gIH1cbn1cbiJdfQ==
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9Qcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QZW5kb1Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLGtEQUk4QjtBQUM5QixtQkFBaUI7QUFVakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQWEsYUFBYTtJQWF4QixZQUFZLFVBQWdDLEVBQUU7UUFackMsYUFBUSxHQUFxQjtZQUNwQyxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUM7UUFFTyxXQUFNLEdBQUcsSUFBSSxpQ0FBdUIsRUFBRSxDQUFDO1FBQ2hELFdBQU0sR0FBeUIsOEJBQW9CLENBQUMsU0FBUyxDQUFDO1FBSXRELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxzQkFBaUIsR0FBd0IsSUFBSSxDQUFDO1FBR3BELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsMEVBQTBFO1FBQzFFLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsUUFBUSxDQUFDLGdCQUFnQixDQUN2QixhQUFhLEVBQ2IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQ3JDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUNmLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyw4QkFBb0IsQ0FBQyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZ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LENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDekUsT0FBTztRQUNULENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUM5QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDaEUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlO1FBQ3JCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXhDLDJEQUEyRDtRQUMzRCw2REFBNkQ7UUFDN0QsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFwUkQsc0NBb1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBQcm92aWRlcixcbiAgUHJvdmlkZXJNZXRhZGF0YSxcbiAgUmVzb2x1dGlvbkRldGFpbHMsXG4gIEV2YWx1YXRpb25Db250ZXh0LFxuICBKc29uVmFsdWUsXG4gIEhvb2ssXG4gIFRyYWNraW5nRXZlbnREZXRhaWxzLFxufSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcbmltcG9ydCB7XG4gIENsaWVudFByb3ZpZGVyU3RhdHVzLFxuICBPcGVuRmVhdHVyZUV2ZW50RW1pdHRlcixcbiAgUHJvdmlkZXJFdmVudHMsXG59IGZyb20gXCJAb3BlbmZlYXR1cmUvd2ViLXNka1wiO1xuaW1wb3J0IFwiLi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRvUHJvdmlkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5LlxuICAgKiBEZWZhdWx0OiA1MDAwbXNcbiAgICovXG4gIHJlYWR5VGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBwcm92aWRlciBmb3IgUGVuZG8gZmVhdHVyZSBmbGFncy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGludGVncmF0ZXMgd2l0aCB0aGUgUGVuZG8gV2ViIFNESydzIHNlZ21lbnQtZmxhZ3MgcGx1Z2luXG4gKiB0byBldmFsdWF0ZSBmZWF0dXJlIGZsYWdzIGJhc2VkIG9uIHNlZ21lbnQgbWVtYmVyc2hpcC5cbiAqXG4gKiBQcmVyZXF1aXNpdGVzOlxuICogLSBQZW5kbyBXZWIgU0RLIG11c3QgYmUgaW5zdGFsbGVkIGFuZCBpbml0aWFsaXplZCBvbiB0aGUgcGFnZVxuICogLSBgcmVxdWVzdFNlZ21lbnRGbGFnczogdHJ1ZWAgbXVzdCBiZSBzZXQgaW4gdGhlIFBlbmRvIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgT3BlbkZlYXR1cmUgfSBmcm9tICdAb3BlbmZlYXR1cmUvd2ViLXNkayc7XG4gKiBpbXBvcnQgeyBQZW5kb1Byb3ZpZGVyIH0gZnJvbSAnQHBlbmRvL29wZW5mZWF0dXJlLXdlYi1wcm92aWRlcic7XG4gKlxuICogLy8gUGVuZG8gbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIHJlcXVlc3RTZWdtZW50RmxhZ3MgZW5hYmxlZDpcbiAqIC8vIHBlbmRvLmluaXRpYWxpemUoe1xuICogLy8gICB2aXNpdG9yOiB7IGlkOiAndXNlci0xMjMnIH0sXG4gKiAvLyAgIGFjY291bnQ6IHsgaWQ6ICdhY2NvdW50LTQ1NicgfSxcbiAqIC8vICAgcmVxdWVzdFNlZ21lbnRGbGFnczogdHJ1ZVxuICogLy8gfSk7XG4gKlxuICogYXdhaXQgT3BlbkZlYXR1cmUuc2V0UHJvdmlkZXJBbmRXYWl0KG5ldyBQZW5kb1Byb3ZpZGVyKCkpO1xuICpcbiAqIGNvbnN0IGNsaWVudCA9IE9wZW5GZWF0dXJlLmdldENsaWVudCgpO1xuICogY29uc3QgZW5hYmxlZCA9IGNsaWVudC5nZXRCb29sZWFuVmFsdWUoJ215RmVhdHVyZScsIGZhbHNlKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGVuZG9Qcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyIHtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IFByb3ZpZGVyTWV0YWRhdGEgPSB7XG4gICAgbmFtZTogXCJwZW5kby1wcm92aWRlclwiLFxuICB9O1xuXG4gIHJlYWRvbmx5IGV2ZW50cyA9IG5ldyBPcGVuRmVhdHVyZUV2ZW50RW1pdHRlcigpO1xuICBzdGF0dXM6IENsaWVudFByb3ZpZGVyU3RhdHVzID0gQ2xpZW50UHJvdmlkZXJTdGF0dXMuTk9UX1JFQURZO1xuICBob29rcz86IEhvb2tbXTtcblxuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPFBlbmRvUHJvdmlkZXJPcHRpb25zPjtcbiAgcHJpdmF0ZSBmbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmbGFnQ2hhbmdlSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGVuZG9Qcm92aWRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHJlYWR5VGltZW91dDogNTAwMCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwcm92aWRlci5cbiAgICogV2FpdHMgZm9yIFBlbmRvIHRvIGJlIHJlYWR5IGFuZCBzZXRzIHVwIGZsYWcgY2hhbmdlIGRldGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTGlzdGVuIGZvciBwZW5kb19yZWFkeSB0byBzZXQgdXAgZGV0ZWN0aW9uIGV2ZW4gaWYgd2UgdGltZW91dCBpbml0aWFsbHlcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBcInBlbmRvX3JlYWR5XCIsXG4gICAgICAgICgpID0+IHRoaXMuc2V0dXBGbGFnQ2hhbmdlRGV0ZWN0aW9uKCksXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvclBlbmRvKCk7XG4gICAgdGhpcy5zZXR1cEZsYWdDaGFuZ2VEZXRlY3Rpb24oKTtcbiAgICB0aGlzLnN0YXR1cyA9IENsaWVudFByb3ZpZGVyU3RhdHVzLlJFQURZO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIFBlbmRvIHRvIGJlIHJlYWR5IHdpdGggdGltZW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclBlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdGlvbnMucmVhZHlUaW1lb3V0O1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBwZW5kbyBpcyBhdmFpbGFibGUgYW5kIHJlYWR5XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZW5kbykge1xuICAgICAgICAgIGlmICh3aW5kb3cucGVuZG8uaXNSZWFkeT8uKCkgfHwgd2luZG93LnBlbmRvLnNlZ21lbnRGbGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGltZW91dFxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+IHRpbWVvdXQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIltQZW5kb1Byb3ZpZGVyXSBQZW5kbyBub3QgcmVhZHkgd2l0aGluIHRpbWVvdXQuIEZsYWdzIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWVzLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IGFnYWluXG4gICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDEwMCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcGVuZG9fcmVhZHkgZXZlbnRcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcInBlbmRvX3JlYWR5XCIsXG4gICAgICAgICAgKCkgPT4gcmVzb2x2ZSgpLFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGRldGVjdGlvbiBmb3Igd2hlbiBzZWdtZW50IGZsYWdzIGNoYW5nZS5cbiAgICogTGlzdGVucyBmb3IgdGhlIHNlZ21lbnRGbGFnc1VwZGF0ZWQgZXZlbnQgZnJvbSBQZW5kby5cbiAgICogSWRlbXBvdGVudCAtIG9ubHkgcnVucyBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEZsYWdDaGFuZ2VEZXRlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmxhZ0NoYW5nZURldGVjdGlvblNldHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgIXdpbmRvdy5wZW5kbz8uRXZlbnRzPy5zZWdtZW50RmxhZ3NVcGRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSB0cnVlO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZXIgYW5kIHN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgIHRoaXMuZmxhZ0NoYW5nZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFByb3ZpZGVyRXZlbnRzLkNvbmZpZ3VyYXRpb25DaGFuZ2VkKTtcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIFBlbmRvJ3Mgc2VnbWVudEZsYWdzVXBkYXRlZCBldmVudFxuICAgIHdpbmRvdy5wZW5kby5FdmVudHMuc2VnbWVudEZsYWdzVXBkYXRlZC5vbih0aGlzLmZsYWdDaGFuZ2VIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0ZG93biB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gUGVuZG8gZXZlbnRzXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgd2luZG93LnBlbmRvPy5FdmVudHM/LnNlZ21lbnRGbGFnc1VwZGF0ZWQgJiZcbiAgICAgIHRoaXMuZmxhZ0NoYW5nZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIHdpbmRvdy5wZW5kby5FdmVudHMuc2VnbWVudEZsYWdzVXBkYXRlZC5vZmYodGhpcy5mbGFnQ2hhbmdlSGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXMgPSBDbGllbnRQcm92aWRlclN0YXR1cy5OT1RfUkVBRFk7XG4gICAgdGhpcy5mbGFnQ2hhbmdlSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5mbGFnQ2hhbmdlRGV0ZWN0aW9uU2V0dXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgYm9vbGVhbiBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBDaGVja3MgaWYgdGhlIGZsYWdLZXkgZXhpc3RzIGluIHBlbmRvLnNlZ21lbnRGbGFncyBhcnJheS5cbiAgICovXG4gIHJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihcbiAgICBmbGFnS2V5OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBib29sZWFuLFxuICAgIF9jb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxib29sZWFuPiB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLmdldFNlZ21lbnRGbGFncygpO1xuXG4gICAgaWYgKGZsYWdzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9IGZsYWdzLmluY2x1ZGVzKGZsYWdLZXkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBlbmFibGVkLFxuICAgICAgcmVhc29uOiBlbmFibGVkID8gXCJUQVJHRVRJTkdfTUFUQ0hcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgdmFyaWFudDogZW5hYmxlZCA/IFwib25cIiA6IFwib2ZmXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgc3RyaW5nIGZsYWcgdmFsdWUuXG4gICAqXG4gICAqIEZvciBQZW5kbyBmbGFncywgdGhpcyByZXR1cm5zIFwib25cIiBpZiB0aGUgZmxhZyBpcyBlbmFibGVkLCBcIm9mZlwiIG90aGVyd2lzZS5cbiAgICovXG4gIHJlc29sdmVTdHJpbmdFdmFsdWF0aW9uKFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IHN0cmluZyxcbiAgICBjb250ZXh0OiBFdmFsdWF0aW9uQ29udGV4dFxuICApOiBSZXNvbHV0aW9uRGV0YWlsczxzdHJpbmc+IHtcbiAgICBjb25zdCBib29sUmVzdWx0ID0gdGhpcy5yZXNvbHZlQm9vbGVhbkV2YWx1YXRpb24oZmxhZ0tleSwgZmFsc2UsIGNvbnRleHQpO1xuXG4gICAgaWYgKGJvb2xSZXN1bHQucmVhc29uID09PSBcIkRFRkFVTFRcIiAmJiAhYm9vbFJlc3VsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcmVhc29uOiBcIkRFRkFVTFRcIixcbiAgICAgICAgdmFyaWFudDogXCJkZWZhdWx0XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYm9vbFJlc3VsdC52YWx1ZSA/IFwib25cIiA6IFwib2ZmXCIsXG4gICAgICByZWFzb246IGJvb2xSZXN1bHQucmVhc29uLFxuICAgICAgdmFyaWFudDogYm9vbFJlc3VsdC52YXJpYW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG51bWJlciBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgUGVuZG8gZmxhZ3MsIHRoaXMgcmV0dXJucyAxIGlmIGVuYWJsZWQsIDAgaWYgZGlzYWJsZWQuXG4gICAqL1xuICByZXNvbHZlTnVtYmVyRXZhbHVhdGlvbihcbiAgICBmbGFnS2V5OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBudW1iZXIsXG4gICAgY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8bnVtYmVyPiB7XG4gICAgY29uc3QgYm9vbFJlc3VsdCA9IHRoaXMucmVzb2x2ZUJvb2xlYW5FdmFsdWF0aW9uKGZsYWdLZXksIGZhbHNlLCBjb250ZXh0KTtcblxuICAgIGlmIChib29sUmVzdWx0LnJlYXNvbiA9PT0gXCJERUZBVUxUXCIgJiYgIWJvb2xSZXN1bHQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHJlYXNvbjogXCJERUZBVUxUXCIsXG4gICAgICAgIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJvb2xSZXN1bHQudmFsdWUgPyAxIDogMCxcbiAgICAgIHJlYXNvbjogYm9vbFJlc3VsdC5yZWFzb24sXG4gICAgICB2YXJpYW50OiBib29sUmVzdWx0LnZhcmlhbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIG9iamVjdCBmbGFnIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgUGVuZG8gZmxhZ3MsIHRoaXMgcmV0dXJucyB7IGVuYWJsZWQ6IHRydWUvZmFsc2UgfS5cbiAgICovXG4gIHJlc29sdmVPYmplY3RFdmFsdWF0aW9uPFQgZXh0ZW5kcyBKc29uVmFsdWU+KFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IFQsXG4gICAgY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHRcbiAgKTogUmVzb2x1dGlvbkRldGFpbHM8VD4ge1xuICAgIGNvbnN0IGJvb2xSZXN1bHQgPSB0aGlzLnJlc29sdmVCb29sZWFuRXZhbHVhdGlvbihmbGFnS2V5LCBmYWxzZSwgY29udGV4dCk7XG5cbiAgICBpZiAoYm9vbFJlc3VsdC5yZWFzb24gPT09IFwiREVGQVVMVFwiICYmICFib29sUmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICByZWFzb246IFwiREVGQVVMVFwiLFxuICAgICAgICB2YXJpYW50OiBcImRlZmF1bHRcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB7IGVuYWJsZWQ6IGJvb2xSZXN1bHQudmFsdWUgfSBhcyB1bmtub3duIGFzIFQsXG4gICAgICByZWFzb246IGJvb2xSZXN1bHQucmVhc29uLFxuICAgICAgdmFyaWFudDogYm9vbFJlc3VsdC52YXJpYW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYSBjdXN0b20gZXZlbnQgaW4gUGVuZG8uXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB0aGUgUGVuZG8gV2ViIFNESydzIHRyYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgdHJhY2soXG4gICAgdHJhY2tpbmdFdmVudE5hbWU6IHN0cmluZyxcbiAgICBfY29udGV4dDogRXZhbHVhdGlvbkNvbnRleHQsXG4gICAgdHJhY2tpbmdFdmVudERldGFpbHM6IFRyYWNraW5nRXZlbnREZXRhaWxzXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8/LnRyYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbUGVuZG9Qcm92aWRlcl0gUGVuZG8gV2ViIFNESyBub3QgYXZhaWxhYmxlIGZvciB0cmFja2luZ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IFRyYWNraW5nRXZlbnREZXRhaWxzIHRvIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gZm9yIFBlbmRvIFdlYiBTREtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModHJhY2tpbmdFdmVudERldGFpbHMpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5wZW5kby50cmFjayh0cmFja2luZ0V2ZW50TmFtZSwgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWdtZW50IGZsYWdzIGFycmF5IGZyb20gUGVuZG8uXG4gICAqIFJldHVybnMgbnVsbCBpZiBQZW5kbyBpcyBub3QgYXZhaWxhYmxlIG9yIGZsYWdzIGhhdmVuJ3QgYmVlbiBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIGdldFNlZ21lbnRGbGFncygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzID0gd2luZG93LnBlbmRvLnNlZ21lbnRGbGFncztcblxuICAgIC8vIFJldHVybiBudWxsIGlmIGZsYWdzIGhhdmVuJ3QgYmVlbiBsb2FkZWQgeWV0ICh1bmRlZmluZWQpXG4gICAgLy8gUmV0dXJuIHRoZSBhcnJheSAoZXZlbiBpZiBlbXB0eSkgaWYgZmxhZ3MgaGF2ZSBiZWVuIGxvYWRlZFxuICAgIHJldHVybiBmbGFncyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZsYWdzO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,5 @@
1
1
  import type { Hook, HookContext, EvaluationDetails, FlagValue } from "@openfeature/web-sdk";
2
+ import "./types";
2
3
  export interface PendoTelemetryHookOptions {
3
4
  /**
4
5
  * Event name for flag evaluation tracking.
@@ -17,7 +18,7 @@ export interface PendoTelemetryHookOptions {
17
18
  * This hook sends an event to Pendo after each flag evaluation, allowing you
18
19
  * to analyze feature flag usage alongside your other Pendo analytics.
19
20
  *
20
- * The hook uses the Pendo agent's track function, so the Pendo agent must be
21
+ * The hook uses the Pendo Web SDK's track function, so the Pendo Web SDK must be
21
22
  * initialized on the page for tracking to work.
22
23
  *
23
24
  * @example
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PendoTelemetryHook = void 0;
4
+ require("./types");
4
5
  /**
5
6
  * OpenFeature hook that automatically tracks flag evaluations to Pendo.
6
7
  *
7
8
  * This hook sends an event to Pendo after each flag evaluation, allowing you
8
9
  * to analyze feature flag usage alongside your other Pendo analytics.
9
10
  *
10
- * The hook uses the Pendo agent's track function, so the Pendo agent must be
11
+ * The hook uses the Pendo Web SDK's track function, so the Pendo Web SDK must be
11
12
  * initialized on the page for tracking to work.
12
13
  *
13
14
  * @example
@@ -39,7 +40,7 @@ class PendoTelemetryHook {
39
40
  if (this.options.flagFilter && !this.options.flagFilter(flagKey)) {
40
41
  return;
41
42
  }
42
- // Check if Pendo agent is available
43
+ // Check if Pendo Web SDK is available
43
44
  if (typeof window === "undefined" || !window.pendo?.track) {
44
45
  return;
45
46
  }
@@ -50,7 +51,7 @@ class PendoTelemetryHook {
50
51
  flag_value: this.stringifyValue(evaluationDetails.value),
51
52
  provider_name: hookContext.providerMetadata.name,
52
53
  };
53
- // Fire-and-forget: delegate to Pendo agent
54
+ // Fire-and-forget: delegate to Pendo Web SDK
54
55
  window.pendo.track(this.options.eventName, properties);
55
56
  }
56
57
  /**
@@ -67,4 +68,4 @@ class PendoTelemetryHook {
67
68
  }
68
69
  }
69
70
  exports.PendoTelemetryHook = PendoTelemetryHook;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9UZWxlbWV0cnlIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BlbmRvVGVsZW1ldHJ5SG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSxrQkFBa0I7SUFLN0IsWUFBWSxVQUFxQyxFQUFFO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLEdBQUcsT0FBTztTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUNILFdBQTZDLEVBQzdDLGlCQUErQztRQUUvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBRWhDLHVDQUF1QztRQUN2QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxPQUFPO1FBQ1QsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBMkI7WUFDekMsUUFBUSxFQUFFLE9BQU87WUFDakIsWUFBWSxFQUFFLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxTQUFTO1lBQ3BELFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksU0FBUztZQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7WUFDeEQsYUFBYSxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO1NBQ2pELENBQUM7UUFFRiwyQ0FBMkM7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLEtBQWdCO1FBQ3JDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBeERELGdEQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgSG9vayxcbiAgSG9va0NvbnRleHQsXG4gIEV2YWx1YXRpb25EZXRhaWxzLFxuICBGbGFnVmFsdWUsXG59IGZyb20gXCJAb3BlbmZlYXR1cmUvd2ViLXNka1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRvVGVsZW1ldHJ5SG9va09wdGlvbnMge1xuICAvKipcbiAgICogRXZlbnQgbmFtZSBmb3IgZmxhZyBldmFsdWF0aW9uIHRyYWNraW5nLlxuICAgKiBEZWZhdWx0OiBcImZsYWdfZXZhbHVhdGVkXCJcbiAgICovXG4gIGV2ZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIHNlbGVjdGl2ZWx5IHRyYWNrIGZsYWdzLlxuICAgKiBSZXR1cm4gdHJ1ZSB0byB0cmFjayB0aGUgZmxhZywgZmFsc2UgdG8gc2tpcC5cbiAgICovXG4gIGZsYWdGaWx0ZXI/OiAoZmxhZ0tleTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wZW5GZWF0dXJlIGhvb2sgdGhhdCBhdXRvbWF0aWNhbGx5IHRyYWNrcyBmbGFnIGV2YWx1YXRpb25zIHRvIFBlbmRvLlxuICpcbiAqIFRoaXMgaG9vayBzZW5kcyBhbiBldmVudCB0byBQZW5kbyBhZnRlciBlYWNoIGZsYWcgZXZhbHVhdGlvbiwgYWxsb3dpbmcgeW91XG4gKiB0byBhbmFseXplIGZlYXR1cmUgZmxhZyB1c2FnZSBhbG9uZ3NpZGUgeW91ciBvdGhlciBQZW5kbyBhbmFseXRpY3MuXG4gKlxuICogVGhlIGhvb2sgdXNlcyB0aGUgUGVuZG8gYWdlbnQncyB0cmFjayBmdW5jdGlvbiwgc28gdGhlIFBlbmRvIGFnZW50IG11c3QgYmVcbiAqIGluaXRpYWxpemVkIG9uIHRoZSBwYWdlIGZvciB0cmFja2luZyB0byB3b3JrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBPcGVuRmVhdHVyZSB9IGZyb20gJ0BvcGVuZmVhdHVyZS93ZWItc2RrJztcbiAqIGltcG9ydCB7IFBlbmRvUHJvdmlkZXIsIFBlbmRvVGVsZW1ldHJ5SG9vayB9IGZyb20gJ0BwZW5kby9vcGVuZmVhdHVyZS13ZWItcHJvdmlkZXInO1xuICpcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBlbmRvUHJvdmlkZXIoKTtcbiAqIGNvbnN0IHRlbGVtZXRyeUhvb2sgPSBuZXcgUGVuZG9UZWxlbWV0cnlIb29rKCk7XG4gKlxuICogYXdhaXQgT3BlbkZlYXR1cmUuc2V0UHJvdmlkZXJBbmRXYWl0KHByb3ZpZGVyKTtcbiAqIE9wZW5GZWF0dXJlLmFkZEhvb2tzKHRlbGVtZXRyeUhvb2spO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQZW5kb1RlbGVtZXRyeUhvb2sgaW1wbGVtZW50cyBIb29rIHtcbiAgcHJpdmF0ZSBvcHRpb25zOiBSZXF1aXJlZDxPbWl0PFBlbmRvVGVsZW1ldHJ5SG9va09wdGlvbnMsIFwiZmxhZ0ZpbHRlclwiPj4gJiB7XG4gICAgZmxhZ0ZpbHRlcj86IChmbGFnS2V5OiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGVuZG9UZWxlbWV0cnlIb29rT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZXZlbnROYW1lOiBcImZsYWdfZXZhbHVhdGVkXCIsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIGEgZmxhZyBpcyBzdWNjZXNzZnVsbHkgZXZhbHVhdGVkLlxuICAgKiBTZW5kcyB0aGUgZXZhbHVhdGlvbiByZXN1bHQgdG8gUGVuZG8gYXMgYSB0cmFjayBldmVudC5cbiAgICovXG4gIGFmdGVyKFxuICAgIGhvb2tDb250ZXh0OiBSZWFkb25seTxIb29rQ29udGV4dDxGbGFnVmFsdWU+PixcbiAgICBldmFsdWF0aW9uRGV0YWlsczogRXZhbHVhdGlvbkRldGFpbHM8RmxhZ1ZhbHVlPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGZsYWdLZXkgfSA9IGhvb2tDb250ZXh0O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBmbGFnIHNob3VsZCBiZSB0cmFja2VkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5mbGFnRmlsdGVyICYmICF0aGlzLm9wdGlvbnMuZmxhZ0ZpbHRlcihmbGFnS2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIFBlbmRvIGFnZW50IGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cucGVuZG8/LnRyYWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGZsYWdfa2V5OiBmbGFnS2V5LFxuICAgICAgZmxhZ192YXJpYW50OiBldmFsdWF0aW9uRGV0YWlscy52YXJpYW50IHx8IFwidW5rbm93blwiLFxuICAgICAgZmxhZ19yZWFzb246IGV2YWx1YXRpb25EZXRhaWxzLnJlYXNvbiB8fCBcIlVOS05PV05cIixcbiAgICAgIGZsYWdfdmFsdWU6IHRoaXMuc3RyaW5naWZ5VmFsdWUoZXZhbHVhdGlvbkRldGFpbHMudmFsdWUpLFxuICAgICAgcHJvdmlkZXJfbmFtZTogaG9va0NvbnRleHQucHJvdmlkZXJNZXRhZGF0YS5uYW1lLFxuICAgIH07XG5cbiAgICAvLyBGaXJlLWFuZC1mb3JnZXQ6IGRlbGVnYXRlIHRvIFBlbmRvIGFnZW50XG4gICAgd2luZG93LnBlbmRvLnRyYWNrKHRoaXMub3B0aW9ucy5ldmVudE5hbWUsIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBmbGFnIHZhbHVlIHRvIGEgc3RyaW5nIGZvciB0cmFja2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5VmFsdWUodmFsdWU6IEZsYWdWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iXX0=
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZG9UZWxlbWV0cnlIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1BlbmRvVGVsZW1ldHJ5SG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxtQkFBaUI7QUFnQmpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixHQUFHLE9BQU87U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FDSCxXQUE2QyxFQUM3QyxpQkFBK0M7UUFFL0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUVoQyx1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQTJCO1lBQ3pDLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLElBQUksU0FBUztZQUNwRCxXQUFXLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxJQUFJLFNBQVM7WUFDbEQsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQ3hELGFBQWEsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSTtTQUNqRCxDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxLQUFnQjtRQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQXhERCxnREF3REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEhvb2ssXG4gIEhvb2tDb250ZXh0LFxuICBFdmFsdWF0aW9uRGV0YWlscyxcbiAgRmxhZ1ZhbHVlLFxufSBmcm9tIFwiQG9wZW5mZWF0dXJlL3dlYi1zZGtcIjtcbmltcG9ydCBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQZW5kb1RlbGVtZXRyeUhvb2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIEV2ZW50IG5hbWUgZm9yIGZsYWcgZXZhbHVhdGlvbiB0cmFja2luZy5cbiAgICogRGVmYXVsdDogXCJmbGFnX2V2YWx1YXRlZFwiXG4gICAqL1xuICBldmVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBzZWxlY3RpdmVseSB0cmFjayBmbGFncy5cbiAgICogUmV0dXJuIHRydWUgdG8gdHJhY2sgdGhlIGZsYWcsIGZhbHNlIHRvIHNraXAuXG4gICAqL1xuICBmbGFnRmlsdGVyPzogKGZsYWdLZXk6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcGVuRmVhdHVyZSBob29rIHRoYXQgYXV0b21hdGljYWxseSB0cmFja3MgZmxhZyBldmFsdWF0aW9ucyB0byBQZW5kby5cbiAqXG4gKiBUaGlzIGhvb2sgc2VuZHMgYW4gZXZlbnQgdG8gUGVuZG8gYWZ0ZXIgZWFjaCBmbGFnIGV2YWx1YXRpb24sIGFsbG93aW5nIHlvdVxuICogdG8gYW5hbHl6ZSBmZWF0dXJlIGZsYWcgdXNhZ2UgYWxvbmdzaWRlIHlvdXIgb3RoZXIgUGVuZG8gYW5hbHl0aWNzLlxuICpcbiAqIFRoZSBob29rIHVzZXMgdGhlIFBlbmRvIFdlYiBTREsncyB0cmFjayBmdW5jdGlvbiwgc28gdGhlIFBlbmRvIFdlYiBTREsgbXVzdCBiZVxuICogaW5pdGlhbGl6ZWQgb24gdGhlIHBhZ2UgZm9yIHRyYWNraW5nIHRvIHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE9wZW5GZWF0dXJlIH0gZnJvbSAnQG9wZW5mZWF0dXJlL3dlYi1zZGsnO1xuICogaW1wb3J0IHsgUGVuZG9Qcm92aWRlciwgUGVuZG9UZWxlbWV0cnlIb29rIH0gZnJvbSAnQHBlbmRvL29wZW5mZWF0dXJlLXdlYi1wcm92aWRlcic7XG4gKlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGVuZG9Qcm92aWRlcigpO1xuICogY29uc3QgdGVsZW1ldHJ5SG9vayA9IG5ldyBQZW5kb1RlbGVtZXRyeUhvb2soKTtcbiAqXG4gKiBhd2FpdCBPcGVuRmVhdHVyZS5zZXRQcm92aWRlckFuZFdhaXQocHJvdmlkZXIpO1xuICogT3BlbkZlYXR1cmUuYWRkSG9va3ModGVsZW1ldHJ5SG9vayk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRvVGVsZW1ldHJ5SG9vayBpbXBsZW1lbnRzIEhvb2sge1xuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPE9taXQ8UGVuZG9UZWxlbWV0cnlIb29rT3B0aW9ucywgXCJmbGFnRmlsdGVyXCI+PiAmIHtcbiAgICBmbGFnRmlsdGVyPzogKGZsYWdLZXk6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQZW5kb1RlbGVtZXRyeUhvb2tPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBldmVudE5hbWU6IFwiZmxhZ19ldmFsdWF0ZWRcIixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBmbGFnIGlzIHN1Y2Nlc3NmdWxseSBldmFsdWF0ZWQuXG4gICAqIFNlbmRzIHRoZSBldmFsdWF0aW9uIHJlc3VsdCB0byBQZW5kbyBhcyBhIHRyYWNrIGV2ZW50LlxuICAgKi9cbiAgYWZ0ZXIoXG4gICAgaG9va0NvbnRleHQ6IFJlYWRvbmx5PEhvb2tDb250ZXh0PEZsYWdWYWx1ZT4+LFxuICAgIGV2YWx1YXRpb25EZXRhaWxzOiBFdmFsdWF0aW9uRGV0YWlsczxGbGFnVmFsdWU+XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZmxhZ0tleSB9ID0gaG9va0NvbnRleHQ7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGZsYWcgc2hvdWxkIGJlIHRyYWNrZWRcbiAgICBpZiAodGhpcy5vcHRpb25zLmZsYWdGaWx0ZXIgJiYgIXRoaXMub3B0aW9ucy5mbGFnRmlsdGVyKGZsYWdLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgUGVuZG8gV2ViIFNESyBpcyBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhd2luZG93LnBlbmRvPy50cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBmbGFnX2tleTogZmxhZ0tleSxcbiAgICAgIGZsYWdfdmFyaWFudDogZXZhbHVhdGlvbkRldGFpbHMudmFyaWFudCB8fCBcInVua25vd25cIixcbiAgICAgIGZsYWdfcmVhc29uOiBldmFsdWF0aW9uRGV0YWlscy5yZWFzb24gfHwgXCJVTktOT1dOXCIsXG4gICAgICBmbGFnX3ZhbHVlOiB0aGlzLnN0cmluZ2lmeVZhbHVlKGV2YWx1YXRpb25EZXRhaWxzLnZhbHVlKSxcbiAgICAgIHByb3ZpZGVyX25hbWU6IGhvb2tDb250ZXh0LnByb3ZpZGVyTWV0YWRhdGEubmFtZSxcbiAgICB9O1xuXG4gICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBkZWxlZ2F0ZSB0byBQZW5kbyBXZWIgU0RLXG4gICAgd2luZG93LnBlbmRvLnRyYWNrKHRoaXMub3B0aW9ucy5ldmVudE5hbWUsIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBmbGFnIHZhbHVlIHRvIGEgc3RyaW5nIGZvciB0cmFja2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5VmFsdWUodmFsdWU6IEZsYWdWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Type declarations for Pendo Web SDK integration.
3
+ */
4
+ interface PendoEventEmitter {
5
+ on: (handler: (data?: unknown) => void) => void;
6
+ off: (handler: (data?: unknown) => void) => void;
7
+ trigger: (data?: unknown) => void;
8
+ }
9
+ declare global {
10
+ interface Window {
11
+ pendo?: {
12
+ segmentFlags?: string[] | null;
13
+ isReady?: () => boolean;
14
+ initialize?: (options: unknown) => void;
15
+ track?: (event: string, properties?: Record<string, string>) => void;
16
+ Events?: {
17
+ segmentFlagsUpdated?: PendoEventEmitter;
18
+ };
19
+ };
20
+ }
21
+ }
22
+ export {};
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type declarations for Pendo Web SDK integration.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIGRlY2xhcmF0aW9ucyBmb3IgUGVuZG8gV2ViIFNESyBpbnRlZ3JhdGlvbi5cbiAqL1xuXG5pbnRlcmZhY2UgUGVuZG9FdmVudEVtaXR0ZXIge1xuICBvbjogKGhhbmRsZXI6IChkYXRhPzogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgb2ZmOiAoaGFuZGxlcjogKGRhdGE/OiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkO1xuICB0cmlnZ2VyOiAoZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgcGVuZG8/OiB7XG4gICAgICBzZWdtZW50RmxhZ3M/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgICBpc1JlYWR5PzogKCkgPT4gYm9vbGVhbjtcbiAgICAgIGluaXRpYWxpemU/OiAob3B0aW9uczogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIHRyYWNrPzogKGV2ZW50OiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB2b2lkO1xuICAgICAgRXZlbnRzPzoge1xuICAgICAgICBzZWdtZW50RmxhZ3NVcGRhdGVkPzogUGVuZG9FdmVudEVtaXR0ZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBleHBvcnQgbWFrZXMgdGhpcyBmaWxlIGEgbW9kdWxlXG5leHBvcnQge307XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pendo/openfeature-web-provider",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "OpenFeature provider for Pendo feature flags (web/browser)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,7 +11,11 @@
11
11
  "scripts": {
12
12
  "build": "tsc",
13
13
  "test": "jest",
14
- "lint": "eslint src"
14
+ "lint": "eslint src",
15
+ "prepublishOnly": "npm run build && npm test"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
15
19
  },
16
20
  "peerDependencies": {
17
21
  "@openfeature/web-sdk": "^1.0.0"