@scalar/api-client 2.17.7 → 2.17.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/components/CommandPalette/CommandActionInput.vue.js +1 -1
  3. package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.js +5 -5
  4. package/dist/components/Sidebar/Actions/EditSidebarListCollection.vue.js +18 -18
  5. package/dist/components/Sidebar/Actions/EditSidebarListElement.vue.js +7 -7
  6. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.d.ts.map +1 -1
  7. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.js +44 -5
  8. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue2.js +2 -44
  9. package/dist/style.css +1 -1
  10. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts +18 -10
  11. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  12. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js +149 -126
  13. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts +20 -0
  14. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts.map +1 -0
  15. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.js +7 -0
  16. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue2.js +76 -0
  17. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts +22 -5
  18. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts.map +1 -1
  19. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js +79 -64
  20. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts +16 -8
  21. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  22. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +2 -2
  23. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts.map +1 -1
  24. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +84 -82
  25. package/dist/v2/components/forms/ConfirmationForm.vue.d.ts.map +1 -1
  26. package/dist/v2/components/forms/ConfirmationForm.vue.js +43 -5
  27. package/dist/v2/components/forms/ConfirmationForm.vue2.js +2 -43
  28. package/dist/v2/components/modals/DeleteModal.vue.js +11 -11
  29. package/dist/v2/features/operation/Operation.vue.js +1 -1
  30. package/dist/v2/features/settings/DocumentSettings.vue.d.ts.map +1 -1
  31. package/dist/v2/features/settings/DocumentSettings.vue.js +104 -5
  32. package/dist/v2/features/settings/DocumentSettings.vue2.js +2 -104
  33. package/dist/views/Collection/CollectionSettings.vue.d.ts.map +1 -1
  34. package/dist/views/Collection/CollectionSettings.vue.js +1 -4
  35. package/dist/views/Collection/CollectionSettings.vue2.js +5 -5
  36. package/dist/views/Environment/EnvironmentColorModal.vue.js +6 -6
  37. package/dist/views/Request/ResponseSection/ResponseEmpty.vue2.js +1 -1
  38. package/package.json +10 -10
@@ -1,16 +1,33 @@
1
- import type { OAuthFlow } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
1
+ import type { OAuthFlow, OAuthFlowsObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
2
2
  type __VLS_Props = {
3
+ flowType: keyof OAuthFlowsObject;
3
4
  flow: OAuthFlow;
4
5
  selectedScopes: string[];
5
6
  };
6
7
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
7
- "update:selectedScopes": (payload: {
8
+ "update:selectedScopes": (payload: Pick<{
9
+ id: string[];
10
+ name: string;
8
11
  scopes: string[];
9
- }) => any;
12
+ newScopePayload?: {
13
+ name: string;
14
+ description: string;
15
+ flowType: keyof OAuthFlowsObject;
16
+ };
17
+ meta: import("@scalar/workspace-store/mutators").AuthMeta;
18
+ }, "scopes" | "newScopePayload">) => any;
10
19
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
11
- "onUpdate:selectedScopes"?: ((payload: {
20
+ "onUpdate:selectedScopes"?: ((payload: Pick<{
21
+ id: string[];
22
+ name: string;
12
23
  scopes: string[];
13
- }) => any) | undefined;
24
+ newScopePayload?: {
25
+ name: string;
26
+ description: string;
27
+ flowType: keyof OAuthFlowsObject;
28
+ };
29
+ meta: import("@scalar/workspace-store/mutators").AuthMeta;
30
+ }, "scopes" | "newScopePayload">) => any) | undefined;
14
31
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
32
  export default _default;
16
33
  //# sourceMappingURL=OAuthScopesInput.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthScopesInput.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue"],"names":[],"mappings":"AAuIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8DAA8D,CAAA;AAS7F,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,CAAC;;;gBAIgD,MAAM,EAAE;;;;gBAAR,MAAM,EAAE;;;AA0U1D,wBAOG"}
1
+ {"version":3,"file":"OAuthScopesInput.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue"],"names":[],"mappings":"AA2KA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EACjB,MAAM,8DAA8D,CAAA;AAWrE,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,MAAM,gBAAgB,CAAA;IAChC,IAAI,EAAE,SAAS,CAAA;IACf,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AAyYF,wBAOG"}
@@ -1,115 +1,122 @@
1
- import { defineComponent as A, computed as v, createBlock as d, openBlock as n, unref as s, withCtx as o, createElementVNode as a, createVNode as r, normalizeClass as B, toDisplayString as p, createCommentVNode as u, withModifiers as g, createTextVNode as m, createElementBlock as w, Fragment as O, renderList as j } from "vue";
2
- import { Disclosure as z, DisclosureButton as N, DisclosurePanel as T } from "@headlessui/vue";
3
- import { ScalarButton as k, ScalarIcon as $ } from "@scalar/components";
1
+ import { defineComponent as T, computed as y, createBlock as p, openBlock as a, unref as s, withCtx as l, createElementVNode as r, createVNode as c, normalizeClass as j, toDisplayString as d, createCommentVNode as u, withModifiers as m, createTextVNode as f, createElementBlock as b, Fragment as z, renderList as B } from "vue";
2
+ import { Disclosure as N, DisclosureButton as M, DisclosurePanel as $ } from "@headlessui/vue";
3
+ import { useModal as E, ScalarButton as S, ScalarIcon as I } from "@scalar/components";
4
+ import P from "./OAuthScopesAddModal.vue.js";
4
5
  import C from "../../../../components/DataTable/DataTableCell.vue.js";
5
- import E from "../../../../components/DataTable/DataTableRow.vue.js";
6
- import I from "../../../../components/DataTable/DataTableCheckbox.vue.js";
7
- const R = { class: "flex h-fit w-full" }, U = { class: "flex-1" }, F = { class: "flex items-center gap-1.75" }, L = {
6
+ import R from "../../../../components/DataTable/DataTableRow.vue.js";
7
+ import U from "../../../../components/DataTable/DataTableCheckbox.vue.js";
8
+ const F = { class: "flex h-fit w-full" }, L = { class: "flex-1" }, _ = { class: "flex items-center gap-1.75" }, q = {
8
9
  class: "grid auto-rows-auto",
9
10
  style: { gridTemplateColumns: "1fr auto" }
10
- }, M = { key: 0 }, P = { class: "font-code text-xs" }, X = /* @__PURE__ */ A({
11
+ }, G = { class: "font-code text-xs" }, H = { key: 0 }, ee = /* @__PURE__ */ T({
11
12
  __name: "OAuthScopesInput",
12
13
  props: {
14
+ flowType: {},
13
15
  flow: {},
14
16
  selectedScopes: {}
15
17
  },
16
18
  emits: ["update:selectedScopes"],
17
- setup(c, { emit: b }) {
18
- const i = b, y = v(
19
- () => Object.entries(c.flow?.scopes ?? {}).map(([e, t]) => ({
20
- id: e,
21
- label: e,
22
- description: t
19
+ setup(n, { emit: A }) {
20
+ const i = A, V = y(
21
+ () => Object.entries(n.flow?.scopes ?? {}).map(([t, e]) => ({
22
+ id: t,
23
+ label: t,
24
+ description: e
23
25
  }))
24
- ), f = v(
25
- () => c.selectedScopes.length === Object.keys(c.flow?.scopes ?? {}).length
26
+ ), h = y(
27
+ () => n.selectedScopes.length === Object.keys(n.flow?.scopes ?? {}).length
26
28
  );
27
- function S(e, t) {
28
- if (t)
29
+ function w(t, e) {
30
+ if (e)
29
31
  return i("update:selectedScopes", {
30
- scopes: Array.from(/* @__PURE__ */ new Set([...c.selectedScopes, e]))
32
+ scopes: Array.from(/* @__PURE__ */ new Set([...n.selectedScopes, t]))
31
33
  });
32
34
  i("update:selectedScopes", {
33
- scopes: c.selectedScopes.filter((l) => l !== e)
35
+ scopes: n.selectedScopes.filter((o) => o !== t)
34
36
  });
35
37
  }
36
- const _ = () => {
37
- i("update:selectedScopes", { scopes: Object.keys(c.flow?.scopes ?? {}) });
38
- }, V = () => {
39
- i("update:selectedScopes", { scopes: [] });
40
- };
41
- return (e, t) => (n(), d(s(C), { class: "h-auto !max-h-[initial] min-h-8 items-center" }, {
42
- default: o(() => [
43
- a("div", R, [
44
- t[2] || (t[2] = a("div", { class: "text-c-1 h-full items-center" }, null, -1)),
45
- r(s(z), {
38
+ const D = () => i("update:selectedScopes", { scopes: Object.keys(n.flow?.scopes ?? {}) }), O = () => i("update:selectedScopes", { scopes: [] }), v = E();
39
+ return (t, e) => (a(), p(s(C), { class: "h-auto !max-h-[initial] min-h-8 items-center" }, {
40
+ default: l(() => [
41
+ r("div", F, [
42
+ e[5] || (e[5] = r("div", { class: "text-c-1 h-full items-center" }, null, -1)),
43
+ c(s(N), {
46
44
  as: "div",
47
45
  class: "bl flex w-full flex-col"
48
46
  }, {
49
- default: o(() => [
50
- r(s(N), {
51
- class: B([
47
+ default: l(() => [
48
+ c(s(M), {
49
+ class: j([
52
50
  "group/scopes-accordion hover:text-c-1 flex h-auto min-h-8 cursor-pointer items-center gap-1.5 pr-2.25 pl-3 text-left",
53
- (e.selectedScopes.length || 0) > 0 ? "text-c-1" : "text-c-3"
51
+ (t.selectedScopes.length || 0) > 0 ? "text-c-1" : "text-c-3"
54
52
  ])
55
53
  }, {
56
- default: o(({ open: l }) => [
57
- a("div", U, " Scopes Selected " + p(e.selectedScopes.length || 0) + " / " + p(Object.keys(e.flow?.scopes ?? {}).length || 0), 1),
58
- a("div", F, [
59
- f.value ? (n(), d(s(k), {
54
+ default: l(({ open: o }) => [
55
+ r("div", L, " Scopes Selected " + d(t.selectedScopes.length || 0) + " / " + d(Object.keys(t.flow?.scopes ?? {}).length || 0), 1),
56
+ r("div", _, [
57
+ c(s(S), {
58
+ class: "pr-0.75 pl-1 transition-none",
59
+ size: "sm",
60
+ variant: "ghost",
61
+ onClick: e[0] || (e[0] = m((g) => s(v).show(), ["stop"]))
62
+ }, {
63
+ default: l(() => [...e[2] || (e[2] = [
64
+ f(" Add Scope ", -1)
65
+ ])]),
66
+ _: 1
67
+ }),
68
+ h.value ? (a(), p(s(S), {
60
69
  key: 0,
61
70
  class: "pr-0.75 pl-1 transition-none",
62
71
  size: "sm",
63
72
  variant: "ghost",
64
- onClick: g(V, ["stop"])
73
+ onClick: m(O, ["stop"])
65
74
  }, {
66
- default: o(() => [...t[0] || (t[0] = [
67
- m(" Deselect All ", -1)
75
+ default: l(() => [...e[3] || (e[3] = [
76
+ f(" Deselect All ", -1)
68
77
  ])]),
69
78
  _: 1
70
79
  })) : u("", !0),
71
- f.value ? u("", !0) : (n(), d(s(k), {
80
+ h.value ? u("", !0) : (a(), p(s(S), {
72
81
  key: 1,
73
82
  class: "pr-0.75 pl-1 transition-none",
74
83
  size: "sm",
75
84
  variant: "ghost",
76
- onClick: g(_, ["stop"])
85
+ onClick: m(D, ["stop"])
77
86
  }, {
78
- default: o(() => [...t[1] || (t[1] = [
79
- m(" Select All ", -1)
87
+ default: l(() => [...e[4] || (e[4] = [
88
+ f(" Select All ", -1)
80
89
  ])]),
81
90
  _: 1
82
91
  })),
83
- r(s($), {
92
+ c(s(I), {
84
93
  class: "text-c-3 group-hover/scopes-accordion:text-c-2",
85
- icon: l ? "ChevronDown" : "ChevronRight",
94
+ icon: o ? "ChevronDown" : "ChevronRight",
86
95
  size: "md"
87
96
  }, null, 8, ["icon"])
88
97
  ])
89
98
  ]),
90
99
  _: 1
91
100
  }, 8, ["class"]),
92
- r(s(T), { as: "template" }, {
93
- default: o(() => [
94
- a("table", L, [
95
- (n(!0), w(O, null, j(y.value, ({ id: l, label: D, description: h }) => (n(), d(s(E), {
96
- key: l,
101
+ c(s($), { as: "template" }, {
102
+ default: l(() => [
103
+ r("table", q, [
104
+ (a(!0), b(z, null, B(V.value, ({ id: o, label: g, description: x }) => (a(), p(s(R), {
105
+ key: o,
97
106
  class: "text-c-2",
98
- onClick: (x) => S(l, !e.selectedScopes.includes(l))
107
+ onClick: (k) => w(o, !t.selectedScopes.includes(o))
99
108
  }, {
100
- default: o(() => [
101
- r(s(C), { class: "hover:text-c-1 box-border !max-h-[initial] w-full cursor-pointer px-3 py-1.5" }, {
102
- default: o(() => [
103
- h ? (n(), w("div", M, [
104
- a("span", P, p(D), 1),
105
- m(" – " + p(h), 1)
106
- ])) : u("", !0)
109
+ default: l(() => [
110
+ c(s(C), { class: "hover:text-c-1 box-border !max-h-[initial] w-full cursor-pointer px-3 py-1.5" }, {
111
+ default: l(() => [
112
+ r("span", G, d(g), 1),
113
+ x ? (a(), b("span", H, "   – " + d(x), 1)) : u("", !0)
107
114
  ]),
108
115
  _: 2
109
116
  }, 1024),
110
- r(s(I), {
111
- modelValue: e.selectedScopes.includes(l),
112
- "onUpdate:modelValue": (x) => S(l, x)
117
+ c(s(U), {
118
+ modelValue: t.selectedScopes.includes(o),
119
+ "onUpdate:modelValue": (k) => w(o, k)
113
120
  }, null, 8, ["modelValue", "onUpdate:modelValue"])
114
121
  ]),
115
122
  _: 2
@@ -121,12 +128,20 @@ const R = { class: "flex h-fit w-full" }, U = { class: "flex-1" }, F = { class:
121
128
  ]),
122
129
  _: 1
123
130
  })
124
- ])
131
+ ]),
132
+ c(P, {
133
+ scopes: Object.keys(t.flow.scopes ?? {}),
134
+ state: s(v),
135
+ onSubmit: e[1] || (e[1] = (o) => i("update:selectedScopes", {
136
+ scopes: t.selectedScopes,
137
+ newScopePayload: { ...o, flowType: t.flowType }
138
+ }))
139
+ }, null, 8, ["scopes", "state"])
125
140
  ]),
126
141
  _: 1
127
142
  }));
128
143
  }
129
144
  });
130
145
  export {
131
- X as default
146
+ ee as default
132
147
  };
@@ -14,6 +14,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
14
14
  id: string[];
15
15
  name: string;
16
16
  scopes: string[];
17
+ newScopePayload?: {
18
+ name: string;
19
+ description: string;
20
+ flowType: keyof import("@scalar/workspace-store/schemas/v3.1/strict/oauthflows").OAuthFlowsObject;
21
+ };
17
22
  meta: import("@scalar/workspace-store/mutators").AuthMeta;
18
23
  }, "meta">) => any;
19
24
  "update:securityScheme": (payload: ({
@@ -40,7 +45,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
40
45
  [x: string]: string | undefined;
41
46
  } | undefined;
42
47
  'x-tokenName'?: string | undefined;
43
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
44
48
  authorizationUrl?: string | undefined;
45
49
  'x-scalar-secret-redirect-uri'?: string | undefined;
46
50
  } | undefined;
@@ -58,11 +62,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
58
62
  [x: string]: string | undefined;
59
63
  } | undefined;
60
64
  'x-tokenName'?: string | undefined;
61
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
62
65
  tokenUrl?: string | undefined;
63
66
  'x-scalar-secret-username'?: string | undefined;
64
67
  'x-scalar-secret-password'?: string | undefined;
65
68
  'x-scalar-secret-client-secret'?: string | undefined;
69
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
66
70
  } | undefined;
67
71
  clientCredentials?: {
68
72
  refreshUrl?: string | undefined;
@@ -78,9 +82,9 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
78
82
  [x: string]: string | undefined;
79
83
  } | undefined;
80
84
  'x-tokenName'?: string | undefined;
81
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
82
85
  tokenUrl?: string | undefined;
83
86
  'x-scalar-secret-client-secret'?: string | undefined;
87
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
84
88
  } | undefined;
85
89
  authorizationCode?: {
86
90
  refreshUrl?: string | undefined;
@@ -96,12 +100,12 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
96
100
  [x: string]: string | undefined;
97
101
  } | undefined;
98
102
  'x-tokenName'?: string | undefined;
99
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
100
103
  authorizationUrl?: string | undefined;
101
104
  tokenUrl?: string | undefined;
102
105
  'x-scalar-secret-client-secret'?: string | undefined;
103
106
  'x-scalar-secret-redirect-uri'?: string | undefined;
104
107
  'x-usePkce'?: "SHA-256" | "plain" | "no" | undefined;
108
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
105
109
  } | undefined;
106
110
  } | undefined;
107
111
  })) => any;
@@ -110,6 +114,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
110
114
  id: string[];
111
115
  name: string;
112
116
  scopes: string[];
117
+ newScopePayload?: {
118
+ name: string;
119
+ description: string;
120
+ flowType: keyof import("@scalar/workspace-store/schemas/v3.1/strict/oauthflows").OAuthFlowsObject;
121
+ };
113
122
  meta: import("@scalar/workspace-store/mutators").AuthMeta;
114
123
  }, "meta">) => any) | undefined;
115
124
  "onUpdate:securityScheme"?: ((payload: ({
@@ -136,7 +145,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
136
145
  [x: string]: string | undefined;
137
146
  } | undefined;
138
147
  'x-tokenName'?: string | undefined;
139
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
140
148
  authorizationUrl?: string | undefined;
141
149
  'x-scalar-secret-redirect-uri'?: string | undefined;
142
150
  } | undefined;
@@ -154,11 +162,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
154
162
  [x: string]: string | undefined;
155
163
  } | undefined;
156
164
  'x-tokenName'?: string | undefined;
157
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
158
165
  tokenUrl?: string | undefined;
159
166
  'x-scalar-secret-username'?: string | undefined;
160
167
  'x-scalar-secret-password'?: string | undefined;
161
168
  'x-scalar-secret-client-secret'?: string | undefined;
169
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
162
170
  } | undefined;
163
171
  clientCredentials?: {
164
172
  refreshUrl?: string | undefined;
@@ -174,9 +182,9 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
174
182
  [x: string]: string | undefined;
175
183
  } | undefined;
176
184
  'x-tokenName'?: string | undefined;
177
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
178
185
  tokenUrl?: string | undefined;
179
186
  'x-scalar-secret-client-secret'?: string | undefined;
187
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
180
188
  } | undefined;
181
189
  authorizationCode?: {
182
190
  refreshUrl?: string | undefined;
@@ -192,12 +200,12 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
192
200
  [x: string]: string | undefined;
193
201
  } | undefined;
194
202
  'x-tokenName'?: string | undefined;
195
- 'x-scalar-credentials-location'?: "header" | "body" | undefined;
196
203
  authorizationUrl?: string | undefined;
197
204
  tokenUrl?: string | undefined;
198
205
  'x-scalar-secret-client-secret'?: string | undefined;
199
206
  'x-scalar-secret-redirect-uri'?: string | undefined;
200
207
  'x-usePkce'?: "SHA-256" | "plain" | "no" | undefined;
208
+ 'x-scalar-credentials-location'?: "header" | "body" | undefined;
201
209
  } | undefined;
202
210
  } | undefined;
203
211
  })) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"RequestAuthTab.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"names":[],"mappings":"AAmTA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,yBAAyB,EAEzB,YAAY,EACb,MAAM,8DAA8D,CAAA;AAcrE,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,kBAAkB,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,uBAAuB,EAAE,yBAAyB,CAAA;IAClD,eAAe,EAAE,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACjE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAC5B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmiBF,wBAOG"}
1
+ {"version":3,"file":"RequestAuthTab.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"names":[],"mappings":"AAmTA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,yBAAyB,EAEzB,YAAY,EACb,MAAM,8DAA8D,CAAA;AAcrE,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,kBAAkB,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,uBAAuB,EAAE,yBAAyB,CAAA;IAClD,eAAe,EAAE,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACjE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAC5B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmiBF,wBAOG"}
@@ -1,7 +1,7 @@
1
1
  import type { OAuthFlowsObject, ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
2
2
  import type { ErrorResponse } from '../../../../libs/errors.js';
3
3
  /** Oauth2 security schemes which are not implicit */
4
- type NonImplicitFlow = Omit<OAuthFlowsObject, 'implicit'>;
4
+ type NonImplicitFlows = Omit<OAuthFlowsObject, 'implicit'>;
5
5
  type PKCEState = {
6
6
  codeVerifier: string;
7
7
  codeChallenge: string;
@@ -25,7 +25,7 @@ proxyUrl: string) => Promise<ErrorResponse<string>>;
25
25
  * Makes the BE authorization call to grab the token server to server
26
26
  * Used for clientCredentials and authorizationCode
27
27
  */
28
- export declare const authorizeServers: (flows: NonImplicitFlow, type: keyof NonImplicitFlow, scopes: string, { code, pkce, proxyUrl, }: {
28
+ export declare const authorizeServers: (flows: NonImplicitFlows, type: keyof NonImplicitFlows, scopes: string, { code, pkce, proxyUrl, }: {
29
29
  code?: string;
30
30
  pkce?: PKCEState | null;
31
31
  proxyUrl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/helpers/oauth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAGlH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,qDAAqD;AACrD,KAAK,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAA;AAEzD,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAgBD;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAU,UAAU,MAAM,EAAE,UAAU,SAAS,GAAG,OAAO,KAAG,OAAO,CAAC,MAAM,CAkB3G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,gBAAgB,EACvB,MAAM,MAAM,gBAAgB,EAC5B,gBAAgB,MAAM,EAAE;AACxB,wEAAwE;AACxE,cAAc,YAAY,GAAG,IAAI;AACjC,kCAAkC;AAClC,UAAU,MAAM,KACf,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAmL/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,eAAe,EACtB,MAAM,MAAM,eAAe,EAC3B,QAAQ,MAAM,EACd,2BAIG;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,YAAK,EACN,cAAc,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CA+F/B,CAAA"}
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/helpers/oauth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAGlH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,qDAAqD;AACrD,KAAK,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAA;AAE1D,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAgBD;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAU,UAAU,MAAM,EAAE,UAAU,SAAS,GAAG,OAAO,KAAG,OAAO,CAAC,MAAM,CAkB3G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,gBAAgB,EACvB,MAAM,MAAM,gBAAgB,EAC5B,gBAAgB,MAAM,EAAE;AACxB,wEAAwE;AACxE,cAAc,YAAY,GAAG,IAAI;AACjC,kCAAkC;AAClC,UAAU,MAAM,KACf,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAiL/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,gBAAgB,EACvB,MAAM,MAAM,gBAAgB,EAC5B,QAAQ,MAAM,EACd,2BAIG;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,YAAK,EACN,cAAc,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAwF/B,CAAA"}
@@ -1,128 +1,130 @@
1
- import { makeUrlAbsolute as A } from "@scalar/helpers/url/make-url-absolute";
2
- import { shouldUseProxy as b } from "@scalar/oas-utils/helpers";
3
- import { encode as C, fromUint8Array as S } from "js-base64";
4
- const E = () => {
5
- const r = new Uint8Array(32);
6
- return crypto.getRandomValues(r), S(r, !0);
7
- }, z = async (r, t) => {
8
- if (t === "plain")
9
- return r;
1
+ import { makeUrlAbsolute as b } from "@scalar/helpers/url/make-url-absolute";
2
+ import { shouldUseProxy as E } from "@scalar/oas-utils/helpers";
3
+ import { encode as A, fromUint8Array as C } from "js-base64";
4
+ const S = () => {
5
+ const s = new Uint8Array(32);
6
+ return crypto.getRandomValues(s), C(s, !0);
7
+ }, z = async (s, e) => {
8
+ if (e === "plain")
9
+ return s;
10
10
  if (typeof crypto?.subtle?.digest != "function")
11
- return console.warn("SHA-256 is only supported when using https, using a plain text code challenge instead."), r;
12
- const l = new TextEncoder().encode(r), w = await crypto.subtle.digest("SHA-256", l);
13
- return S(new Uint8Array(w), !0);
14
- }, $ = async (r, t, p, l, w) => {
15
- const d = r[t];
11
+ return console.warn("SHA-256 is only supported when using https, using a plain text code challenge instead."), s;
12
+ const l = new TextEncoder().encode(s), f = await crypto.subtle.digest("SHA-256", l);
13
+ return C(new Uint8Array(f), !0);
14
+ }, L = async (s, e, g, l, f) => {
15
+ const d = s[e];
16
16
  try {
17
17
  if (!d)
18
18
  return [new Error("Flow not found"), null];
19
- const f = p.join(" ");
20
- if (t === "clientCredentials" || t === "password")
19
+ const m = g.join(" ");
20
+ if (e === "clientCredentials" || e === "password")
21
21
  return U(
22
- r,
23
- t,
24
- f,
22
+ s,
23
+ e,
24
+ m,
25
25
  {
26
- proxyUrl: w
26
+ proxyUrl: f
27
27
  },
28
28
  l
29
29
  );
30
- const e = (Math.random() + 1).toString(36).substring(2, 10), a = A(r[t].authorizationUrl, {
30
+ const t = (Math.random() + 1).toString(36).substring(2, 10), a = b(s[e].authorizationUrl, {
31
31
  baseUrl: l?.url
32
32
  }), n = new URL(a);
33
- let o = null;
34
- if (t === "implicit")
33
+ let c = null;
34
+ if (e === "implicit")
35
35
  n.searchParams.set("response_type", "token");
36
- else if (t === "authorizationCode") {
37
- const s = r[t];
38
- if (n.searchParams.set("response_type", "code"), s["x-usePkce"] !== "no") {
39
- const c = E(), i = await z(c, s["x-usePkce"]);
40
- o = {
41
- codeVerifier: c,
42
- codeChallenge: i,
43
- codeChallengeMethod: s["x-usePkce"] === "SHA-256" ? "S256" : "plain"
44
- }, n.searchParams.set("code_challenge", i), n.searchParams.set("code_challenge_method", o.codeChallengeMethod);
36
+ else if (e === "authorizationCode") {
37
+ const r = s[e];
38
+ if (n.searchParams.set("response_type", "code"), r["x-usePkce"] !== "no") {
39
+ const o = S(), u = await z(o, r["x-usePkce"]);
40
+ c = {
41
+ codeVerifier: o,
42
+ codeChallenge: u,
43
+ codeChallengeMethod: r["x-usePkce"] === "SHA-256" ? "S256" : "plain"
44
+ }, n.searchParams.set("code_challenge", u), n.searchParams.set("code_challenge_method", c.codeChallengeMethod);
45
45
  }
46
46
  }
47
- const m = r[t];
48
- if (m["x-scalar-secret-redirect-uri"].startsWith("/")) {
49
- const s = l?.url || window.location.origin + window.location.pathname, c = new URL(m["x-scalar-secret-redirect-uri"], s).toString();
50
- n.searchParams.set("redirect_uri", c);
47
+ const i = s[e];
48
+ if (i["x-scalar-secret-redirect-uri"].startsWith("/")) {
49
+ const r = l?.url || window.location.origin + window.location.pathname, o = new URL(i["x-scalar-secret-redirect-uri"], r).toString();
50
+ n.searchParams.set("redirect_uri", o);
51
51
  } else
52
- n.searchParams.set("redirect_uri", m["x-scalar-secret-redirect-uri"]);
53
- d["x-scalar-security-query"] && Object.keys(d["x-scalar-security-query"]).forEach((s) => {
54
- const c = d["x-scalar-security-query"]?.[s];
55
- c && n.searchParams.set(s, c);
56
- }), n.searchParams.set("client_id", d["x-scalar-secret-client-id"]), n.searchParams.set("state", e), f && n.searchParams.set("scope", f);
57
- const u = window.open(n, "openAuth2Window", "left=100,top=100,width=800,height=600");
58
- return u ? new Promise((s) => {
59
- const c = setInterval(() => {
60
- let i = null, g = null, x = null, P = null;
52
+ n.searchParams.set("redirect_uri", i["x-scalar-secret-redirect-uri"]);
53
+ d["x-scalar-security-query"] && Object.keys(d["x-scalar-security-query"]).forEach((r) => {
54
+ const o = d["x-scalar-security-query"]?.[r];
55
+ o && n.searchParams.set(r, o);
56
+ }), n.searchParams.set("client_id", d["x-scalar-secret-client-id"]), n.searchParams.set("state", t), m && n.searchParams.set("scope", m);
57
+ const h = window.open(n, "openAuth2Window", "left=100,top=100,width=800,height=600");
58
+ return h ? new Promise((r) => {
59
+ const o = setInterval(() => {
60
+ let u = null, p = null, x = null, _ = null;
61
61
  try {
62
- const h = new URL(u.location.href).searchParams, k = d["x-tokenName"] || "access_token";
63
- i = h.get(k), g = h.get("code"), x = h.get("error"), P = h.get("error_description");
64
- const y = new URLSearchParams(u.location.href.split("#")[1]);
65
- i ||= y.get(k), g ||= y.get("code"), x ||= y.get("error"), P ||= y.get("error_description");
62
+ const w = new URL(h.location.href).searchParams, k = d["x-tokenName"] || "access_token";
63
+ u = w.get(k), p = w.get("code"), x = w.get("error"), _ = w.get("error_description");
64
+ const P = new URLSearchParams(h.location.href.split("#")[1]);
65
+ u ||= P.get(k), p ||= P.get("code"), x ||= P.get("error"), _ ||= P.get("error_description");
66
66
  } catch {
67
67
  }
68
- if (u.closed || i || g || x)
69
- if (clearInterval(c), u.close(), x)
70
- s([new Error(`OAuth error: ${x}${P ? ` (${P})` : ""}`), null]);
71
- else if (i) {
72
- const h = u.location.href.match(/state=([^&]*)/)?.[1];
73
- s(h === e ? [null, i] : [new Error("State mismatch"), null]);
74
- } else g && t === "authorizationCode" ? new URL(u.location.href).searchParams.get("state") === e ? U(
75
- r,
76
- t,
77
- f,
68
+ if (h.closed || u || p || x)
69
+ if (clearInterval(o), h.close(), x)
70
+ r([new Error(`OAuth error: ${x}${_ ? ` (${_})` : ""}`), null]);
71
+ else if (u) {
72
+ const w = h.location.href.match(/state=([^&]*)/)?.[1];
73
+ r(w === t ? [null, u] : [new Error("State mismatch"), null]);
74
+ } else p && e === "authorizationCode" ? new URL(h.location.href).searchParams.get("state") === t ? U(
75
+ s,
76
+ e,
77
+ m,
78
78
  {
79
- code: g,
80
- pkce: o,
81
- proxyUrl: w
79
+ code: p,
80
+ pkce: c,
81
+ proxyUrl: f
82
82
  },
83
83
  l
84
- ).then(s) : s([new Error("State mismatch"), null]) : (clearInterval(c), s([new Error("Window was closed without granting authorization"), null]));
84
+ ).then(r) : r([new Error("State mismatch"), null]) : (clearInterval(o), r([new Error("Window was closed without granting authorization"), null]));
85
85
  }, 200);
86
86
  }) : [new Error("Failed to open auth window"), null];
87
87
  } catch {
88
88
  return [new Error("Failed to authorize oauth2 flow"), null];
89
89
  }
90
- }, U = async (r, t, p, {
90
+ }, U = async (s, e, g, {
91
91
  code: l,
92
- pkce: w,
92
+ pkce: f,
93
93
  proxyUrl: d
94
- } = {}, f) => {
95
- const e = r[t];
96
- if (!e)
94
+ } = {}, m) => {
95
+ const t = s[e];
96
+ if (!t)
97
97
  return [new Error("OAuth2 flow was not defined"), null];
98
98
  const a = new URLSearchParams();
99
- if (a.set("client_id", e["x-scalar-secret-client-id"]), p && (t === "clientCredentials" || t === "password") && a.set("scope", p), e["x-scalar-secret-client-secret"] && (!e["x-scalar-credentials-location"] || e["x-scalar-credentials-location"] === "body") && a.set("client_secret", e["x-scalar-secret-client-secret"]), "x-scalar-secret-redirect-uri" in e && e["x-scalar-secret-redirect-uri"] && a.set("redirect_uri", e["x-scalar-secret-redirect-uri"]), l)
100
- a.set("code", l), a.set("grant_type", "authorization_code"), w && a.set("code_verifier", w.codeVerifier);
101
- else if (t === "password") {
102
- const o = r[t];
103
- a.set("grant_type", "password"), a.set("username", o["x-scalar-secret-username"]), a.set("password", o["x-scalar-secret-password"]);
99
+ g && (e === "clientCredentials" || e === "password") && a.set("scope", g);
100
+ const n = t["x-scalar-credentials-location"] === "body";
101
+ if (n && (a.set("client_id", t["x-scalar-secret-client-id"]), a.set("client_secret", t["x-scalar-secret-client-secret"])), "x-scalar-secret-redirect-uri" in t && t["x-scalar-secret-redirect-uri"] && a.set("redirect_uri", t["x-scalar-secret-redirect-uri"]), l)
102
+ a.set("code", l), a.set("grant_type", "authorization_code"), f && a.set("code_verifier", f.codeVerifier);
103
+ else if (e === "password") {
104
+ const c = s[e];
105
+ a.set("grant_type", "password"), a.set("username", c["x-scalar-secret-username"]), a.set("password", c["x-scalar-secret-password"]);
104
106
  } else
105
107
  a.set("grant_type", "client_credentials");
106
- e["x-scalar-security-body"] && Object.entries(e["x-scalar-security-body"]).forEach(([o, m]) => {
107
- m && a.set(o, m);
108
+ t["x-scalar-security-body"] && Object.entries(t["x-scalar-security-body"]).forEach(([c, i]) => {
109
+ i && a.set(c, i);
108
110
  });
109
111
  try {
110
- const o = {
112
+ const c = {
111
113
  "Content-Type": "application/x-www-form-urlencoded"
112
114
  };
113
- e["x-scalar-secret-client-secret"] && (!e["x-scalar-credentials-location"] || e["x-scalar-credentials-location"] === "header") && (o.Authorization = `Basic ${C(`${e["x-scalar-secret-client-id"]}:${e["x-scalar-secret-client-secret"]}`)}`);
114
- const _ = A(e.tokenUrl, { baseUrl: f?.url }), u = b(d, _) ? `${d}?${new URLSearchParams([["scalar_url", _]]).toString()}` : _, c = await (await fetch(u, {
115
+ n || (c.Authorization = `Basic ${A(`${t["x-scalar-secret-client-id"]}:${t["x-scalar-secret-client-secret"]}`)}`);
116
+ const i = b(t.tokenUrl, { baseUrl: m?.url }), y = E(d, i) ? `${d}?${new URLSearchParams([["scalar_url", i]]).toString()}` : i, r = await (await fetch(y, {
115
117
  method: "POST",
116
- headers: o,
118
+ headers: c,
117
119
  body: a
118
- })).json(), i = e["x-tokenName"] || "access_token";
119
- return [null, c[i]];
120
+ })).json(), o = t["x-tokenName"] || "access_token";
121
+ return [null, r[o]];
120
122
  } catch {
121
123
  return [new Error("Failed to get an access token. Please check your credentials."), null];
122
124
  }
123
125
  };
124
126
  export {
125
- $ as authorizeOauth2,
127
+ L as authorizeOauth2,
126
128
  U as authorizeServers,
127
129
  z as generateCodeChallenge
128
130
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmationForm.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/components/forms/ConfirmationForm.vue"],"names":[],"mappings":"AAwDA,KAAK,WAAW,GAAG;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAC7B,CAAC;AAqGF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAsB/C,QAAA,MAAM,eAAe;;;;;;kFAOnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ConfirmationForm.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/components/forms/ConfirmationForm.vue"],"names":[],"mappings":"AA6CA,KAAK,WAAW,GAAG;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAC7B,CAAC;AA4EF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAsB/C,QAAA,MAAM,eAAe;;;;;;kFAOnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}