@cobaltio/cobalt-js 9.0.0 → 9.2.0-beta.1

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/cobalt.ts CHANGED
@@ -38,6 +38,8 @@ export interface Application {
38
38
  };
39
39
  /** The list of connected accounts for this application */
40
40
  connected_accounts?: {
41
+ /** The connection identifier of the auth config. */
42
+ connection_id: string;
41
43
  /** The identifier (username, email, etc.) of the connected account. */
42
44
  identifier: unknown;
43
45
  /** The auth type used to connect the account. */
@@ -92,6 +94,24 @@ export interface InputField {
92
94
  }[];
93
95
  }
94
96
 
97
+ export interface OAuthParams {
98
+ /** The application slug. */
99
+ slug: string;
100
+ /** The connection identifier. */
101
+ connection?: string;
102
+ /** The key value pairs of auth data. */
103
+ payload?: Record<string, string>;
104
+ }
105
+
106
+ export interface KeyBasedParams {
107
+ /** The application slug. */
108
+ slug: string;
109
+ /** The connection identifier. */
110
+ connection?: string;
111
+ /** The key value pairs of auth data. */
112
+ payload?: Record<string, string>;
113
+ }
114
+
95
115
  /** The payload object for config. */
96
116
  export interface ConfigPayload {
97
117
  /** The application slug. */
@@ -252,6 +272,23 @@ export interface ConfigWorkflow {
252
272
  fields?: ConfigField[];
253
273
  }
254
274
 
275
+ export interface WorkflowPayloadResponse {
276
+ payload: Record<string, any>;
277
+ schema?: unknown;
278
+ schema_interpreted?: unknown;
279
+ }
280
+
281
+ export interface ExecuteWorkflowPayload {
282
+ /**The workflow id or alias. */
283
+ worklfow: string;
284
+ /** The application's slug this workflow belongs to. */
285
+ slug?: string;
286
+ /** The payload to execute the workflow. */
287
+ payload?: Record<string, any>;
288
+ /** Whether to execute the workflow synchronously. */
289
+ sync_execution?: boolean;
290
+ }
291
+
255
292
  export interface Execution {
256
293
  _id: string;
257
294
  id?: string;
@@ -426,12 +463,22 @@ class Cobalt {
426
463
  * Returns the auth URL that users can use to authenticate themselves to the
427
464
  * specified application.
428
465
  * @private
429
- * @param {String} slug The application slug.
430
- * @param {Object.<string, string>} [params] The key value pairs of auth data.
466
+ * @param {OAuthParams} params The OAuth parameters.
431
467
  * @returns {Promise<String>} The auth URL where users can authenticate themselves.
432
468
  */
433
- private async getOAuthUrl(slug: string, params?: Record<string, string>): Promise<string> {
434
- const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${new URLSearchParams(params).toString()}`, {
469
+ private async getOAuthUrl({
470
+ slug,
471
+ connection,
472
+ payload,
473
+ }: OAuthParams): Promise<string> {
474
+ const queryParams = new URLSearchParams();
475
+ if (connection) queryParams.append("connection", connection);
476
+ if (typeof payload === "object") {
477
+ for (const [ key, value ] of Object.entries(payload)) {
478
+ queryParams.append(key, value);
479
+ }
480
+ }
481
+ const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${queryParams.toString()}`, {
435
482
  headers: {
436
483
  authorization: `Bearer ${this.token}`,
437
484
  },
@@ -449,13 +496,16 @@ class Cobalt {
449
496
  /**
450
497
  * Handle OAuth for the specified application.
451
498
  * @private
452
- * @param {String} slug The application slug.
453
- * @param {Object.<string, string>} [params] The key value pairs of auth data.
499
+ * @param {OAuthParams} params The OAuth parameters.
454
500
  * @returns {Promise<Boolean>} Whether the user authenticated.
455
501
  */
456
- private async oauth(slug: string, params?: Record<string, string>): Promise<boolean> {
502
+ private async oauth({
503
+ slug,
504
+ connection,
505
+ payload,
506
+ }: OAuthParams): Promise<boolean> {
457
507
  return new Promise((resolve, reject) => {
458
- this.getOAuthUrl(slug, params)
508
+ this.getOAuthUrl({ slug, connection, payload })
459
509
  .then(oauthUrl => {
460
510
  const connectWindow = window.open(oauthUrl);
461
511
 
@@ -463,7 +513,8 @@ class Cobalt {
463
513
  const interval = setInterval(() => {
464
514
  this.getApp(slug)
465
515
  .then(app => {
466
- if (app && app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2).some(a => a.status === AuthStatus.Active)) {
516
+ const oauthAccounts = app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2 && a.status === AuthStatus.Active);
517
+ if (app && oauthAccounts?.some(a => connection ? a.connection_id === connection : true)) {
467
518
  // close auth window
468
519
  connectWindow && connectWindow.close();
469
520
  // clear interval
@@ -494,12 +545,15 @@ class Cobalt {
494
545
 
495
546
  /**
496
547
  * Save auth data for the specified keybased application.
497
- * @param {String} slug The application slug.
498
- * @param {Object.<string, string>} [payload] The key value pairs of auth data.
548
+ * @param {KeyBasedParams} params The key based parameters.
499
549
  * @returns {Promise<Boolean>} Whether the auth data was saved successfully.
500
550
  */
501
- private async keybased(slug: string, payload?: Record<string, string>): Promise<boolean> {
502
- const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save`, {
551
+ private async keybased({
552
+ slug,
553
+ connection,
554
+ payload,
555
+ }: KeyBasedParams): Promise<boolean> {
556
+ const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save?connection=${connection}`, {
503
557
  method: "POST",
504
558
  headers: {
505
559
  authorization: `Bearer ${this.token}`,
@@ -523,6 +577,7 @@ class Cobalt {
523
577
  * Connects the specified application using the provided authentication type and optional auth data.
524
578
  * @param params - The parameters for connecting the application.
525
579
  * @param params.slug - The application slug.
580
+ * @param params.connection - The connection identifier of the auth config.
526
581
  * @param params.type - The authentication type to use. If not provided, it defaults to `keybased` if payload is provided, otherwise `oauth2`.
527
582
  * @param params.payload - key-value pairs of authentication data required for the specified auth type.
528
583
  * @returns A promise that resolves to true if the connection was successful, otherwise false.
@@ -530,21 +585,23 @@ class Cobalt {
530
585
  */
531
586
  public async connect({
532
587
  slug,
588
+ connection,
533
589
  type,
534
590
  payload,
535
591
  }: {
536
592
  slug: string;
593
+ connection?: string;
537
594
  type?: AuthType;
538
595
  payload?: Record<string, string>;
539
596
  }): Promise<boolean> {
540
597
  switch (type) {
541
598
  case AuthType.OAuth2:
542
- return this.oauth(slug, payload);
599
+ return this.oauth({ slug, connection, payload });
543
600
  case AuthType.KeyBased:
544
- return this.keybased(slug, payload);
601
+ return this.keybased({ slug, connection, payload });
545
602
  default:
546
- if (payload) return this.keybased(slug, payload);
547
- return this.oauth(slug);
603
+ if (payload) return this.keybased({ slug, connection, payload });
604
+ return this.oauth({ slug, connection });
548
605
  }
549
606
  }
550
607
 
@@ -552,10 +609,15 @@ class Cobalt {
552
609
  * Disconnect the specified application and remove any associated data from Cobalt.
553
610
  * @param {String} slug The application slug.
554
611
  * @param {AuthType} [type] The authentication type to use. If not provided, it'll remove all the connected accounts.
612
+ * @param {String} [connection] The connection identifier of the auth config.
555
613
  * @returns {Promise<unknown>}
556
614
  */
557
- public async disconnect(slug: string, type?: AuthType): Promise<unknown> {
558
- const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}${type ? `?auth_type=${type}` : ""}`, {
615
+ public async disconnect(slug: string, type?: AuthType, connection?: string): Promise<unknown> {
616
+ const queryParams = new URLSearchParams();
617
+ if (type) queryParams.append("auth_type", type);
618
+ if (connection) queryParams.append("connection", connection);
619
+
620
+ const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}?${queryParams.toString()}`, {
559
621
  method: "DELETE",
560
622
  headers: {
561
623
  authorization: `Bearer ${this.token}`,
@@ -861,6 +923,54 @@ class Cobalt {
861
923
  return await res.json();
862
924
  }
863
925
 
926
+ /**
927
+ * Returns the execution payload for the specified public workflow.
928
+ * @param {String} workflowId The workflow ID.
929
+ * @returns {Promise<WorkflowPayloadResponse>} The workflow payload response.
930
+ */
931
+ async getWorkflowPayload(workflowId: string): Promise<WorkflowPayloadResponse> {
932
+ const res = await fetch(`${this.baseUrl}/api/v2/public/workflow/request-structure/${workflowId}`, {
933
+ headers: {
934
+ authorization: `Bearer ${this.token}`,
935
+ },
936
+ });
937
+
938
+ if (res.status >= 400 && res.status < 600) {
939
+ const error = await res.json();
940
+ throw error;
941
+ }
942
+
943
+ return await res.json();
944
+ }
945
+
946
+ /**
947
+ * Execute the specified public workflow.
948
+ * @param {ExecuteWorkflowPayload} options The execution payload.
949
+ * @param {String} options.worklfow The workflow id or alias.
950
+ * @param {String} [options.slug] The application's slug this workflow belongs to. Slug is required if you're using workflow alias.
951
+ * @param {Record<string, any>} [options.payload] The execution payload.
952
+ * @returns {Promise<unknown>}
953
+ */
954
+ async executeWorkflow(options: ExecuteWorkflowPayload): Promise<unknown> {
955
+ const res = await fetch(`${this.baseUrl}/api/v2/public/workflow/${options?.worklfow}/execute`, {
956
+ method: "POST",
957
+ headers: {
958
+ authorization: `Bearer ${this.token}`,
959
+ "content-type": "application/json",
960
+ slug: options?.slug || "",
961
+ sync_execution: options?.sync_execution ? "true" : "false",
962
+ },
963
+ body: JSON.stringify(options?.payload),
964
+ });
965
+
966
+ if (res.status >= 400 && res.status < 600) {
967
+ const error = await res.json();
968
+ throw error;
969
+ }
970
+
971
+ return await res.json();
972
+ }
973
+
864
974
  /**
865
975
  * Returns the workflow execution logs for the linked account.
866
976
  * @param {Object} [params]
@@ -1 +1 @@
1
- window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzwMKVNfWAgCbHgqm"
1
+ window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg=="
@@ -1 +1 @@
1
- window.navigationData = "eJyNk01LAzEQhv9LzsViwVJ6E1EQBEtb8SAeZndnu6FpEpoJbRH/u7v1YxvMTnKd532fXSbJ24cgPJKYi1tPzYqAvBMjYYGadoba79y4J1cN7VSLt1JXYj77HAXt9clirNvNh5t3pgBFfa9U4By68fc87F1Pgm9aq2QJJI3u61IT7msoW8MFDzWTm+m/H3i2Xc5FRUGCV+labgYcHUqXHySqijGceVqzgJMywIl+EmnVq9lva2UOjOs3wsnuj1j6wbP6o5ziUVtPwwvqMSd5ggJVtH8mXHXhi/ZCsfsII/ky7ryiyXy1y3e7DPnSK+QeywXnNC+2AsL0ZY3kOG3OPpObfP8CA8O/QA=="
1
+ window.navigationData = "eJyVlNFKwzAUht8l18PhQJHdqSgMhZWpeCFenLWnNixLQ88JbojvLp3OLi49jbf5v/9rOEn68qEYN6ym6tJz9cDAntRIOeBKTRVav6Zxl5xUvDZqpFbaFmp68TkK2o9bh7Fuu97fvK6XYLjr5QaIkMbf62HvdBJ80zmjc2Bd266uLWNTQo40PshDzeTs/GgDc9dyFBUFhKyypX7rcbTRcPlWoykEwy4f1mSwNTVIoh9iWPVcN6vS1O+Ca49IspsN5p5xj0objKPD8r6L8JtKipl1nvun38WS5A63V0BYZNDAOn6ZQkSS3cMSTdSxS6TqvH13wiYOckmT+aXRuXgBQiRdJp1/lExXU7qbEuQLb1D6OxzkkubJFcA4/DojnKRNmec/JvkHXSC52hKmaPfssf71C1D9NS0="
@@ -1 +1 @@
1
- window.searchData = "eJytnd9v4zYSx/8X5zVNTYqSqLz1ih5Q3AEt7q69h2AReG1t1ljH9vnHbhfB/u8nUpI1wxlSY3mfElvkfCnqw+FoKNFvs8Puy3H2+PQ2+7TermaP9n62XbzWs8fZT+fTx3+fFqfzcXY/Ox82zVf19vx6/HE48PDx9Lppji43i+OxbszMZt/ue0uqGEwtT+vPddrM3aIvBKzdz/aLQ7094eawGr/8tV8f6tWISH0pdYUK7pP/fN1zp+K+lvbHP+qvf1sc2cZezNx9qr++7wrF2+obw2r85g7rpMJu0RWR29dDX/y8e7/YnC4CnY0f26+TPZErfbGy3G2Pp8N5edodUqbucDm+wV2LQHPn2lyUTrtP9Tap0ZcQWtdzY+F5fFi/jJ1CW2Si/W29THb33VBmksKhXpzq/+4Onz5sdl/SQr7ol6HoFL1VvalP9c/j/dYWvKn3oNbf1/VmJRb80JWerirq0bborT26PkowQcWm6LzUp5/2+6RGU2Thi0y3fxQIHKcrCMBrSt1E3UVlHLmL1C28XfRGu255KTZR55e/6uX5tN6lHWpTsAYFb9UaPa0alpyo5q/Vb3uRnr9Yu/2Nir2DGJX7AgpO0TrvVwuRx20L3sQ+1BrHHwpeOwJyEGfu95v1coG4XG9P9eHDYtkogsPpSA2GDY2XeV6vJObuLkUj8RRoXUysCbme19v9+fT8utjLRMMqt4mfYHQ7qtuVvl3yeReMOJH089jYEzShmwpr2SWGpW+XfF4sl7vz9iQ7bbba5Eas6uPysN5Lx8odLj9Zdr0U6nUFJwv5PxKhruBkoSYWdjwe6v+d0Q1oSpPWmSx/3JxfRJpdwclCp8WLjNOu4HQhqQua4H3gbNFOJeFUDwRRAfmM4e7a/zhsZBbvXOnzYRM9D9xK0b1tWlByl0vlcMehCALJuSPyrmpn/Mj8CozdwYKxhvtGRYR8UPFcHw67Q+RSD1pB2clyMqGpErFxDwWSQz5t/gsJSiMakqA0EKIs4QiRKPnDV4Rsx+NuuV64mXK/eGF9SWj3jtZJnUzb3iRrMS9GlFHxyaIf683+ubkBOok0YenpkuvVKuZ1Qr2+6GSxlIsAQqMOIimyWbyvNwnigdCl6GSx1/PmtN5vZJCAwpMFYxEREUtGRAKhRCxPtMbvnkflurIStUvR6WKbxvLH3WZVH2SKqPxk2VR0STRHw0qB4OfF5iyjpS95jRSdAX5ffN3sFonz6wp819gC2hSHGH1LJ/oQpCnyIiOC6UAAyQniASpGrxXJaBPVvoT8ao3cjjJmRXekQYMj4vV28X6TGlxYeCh+i+hYjIg1RbHimGRqLGC50VEwJpWebLCYYL5h5CCXNB0NJC8H5TRGvAa2dJfyFUOLxoPURTptGahGK97ekPpzU0d27nyt25twOqxfXurD9D7hDdzesC8JpxdvzeiK3mgTlrvXJu5zJZ739WHZ1Irc0gSNiNWb3IzEbEqkx2bScTm/wrz6iQ3rQrm27CIe143LnY+n3StkRnimkXq3NaNH+JomoDoT5evt5/Vht32NRNOBMC49UVJ0irec02a9/TRkzGVdytWZKB+bBgPF5Aw4LrJrQiGJSlduoszuIBz/l4IThY74qbO40KXgRCFmrmhnM4F2qq68OTCI+dUt4kUzYcNReRiTTAoFBgU5IdDA1M2PRKwvOFUolTwJtUZzJ+NysWEcSiXH8bhMInESKo3lTcbFRjIZoaAkkTEumspjhIqjaYxxuVgSNpRKZl9ZGThw/xmj3h+QD9cYZYOZNGBtO65N6ADr6VROaB52we/n940XTCUGcImbb8UYc8n7saCBU8JOTnI89pQJj6Q/OGlJ+kMmHuOOU00CKJPbu1LHj7wT4DRhhVuEY5kyTjOZKpPJtQ81XQFTV2EKTPGxmEissgW/W8oubn0CuiM5UBnBqA1XgDwxAZsQv4KudEIWlz2KL/bx6qu9Wb+uBSQfcX67qzSYPx1XP6yPP6y3H+vDun2OKnLix5Fujy3tptpDlna/X3NkFBynYsDIQw7+dd7UiSdZwOGrFlBWa1dnsXleNreOz8fTandmGQjt38Xr8icL2x/LTrgHMkTifcnJUoemSNPszfmV9WxEEJe/RhZewz/AI7OJgcwU+06LYjHLgoQe1/ar1z2i+iOLH1eIx0ZpVDo5RK8QTj5PE1Uff7gm3QSIlyAgmBwKJBbQ2PlvbAVNOPPGUWJVRzASivJjhxVMDBgi9u6+Mbeq/5o9vs0+14eji40eZ/ohe6iael3TH5/6UGe5e+0yr6vd8uz/fdcV+7N2b8m5wm3pH+ez+6f5vTEPVWXfvbt/6iv7A/6L3sbwja+omk+Kq6hIRYUq6uaT5ipqUlGjilnzKeMqZqRihiqa5pPhKhpS0aCKefMp5yrmpGKOKhbNp4KrWJCKBapYNp9KrmJJKpaoom0+2fuserAVqmdJPYvqNQA9VUy9itSr8OV3NCiWHEXRUQE7Hh6eHgYfzI9yVCiWIEURUpgh5chQLEWKYqQwR8rRoViSFEVJYZaUI0SxNCmKk8I8KUeJYolSFCmFmVKOFMVSpShWCnOlHC7KspUpWwrDpRwzqmIrU8AUJkw7ZjRLmKaEaUyYdsxoljBNCdOBh/IuivdRjJPChGnHjGYJ05QwjQnTjhnNEqYpYRoTph0zmiVMU8I0Jkw7ZjRLmKaEaUyYdsxoljBNCdOYMO2Y0SxhmhKmMWHaMaNZwjQlTGPCMsdMxhKWUcIyTFjmmMlYwjJKWIYJyxwzGUtYRgnLgnnQT4T8TMhMhZiwzDGTmfvMPMyVxpUpYRkmLHPMZCxhGSUsw4RljpmsuNflQ5EHypSwDBOWOWYylrCMEpZhwjLHTGbvtX2o5gZXpoRlmLDMMZOxhGWUsAwTZhwzZs7Mr4YCZjBgxiFjWMAMBcxgwIxDxrCAGQqYwYCZLBJMGIqXCUItE4knDBNrYbiMw8VkHJmGwmUwXMbhYvggj8JlMFzG4WJyVpnCZTBcJg6XoXAZDJdxuJiC6y/KlsFs5Z4tdkjkFK4cw5V7uFinm1O4cgxX7uFih0RO4coxXLkDJueGRE7pyjFduSMmZ4dETvnKg2DeR/Oau8o5E89jvnJHTJ5xraZ45Riv3AGTG64upSvHdOU26jRzSleO6codMHnOCVO6ckxX4XjJ+XsYSleB6SocL3nJCBcUrgLDVThccs77FJStArNVeLY491NQtgrMVuFoKdhgoKBsFZitIu67CspWEdwsRtkqmNtFzFZRRr1PQeEqMFyFw6Vgh1NB4SowXEUVDSQKSleB6SodL4VmTrmkcJUYrlJFvXVJ6SoxXaWOOoGS4lVivMosOhhLyleJ+So9X2zUVlK+SsxX6YgpOBdSUrxKjFfpkxFs0FZSvsogH+GIKVg3UDIpCcxX6fni0xmUrxLzVTpiCnaGKilfJebLer7YGcpSwCwGzKroYLYUMIsBsw6ZkpveLOXLYr6sI6Zkx6OlfFnMl3XElGzEZylfFvNlHTIlC6elgFkMmC2iY8pSwCwGzPqMFxu4WQqYDZJe8dnRMokvDJh1yJTsuLAUMIsBqxwyJTsuKgpYhQGrHDIlOy4qCliFAas8YOy4qChhFSas8oSx46KihFWYsMrEIreKAlZhwCqHjGXrUr4qzFdVxOKniuJVYbyqMkpIRfGqMF6VjcVPFaWrCvKqVSwEqpjUaphbncdioPYQrg2+66p7B8Z1dnsorB7kV+c6dq3aQ2H1IMM6j8+S7bGwfpBknZtYENceCqsHada5J43PLc+ZROs8yLTOi9hU2x4Kqwe51nkZ8//tobB6kG2d22hU1R4L6wcJ13mV6Hwm5ToPyPOJessn17m8Pkns+6wYG48qNrUfsOfT9ZbPz3PZ/TC97zP2lk/Rcwn+MMOv4ukxxeX4wyS/z9tH+p9L84d5fp+6j/Ufg1+Y6vfZe8uvMnDJ/jDb7xP4ll9o4PL9YcLf5/Atv9bApfyDnL/yafzI+TNZfxWk/ZXP5Ft+uYJJ/Ksg8698Mt/yKxZM7l8FyX/l8/kVvyzGpP9VkP9XPqVf8d6LWQFQwRKA8ln9KrI4xvAXrAIon9jnY1/FrAOoYCFA6XgqTTFLASpYC1A6nk1TzGqACpYDlI4m1BSzHqCCBQHlc/xVZHmQwS9YE1A+zc/e1ypmUUAFqwLKJ/ojvcesC6hgYUD5XD8fiStmaaD/zj9e8Lk+nOrVr+1jBk9P7bPVb82f9pvi8pDD26y5wXx8+3Y/c5Nf88+34YkD/3Vv3x9zgv3uzYM1NRhTMhPd9nmDiWG34bdZQ4HQyPDaJ7BUAkulzFLkPVvQXznoL2E3ca/NAosFsHh1M9unGwdrBnRfLrwGIy/SgqaCHi2F14Z7LxZYBM1t7vVFFoPND8EFr8AFv8JY+ybIYCebD3YaT3CVnWF7QmAPDItMeE0ae/2bboMh0C55s8jZgcaIjFx2KwOU6cGI0SIry27rcHDtBxuygdSaYDrYgA42sg5e8q9Kg9YBmKyst6MPwA5WLbDqggyhWb/12mAFGKnaSsZcYSpwQAYQYbopoOj+WtVNCVp6icB2rkACOI5c3JmNpX3/4CK4MGAUFNecNut/ADmFzKNd9tEG0x5okhKfXr+pKBiaYFhlYjjIBqHAIBzsstGONt0fLEHPL7MzvCUFrICOsrqPNq4xyF1EBcMO4fDnX+IHLQU2rbDn6Fv5wB64tFZGLd4DH5yuhj7kalNkcCoAiZKdarh1PTAG4kklPU/wZhBgF1jKTOeWqp4Z2/0j1QD734PGgmBO5SJDl6eYgQ8B16Ocd+0SzvNoQwVAC7gkVtiw9gUIMElAp6Rl1xXs3A7ODzSmlHX35SdXQHAGYjORDbwlJ5hLABdGNivB7RaBITCN5le0CbcGIGTKtlp5mTTLngaZ+f4XFAChIEhSspO9/EoCsAK8t5J5W/A7CMAOiNaVbLYMf+QAGIOhkCxah79iAMgCoGvZ7It/pACYAl5fy0Zw8BMEwBYkXnz98c8LAGtgEAoHM/71AGAKDCAtG89gn4jBTg76Pc/ampXQXrc3KDAGej6XGWl3CwcTBhiKmcxp4jk6B1cs7wLgsotSbNEPZVnn+xtUwnwJI3eZoeEnoYDTAT5HZKTbegPch4BrV13SPjJK+w0MQccBOPOuowqZt+reFgUtgx5P6GSYzXtAn4PesjLnN+weAs4RmMk7v17JztFXg6CCU8y67sq7gKbsBpLtPlf9FDLP+n/6GEgYsXQ7AIEOAePEyhxv/6thoDtAb8hMUJ+WQyPdWVWyK95vNwTOCnRqJZsFwtyZhdOkcErqd5cFZwXzGsKGwH1WgCXQnqKLKSphs/yLxFyAbuHN0lx27bA15p7cwqhfeA+BjR45qzA8F8YtYN8IYAjeMQlv0MnPNYDxC65LJmsWZyYH0VRxuRkWtg6+fQxifnhxhXO7M8UMTgtjPWEs1L44CzoK2Mg6h2a6v0Xv2FQfLat+itX9TZQw/08TpSW4QpWs7e0vWIC2g6k6kw267lcWQB8CR9udvWxsJDYaAycJzFeyqZvcAoEwwPS9Ppd1GP7BKBBeglGrZf6F+SkoYA/4U2EWEtpj/EqFEijXNDFIZ1mYORGmYrr9loAbAKAVl0leNnYTLrlCWR2ZV2FvFwzof9PHHpLllXf3s/16XzfBWVP36d23b/8HVF1MBw==";
1
+ window.searchData = "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";