@cloudbase/js-sdk 4.0.0 → 4.0.1-alpha.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.
Files changed (203) hide show
  1. package/CHANGELOG.md +398 -0
  2. package/ai/dist/index.esm.js +2 -3
  3. package/ai/dist/index.esm.js.map +1 -0
  4. package/ai/dist/index.js +2 -21
  5. package/ai/dist/index.js.map +1 -0
  6. package/apis/dist/index.d.ts +1 -0
  7. package/apis/dist/index.esm.js +2 -0
  8. package/apis/dist/index.esm.js.map +1 -0
  9. package/apis/dist/index.js +2 -0
  10. package/apis/dist/index.js.map +1 -0
  11. package/{analytics → apis}/package.json +1 -1
  12. package/app/dist/index.esm.js +2 -11
  13. package/app/dist/index.esm.js.map +1 -0
  14. package/app/dist/index.js +2 -18
  15. package/app/dist/index.js.map +1 -0
  16. package/app/dist/index.node.esm.js +3 -0
  17. package/app/dist/index.node.esm.js.LICENSE.txt +13 -0
  18. package/app/dist/index.node.esm.js.map +1 -0
  19. package/app/dist/index.node.js +3 -0
  20. package/app/dist/index.node.js.LICENSE.txt +13 -0
  21. package/app/dist/index.node.js.map +1 -0
  22. package/app/package.json +12 -1
  23. package/auth/dist/index.d.ts +2 -2
  24. package/auth/dist/index.esm.js +3 -4
  25. package/auth/dist/index.esm.js.LICENSE.txt +12 -0
  26. package/auth/dist/index.esm.js.map +1 -0
  27. package/auth/dist/index.js +3 -9
  28. package/auth/dist/index.js.LICENSE.txt +12 -0
  29. package/auth/dist/index.js.map +1 -0
  30. package/cloudrun/dist/index.esm.js +2 -3
  31. package/cloudrun/dist/index.esm.js.map +1 -0
  32. package/cloudrun/dist/index.js +2 -21
  33. package/cloudrun/dist/index.js.map +1 -0
  34. package/container/dist/index.d.ts +2 -2
  35. package/container/dist/index.esm.js +2 -4
  36. package/container/dist/index.esm.js.map +1 -0
  37. package/container/dist/index.js +2 -9
  38. package/container/dist/index.js.map +1 -0
  39. package/core.d.ts +4331 -0
  40. package/core.node.d.ts +294 -0
  41. package/database/dist/index.esm.js +2 -47
  42. package/database/dist/index.esm.js.map +1 -0
  43. package/database/dist/index.js +2 -53
  44. package/database/dist/index.js.map +1 -0
  45. package/database/package.json +34 -4
  46. package/dist/index.cjs.js +3 -37
  47. package/dist/index.cjs.js.LICENSE.txt +12 -0
  48. package/dist/index.cjs.js.map +1 -0
  49. package/dist/index.esm.js +3 -32
  50. package/dist/index.esm.js.LICENSE.txt +12 -0
  51. package/dist/index.esm.js.map +1 -0
  52. package/dist/index.node.cjs.js +3 -0
  53. package/dist/index.node.cjs.js.LICENSE.txt +26 -0
  54. package/dist/index.node.cjs.js.map +1 -0
  55. package/dist/index.node.esm.js +3 -0
  56. package/dist/index.node.esm.js.LICENSE.txt +26 -0
  57. package/dist/index.node.esm.js.map +1 -0
  58. package/functions/dist/index.d.ts +2 -2
  59. package/functions/dist/index.esm.js +2 -4
  60. package/functions/dist/index.esm.js.map +1 -0
  61. package/functions/dist/index.js +2 -9
  62. package/functions/dist/index.js.map +1 -0
  63. package/index.d.ts +7 -1785
  64. package/index.node.d.ts +13 -0
  65. package/miniprogram_dist/ai/index.d.ts +42 -0
  66. package/miniprogram_dist/ai/index.js +2 -0
  67. package/miniprogram_dist/apis/index.d.ts +5 -0
  68. package/miniprogram_dist/apis/index.js +1 -0
  69. package/miniprogram_dist/app/index.d.ts +67 -0
  70. package/miniprogram_dist/app/index.js +2 -0
  71. package/miniprogram_dist/auth/index.d.ts +269 -0
  72. package/miniprogram_dist/auth/index.js +2 -0
  73. package/miniprogram_dist/cloudrun/index.d.ts +4 -0
  74. package/miniprogram_dist/cloudrun/index.js +1 -0
  75. package/miniprogram_dist/container/index.d.ts +13 -0
  76. package/miniprogram_dist/container/index.js +1 -0
  77. package/miniprogram_dist/database/index.d.ts +3 -0
  78. package/miniprogram_dist/database/index.js +1 -0
  79. package/miniprogram_dist/functions/index.d.ts +2 -0
  80. package/miniprogram_dist/functions/index.js +1 -0
  81. package/miniprogram_dist/index.js +1 -1
  82. package/miniprogram_dist/model/index.d.ts +5 -0
  83. package/miniprogram_dist/model/index.js +1 -0
  84. package/miniprogram_dist/mysql/index.d.ts +3 -0
  85. package/miniprogram_dist/mysql/index.js +1 -0
  86. package/miniprogram_dist/oauth/index.d.ts +22 -0
  87. package/miniprogram_dist/oauth/index.js +2 -0
  88. package/miniprogram_dist/realtime/index.d.ts +2 -0
  89. package/miniprogram_dist/realtime/index.js +1 -0
  90. package/miniprogram_dist/storage/index.d.ts +13 -0
  91. package/miniprogram_dist/storage/index.js +1 -0
  92. package/model/dist/index.esm.js +2 -3
  93. package/model/dist/index.esm.js.map +1 -0
  94. package/model/dist/index.js +2 -21
  95. package/model/dist/index.js.map +1 -0
  96. package/mysql/dist/index.d.ts +1 -0
  97. package/mysql/dist/index.esm.js +2 -0
  98. package/mysql/dist/index.esm.js.map +1 -0
  99. package/mysql/dist/index.js +2 -0
  100. package/mysql/dist/index.js.map +1 -0
  101. package/mysql/package.json +6 -0
  102. package/oauth/dist/index.esm.js +3 -3
  103. package/oauth/dist/index.esm.js.LICENSE.txt +12 -0
  104. package/oauth/dist/index.esm.js.map +1 -0
  105. package/oauth/dist/index.js +3 -21
  106. package/oauth/dist/index.js.LICENSE.txt +12 -0
  107. package/oauth/dist/index.js.map +1 -0
  108. package/package.json +144 -18
  109. package/realtime/dist/index.d.ts +2 -2
  110. package/realtime/dist/index.esm.js +2 -4
  111. package/realtime/dist/index.esm.js.map +1 -0
  112. package/realtime/dist/index.js +2 -9
  113. package/realtime/dist/index.js.map +1 -0
  114. package/storage/dist/index.d.ts +2 -2
  115. package/storage/dist/index.esm.js +2 -4
  116. package/storage/dist/index.esm.js.map +1 -0
  117. package/storage/dist/index.js +2 -9
  118. package/storage/dist/index.js.map +1 -0
  119. package/types/analytics.d.ts +51 -0
  120. package/types/auth.d.ts +166 -0
  121. package/types/cache.d.ts +26 -0
  122. package/types/cloudrun.d.ts +9 -0
  123. package/types/component.d.ts +17 -0
  124. package/types/container.d.ts +93 -0
  125. package/types/database.d.ts +31 -0
  126. package/types/error.d.ts +40 -0
  127. package/types/events.d.ts +13 -0
  128. package/types/functions.d.ts +49 -0
  129. package/types/index.d.ts +269 -0
  130. package/types/package.json +47 -0
  131. package/types/realtime.d.ts +350 -0
  132. package/types/request.d.ts +30 -0
  133. package/types/result.d.ts +48 -0
  134. package/types/storage.d.ts +144 -0
  135. package/utilities/dist/cjs/adapters/index.d.ts +45 -0
  136. package/utilities/dist/cjs/adapters/index.js +68 -0
  137. package/utilities/dist/cjs/adapters/platforms/web.d.ts +20 -0
  138. package/utilities/dist/cjs/adapters/platforms/web.js +286 -0
  139. package/utilities/dist/cjs/constants/common.d.ts +6 -0
  140. package/utilities/dist/cjs/constants/common.js +24 -0
  141. package/utilities/dist/cjs/constants/errors.d.ts +8 -0
  142. package/utilities/dist/cjs/constants/errors.js +12 -0
  143. package/utilities/dist/cjs/constants/index.d.ts +3 -0
  144. package/utilities/dist/cjs/constants/index.js +21 -0
  145. package/utilities/dist/cjs/helpers/decorators.d.ts +11 -0
  146. package/utilities/dist/cjs/helpers/decorators.js +238 -0
  147. package/utilities/dist/cjs/helpers/index.d.ts +1 -0
  148. package/utilities/dist/cjs/helpers/index.js +18 -0
  149. package/utilities/dist/cjs/index.d.ts +13 -0
  150. package/utilities/dist/cjs/index.js +51 -0
  151. package/utilities/dist/cjs/libs/abortController.d.ts +9 -0
  152. package/utilities/dist/cjs/libs/abortController.js +25 -0
  153. package/utilities/dist/cjs/libs/cache.d.ts +17 -0
  154. package/utilities/dist/cjs/libs/cache.js +261 -0
  155. package/utilities/dist/cjs/libs/events.d.ts +27 -0
  156. package/utilities/dist/cjs/libs/events.js +108 -0
  157. package/utilities/dist/cjs/libs/langEvent.d.ts +3 -0
  158. package/utilities/dist/cjs/libs/langEvent.js +7 -0
  159. package/utilities/dist/cjs/libs/util.d.ts +49 -0
  160. package/utilities/dist/cjs/libs/util.js +282 -0
  161. package/utilities/dist/esm/adapters/index.d.ts +45 -0
  162. package/utilities/dist/esm/adapters/index.js +40 -0
  163. package/utilities/dist/esm/adapters/platforms/web.d.ts +20 -0
  164. package/utilities/dist/esm/adapters/platforms/web.js +282 -0
  165. package/utilities/dist/esm/constants/common.d.ts +6 -0
  166. package/utilities/dist/esm/constants/common.js +17 -0
  167. package/utilities/dist/esm/constants/errors.d.ts +8 -0
  168. package/utilities/dist/esm/constants/errors.js +9 -0
  169. package/utilities/dist/esm/constants/index.d.ts +3 -0
  170. package/utilities/dist/esm/constants/index.js +4 -0
  171. package/utilities/dist/esm/helpers/decorators.d.ts +11 -0
  172. package/utilities/dist/esm/helpers/decorators.js +234 -0
  173. package/utilities/dist/esm/helpers/index.d.ts +1 -0
  174. package/utilities/dist/esm/helpers/index.js +2 -0
  175. package/utilities/dist/esm/index.d.ts +13 -0
  176. package/utilities/dist/esm/index.js +14 -0
  177. package/utilities/dist/esm/libs/abortController.d.ts +9 -0
  178. package/utilities/dist/esm/libs/abortController.js +23 -0
  179. package/utilities/dist/esm/libs/cache.d.ts +17 -0
  180. package/utilities/dist/esm/libs/cache.js +258 -0
  181. package/utilities/dist/esm/libs/events.d.ts +27 -0
  182. package/utilities/dist/esm/libs/events.js +102 -0
  183. package/utilities/dist/esm/libs/langEvent.d.ts +3 -0
  184. package/utilities/dist/esm/libs/langEvent.js +4 -0
  185. package/utilities/dist/esm/libs/util.d.ts +49 -0
  186. package/utilities/dist/esm/libs/util.js +254 -0
  187. package/utilities/dist/miniprogram/index.js +1 -0
  188. package/utilities/package.json +26 -0
  189. package/analytics/dist/index.d.ts +0 -2
  190. package/analytics/dist/index.esm.js +0 -4
  191. package/analytics/dist/index.js +0 -9
  192. package/miniprogram_dist/ai.js +0 -2
  193. package/miniprogram_dist/analytics.js +0 -1
  194. package/miniprogram_dist/app.js +0 -2
  195. package/miniprogram_dist/auth.js +0 -2
  196. package/miniprogram_dist/cloudrun.js +0 -1
  197. package/miniprogram_dist/container.js +0 -1
  198. package/miniprogram_dist/database.js +0 -2
  199. package/miniprogram_dist/functions.js +0 -1
  200. package/miniprogram_dist/model.js +0 -1
  201. package/miniprogram_dist/oauth.js +0 -1
  202. package/miniprogram_dist/realtime.js +0 -1
  203. package/miniprogram_dist/storage.js +0 -1
@@ -0,0 +1,48 @@
1
+ import { ICloudbaseError } from './error'
2
+
3
+ /**
4
+ * `{ data, error }` 统一返回结构(可辨识联合 / Discriminated Union)。
5
+ *
6
+ * 判别字段为 `error` 是否为 `null`:
7
+ * - 成功:`{ data: T; error: null }`
8
+ * - 失败:`{ data: null; error: E }`
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const res = await sdk.callFunction<{ n: number }>({ name: 'foo' })
13
+ * if (res.error === null) {
14
+ * // 此处 res.data 被自动收窄为 { n: number }(非 null)
15
+ * console.log(res.data.n)
16
+ * } else {
17
+ * // 此处 res.data 被收窄为 null,res.error 为 E
18
+ * console.error(res.error.message)
19
+ * }
20
+ * ```
21
+ *
22
+ * @typeParam T - 成功时的数据类型
23
+ * @typeParam E - 失败时的错误类型,默认 `ICloudbaseError`
24
+ */
25
+ export type Result<T, E extends ICloudbaseError = ICloudbaseError> =
26
+ | { data: T; error: null }
27
+ | { data: null; error: E }
28
+
29
+ /**
30
+ * 安全解构变体:失败分支的 `data` 不是 `null`,而是把成功 shape 的每个字段映射成 `null`。
31
+ *
32
+ * 这样即使不先判空 `error`,也能安全解构成功结构里的字段(值可能为 `null`):
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // 无需先判 res.data === null 即可解构
37
+ * const { data: { user, session } } = await auth.signInWithPassword({ ... })
38
+ * ```
39
+ *
40
+ * 该类型用于「已有 `{ data: { ... } }` 嵌套结构、需要平滑升级为判别联合」的场景(如 auth)。
41
+ * 相比 `Result<T>`,它对既有解构代码是**非破坏性**的升级。
42
+ *
43
+ * @typeParam T - 成功时的数据结构(必须为对象)
44
+ * @typeParam E - 失败时的错误类型,默认 `ICloudbaseError`
45
+ */
46
+ export type SafeResult<T extends object, E extends ICloudbaseError = ICloudbaseError> =
47
+ | { data: T; error: null }
48
+ | { data: { [K in keyof T]: null }; error: E }
@@ -0,0 +1,144 @@
1
+ import { KVstring } from '.'
2
+ import { ICustomReqOpts } from './functions'
3
+
4
+ /**
5
+ * 上传/下载时的原始文件内容,覆盖浏览器与 Node 两端形态:
6
+ * - Node 端:`Buffer`(属于 `Uint8Array`)、可读流(含 `size`/`byteLength` 的对象)
7
+ * - 浏览器端:`Blob` / `File` / `ArrayBuffer` / TypedArray 等 `ArrayBufferView`
8
+ * - 纯文本内容:`string`
9
+ *
10
+ * 末尾的 `{ size?: number; byteLength?: number }` 兼容自定义流对象(实现层据此推算
11
+ * content-length)。这是一个开放联合:既约束常见形态,又不排除运行时特殊对象。
12
+ */
13
+ export type FileContent =
14
+ | Blob
15
+ | ArrayBuffer
16
+ | ArrayBufferView
17
+ | Uint8Array
18
+ | string
19
+ | { size?: number; byteLength?: number; [key: string]: any };
20
+
21
+ export interface ICloudbaseUploadFileParams {
22
+ cloudPath: string;
23
+ filePath: string;
24
+ method?: 'post' | 'put';
25
+ headers?: KVstring;
26
+ onUploadProgress?: Function;
27
+ /** 文件内容:Buffer / 可读流(Node 端)或 Blob / ArrayBuffer(浏览器端) */
28
+ fileContent?: FileContent;
29
+ customReqOpts?: ICustomReqOpts;
30
+ }
31
+
32
+ export interface ICloudbaseUploadFileByPutParams {
33
+ cloudPath: string;
34
+ filePath: string;
35
+ headers?: KVstring;
36
+ onUploadProgress?: Function;
37
+ }
38
+
39
+ export interface ICloudbaseUploadFileResult {
40
+ fileID: string;
41
+ requestId: string;
42
+ }
43
+
44
+ export type ICloudbaseUploadFile = (params: ICloudbaseUploadFileParams, callback?: Function) => Promise<ICloudbaseUploadFileResult>;
45
+
46
+ export interface ICloudbaseGetUploadMetadataParams {
47
+ cloudPath: string;
48
+ customReqOpts?: ICustomReqOpts;
49
+ }
50
+
51
+ export type ICloudbaseGetUploadMetadata = (params: ICloudbaseGetUploadMetadataParams, callback?: Function) => Promise<any>;
52
+
53
+ export interface ICloudbaseDeleteFileParams {
54
+ fileList: string[];
55
+ customReqOpts?: ICustomReqOpts;
56
+ }
57
+
58
+ export type ICloudbaseDeleteFile = (params: ICloudbaseDeleteFileParams, callback?: Function) => Promise<ICloudbaseDeleteFileResult>;
59
+
60
+ export interface ICloudbaseDeleteFileResult {
61
+ code?: string;
62
+ message?: string;
63
+ fileList?: {
64
+ code?: string;
65
+ fileID: string;
66
+ }[];
67
+ requestId?: string;
68
+ }
69
+
70
+ export interface ICloudbaseFileInfo {
71
+ fileID: string;
72
+ maxAge: number;
73
+ }
74
+
75
+ export interface ICloudbaseGetTempFileURLParams {
76
+ fileList: string[] | ICloudbaseFileInfo[];
77
+ customReqOpts?: ICustomReqOpts;
78
+ }
79
+ export interface ICloudbaseGetTempFileURLResult {
80
+ code?: string;
81
+ message?: string;
82
+ fileList?: {
83
+ code?: string;
84
+ message?: string;
85
+ fileID: string;
86
+ tempFileURL: string;
87
+ download_url?: string;
88
+ }[];
89
+ requestId?: string;
90
+ }
91
+
92
+ export interface ICloudbaseCopyFileParams {
93
+ fileList: Array<{
94
+ srcPath: string
95
+ dstPath: string
96
+ overwrite?: boolean
97
+ removeOriginal?: boolean
98
+ }>
99
+ customReqOpts?: ICustomReqOpts;
100
+ }
101
+
102
+
103
+ export interface ICloudbaseCopyFileResult {
104
+ fileList: Array<{
105
+ fileId?: string
106
+ code?: string
107
+ message?: string
108
+ }>
109
+ requestId?: string;
110
+ }
111
+
112
+ export type ICloudbaseGetTempFileURL = (params: ICloudbaseGetTempFileURLParams, callback?: Function) => Promise<ICloudbaseGetTempFileURLResult>;
113
+
114
+ export interface ICloudbaseDownloadFileParams {
115
+ fileID: string;
116
+ tempFilePath?: string;
117
+ customReqOpts?: ICustomReqOpts;
118
+ }
119
+
120
+ export interface ICloudbaseDownloadFileResult {
121
+ code?: string;
122
+ message?: string;
123
+ /** 下载得到的文件内容:Buffer / 流(Node 端)或 Blob / ArrayBuffer(浏览器端) */
124
+ fileContent?: FileContent;
125
+ requestId?: string;
126
+ }
127
+
128
+ export type ICloudbaseDownloadFile = (params: ICloudbaseDownloadFileParams, callback?: Function) => Promise<ICloudbaseDownloadFileResult>;
129
+
130
+ export interface ICloudbaseFileMetaData {
131
+ url: string;
132
+ token: string;
133
+ authorization: string;
134
+ fileId: string;
135
+ cosFileId: string;
136
+ download_url: string;
137
+ code?: string;
138
+ message?: string;
139
+ }
140
+
141
+ export interface ICloudbaseFileMetaDataRes {
142
+ data: ICloudbaseFileMetaData;
143
+ requestId: string;
144
+ }
@@ -0,0 +1,45 @@
1
+ import { CloudbaseAdapter, SDKAdapterInterface, NodeAdapterInterface } from '@cloudbase/adapter-interface';
2
+ export declare enum RUNTIME {
3
+ WEB = "web",
4
+ WX_MP = "wx_mp"
5
+ }
6
+ type ICloudbaseAdapter = CloudbaseAdapter & {
7
+ genAdapter: (options?: any) => SDKAdapterInterface | NodeAdapterInterface;
8
+ };
9
+ export declare function useAdapters(adapters: ICloudbaseAdapter | ICloudbaseAdapter[], options?: any): {
10
+ adapter: {
11
+ root: any;
12
+ wsClass: import("@cloudbase/adapter-interface").WebSocketContructor;
13
+ reqClass: import("@cloudbase/adapter-interface").SDKRequestConstructor;
14
+ localStorage?: import("@cloudbase/adapter-interface").StorageInterface;
15
+ sessionStorage?: import("@cloudbase/adapter-interface").StorageInterface;
16
+ primaryStorage?: import("@cloudbase/adapter-interface").StorageType;
17
+ captchaOptions?: {
18
+ openURIWithCallback?: (url: string) => Promise<import("@cloudbase/adapter-interface").CaptchaToken>;
19
+ };
20
+ getAppSign?(): string;
21
+ isMatch: () => boolean;
22
+ } | {
23
+ wsClass: import("@cloudbase/adapter-interface").WebSocketContructor;
24
+ reqClass: import("@cloudbase/adapter-interface").NodeRequestConstructor;
25
+ isMatch: () => boolean;
26
+ };
27
+ runtime: string;
28
+ };
29
+ export declare function useDefaultAdapter(): {
30
+ adapter: {
31
+ root: any;
32
+ wsClass: import("@cloudbase/adapter-interface").WebSocketContructor;
33
+ reqClass: import("@cloudbase/adapter-interface").SDKRequestConstructor;
34
+ localStorage?: import("@cloudbase/adapter-interface").StorageInterface;
35
+ sessionStorage?: import("@cloudbase/adapter-interface").StorageInterface;
36
+ primaryStorage?: import("@cloudbase/adapter-interface").StorageType;
37
+ captchaOptions?: {
38
+ openURIWithCallback?: (url: string) => Promise<import("@cloudbase/adapter-interface").CaptchaToken>;
39
+ };
40
+ getAppSign?(): string;
41
+ type?: "" | "default";
42
+ };
43
+ runtime: RUNTIME;
44
+ };
45
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.useDefaultAdapter = exports.useAdapters = exports.RUNTIME = void 0;
38
+ var Web = __importStar(require("./platforms/web"));
39
+ var util_1 = require("../libs/util");
40
+ var RUNTIME;
41
+ (function (RUNTIME) {
42
+ RUNTIME["WEB"] = "web";
43
+ RUNTIME["WX_MP"] = "wx_mp";
44
+ })(RUNTIME = exports.RUNTIME || (exports.RUNTIME = {}));
45
+ function useAdapters(adapters, options) {
46
+ var adapterList = (0, util_1.isArray)(adapters)
47
+ ? adapters
48
+ : [adapters];
49
+ for (var _i = 0, adapterList_1 = adapterList; _i < adapterList_1.length; _i++) {
50
+ var adapter = adapterList_1[_i];
51
+ var isMatch = adapter.isMatch, genAdapter = adapter.genAdapter, runtime = adapter.runtime;
52
+ if (isMatch()) {
53
+ return {
54
+ adapter: __assign({ isMatch: isMatch }, genAdapter(options)),
55
+ runtime: runtime,
56
+ };
57
+ }
58
+ }
59
+ }
60
+ exports.useAdapters = useAdapters;
61
+ function useDefaultAdapter() {
62
+ return {
63
+ adapter: __assign({}, Web.genAdapter()),
64
+ runtime: RUNTIME.WEB,
65
+ };
66
+ }
67
+ exports.useDefaultAdapter = useDefaultAdapter;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG1EQUFzQztBQUN0QyxxQ0FBc0M7QUFFdEMsSUFBWSxPQUdYO0FBSEQsV0FBWSxPQUFPO0lBQ2pCLHNCQUFXLENBQUE7SUFDWCwwQkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxPQUFPLEdBQVAsZUFBTyxLQUFQLGVBQU8sUUFHbEI7QUFNRCxTQUFnQixXQUFXLENBQUMsUUFBaUQsRUFBRSxPQUFhO0lBQzFGLElBQU0sV0FBVyxHQUF3QixJQUFBLGNBQU8sRUFBQyxRQUFRLENBQUM7UUFDeEQsQ0FBQyxDQUFFLFFBQWdDO1FBQ25DLENBQUMsQ0FBQyxDQUFDLFFBQTZCLENBQUMsQ0FBQTtJQUNuQyxLQUFzQixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtRQUE5QixJQUFNLE9BQU8sb0JBQUE7UUFDUixJQUFBLE9BQU8sR0FBMEIsT0FBTyxRQUFqQyxFQUFFLFVBQVUsR0FBYyxPQUFPLFdBQXJCLEVBQUUsT0FBTyxHQUFLLE9BQU8sUUFBWixDQUFZO1FBQ2hELElBQUksT0FBTyxFQUFFLEVBQUU7WUFDYixPQUFPO2dCQUNMLE9BQU8sYUFBSSxPQUFPLFNBQUEsSUFBSyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUU7Z0JBQzVDLE9BQU8sU0FBQTthQUNSLENBQUE7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQWJELGtDQWFDO0FBRUQsU0FBZ0IsaUJBQWlCO0lBQy9CLE9BQU87UUFDTCxPQUFPLGVBQU8sR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFFO1FBQ2hDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRztLQUNyQixDQUFBO0FBQ0gsQ0FBQztBQUxELDhDQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvdWRiYXNlQWRhcHRlciwgU0RLQWRhcHRlckludGVyZmFjZSwgTm9kZUFkYXB0ZXJJbnRlcmZhY2UgfSBmcm9tICdAY2xvdWRiYXNlL2FkYXB0ZXItaW50ZXJmYWNlJ1xuaW1wb3J0ICogYXMgV2ViIGZyb20gJy4vcGxhdGZvcm1zL3dlYidcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuLi9saWJzL3V0aWwnXG5cbmV4cG9ydCBlbnVtIFJVTlRJTUUge1xuICBXRUIgPSAnd2ViJyxcbiAgV1hfTVAgPSAnd3hfbXAnLCAvLyDlvq7kv6HlsI/nqIvluo9cbn1cblxudHlwZSBJQ2xvdWRiYXNlQWRhcHRlciA9IENsb3VkYmFzZUFkYXB0ZXIgJiB7XG4gIGdlbkFkYXB0ZXI6IChvcHRpb25zPzogYW55KSA9PiBTREtBZGFwdGVySW50ZXJmYWNlIHwgTm9kZUFkYXB0ZXJJbnRlcmZhY2Vcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZGFwdGVycyhhZGFwdGVyczogSUNsb3VkYmFzZUFkYXB0ZXIgfCBJQ2xvdWRiYXNlQWRhcHRlcltdLCBvcHRpb25zPzogYW55KSB7XG4gIGNvbnN0IGFkYXB0ZXJMaXN0OiBJQ2xvdWRiYXNlQWRhcHRlcltdID0gaXNBcnJheShhZGFwdGVycylcbiAgICA/IChhZGFwdGVycyBhcyBJQ2xvdWRiYXNlQWRhcHRlcltdKVxuICAgIDogW2FkYXB0ZXJzIGFzIElDbG91ZGJhc2VBZGFwdGVyXVxuICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlckxpc3QpIHtcbiAgICBjb25zdCB7IGlzTWF0Y2gsIGdlbkFkYXB0ZXIsIHJ1bnRpbWUgfSA9IGFkYXB0ZXJcbiAgICBpZiAoaXNNYXRjaCgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGFwdGVyOiB7IGlzTWF0Y2gsIC4uLmdlbkFkYXB0ZXIob3B0aW9ucykgfSxcbiAgICAgICAgcnVudGltZSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURlZmF1bHRBZGFwdGVyKCkge1xuICByZXR1cm4ge1xuICAgIGFkYXB0ZXI6IHsgLi4uV2ViLmdlbkFkYXB0ZXIoKSB9LFxuICAgIHJ1bnRpbWU6IFJVTlRJTUUuV0VCLFxuICB9XG59XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { SDKAdapterInterface, AbstractSDKRequest, IRequestOptions, ResponseObject, IUploadRequestOptions, IRequestConfig, IFetchOptions } from '@cloudbase/adapter-interface';
2
+ declare class WebRequest extends AbstractSDKRequest {
3
+ private readonly timeout;
4
+ private readonly timeoutMsg;
5
+ private readonly restrictedMethods;
6
+ constructor(config: IRequestConfig);
7
+ get(options: IRequestOptions): Promise<ResponseObject>;
8
+ post(options: IRequestOptions): Promise<ResponseObject>;
9
+ put(options: IRequestOptions): Promise<ResponseObject>;
10
+ upload(options: IUploadRequestOptions): Promise<ResponseObject>;
11
+ download(options: IRequestOptions): Promise<any>;
12
+ fetch(options: IFetchOptions & {
13
+ shouldThrowOnError?: boolean;
14
+ }): Promise<ResponseObject>;
15
+ protected request(options: IRequestOptions, enableAbort?: boolean): Promise<ResponseObject>;
16
+ }
17
+ declare function genAdapter(): SDKAdapterInterface & {
18
+ type?: 'default' | '';
19
+ };
20
+ export { genAdapter, WebRequest };
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.WebRequest = exports.genAdapter = void 0;
66
+ var adapter_interface_1 = require("@cloudbase/adapter-interface");
67
+ var util_1 = require("../../libs/util");
68
+ var common_1 = require("../../constants/common");
69
+ var WebRequest = (function (_super) {
70
+ __extends(WebRequest, _super);
71
+ function WebRequest(config) {
72
+ var _this = _super.call(this) || this;
73
+ var timeout = config.timeout, timeoutMsg = config.timeoutMsg, restrictedMethods = config.restrictedMethods;
74
+ _this.timeout = timeout || 0;
75
+ _this.timeoutMsg = timeoutMsg || '请求超时';
76
+ _this.restrictedMethods = restrictedMethods || ['get', 'post', 'upload', 'download'];
77
+ return _this;
78
+ }
79
+ WebRequest.prototype.get = function (options) {
80
+ return this.request(__assign(__assign({}, options), { method: 'get' }), this.restrictedMethods.includes('get'));
81
+ };
82
+ WebRequest.prototype.post = function (options) {
83
+ return this.request(__assign(__assign({}, options), { method: 'post' }), this.restrictedMethods.includes('post'));
84
+ };
85
+ WebRequest.prototype.put = function (options) {
86
+ return this.request(__assign(__assign({}, options), { method: 'put' }));
87
+ };
88
+ WebRequest.prototype.upload = function (options) {
89
+ var data = options.data, file = options.file, name = options.name, method = options.method, _a = options.headers, headers = _a === void 0 ? {} : _a;
90
+ var reqMethod = { post: 'post', put: 'put' }[method === null || method === void 0 ? void 0 : method.toLowerCase()] || 'put';
91
+ var formData = new FormData();
92
+ if (reqMethod === 'post') {
93
+ Object.keys(data).forEach(function (key) {
94
+ formData.append(key, data[key]);
95
+ });
96
+ formData.append('key', name);
97
+ formData.append('file', file);
98
+ return this.request(__assign(__assign({}, options), { data: formData, method: reqMethod }), this.restrictedMethods.includes('upload'));
99
+ }
100
+ return this.request(__assign(__assign({}, options), { method: 'put', headers: headers, body: file }), this.restrictedMethods.includes('upload'));
101
+ };
102
+ WebRequest.prototype.download = function (options) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ var data, url, fileName, link, e_1;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ _a.trys.push([0, 2, , 3]);
109
+ return [4, this.get(__assign(__assign({}, options), { headers: {}, responseType: 'blob' }))];
110
+ case 1:
111
+ data = (_a.sent()).data;
112
+ url = window.URL.createObjectURL(new Blob([data]));
113
+ fileName = decodeURIComponent(new URL(options.url).pathname.split('/').pop() || '');
114
+ link = document.createElement('a');
115
+ link.href = url;
116
+ link.setAttribute('download', fileName);
117
+ link.style.display = 'none';
118
+ document.body.appendChild(link);
119
+ link.click();
120
+ window.URL.revokeObjectURL(url);
121
+ document.body.removeChild(link);
122
+ return [3, 3];
123
+ case 2:
124
+ e_1 = _a.sent();
125
+ return [3, 3];
126
+ case 3: return [2, new Promise(function (resolve) {
127
+ resolve({
128
+ statusCode: 200,
129
+ tempFilePath: options.url,
130
+ });
131
+ })];
132
+ }
133
+ });
134
+ });
135
+ };
136
+ WebRequest.prototype.fetch = function (options) {
137
+ var _a;
138
+ return __awaiter(this, void 0, void 0, function () {
139
+ var abortController, url, _b, enableAbort, _c, stream, signal, _timeout, _d, shouldThrowOnError, timeout, timer, res;
140
+ var _this = this;
141
+ return __generator(this, function (_e) {
142
+ switch (_e.label) {
143
+ case 0:
144
+ abortController = new AbortController();
145
+ url = options.url, _b = options.enableAbort, enableAbort = _b === void 0 ? false : _b, _c = options.stream, stream = _c === void 0 ? false : _c, signal = options.signal, _timeout = options.timeout, _d = options.shouldThrowOnError, shouldThrowOnError = _d === void 0 ? true : _d;
146
+ timeout = _timeout !== null && _timeout !== void 0 ? _timeout : this.timeout;
147
+ if (signal) {
148
+ if (signal.aborted)
149
+ abortController.abort();
150
+ signal.addEventListener('abort', function () { return abortController.abort(); });
151
+ }
152
+ timer = null;
153
+ if (enableAbort && timeout) {
154
+ timer = setTimeout(function () {
155
+ console.warn(_this.timeoutMsg);
156
+ abortController.abort(new Error(_this.timeoutMsg));
157
+ }, timeout);
158
+ }
159
+ return [4, fetch(url, __assign(__assign({}, options), { signal: abortController.signal }))
160
+ .then(function (response) { return __awaiter(_this, void 0, void 0, function () {
161
+ var _a, _b, _c;
162
+ return __generator(this, function (_d) {
163
+ switch (_d.label) {
164
+ case 0:
165
+ clearTimeout(timer);
166
+ if (!shouldThrowOnError) return [3, 4];
167
+ if (!response.ok) return [3, 1];
168
+ _a = response;
169
+ return [3, 3];
170
+ case 1:
171
+ _c = (_b = Promise).reject;
172
+ return [4, response.json()];
173
+ case 2:
174
+ _a = _c.apply(_b, [_d.sent()]);
175
+ _d.label = 3;
176
+ case 3: return [2, _a];
177
+ case 4: return [2, response];
178
+ }
179
+ });
180
+ }); })
181
+ .catch(function (x) {
182
+ clearTimeout(timer);
183
+ return Promise.reject(x);
184
+ })];
185
+ case 1:
186
+ res = _e.sent();
187
+ return [2, {
188
+ data: stream ? res.body : ((_a = res.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.includes('application/json')) ? res.json() : res.text(),
189
+ statusCode: res.status,
190
+ header: res.headers,
191
+ response: res,
192
+ }];
193
+ }
194
+ });
195
+ });
196
+ };
197
+ WebRequest.prototype.request = function (options, enableAbort) {
198
+ var _this = this;
199
+ if (enableAbort === void 0) { enableAbort = false; }
200
+ var method = String(options.method).toLowerCase() || 'get';
201
+ return new Promise(function (resolve) {
202
+ var url = options.url, _a = options.headers, headers = _a === void 0 ? {} : _a, data = options.data, responseType = options.responseType, withCredentials = options.withCredentials, body = options.body, onUploadProgress = options.onUploadProgress;
203
+ var realUrl = (0, util_1.formatUrl)((0, common_1.getProtocol)(), url, method === 'get' ? data : {});
204
+ var ajax = new XMLHttpRequest();
205
+ ajax.open(method, realUrl);
206
+ responseType && (ajax.responseType = responseType);
207
+ var signal = options.signal;
208
+ if (signal) {
209
+ if (signal.aborted) {
210
+ ajax.abort();
211
+ }
212
+ else {
213
+ signal.addEventListener('abort', function () { return ajax.abort(); }, { once: true });
214
+ }
215
+ }
216
+ Object.keys(headers).forEach(function (key) {
217
+ ajax.setRequestHeader(key, headers[key]);
218
+ });
219
+ var timer;
220
+ if (onUploadProgress) {
221
+ ajax.upload.addEventListener('progress', onUploadProgress);
222
+ }
223
+ ajax.onreadystatechange = function () {
224
+ var result = {};
225
+ if (ajax.readyState === 4) {
226
+ var headers_1 = ajax.getAllResponseHeaders();
227
+ var arr = headers_1.trim().split(/[\r\n]+/);
228
+ var headerMap_1 = {};
229
+ arr.forEach(function (line) {
230
+ var parts = line.split(': ');
231
+ var header = parts.shift().toLowerCase();
232
+ var value = parts.join(': ');
233
+ headerMap_1[header] = value;
234
+ });
235
+ result.header = headerMap_1;
236
+ result.statusCode = ajax.status;
237
+ try {
238
+ result.data = responseType === 'blob' ? ajax.response : JSON.parse(ajax.responseText);
239
+ }
240
+ catch (e) {
241
+ result.data = responseType === 'blob' ? ajax.response : ajax.responseText;
242
+ }
243
+ clearTimeout(timer);
244
+ resolve(result);
245
+ }
246
+ };
247
+ if (enableAbort && _this.timeout) {
248
+ timer = setTimeout(function () {
249
+ console.warn(_this.timeoutMsg);
250
+ ajax.abort();
251
+ }, _this.timeout);
252
+ }
253
+ var payload;
254
+ if ((0, util_1.isFormData)(data)) {
255
+ payload = data;
256
+ }
257
+ else if (headers['content-type'] === 'application/x-www-form-urlencoded') {
258
+ payload = (0, util_1.toQueryString)(data);
259
+ }
260
+ else if (body) {
261
+ payload = body;
262
+ }
263
+ else {
264
+ payload = data ? JSON.stringify(data) : undefined;
265
+ }
266
+ if (withCredentials) {
267
+ ajax.withCredentials = true;
268
+ }
269
+ ajax.send(payload);
270
+ });
271
+ };
272
+ return WebRequest;
273
+ }(adapter_interface_1.AbstractSDKRequest));
274
+ exports.WebRequest = WebRequest;
275
+ function genAdapter() {
276
+ var adapter = {
277
+ type: 'default',
278
+ root: window,
279
+ reqClass: WebRequest,
280
+ wsClass: WebSocket,
281
+ localStorage: localStorage,
282
+ };
283
+ return adapter;
284
+ }
285
+ exports.genAdapter = genAdapter;
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL3BsYXRmb3Jtcy93ZWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrRUFTcUM7QUFDckMsd0NBQXNFO0FBQ3RFLGlEQUFvRDtBQUtwRDtJQUF5Qiw4QkFBa0I7SUFPekMsb0JBQVksTUFBc0I7UUFBbEMsWUFDRSxpQkFBTyxTQUtSO1FBSlMsSUFBQSxPQUFPLEdBQW9DLE1BQU0sUUFBMUMsRUFBRSxVQUFVLEdBQXdCLE1BQU0sV0FBOUIsRUFBRSxpQkFBaUIsR0FBSyxNQUFNLGtCQUFYLENBQVc7UUFDekQsS0FBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFBO1FBQzNCLEtBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFJLE1BQU0sQ0FBQTtRQUN0QyxLQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTs7SUFDckYsQ0FBQztJQUNNLHdCQUFHLEdBQVYsVUFBVyxPQUF3QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLHVCQUVaLE9BQU8sS0FDVixNQUFNLEVBQUUsS0FBSyxLQUVmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3ZDLENBQUE7SUFDSCxDQUFDO0lBQ00seUJBQUksR0FBWCxVQUFZLE9BQXdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sdUJBRVosT0FBTyxLQUNWLE1BQU0sRUFBRSxNQUFNLEtBRWhCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ3hDLENBQUE7SUFDSCxDQUFDO0lBQ00sd0JBQUcsR0FBVixVQUFXLE9B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Q0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7YUFDbEQ7WUFFRCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7YUFDNUI7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQTVPRCxDQUF5QixzQ0FBa0IsR0E0TzFDO0FBYW9CLGdDQUFVO0FBWC9CLFNBQVMsVUFBVTtJQUNqQixJQUFNLE9BQU8sR0FBb0Q7UUFDL0QsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUUsTUFBTTtRQUNaLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFlBQVksY0FBQTtLQUNiLENBQUE7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRVEsZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTREtBZGFwdGVySW50ZXJmYWNlLFxuICBBYnN0cmFjdFNES1JlcXVlc3QsXG4gIElSZXF1ZXN0T3B0aW9ucyxcbiAgUmVzcG9uc2VPYmplY3QsXG4gIElVcGxvYWRSZXF1ZXN0T3B0aW9ucyxcbiAgSVJlcXVlc3RDb25maWcsXG4gIElSZXF1ZXN0TWV0aG9kLFxuICBJRmV0Y2hPcHRpb25zLFxufSBmcm9tICdAY2xvdWRiYXNlL2FkYXB0ZXItaW50ZXJmYWNlJ1xuaW1wb3J0IHsgaXNGb3JtRGF0YSwgZm9ybWF0VXJsLCB0b1F1ZXJ5U3RyaW5nIH0gZnJvbSAnLi4vLi4vbGlicy91dGlsJ1xuaW1wb3J0IHsgZ2V0UHJvdG9jb2wgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29tbW9uJ1xuXG4vKipcbiAqIEBjbGFzcyBXZWJSZXF1ZXN0XG4gKi9cbmNsYXNzIFdlYlJlcXVlc3QgZXh0ZW5kcyBBYnN0cmFjdFNES1JlcXVlc3Qge1xuICAvLyDpu5jorqTkuI3pmZDotoXml7ZcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lb3V0OiBudW1iZXJcbiAgLy8g6LaF5pe25o+Q56S65paH5qGIXG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zZzogc3RyaW5nXG4gIC8vIOi2heaXtuWPl+mZkOivt+axguexu+Wei++8jOm7mOiupOaJgOacieivt+axguWdh+WPl+mZkFxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3RyaWN0ZWRNZXRob2RzOiBBcnJheTxJUmVxdWVzdE1ldGhvZD5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJUmVxdWVzdENvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICBjb25zdCB7IHRpbWVvdXQsIHRpbWVvdXRNc2csIHJlc3RyaWN0ZWRNZXRob2RzIH0gPSBjb25maWdcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0IHx8IDBcbiAgICB0aGlzLnRpbWVvdXRNc2cgPSB0aW1lb3V0TXNnIHx8ICfor7fmsYLotoXml7YnXG4gICAgdGhpcy5yZXN0cmljdGVkTWV0aG9kcyA9IHJlc3RyaWN0ZWRNZXRob2RzIHx8IFsnZ2V0JywgJ3Bvc3QnLCAndXBsb2FkJywgJ2Rvd25sb2FkJ11cbiAgfVxuICBwdWJsaWMgZ2V0KG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2VPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgfSxcbiAgICAgIHRoaXMucmVzdHJpY3RlZE1ldGhvZHMuaW5jbHVkZXMoJ2dldCcpLFxuICAgIClcbiAgfVxuICBwdWJsaWMgcG9zdChvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB9LFxuICAgICAgdGhpcy5yZXN0cmljdGVkTWV0aG9kcy5pbmNsdWRlcygncG9zdCcpLFxuICAgIClcbiAgfVxuICBwdWJsaWMgcHV0KG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2VPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtZXRob2Q6ICdwdXQnLFxuICAgIH0pXG4gIH1cbiAgcHVibGljIHVwbG9hZChvcHRpb25zOiBJVXBsb2FkUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlT2JqZWN0PiB7XG4gICAgY29uc3QgeyBkYXRhLCBmaWxlLCBuYW1lLCBtZXRob2QsIGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9uc1xuICAgIGNvbnN0IHJlcU1ldGhvZCA9IHsgcG9zdDogJ3Bvc3QnLCBwdXQ6ICdwdXQnIH1bbWV0aG9kPy50b0xvd2VyQ2FzZSgpXSB8fCAncHV0J1xuICAgIC8vIOS4iuS8oOaWueW8j+S4unBvc3Tml7bvvIzpnIDovazmjaLkuLpGb3JtRGF0YVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBpZiAocmVxTWV0aG9kID09PSAncG9zdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBkYXRhW2tleV0pXG4gICAgICB9KVxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdrZXknLCBuYW1lKVxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSlcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgICAgIG1ldGhvZDogcmVxTWV0aG9kLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnJlc3RyaWN0ZWRNZXRob2RzLmluY2x1ZGVzKCd1cGxvYWQnKSxcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbWV0aG9kOiAncHV0JyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keTogZmlsZSxcbiAgICAgIH0sXG4gICAgICB0aGlzLnJlc3RyaWN0ZWRNZXRob2RzLmluY2x1ZGVzKCd1cGxvYWQnKSxcbiAgICApXG4gIH1cbiAgcHVibGljIGFzeW5jIGRvd25sb2FkKG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXQoe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7fSwgLy8g5LiL6L296LWE5rqQ6K+35rGC5LiN57uP6L+Hc2VydmljZe+8jGhlYWRlcua4heepulxuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyxcbiAgICAgIH0pXG4gICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZGF0YV0pKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQobmV3IFVSTChvcHRpb25zLnVybCkucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKSB8fCAnJylcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcblxuICAgICAgbGluay5ocmVmID0gdXJsXG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlTmFtZSlcbiAgICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspXG4gICAgICBsaW5rLmNsaWNrKClcbiAgICAgIC8vIOWbnuaUtuWGheWtmFxuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICB0ZW1wRmlsZVBhdGg6IG9wdGlvbnMudXJsLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG4gIGFzeW5jIGZldGNoKG9wdGlvbnM6IElGZXRjaE9wdGlvbnMgJiB7IHNob3VsZFRocm93T25FcnJvcj86IGJvb2xlYW4gfSk6IFByb21pc2U8UmVzcG9uc2VPYmplY3Q+IHtcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCB7IHVybCwgZW5hYmxlQWJvcnQgPSBmYWxzZSwgc3RyZWFtID0gZmFsc2UsIHNpZ25hbCwgdGltZW91dDogX3RpbWVvdXQsIHNob3VsZFRocm93T25FcnJvciA9IHRydWUgfSA9IG9wdGlvbnNcblxuICAgIGNvbnN0IHRpbWVvdXQgPSBfdGltZW91dCA/PyB0aGlzLnRpbWVvdXRcblxuICAgIC8vIEZJWE1FKOWGheWtmOazhOa8jyk6IHsgb25jZTogdHJ1ZSB9IOWPquWcqCBhYm9ydCDkuovku7bjgJDop6blj5HlkI7jgJHmiY3op6Pnu5Hnm5HlkKzlmajjgIJcbiAgICAvLyAgIOWmguaenOivt+axguato+W4uOWujOaIkOOAgeS7juacqiBhYm9ydO+8jOivpeebkeWQrOWZqOS8muS4gOebtOaui+eVmeWcqOWklumDqCBzaWduYWwg5LiK44CCXG4gICAgLy8gICDlvZPosIPnlKjmlrnlpI3nlKjlkIzkuIDplb/nlJ/lkb3lkajmnJ8gc2lnbmFsIOWPjeWkjeWPkeivt+axguaXtu+8jOebkeWQrOWZqOS7jeS8muaMgee7ree0r+enr+OAglxuICAgIC8vICAg5qC55rK75pa55byP77ya5Zyo6K+35rGC57uT5p2f77yIZmluYWxsee+8ieaXtiByZW1vdmVFdmVudExpc3RlbmVyIOS4u+WKqOino+e7ke+8jFxuICAgIC8vICAg6ICM5LiN6IO95LuF5L6d6LWWIHsgb25jZTogdHJ1ZSB944CC5q2k5aSE5pqC5LuF6K6w5b2V77yM5LiN5pS55Yqo6YC76L6R44CCXG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpXG4gICAgfVxuXG4gICAgbGV0IHRpbWVyID0gbnVsbFxuICAgIGlmIChlbmFibGVBYm9ydCAmJiB0aW1lb3V0KSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4odGhpcy50aW1lb3V0TXNnKVxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKHRoaXMudGltZW91dE1zZykpXG4gICAgICB9LCB0aW1lb3V0KVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KVxuICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgaWYgKHNob3VsZFRocm93T25FcnJvcikge1xuICAgICAgICAgIC8vIDQwNCDnrYnnrYnkuZ/kvJrov5sgcmVzb2x2Ze+8jOaJgOS7peimgeWGjemAmui/hyBvayDliKTmlq1cbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uub2sgPyByZXNwb25zZSA6IFByb21pc2UucmVqZWN0KGF3YWl0IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKHgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgICAvLyDkvKDovpPnuqflpLHotKXvvIjnvZHnu5zkuK3mlq3jgIFDT1JTIOmihOajgOiiq+aLkuOAgeivt+axguiiqyBhYm9ydCDnrYnvvInml7YgZmV0Y2gg5LyaIHJlamVjdO+8jFxuICAgICAgICAvLyDmraTml7bmsqHmnInlj6/op6PmnpDnmoQgUmVzcG9uc2XjgILml6Dorrogc2hvdWxkVGhyb3dPbkVycm9yIOWPluWAvOmDveW/hemhu+aKiuecn+WunumUmeivr+aKm+WHuu+8jFxuICAgICAgICAvLyDlkKbliJkgcmVzIOS8muWPmOaIkCB1bmRlZmluZWTvvIzkuIvmlrnor7vlj5YgcmVzLmhlYWRlcnMg5Lya5oqb5Ye65Luk5Lq66K+v6Kej55qEXG4gICAgICAgIC8vIFwiQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2hlYWRlcnMnKVwi77yM5o6p55uW55yf5q2j55qE6ZSZ6K+v5Y6f5Zug44CCXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh4KVxuICAgICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgIGRhdGE6IHN0cmVhbSA/IHJlcy5ib2R5IDogcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlcy5qc29uKCkgOiByZXMudGV4dCgpLFxuICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1cyxcbiAgICAgIGhlYWRlcjogcmVzLmhlYWRlcnMsXG4gICAgICAvLyDpgI/lh7rljp/lp4sgUmVzcG9uc2XvvIzkvr/kuo7kuIrlsYLmjInpnIAgLmJsb2IoKSAvIC5hcnJheUJ1ZmZlcigpIC8g6K+75Y+WIGJvZHkg5rWB77yM6YG/5YWN5LqM5qyh5YyF6KOF44CCXG4gICAgICByZXNwb25zZTogcmVzLFxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtJUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVBYm9ydCDmmK/lkKbotoXml7bkuK3mlq3or7fmsYJcbiAgICovXG4gIHByb3RlY3RlZCByZXF1ZXN0KG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucywgZW5hYmxlQWJvcnQgPSBmYWxzZSk6IFByb21pc2U8UmVzcG9uc2VPYmplY3Q+IHtcbiAgICBjb25zdCBtZXRob2QgPSBTdHJpbmcob3B0aW9ucy5tZXRob2QpLnRvTG93ZXJDYXNlKCkgfHwgJ2dldCdcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHsgdXJsLCBoZWFkZXJzID0ge30sIGRhdGEsIHJlc3BvbnNlVHlwZSwgd2l0aENyZWRlbnRpYWxzLCBib2R5LCBvblVwbG9hZFByb2dyZXNzIH0gPSBvcHRpb25zXG4gICAgICBjb25zdCByZWFsVXJsID0gZm9ybWF0VXJsKGdldFByb3RvY29sKCksIHVybCwgbWV0aG9kID09PSAnZ2V0JyA/IGRhdGEgOiB7fSlcbiAgICAgIGNvbnN0IGFqYXggPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgYWpheC5vcGVuKG1ldGhvZCwgcmVhbFVybClcbiAgICAgIHJlc3BvbnNlVHlwZSAmJiAoYWpheC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUpXG4gICAgICAvLyDmlK/mjIHpgJrov4cgQWJvcnRTaWduYWwg5Y+W5raI6K+35rGC77ya5beyIGFib3J0IOeri+WNs+WPlua2iO+8m+WQpuWImeeUqCB7IG9uY2U6IHRydWUgfVxuICAgICAgLy8g55uR5ZCs77yM6Kem5Y+R5ZCO6Ieq5Yqo6Kej57uR77yM6YG/5YWN5aSN55So5ZCM5LiAIEFib3J0Q29udHJvbGxlciDlpJrmrKHor7fmsYLml7bntK/np6/nm5HlkKzlmajjgIJcbiAgICAgIC8vXG4gICAgICAvLyBGSVhNRSjlhoXlrZjms4TmvI8pOiB7IG9uY2U6IHRydWUgfSDlj6rlnKggYWJvcnQg5LqL5Lu244CQ6Kem5Y+R5ZCO44CR5omN6Kej57uR55uR5ZCs5Zmo44CCXG4gICAgICAvLyAgIOWmguaenOivt+axguato+W4uOWujOaIkOOAgeS7juacqiBhYm9ydO+8jOivpeebkeWQrOWZqOS8muS4gOebtOaui+eVmeWcqOWklumDqCBzaWduYWwg5LiK44CCXG4gICAgICAvLyAgIOW9k+iwg+eUqOaWueWkjeeUqOWQjOS4gOmVv+eUn+WRveWRqOacnyBzaWduYWwg5Y+N5aSN5Y+R6K+35rGC5pe277yM55uR5ZCs5Zmo5LuN5Lya5oyB57ut57Sv56ev44CCXG4gICAgICAvLyAgIOagueayu+aWueW8j++8muWcqOivt+axgue7k+adn++8iHJlYWR5U3RhdGU9PT00IC8gb25sb2FkZW5k77yJ5pe2IHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICAgIC8vICAg5Li75Yqo6Kej57uR77yM6ICM5LiN6IO95LuF5L6d6LWWIHsgb25jZTogdHJ1ZSB944CC5q2k5aSE5pqC5LuF6K6w5b2V77yM5LiN5pS55Yqo6YC76L6R44CCXG4gICAgICBjb25zdCBzaWduYWwgPSAob3B0aW9ucyBhcyBhbnkpLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhamF4LmFib3J0KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBhamF4LmFib3J0KCksIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgYWpheC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgfSlcbiAgICAgIGxldCB0aW1lclxuICAgICAgaWYgKG9uVXBsb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgYWpheC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvblVwbG9hZFByb2dyZXNzKVxuICAgICAgfVxuICAgICAgYWpheC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzcG9uc2VPYmplY3QgPSB7fVxuICAgICAgICBpZiAoYWpheC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IGFqYXguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICAgICBjb25zdCBhcnIgPSBoZWFkZXJzLnRyaW0oKS5zcGxpdCgvW1xcclxcbl0rLylcbiAgICAgICAgICAvLyBDcmVhdGUgYSBtYXAgb2YgaGVhZGVyIG5hbWVzIHRvIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGhlYWRlck1hcCA9IHt9XG4gICAgICAgICAgYXJyLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdCgnOiAnKVxuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gcGFydHMuc2hpZnQoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnRzLmpvaW4oJzogJylcbiAgICAgICAgICAgIGhlYWRlck1hcFtoZWFkZXJdID0gdmFsdWVcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJlc3VsdC5oZWFkZXIgPSBoZWFkZXJNYXBcbiAgICAgICAgICByZXN1bHQuc3RhdHVzQ29kZSA9IGFqYXguc3RhdHVzXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOS4iuS8oHBvc3Tor7fmsYLov5Tlm57mlbDmja7moLzlvI/kuLp4bWzvvIzmraTlpITlrrnplJlcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gcmVzcG9uc2VUeXBlID09PSAnYmxvYicgPyBhamF4LnJlc3BvbnNlIDogSlNPTi5wYXJzZShhamF4LnJlc3BvbnNlVGV4dClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InID8gYWpheC5yZXNwb25zZSA6IGFqYXgucmVzcG9uc2VUZXh0XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVuYWJsZUFib3J0ICYmIHRoaXMudGltZW91dCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih0aGlzLnRpbWVvdXRNc2cpXG4gICAgICAgICAgYWpheC5hYm9ydCgpXG4gICAgICAgIH0sIHRoaXMudGltZW91dClcbiAgICAgIH1cbiAgICAgIC8vIOWkhOeQhiBwYXlsb2FkXG4gICAgICBsZXQgcGF5bG9hZFxuICAgICAgaWYgKGlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICAgICAgLy8gRm9ybURhdGHvvIzkuI3lpITnkIZcbiAgICAgICAgcGF5bG9hZCA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAoaGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAgIHBheWxvYWQgPSB0b1F1ZXJ5U3RyaW5nKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGJvZHkpIHtcbiAgICAgICAgcGF5bG9hZCA9IGJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWFtuWug+aDheWGtVxuICAgICAgICBwYXlsb2FkID0gZGF0YSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICh3aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgYWpheC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICB9XG4gICAgICBhamF4LnNlbmQocGF5bG9hZClcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkFkYXB0ZXIoKSB7XG4gIGNvbnN0IGFkYXB0ZXI6IFNES0FkYXB0ZXJJbnRlcmZhY2UgJiB7IHR5cGU/OiAnZGVmYXVsdCcgfCAnJyB9ID0ge1xuICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICByb290OiB3aW5kb3csXG4gICAgcmVxQ2xhc3M6IFdlYlJlcXVlc3QsXG4gICAgd3NDbGFzczogV2ViU29ja2V0LFxuICAgIGxvY2FsU3RvcmFnZSxcbiAgfVxuICByZXR1cm4gYWRhcHRlclxufVxuXG5leHBvcnQgeyBnZW5BZGFwdGVyLCBXZWJSZXF1ZXN0IH1cbiJdfQ==