@cloudbase/auth 3.1.8 → 3.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,77 @@
1
+ import type { authModels } from '@cloudbase/oauth';
2
+ import type { SignUpRes } from './type';
3
+ export declare class WeixinAuthProvider {
4
+ constructor(_options: {
5
+ authInstance: any;
6
+ appid: string;
7
+ scope: string;
8
+ });
9
+ signInWithRedirect(): void;
10
+ getRedirectResult(_options?: {
11
+ createUser?: boolean;
12
+ syncUserInfo?: boolean;
13
+ }): Promise<any>;
14
+ getLinkRedirectResult(_options?: {
15
+ withUnionId?: boolean;
16
+ }): Promise<void>;
17
+ }
18
+ export declare class CustomAuthProvider {
19
+ private authInstance;
20
+ constructor(options: {
21
+ authInstance: any;
22
+ });
23
+ signIn(ticket: string): Promise<void>;
24
+ }
25
+ export declare class AnonymousAuthProvider {
26
+ private authInstance;
27
+ constructor(options: {
28
+ authInstance: any;
29
+ });
30
+ signIn(): Promise<void>;
31
+ }
32
+ export declare abstract class AuthV1Compat {
33
+ abstract readonly config: any;
34
+ weixinAuthProvider(options: {
35
+ appid: string;
36
+ scope: string;
37
+ }): WeixinAuthProvider;
38
+ customAuthProvider(): CustomAuthProvider;
39
+ anonymousAuthProvider(): AnonymousAuthProvider;
40
+ signUpWithEmailAndPassword(email: string, password: string): Promise<SignUpRes>;
41
+ signInWithEmailAndPassword(email: string, password: string): Promise<any>;
42
+ sendPasswordResetEmail(email: string): Promise<void>;
43
+ signInWithUsernameAndPassword(username: string, password: string): Promise<any>;
44
+ sendPhoneCode(phoneNumber: string): Promise<boolean>;
45
+ signUpWithPhoneCode(phoneNumber: string, phoneCode: string, password?: string): Promise<any>;
46
+ signInWithPhoneCodeOrPassword(params: {
47
+ phoneNumber: string;
48
+ phoneCode?: string;
49
+ password?: string;
50
+ }): Promise<any>;
51
+ forceResetPwdByPhoneCode(params: {
52
+ phoneNumber: string;
53
+ phoneCode: string;
54
+ password: string;
55
+ }): Promise<any>;
56
+ shouldRefreshAccessToken(_callback: () => boolean): void;
57
+ onLoginStateExpired(callback: Function): void;
58
+ onAccessTokenRefreshed(callback: Function): void;
59
+ onAnonymousConverted(callback: Function): void;
60
+ onLoginTypeChanged(callback: Function): void;
61
+ abstract signIn(params: authModels.SignInRequest): Promise<any>;
62
+ abstract signUp(params: authModels.SignUpRequest & {
63
+ phone?: string;
64
+ }): Promise<SignUpRes>;
65
+ abstract signInWithCustomTicket(getTickFn?: authModels.GetCustomSignTicketFn): Promise<any>;
66
+ abstract signInAnonymously(params: any): Promise<any>;
67
+ abstract getVerification(params: any, options?: any): Promise<authModels.GetVerificationResponse>;
68
+ abstract resetPassword(params: authModels.ResetPasswordRequest): Promise<void>;
69
+ abstract onLoginStateChanged(callback: Function): Promise<void>;
70
+ abstract onAuthStateChange(callback: any): any;
71
+ abstract createLoginState(params?: any, options?: any): Promise<any>;
72
+ abstract signInWithOAuth(params: any): Promise<any>;
73
+ abstract grantProviderToken(params: authModels.GrantProviderTokenRequest): Promise<authModels.GrantProviderTokenResponse>;
74
+ abstract bindWithProvider(params: authModels.BindWithProviderRequest): Promise<void>;
75
+ protected abstract formatPhone(phone: string): string;
76
+ }
77
+ export declare function applyUserV1Compat(UserClass: any): void;
@@ -0,0 +1,423 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ 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;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.applyUserV1Compat = exports.AuthV1Compat = exports.AnonymousAuthProvider = exports.CustomAuthProvider = exports.WeixinAuthProvider = void 0;
51
+ var oauth_1 = require("@cloudbase/oauth");
52
+ var utilities_1 = require("./utilities");
53
+ var WeixinAuthProvider = (function () {
54
+ function WeixinAuthProvider(_options) {
55
+ }
56
+ WeixinAuthProvider.prototype.signInWithRedirect = function () {
57
+ throw new Error('[v1 兼容] WeixinAuthProvider.signInWithRedirect() 在当前版本中无法实现。'
58
+ + ' 建议使用 auth.signInWithOAuth({ provider: \'providerId\' }) 替代。');
59
+ };
60
+ WeixinAuthProvider.prototype.getRedirectResult = function (_options) {
61
+ return __awaiter(this, void 0, void 0, function () {
62
+ return __generator(this, function (_a) {
63
+ throw new Error('[v1 兼容] WeixinAuthProvider.getRedirectResult() 在当前版本中无法实现。'
64
+ + ' 建议使用 auth.verifyOAuth({ code, state, provider }) 替代。');
65
+ });
66
+ });
67
+ };
68
+ WeixinAuthProvider.prototype.getLinkRedirectResult = function (_options) {
69
+ return __awaiter(this, void 0, void 0, function () {
70
+ return __generator(this, function (_a) {
71
+ throw new Error('[v1 兼容] WeixinAuthProvider.getLinkRedirectResult() 在当前版本中无法实现。'
72
+ + ' 建议使用 auth.linkIdentity({ provider: \'providerId\' }) 替代。');
73
+ });
74
+ });
75
+ };
76
+ return WeixinAuthProvider;
77
+ }());
78
+ exports.WeixinAuthProvider = WeixinAuthProvider;
79
+ var CustomAuthProvider = (function () {
80
+ function CustomAuthProvider(options) {
81
+ this.authInstance = options.authInstance;
82
+ }
83
+ CustomAuthProvider.prototype.signIn = function (ticket) {
84
+ return __awaiter(this, void 0, void 0, function () {
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0: return [4, this.authInstance.signInWithCustomTicket(function () { return Promise.resolve(ticket); })];
88
+ case 1:
89
+ _a.sent();
90
+ return [2];
91
+ }
92
+ });
93
+ });
94
+ };
95
+ return CustomAuthProvider;
96
+ }());
97
+ exports.CustomAuthProvider = CustomAuthProvider;
98
+ var AnonymousAuthProvider = (function () {
99
+ function AnonymousAuthProvider(options) {
100
+ this.authInstance = options.authInstance;
101
+ }
102
+ AnonymousAuthProvider.prototype.signIn = function () {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0: return [4, this.authInstance.signInAnonymously({})];
107
+ case 1:
108
+ _a.sent();
109
+ return [2];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ return AnonymousAuthProvider;
115
+ }());
116
+ exports.AnonymousAuthProvider = AnonymousAuthProvider;
117
+ var AuthV1Compat = (function () {
118
+ function AuthV1Compat() {
119
+ }
120
+ AuthV1Compat.prototype.weixinAuthProvider = function (options) {
121
+ return new WeixinAuthProvider({
122
+ authInstance: this,
123
+ appid: options.appid,
124
+ scope: options.scope,
125
+ });
126
+ };
127
+ AuthV1Compat.prototype.customAuthProvider = function () {
128
+ return new CustomAuthProvider({
129
+ authInstance: this,
130
+ });
131
+ };
132
+ AuthV1Compat.prototype.anonymousAuthProvider = function () {
133
+ return new AnonymousAuthProvider({
134
+ authInstance: this,
135
+ });
136
+ };
137
+ AuthV1Compat.prototype.signUpWithEmailAndPassword = function (email, password) {
138
+ return __awaiter(this, void 0, void 0, function () {
139
+ return __generator(this, function (_a) {
140
+ switch (_a.label) {
141
+ case 0:
142
+ if (typeof email !== 'string') {
143
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'email must be a string');
144
+ }
145
+ if (typeof password !== 'string') {
146
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'password must be a string');
147
+ }
148
+ return [4, this.signUp({
149
+ email: email,
150
+ password: password,
151
+ })];
152
+ case 1: return [2, _a.sent()];
153
+ }
154
+ });
155
+ });
156
+ };
157
+ AuthV1Compat.prototype.signInWithEmailAndPassword = function (email, password) {
158
+ return __awaiter(this, void 0, void 0, function () {
159
+ return __generator(this, function (_a) {
160
+ switch (_a.label) {
161
+ case 0:
162
+ if (typeof email !== 'string') {
163
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'email must be a string');
164
+ }
165
+ if (typeof password !== 'string') {
166
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'password must be a string');
167
+ }
168
+ return [4, this.signIn({
169
+ username: email,
170
+ password: password,
171
+ })];
172
+ case 1:
173
+ _a.sent();
174
+ return [2, this.createLoginState()];
175
+ }
176
+ });
177
+ });
178
+ };
179
+ AuthV1Compat.prototype.sendPasswordResetEmail = function (email) {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ return __generator(this, function (_a) {
182
+ switch (_a.label) {
183
+ case 0:
184
+ if (typeof email !== 'string') {
185
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'email must be a string');
186
+ }
187
+ return [4, this.getVerification({ email: email })];
188
+ case 1:
189
+ _a.sent();
190
+ return [2];
191
+ }
192
+ });
193
+ });
194
+ };
195
+ AuthV1Compat.prototype.signInWithUsernameAndPassword = function (username, password) {
196
+ return __awaiter(this, void 0, void 0, function () {
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0:
200
+ if (typeof username !== 'string') {
201
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'username must be a string');
202
+ }
203
+ if (typeof password !== 'string') {
204
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'password must be a string');
205
+ }
206
+ return [4, this.signIn({
207
+ username: username,
208
+ password: password,
209
+ })];
210
+ case 1:
211
+ _a.sent();
212
+ return [2, this.createLoginState()];
213
+ }
214
+ });
215
+ });
216
+ };
217
+ AuthV1Compat.prototype.sendPhoneCode = function (phoneNumber) {
218
+ return __awaiter(this, void 0, void 0, function () {
219
+ var formattedPhone;
220
+ return __generator(this, function (_a) {
221
+ switch (_a.label) {
222
+ case 0:
223
+ if (typeof phoneNumber !== 'string') {
224
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneNumber must be a string');
225
+ }
226
+ formattedPhone = this.formatPhone(phoneNumber);
227
+ return [4, this.getVerification({ phone_number: formattedPhone })];
228
+ case 1:
229
+ _a.sent();
230
+ return [2, true];
231
+ }
232
+ });
233
+ });
234
+ };
235
+ AuthV1Compat.prototype.signUpWithPhoneCode = function (phoneNumber, phoneCode, password) {
236
+ return __awaiter(this, void 0, void 0, function () {
237
+ var formattedPhone;
238
+ return __generator(this, function (_a) {
239
+ switch (_a.label) {
240
+ case 0:
241
+ if (typeof phoneNumber !== 'string') {
242
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneNumber must be a string');
243
+ }
244
+ if (typeof phoneCode !== 'string') {
245
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneCode must be a string');
246
+ }
247
+ formattedPhone = this.formatPhone(phoneNumber);
248
+ return [4, this.signUp(__assign({ phone_number: formattedPhone, verification_code: phoneCode }, (password ? { password: password } : {})))];
249
+ case 1:
250
+ _a.sent();
251
+ return [2, this.createLoginState()];
252
+ }
253
+ });
254
+ });
255
+ };
256
+ AuthV1Compat.prototype.signInWithPhoneCodeOrPassword = function (params) {
257
+ return __awaiter(this, void 0, void 0, function () {
258
+ var phoneNumber, phoneCode, password, formattedPhone;
259
+ return __generator(this, function (_a) {
260
+ switch (_a.label) {
261
+ case 0:
262
+ phoneNumber = params.phoneNumber, phoneCode = params.phoneCode, password = params.password;
263
+ if (typeof phoneNumber !== 'string') {
264
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneNumber must be a string');
265
+ }
266
+ formattedPhone = this.formatPhone(phoneNumber);
267
+ if (!password) return [3, 2];
268
+ return [4, this.signIn({
269
+ username: formattedPhone,
270
+ password: password,
271
+ })];
272
+ case 1:
273
+ _a.sent();
274
+ return [3, 5];
275
+ case 2:
276
+ if (!phoneCode) return [3, 4];
277
+ return [4, this.signIn({
278
+ username: formattedPhone,
279
+ verification_token: phoneCode,
280
+ })];
281
+ case 3:
282
+ _a.sent();
283
+ return [3, 5];
284
+ case 4:
285
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneCode or password must be provided');
286
+ _a.label = 5;
287
+ case 5: return [2, this.createLoginState()];
288
+ }
289
+ });
290
+ });
291
+ };
292
+ AuthV1Compat.prototype.forceResetPwdByPhoneCode = function (params) {
293
+ return __awaiter(this, void 0, void 0, function () {
294
+ var phoneNumber, phoneCode, password, formattedPhone;
295
+ return __generator(this, function (_a) {
296
+ switch (_a.label) {
297
+ case 0:
298
+ phoneNumber = params.phoneNumber, phoneCode = params.phoneCode, password = params.password;
299
+ if (typeof phoneNumber !== 'string') {
300
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneNumber must be a string');
301
+ }
302
+ if (typeof phoneCode !== 'string') {
303
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'phoneCode must be a string');
304
+ }
305
+ if (typeof password !== 'string') {
306
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'password must be a string');
307
+ }
308
+ formattedPhone = this.formatPhone(phoneNumber);
309
+ return [4, this.resetPassword({
310
+ phone_number: formattedPhone,
311
+ new_password: password,
312
+ verification_token: phoneCode,
313
+ })];
314
+ case 1:
315
+ _a.sent();
316
+ return [4, this.signIn({
317
+ username: formattedPhone,
318
+ password: password,
319
+ })];
320
+ case 2:
321
+ _a.sent();
322
+ return [2, this.createLoginState()];
323
+ }
324
+ });
325
+ });
326
+ };
327
+ AuthV1Compat.prototype.shouldRefreshAccessToken = function (_callback) {
328
+ throw new Error('[v1 兼容] shouldRefreshAccessToken() 在当前版本中无法实现。'
329
+ + ' 建议使用 auth.onAuthStateChange(callback) 来监听 TOKEN_REFRESHED 事件替代。');
330
+ };
331
+ AuthV1Compat.prototype.onLoginStateExpired = function (callback) {
332
+ var _this = this;
333
+ this.onLoginStateChanged(function (params) {
334
+ if ((params === null || params === void 0 ? void 0 : params.eventType) === oauth_1.LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR) {
335
+ callback.call(_this);
336
+ }
337
+ });
338
+ };
339
+ AuthV1Compat.prototype.onAccessTokenRefreshed = function (callback) {
340
+ var _this = this;
341
+ this.onAuthStateChange(function (event) {
342
+ if (event === oauth_1.AUTH_STATE_CHANGED_TYPE.TOKEN_REFRESHED) {
343
+ callback.call(_this);
344
+ }
345
+ });
346
+ };
347
+ AuthV1Compat.prototype.onAnonymousConverted = function (callback) {
348
+ var _this = this;
349
+ this.onAuthStateChange(function (event) {
350
+ if (event === oauth_1.AUTH_STATE_CHANGED_TYPE.SIGNED_IN) {
351
+ callback.call(_this);
352
+ }
353
+ });
354
+ };
355
+ AuthV1Compat.prototype.onLoginTypeChanged = function (callback) {
356
+ var _this = this;
357
+ this.onAuthStateChange(function (event) {
358
+ if (event === oauth_1.AUTH_STATE_CHANGED_TYPE.SIGNED_IN || event === oauth_1.AUTH_STATE_CHANGED_TYPE.SIGNED_OUT) {
359
+ callback.call(_this);
360
+ }
361
+ });
362
+ };
363
+ return AuthV1Compat;
364
+ }());
365
+ exports.AuthV1Compat = AuthV1Compat;
366
+ function applyUserV1Compat(UserClass) {
367
+ UserClass.prototype.linkWithTicket = function (_ticket) {
368
+ return __awaiter(this, void 0, void 0, function () {
369
+ return __generator(this, function (_a) {
370
+ throw new Error('[v1 兼容] User.linkWithTicket() 在当前版本中无法实现。'
371
+ + ' 建议使用 auth.signInWithCustomTicket(() => Promise.resolve(ticket)) 替代。');
372
+ });
373
+ });
374
+ };
375
+ UserClass.prototype.linkWithRedirect = function (_provider) {
376
+ throw new Error('[v1 兼容] User.linkWithRedirect() 在当前版本中无法实现。'
377
+ + ' 建议使用 auth.linkIdentity({ provider: \'providerId\' }) 替代。');
378
+ };
379
+ UserClass.prototype.updateEmail = function (newEmail, _password) {
380
+ return __awaiter(this, void 0, void 0, function () {
381
+ return __generator(this, function (_a) {
382
+ switch (_a.label) {
383
+ case 0:
384
+ if (typeof newEmail !== 'string') {
385
+ (0, utilities_1.throwError)(utilities_1.ERRORS.INVALID_PARAMS, 'newEmail must be a string');
386
+ }
387
+ return [4, this.updateUserBasicInfo({
388
+ email: newEmail,
389
+ })];
390
+ case 1:
391
+ _a.sent();
392
+ return [2];
393
+ }
394
+ });
395
+ });
396
+ };
397
+ UserClass.prototype.linkWithPhoneNumber = function (_phoneNumber, _phoneCode) {
398
+ return __awaiter(this, void 0, void 0, function () {
399
+ return __generator(this, function (_a) {
400
+ throw new Error('[v1 兼容] User.linkWithPhoneNumber() 在当前版本中无法实现。'
401
+ + ' 建议使用 auth.bindPhoneNumber({ phone_number, verification_token, sudo_token }) 替代。');
402
+ });
403
+ });
404
+ };
405
+ UserClass.prototype.updatePhoneNumber = function (_phoneNumber, _phoneCode) {
406
+ return __awaiter(this, void 0, void 0, function () {
407
+ return __generator(this, function (_a) {
408
+ throw new Error('[v1 兼容] User.updatePhoneNumber() 在当前版本中无法实现。'
409
+ + ' 建议使用 auth.updateUser({ phone: newPhoneNumber }) 替代。');
410
+ });
411
+ });
412
+ };
413
+ UserClass.prototype.unlink = function (_loginType) {
414
+ return __awaiter(this, void 0, void 0, function () {
415
+ return __generator(this, function (_a) {
416
+ throw new Error('[v1 兼容] User.unlink() 在当前版本中无法实现。'
417
+ + ' 建议使用 auth.unlinkIdentity({ provider: loginType }) 替代。');
418
+ });
419
+ });
420
+ };
421
+ }
422
+ exports.applyUserV1Compat = applyUserV1Compat;
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjEtY29tcGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3YxLWNvbXBhdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLDBDQUd5QjtBQUN6Qix5Q0FHb0I7QUFXcEI7SUFDRSw0QkFBWSxRQUlYO0lBRUQsQ0FBQztJQU1NLCtDQUFrQixHQUF6QjtRQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZEO2NBQ3pFLDhEQUE4RCxDQUFFLENBQUE7SUFDdEUsQ0FBQztJQU1ZLDhDQUFpQixHQUE5QixVQUErQixRQUc5Qjs7O2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTREO3NCQUN4RSx1REFBdUQsQ0FBRSxDQUFBOzs7S0FDOUQ7SUFNWSxrREFBcUIsR0FBbEMsVUFBbUMsUUFFbEM7OztnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRTtzQkFDNUUsMkRBQTJELENBQUUsQ0FBQTs7O0tBQ2xFO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBeENELElBd0NDO0FBeENZLGdEQUFrQjtBQWdEL0I7SUFHRSw0QkFBWSxPQUVYO1FBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO0lBQzFDLENBQUM7SUFPWSxtQ0FBTSxHQUFuQixVQUFvQixNQUFjOzs7OzRCQUVoQyxXQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsY0FBTSxPQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQXZCLENBQXVCLENBQUMsRUFBQTs7d0JBQTdFLFNBQTZFLENBQUE7Ozs7O0tBQzlFO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBbEJELElBa0JDO0FBbEJZLGdEQUFrQjtBQTBCL0I7SUFHRSwrQkFBWSxPQUVYO1FBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFB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QzdELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDO2NBQ3pELDJEQUEyRCxDQUFFLENBQUE7SUFDbkUsQ0FBQyxDQUFBO0lBTUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBZ0IsUUFBZ0IsRUFBRSxTQUFrQjs7Ozs7d0JBQ3BGLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFOzRCQUNoQyxJQUFBLHNCQUFVLEVBQUMsa0JBQU0sQ0FBQyxjQUFjLEVBQUUsMkJBQTJCLENBQUMsQ0FBQTt5QkFDL0Q7d0JBR0QsV0FBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0NBQzdCLEtBQUssRUFBRSxRQUFROzZCQUNoQixDQUFDLEVBQUE7O3dCQUZGLFNBRUUsQ0FBQTs7Ozs7S0FDSCxDQUFBO0lBT0QsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRyxVQUFnQixZQUFvQixFQUFFLFVBQWtCOzs7Z0JBQ2hHLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdEO3NCQUM1RCxrRkFBa0YsQ0FBRSxDQUFBOzs7S0FDekYsQ0FBQTtJQU9ELFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsVUFBZ0IsWUFBb0IsRUFBRSxVQUFrQjs7O2dCQUM5RixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QztzQkFDMUQsc0RBQXNELENBQUUsQ0FBQTs7O0tBQzdELENBQUE7SUFPRCxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFnQixVQUFrQjs7O2dCQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQztzQkFDL0Msd0RBQXdELENBQUUsQ0FBQTs7O0tBQy9ELENBQUE7QUFDSCxDQUFDO0FBaEVELDhDQWdFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yICovXG4vKipcbiAqIHYxIOWFvOWuueWxglxuICog5pys5paH5Lu25YyF5ZCrIHYxIOeJiOacrOeahCBQcm92aWRlciDnsbvjgIFBdXRoIHYxIOWFvOWuueaWueazleWSjCBVc2VyIHYxIOWFvOWuueaWueazleOAglxuICogQXV0aCDnsbvpgJrov4cgZXh0ZW5kcyBBdXRoVjFDb21wYXQg5p2l57un5om/IHYxIOaWueazleOAglxuICogVXNlciDnsbvpgJrov4cgYXBwbHlVc2VyVjFDb21wYXQgbWl4aW4g5p2l5omp5bGVIHYxIOaWueazleOAglxuICovXG5pbXBvcnQgdHlwZSB7IGF1dGhNb2RlbHMgfSBmcm9tICdAY2xvdWRiYXNlL29hdXRoJ1xuaW1wb3J0IHtcbiAgTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLFxuICBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRSxcbn0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIHRocm93RXJyb3IsXG4gIEVSUk9SUyxcbn0gZnJvbSAnLi91dGlsaXRpZXMnXG5pbXBvcnQgdHlwZSB7IFNpZ25VcFJlcyB9IGZyb20gJy4vdHlwZSdcblxuLy8gPT09PT09PT09PSB2MSDlhbzlrrkgUHJvdmlkZXIg57G7ID09PT09PT09PT1cblxuLyoqXG4gKiB2MSDlvq7kv6HnmbvlvZUgUHJvdmlkZXJcbiAqIOS9v+eUqOaWueW8jzogYXV0aC53ZWl4aW5BdXRoUHJvdmlkZXIoeyBhcHBpZCwgc2NvcGUgfSkuc2lnbkluV2l0aFJlZGlyZWN0KClcbiAqXG4gKiBAZGVwcmVjYXRlZCB2MSDlhbzlrrkgQVBJ44CC5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aE9BdXRoKHsgcHJvdmlkZXIgfSkg5pu/5Luj44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWl4aW5BdXRoUHJvdmlkZXIge1xuICBjb25zdHJ1Y3Rvcihfb3B0aW9uczoge1xuICAgIGF1dGhJbnN0YW5jZTogYW55XG4gICAgYXBwaWQ6IHN0cmluZ1xuICAgIHNjb3BlOiBzdHJpbmdcbiAgfSkge1xuICAgIC8vIHYxIOWFvOWuueexu++8jOaJgOacieaWueazleWdh+aKm+WHuuW8guW4uOaPkOekuuabv+S7o+aWueahiFxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgIJcbiAgICog5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aE9BdXRoKHsgcHJvdmlkZXI6ICdwcm92aWRlcklkJyB9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyBzaWduSW5XaXRoUmVkaXJlY3QoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbdjEg5YW85a65XSBXZWl4aW5BdXRoUHJvdmlkZXIuc2lnbkluV2l0aFJlZGlyZWN0KCkg5Zyo5b2T5YmN54mI5pys5Lit5peg5rOV5a6e546w44CCJ1xuICAgICAgKyAnIOW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbldpdGhPQXV0aCh7IHByb3ZpZGVyOiBcXCdwcm92aWRlcklkXFwnIH0pIOabv+S7o+OAgicsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgIJcbiAgICog5bu66K6u5L2/55SoIGF1dGgudmVyaWZ5T0F1dGgoeyBjb2RlLCBzdGF0ZSwgcHJvdmlkZXIgfSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVkaXJlY3RSZXN1bHQoX29wdGlvbnM/OiB7XG4gICAgY3JlYXRlVXNlcj86IGJvb2xlYW5cbiAgICBzeW5jVXNlckluZm8/OiBib29sZWFuXG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignW3YxIOWFvOWuuV0gV2VpeGluQXV0aFByb3ZpZGVyLmdldFJlZGlyZWN0UmVzdWx0KCkg5Zyo5b2T5YmN54mI5pys5Lit5peg5rOV5a6e546w44CCJ1xuICAgICAgKyAnIOW7uuiuruS9v+eUqCBhdXRoLnZlcmlmeU9BdXRoKHsgY29kZSwgc3RhdGUsIHByb3ZpZGVyIH0pIOabv+S7o+OAgicsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgIJcbiAgICog5bu66K6u5L2/55SoIGF1dGgubGlua0lkZW50aXR5KHsgcHJvdmlkZXI6ICdwcm92aWRlcklkJyB9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMaW5rUmVkaXJlY3RSZXN1bHQoX29wdGlvbnM/OiB7XG4gICAgd2l0aFVuaW9uSWQ/OiBib29sZWFuXG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1t2MSDlhbzlrrldIFdlaXhpbkF1dGhQcm92aWRlci5nZXRMaW5rUmVkaXJlY3RSZXN1bHQoKSDlnKjlvZPliY3niYjmnKzkuK3ml6Dms5Xlrp7njrDjgIInXG4gICAgICArICcg5bu66K6u5L2/55SoIGF1dGgubGlua0lkZW50aXR5KHsgcHJvdmlkZXI6IFxcJ3Byb3ZpZGVySWRcXCcgfSkg5pu/5Luj44CCJywpXG4gIH1cbn1cblxuLyoqXG4gKiB2MSDoh6rlrprkuYnnmbvlvZUgUHJvdmlkZXJcbiAqIOS9v+eUqOaWueW8jzogYXV0aC5jdXN0b21BdXRoUHJvdmlkZXIoKS5zaWduSW4odGlja2V0KVxuICpcbiAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgILlu7rorq7kvb/nlKggYXV0aC5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KCgpID0+IFByb21pc2UucmVzb2x2ZSh0aWNrZXQpKSDmm7/ku6PjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbUF1dGhQcm92aWRlciB7XG4gIHByaXZhdGUgYXV0aEluc3RhbmNlOiBhbnlcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgYXV0aEluc3RhbmNlOiBhbnlcbiAgfSkge1xuICAgIHRoaXMuYXV0aEluc3RhbmNlID0gb3B0aW9ucy5hdXRoSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKjoh6rlrprkuYnnmbvlvZXlh63mja4gdGlja2V0IOeZu+W9leS6keW8gOWPkVxuICAgKiBAcGFyYW0gdGlja2V0IOiHquWumuS5ieeZu+W9lSB0aWNrZXRcbiAgICogQGRlcHJlY2F0ZWQgdjEg5YW85a65IEFQSeOAguW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbldpdGhDdXN0b21UaWNrZXQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRpY2tldCkpIOabv+S7o+OAglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25Jbih0aWNrZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduSW5XaXRoQ3VzdG9tVGlja2V0IOaWueazlVxuICAgIGF3YWl0IHRoaXMuYXV0aEluc3RhbmNlLnNpZ25JbldpdGhDdXN0b21UaWNrZXQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRpY2tldCkpXG4gIH1cbn1cblxuLyoqXG4gKiB2MSDljL/lkI3nmbvlvZUgUHJvdmlkZXJcbiAqIOS9v+eUqOaWueW8jzogYXV0aC5hbm9ueW1vdXNBdXRoUHJvdmlkZXIoKS5zaWduSW4oKVxuICpcbiAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgILlu7rorq7kvb/nlKggYXV0aC5zaWduSW5Bbm9ueW1vdXNseSh7fSkg5pu/5Luj44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNBdXRoUHJvdmlkZXIge1xuICBwcml2YXRlIGF1dGhJbnN0YW5jZTogYW55XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgIGF1dGhJbnN0YW5jZTogYW55XG4gIH0pIHtcbiAgICB0aGlzLmF1dGhJbnN0YW5jZSA9IG9wdGlvbnMuYXV0aEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICog5Yy/5ZCN55m75b2V5LqR5byA5Y+RXG4gICAqIEBkZXByZWNhdGVkIHYxIOWFvOWuuSBBUEnjgILlu7rorq7kvb/nlKggYXV0aC5zaWduSW5Bbm9ueW1vdXNseSh7fSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduSW5Bbm9ueW1vdXNseSDmlrnms5VcbiAgICBhd2FpdCB0aGlzLmF1dGhJbnN0YW5jZS5zaWduSW5Bbm9ueW1vdXNseSh7fSlcbiAgfVxufVxuXG4vLyA9PT09PT09PT09IEF1dGggdjEg5YW85a655Z+657G7ID09PT09PT09PT1cblxuLyoqXG4gKiBBdXRoVjFDb21wYXQg5Z+657G777yM5o+Q5L6bIHYxIOeJiOacrOeahOWFvOWuuSBBUEkg5pa55rOV44CCXG4gKiBBdXRoIOexu+mAmui/hyBleHRlbmRzIEF1dGhWMUNvbXBhdCDmnaXnu6fmib/ov5nkupvmlrnms5XjgIJcbiAqXG4gKiDms6jmhI/vvJrmraTnsbvkuK3nmoTmlrnms5XpgJrov4cgdGhpcyDorr/pl67lrZDnsbsgQXV0aCDnmoTmlrnms5XlkozlsZ7mgKfvvIxcbiAqIOWMheaLrDogc2lnbkluLCBzaWduVXAsIHNpZ25JbldpdGhDdXN0b21UaWNrZXQsIHNpZ25JbkFub255bW91c2x5LFxuICogZ2V0VmVyaWZpY2F0aW9uLCByZXNldFBhc3N3b3JkLCBvbkxvZ2luU3RhdGVDaGFuZ2VkLCBvbkF1dGhTdGF0ZUNoYW5nZSxcbiAqIGNyZWF0ZUxvZ2luU3RhdGUsIGZvcm1hdFBob25lLCBjb25maWcsIHNpZ25JbldpdGhPQXV0aCDnrYnjgIJcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAtLSBhYnN0cmFjdCDln7rnsbvkuK0gYWJzdHJhY3Qg5aOw5piO5LiOIHB1YmxpYyDmlrnms5XmjpLluo/kuI3pgILnlKjluLjop4Top4TliJlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRoVjFDb21wYXQge1xuICBhYnN0cmFjdCByZWFkb25seSBjb25maWc6IGFueVxuXG4gIC8vID09PT09PT09PT0gdjEg5YW85a65IEFQSSDmlrnms5UgPT09PT09PT09PVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOiOt+WPlueUqOS6juW+ruS/oeeZu+W9leeahCBXZWl4aW5BdXRoUHJvdmlkZXIgLy8gY3NwZWxsOmlnbm9yZSB3ZWl4aW4gV2VpeGluXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbldpdGhPQXV0aCh7IHByb3ZpZGVyOiBhcHBpZCB9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyB3ZWl4aW5BdXRoUHJvdmlkZXIob3B0aW9uczogeyBhcHBpZDogc3RyaW5nOyBzY29wZTogc3RyaW5nIH0pOiBXZWl4aW5BdXRoUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgV2VpeGluQXV0aFByb3ZpZGVyKHtcbiAgICAgIGF1dGhJbnN0YW5jZTogdGhpcyxcbiAgICAgIGFwcGlkOiBvcHRpb25zLmFwcGlkLFxuICAgICAgc2NvcGU6IG9wdGlvbnMuc2NvcGUsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOiOt+WPlueUqOS6juiHquWumuS5ieeZu+W9leeahCBDdXN0b21BdXRoUHJvdmlkZXJcbiAgICogQGRlcHJlY2F0ZWQg5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aEN1c3RvbVRpY2tldCgoKSA9PiBQcm9taXNlLnJlc29sdmUodGlja2V0KSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgY3VzdG9tQXV0aFByb3ZpZGVyKCk6IEN1c3RvbUF1dGhQcm92aWRlciB7XG4gICAgcmV0dXJuIG5ldyBDdXN0b21BdXRoUHJvdmlkZXIoe1xuICAgICAgYXV0aEluc3RhbmNlOiB0aGlzLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDojrflj5bnlKjkuo7ljL/lkI3nmbvlvZXnmoQgQW5vbnltb3VzQXV0aFByb3ZpZGVyXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbkFub255bW91c2x5KHt9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyBhbm9ueW1vdXNBdXRoUHJvdmlkZXIoKTogQW5vbnltb3VzQXV0aFByb3ZpZGVyIHtcbiAgICByZXR1cm4gbmV3IEFub255bW91c0F1dGhQcm92aWRlcih7XG4gICAgICBhdXRoSW5zdGFuY2U6IHRoaXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOS9v+eUqOmCrueuseWSjOWvhueggeazqOWGjOS6keW8gOWPkei0puaIt1xuICAgKiBAZGVwcmVjYXRlZCDlu7rorq7kvb/nlKggYXV0aC5zaWduVXAoeyBlbWFpbCwgcGFzc3dvcmQgfSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnblVwV2l0aEVtYWlsQW5kUGFzc3dvcmQoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2lnblVwUmVzPiB7XG4gICAgaWYgKHR5cGVvZiBlbWFpbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAnZW1haWwgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduVXAg5pa55rOVXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnblVwKHtcbiAgICAgIGVtYWlsLFxuICAgICAgcGFzc3dvcmQsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOS9v+eUqOmCrueuseWSjOWvhueggeeZu+W9leS6keW8gOWPkVxuICAgKiBAZGVwcmVjYXRlZCDlu7rorq7kvb/nlKggYXV0aC5zaWduSW5XaXRoUGFzc3dvcmQoeyBlbWFpbCwgcGFzc3dvcmQgfSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHR5cGVvZiBlbWFpbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAnZW1haWwgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduSW4g5pa55rOVXG4gICAgYXdhaXQgdGhpcy5zaWduSW4oe1xuICAgICAgdXNlcm5hbWU6IGVtYWlsLFxuICAgICAgcGFzc3dvcmQsXG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOWPkemAgemHjee9ruWvhueggeeahOmCruS7tlxuICAgKiBAZGVwcmVjYXRlZCDlu7rorq7kvb/nlKggYXV0aC5yZXNldFBhc3N3b3JkRm9yRW1haWwoZW1haWwpIOabv+S7o+OAglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoZW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ2VtYWlsIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBnZXRWZXJpZmljYXRpb24g5pa55rOVXG4gICAgYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24oeyBlbWFpbCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIHYxIEFQSTog5L2/55So55So5oi35ZCN5a+G56CB55m75b2V5LqR5byA5Y+RXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbldpdGhQYXNzd29yZCh7IHVzZXJuYW1lLCBwYXNzd29yZCB9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoVXNlcm5hbWVBbmRQYXNzd29yZCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd1c2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAncGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgLy8g5L2/55SoIEF1dGgg5bey5pyJ55qEIHNpZ25JbiDmlrnms5VcbiAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDlj5HpgIHmiYvmnLrpqozor4HnoIFcbiAgICogQGRlcHJlY2F0ZWQg5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aE90cCh7IHBob25lIH0pIOaIliBhdXRoLmdldFZlcmlmaWNhdGlvbih7IHBob25lX251bWJlciB9KSDmm7/ku6PjgIJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kUGhvbmVDb2RlKHBob25lTnVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodHlwZW9mIHBob25lTnVtYmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdwaG9uZU51bWJlciBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICAvLyDkvb/nlKggQXV0aCDlt7LmnInnmoQgZ2V0VmVyaWZpY2F0aW9uIOaWueazlVxuICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShwaG9uZU51bWJlcilcbiAgICBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih7IHBob25lX251bWJlcjogZm9ybWF0dGVkUGhvbmUgfSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIHYxIEFQSTog5omL5py65Y+35rOo5YaM77yI5pSv5oyB55+t5L+h6aqM6K+B56CBK+WvhueggeaWueW8j++8iVxuICAgKiBAZGVwcmVjYXRlZCDlu7rorq7kvb/nlKggYXV0aC5zaWduVXAoeyBwaG9uZV9udW1iZXIsIHZlcmlmaWNhdGlvbl9jb2RlLCBwYXNzd29yZD8gfSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnblVwV2l0aFBob25lQ29kZShwaG9uZU51bWJlcjogc3RyaW5nLCBwaG9uZUNvZGU6IHN0cmluZywgcGFzc3dvcmQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0eXBlb2YgcGhvbmVOdW1iZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3Bob25lTnVtYmVyIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHBob25lQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAncGhvbmVDb2RlIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShwaG9uZU51bWJlcilcblxuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduVXAg5pa55rOVXG4gICAgYXdhaXQgdGhpcy5zaWduVXAoe1xuICAgICAgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSxcbiAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBwaG9uZUNvZGUsXG4gICAgICAuLi4ocGFzc3dvcmQgPyB7IHBhc3N3b3JkIH0gOiB7fSksXG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOaJi+acuuWPt+eZu+W9le+8iOaUr+aMgeefreS/oemqjOivgeeggSBvciDlr4bnoIHmlrnlvI/vvIlcbiAgICogQGRlcHJlY2F0ZWQg5a+G56CB5pa55byP5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aFBhc3N3b3JkKHsgcGhvbmUsIHBhc3N3b3JkIH0pIOabv+S7o++8m1xuICAgKiDpqozor4HnoIHmlrnlvI/lu7rorq7kvb/nlKggYXV0aC5zaWduSW5XaXRoT3RwKHsgcGhvbmUgfSkg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFBob25lQ29kZU9yUGFzc3dvcmQocGFyYW1zOiB7XG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZ1xuICAgIHBob25lQ29kZT86IHN0cmluZ1xuICAgIHBhc3N3b3JkPzogc3RyaW5nXG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgcGhvbmVOdW1iZXIsIHBob25lQ29kZSwgcGFzc3dvcmQgfSA9IHBhcmFtc1xuICAgIGlmICh0eXBlb2YgcGhvbmVOdW1iZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3Bob25lTnVtYmVyIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShwaG9uZU51bWJlcilcblxuICAgIGlmIChwYXNzd29yZCkge1xuICAgICAgLy8g5L2/55SoIEF1dGgg5bey5pyJ55qEIHNpZ25JbiDmlrnms5Xov5vooYzlr4bnoIHnmbvlvZVcbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluKHtcbiAgICAgICAgdXNlcm5hbWU6IGZvcm1hdHRlZFBob25lLFxuICAgICAgICBwYXNzd29yZCxcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChwaG9uZUNvZGUpIHtcbiAgICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBzaWduSW4g5pa55rOV6L+b6KGM6aqM6K+B56CB55m75b2VXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBmb3JtYXR0ZWRQaG9uZSxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiBwaG9uZUNvZGUsXG4gICAgICB9IGFzIGFueSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdwaG9uZUNvZGUgb3IgcGFzc3dvcmQgbXVzdCBiZSBwcm92aWRlZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIHYxIEFQSTog5omL5py65Y+35by65Yi26YeN572u5a+G56CBXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLnJlc2V0UGFzc3dvcmRGb3JFbWFpbChwaG9uZU51bWJlcikg5pu/5Luj44CCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZm9yY2VSZXNldFB3ZEJ5UGhvbmVDb2RlKHBhcmFtczoge1xuICAgIHBob25lTnVtYmVyOiBzdHJpbmdcbiAgICBwaG9uZUNvZGU6IHN0cmluZ1xuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgfSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBwaG9uZU51bWJlciwgcGhvbmVDb2RlLCBwYXNzd29yZCB9ID0gcGFyYW1zXG4gICAgaWYgKHR5cGVvZiBwaG9uZU51bWJlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAncGhvbmVOdW1iZXIgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGhvbmVDb2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdwaG9uZUNvZGUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShwaG9uZU51bWJlcilcblxuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCByZXNldFBhc3N3b3JkIOaWueazlVxuICAgIGF3YWl0IHRoaXMucmVzZXRQYXNzd29yZCh7XG4gICAgICBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lLFxuICAgICAgbmV3X3Bhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogcGhvbmVDb2RlLFxuICAgIH0pXG5cbiAgICAvLyDph43nva7lr4bnoIHmiJDlip/lkI7kvb/nlKggQXV0aCDlt7LmnInnmoQgc2lnbkluIOaWueazleiHquWKqOeZu+W9lVxuICAgIGF3YWl0IHRoaXMuc2lnbkluKHtcbiAgICAgIHVzZXJuYW1lOiBmb3JtYXR0ZWRQaG9uZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDmjqXmlLbkuIDkuKrlm57osIPlh73mlbDvvIzlnKjliLfmlrDnn63mnJ/orr/pl67ku6TniYzliY3osIPnlKjvvIzmoLnmja7ov5Tlm57lgLzlhrPlrprmmK/lkKbliLfmlrBcbiAgICogQGRlcHJlY2F0ZWQgdjEg5YW85a65IEFQSe+8jOW9k+WJjSB2MyBTREsg5Lit5peg55u05o6l5a+55bqU5pa55rOV44CCXG4gICAqIOW7uuiuruS9v+eUqCBhdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKGNhbGxiYWNrKSDnm5HlkKwgVE9LRU5fUkVGUkVTSEVEIOS6i+S7tuabv+S7o+OAglxuICAgKi9cbiAgcHVibGljIHNob3VsZFJlZnJlc2hBY2Nlc3NUb2tlbihfY2FsbGJhY2s6ICgpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1t2MSDlhbzlrrldIHNob3VsZFJlZnJlc2hBY2Nlc3NUb2tlbigpIOWcqOW9k+WJjeeJiOacrOS4reaXoOazleWunueOsOOAgidcbiAgICAgICsgJyDlu7rorq7kvb/nlKggYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjaykg5p2l55uR5ZCsIFRPS0VOX1JFRlJFU0hFRCDkuovku7bmm7/ku6PjgIInLClcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOaOpeaUtuS4gOS4quWbnuiwg+WHveaVsO+8jOWcqOeZu+W9leeKtuaAgei/h+acn+aXtuiwg+eUqFxuICAgKiBAZGVwcmVjYXRlZCDlu7rorq7kvb/nlKggYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjaykg5pu/5Luj77yM55uR5ZCsIFNJR05FRF9PVVQg5LqL5Lu244CCXG4gICAqL1xuICBwdWJsaWMgb25Mb2dpblN0YXRlRXhwaXJlZChjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyDkvb/nlKggQXV0aCDlt7LmnInnmoQgb25Mb2dpblN0YXRlQ2hhbmdlZCDmlrnms5VcbiAgICB0aGlzLm9uTG9naW5TdGF0ZUNoYW5nZWQoKHBhcmFtcykgPT4ge1xuICAgICAgaWYgKHBhcmFtcz8uZXZlbnRUeXBlID09PSBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuQ1JFREVOVElBTFNfRVJST1IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDmjqXmlLbkuIDkuKrlm57osIPlh73mlbDvvIzlnKjnn63mnJ/orr/pl67ku6TniYzliLfmlrDlkI7osIPnlKhcbiAgICogQGRlcHJlY2F0ZWQg5bu66K6u5L2/55SoIGF1dGgub25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2spIOabv+S7o++8jOebkeWQrCBUT0tFTl9SRUZSRVNIRUQg5LqL5Lu244CCXG4gICAqL1xuICBwdWJsaWMgb25BY2Nlc3NUb2tlblJlZnJlc2hlZChjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyDkvb/nlKggQXV0aCDlt7LmnInnmoQgb25BdXRoU3RhdGVDaGFuZ2Ug5pa55rOVXG4gICAgdGhpcy5vbkF1dGhTdGF0ZUNoYW5nZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCA9PT0gQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVE9LRU5fUkVGUkVTSEVEKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIHYxIEFQSTog5o6l5pS25LiA5Liq5Zue6LCD5Ye95pWw77yM5Zyo5Yy/5ZCN55m75b2V54q25oCB6KKr6L2s5o2i5ZCO6LCD55SoXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKGNhbGxiYWNrKSDmm7/ku6PvvIznm5HlkKwgU0lHTkVEX0lOIOS6i+S7tuOAglxuICAgKi9cbiAgcHVibGljIG9uQW5vbnltb3VzQ29udmVydGVkKGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIOS9v+eUqCBBdXRoIOW3suacieeahCBvbkF1dGhTdGF0ZUNoYW5nZSDmlrnms5VcbiAgICB0aGlzLm9uQXV0aFN0YXRlQ2hhbmdlKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50ID09PSBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfSU4pIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDmjqXmlLbkuIDkuKrlm57osIPlh73mlbDvvIzlnKjnmbvlvZXnsbvlnovlj5HnlJ/lj5jljJblkI7osIPnlKhcbiAgICogQGRlcHJlY2F0ZWQg5bu66K6u5L2/55SoIGF1dGgub25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2spIOabv+S7o++8jOebkeWQrCBTSUdORURfSU4gLyBTSUdORURfT1VUIOS6i+S7tuOAglxuICAgKi9cbiAgcHVibGljIG9uTG9naW5UeXBlQ2hhbmdlZChjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyDkvb/nlKggQXV0aCDlt7LmnInnmoQgb25BdXRoU3RhdGVDaGFuZ2Ug5pa55rOVXG4gICAgdGhpcy5vbkF1dGhTdGF0ZUNoYW5nZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCA9PT0gQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX0lOIHx8IGV2ZW50ID09PSBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfT1VUKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PSDlo7DmmI7lrZDnsbsgQXV0aCDpnIDopoHmj5DkvpvnmoTmlrnms5Uv5bGe5oCnID09PT09PT09PT1cbiAgYWJzdHJhY3Qgc2lnbkluKHBhcmFtczogYXV0aE1vZGVscy5TaWduSW5SZXF1ZXN0KTogUHJvbWlzZTxhbnk+XG4gIGFic3RyYWN0IHNpZ25VcChwYXJhbXM6IGF1dGhNb2RlbHMuU2lnblVwUmVxdWVzdCAmIHsgcGhvbmU/OiBzdHJpbmcgfSk6IFByb21pc2U8U2lnblVwUmVzPlxuICBhYnN0cmFjdCBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KGdldFRpY2tGbj86IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogUHJvbWlzZTxhbnk+XG4gIGFic3RyYWN0IHNpZ25JbkFub255bW91c2x5KHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+XG4gIGFic3RyYWN0IGdldFZlcmlmaWNhdGlvbihwYXJhbXM6IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8YXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXNwb25zZT5cbiAgYWJzdHJhY3QgcmVzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+XG4gIGFic3RyYWN0IG9uTG9naW5TdGF0ZUNoYW5nZWQoY2FsbGJhY2s6IEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPlxuICBhYnN0cmFjdCBvbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjazogYW55KTogYW55XG4gIGFic3RyYWN0IGNyZWF0ZUxvZ2luU3RhdGUocGFyYW1zPzogYW55LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+XG4gIGFic3RyYWN0IHNpZ25JbldpdGhPQXV0aChwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PlxuICBhYnN0cmFjdCBncmFudFByb3ZpZGVyVG9rZW4ocGFyYW1zOiBhdXRoTW9kZWxzLkdyYW50UHJvdmlkZXJUb2tlblJlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+XG4gIGFic3RyYWN0IGJpbmRXaXRoUHJvdmlkZXIocGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRXaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPlxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZm9ybWF0UGhvbmUocGhvbmU6IHN0cmluZyk6IHN0cmluZ1xufVxuXG4vLyA9PT09PT09PT09IFVzZXIgdjEg5YW85a65IG1peGluID09PT09PT09PT1cblxuLyoqXG4gKiDlsIYgdjEg5YW85a655pa55rOV5bqU55So5YiwIFVzZXIg57G755qEIHByb3RvdHlwZSDkuIrjgIJcbiAqIOWcqCBpbmRleC50cyDkuK3osIPnlKg6IGFwcGx5VXNlclYxQ29tcGF0KFVzZXIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVVzZXJWMUNvbXBhdChVc2VyQ2xhc3M6IGFueSk6IHZvaWQge1xuICAvKipcbiAgICogdjEgQVBJOiDlsIblvZPliY3otKbmiLfkuI7oh6rlrprkuYnnmbvlvZUgVGlja2V0IOi/m+ihjOe7keWumlxuICAgKiBAZGVwcmVjYXRlZCB2MSDlhbzlrrkgQVBJ77yM5b2T5YmN54mI5pys5Lit5peg5rOV55u05o6l5a6e546w44CCXG4gICAqIOW7uuiuruS9v+eUqCBhdXRoLnNpZ25JbldpdGhDdXN0b21UaWNrZXQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRpY2tldCkpIOabv+S7o+OAglxuICAgKi9cbiAgVXNlckNsYXNzLnByb3RvdHlwZS5saW5rV2l0aFRpY2tldCA9IGFzeW5jIGZ1bmN0aW9uIChfdGlja2V0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1t2MSDlhbzlrrldIFVzZXIubGlua1dpdGhUaWNrZXQoKSDlnKjlvZPliY3niYjmnKzkuK3ml6Dms5Xlrp7njrDjgIInXG4gICAgICArICcg5bu66K6u5L2/55SoIGF1dGguc2lnbkluV2l0aEN1c3RvbVRpY2tldCgoKSA9PiBQcm9taXNlLnJlc29sdmUodGlja2V0KSkg5pu/5Luj44CCJywpXG4gIH1cblxuICAvKipcbiAgICogdjEgQVBJOiDlsIblvZPliY3otKbmiLfkuI7nrKzkuInmlrnpibTmnYPmj5DkvpvmlrnvvIjku6Xph43lrprlkJHlvaLlvI/vvInov5vooYznu5HlrppcbiAgICogQGRlcHJlY2F0ZWQg5bu66K6u5L2/55SoIGF1dGgubGlua0lkZW50aXR5KHsgcHJvdmlkZXI6ICdwcm92aWRlcklkJyB9KSDmm7/ku6PjgIJcbiAgICovXG4gIFVzZXJDbGFzcy5wcm90b3R5cGUubGlua1dpdGhSZWRpcmVjdCA9IGZ1bmN0aW9uIChfcHJvdmlkZXI6IGFueSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignW3YxIOWFvOWuuV0gVXNlci5saW5rV2l0aFJlZGlyZWN0KCkg5Zyo5b2T5YmN54mI5pys5Lit5peg5rOV5a6e546w44CCJ1xuICAgICAgKyAnIOW7uuiuruS9v+eUqCBhdXRoLmxpbmtJZGVudGl0eSh7IHByb3ZpZGVyOiBcXCdwcm92aWRlcklkXFwnIH0pIOabv+S7o+OAgicsKVxuICB9XG5cbiAgLyoqXG4gICAqIHYxIEFQSTog5pu05paw5b2T5YmN55qE55m75b2V6YKu566xXG4gICAqIEBkZXByZWNhdGVkIOW7uuiuruS9v+eUqCBhdXRoLnVwZGF0ZVVzZXIoeyBlbWFpbDogbmV3RW1haWwgfSkg5pu/5Luj44CCXG4gICAqL1xuICBVc2VyQ2xhc3MucHJvdG90eXBlLnVwZGF0ZUVtYWlsID0gYXN5bmMgZnVuY3Rpb24gKG5ld0VtYWlsOiBzdHJpbmcsIF9wYXNzd29yZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0eXBlb2YgbmV3RW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ25ld0VtYWlsIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIC8vIOS9v+eUqCBVc2VyIOW3suacieeahCB1cGRhdGVVc2VyQmFzaWNJbmZvIOaWueazlVxuICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7XG4gICAgICBlbWFpbDogbmV3RW1haWwsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOe7keWumuaJi+acuuWPt1xuICAgKiBAZGVwcmVjYXRlZCB2MSDlhbzlrrkgQVBJ77yM5b2T5YmN54mI5pys5Lit5peg5rOV55u05o6l5ZyoIFVzZXIg5LiK5a6e546w44CCXG4gICAqIOW7uuiuruS9v+eUqCBhdXRoLmJpbmRQaG9uZU51bWJlcih7IHBob25lX251bWJlciwgdmVyaWZpY2F0aW9uX3Rva2VuLCBzdWRvX3Rva2VuIH0pIOabv+S7o+OAglxuICAgKi9cbiAgVXNlckNsYXNzLnByb3RvdHlwZS5saW5rV2l0aFBob25lTnVtYmVyID0gYXN5bmMgZnVuY3Rpb24gKF9waG9uZU51bWJlcjogc3RyaW5nLCBfcGhvbmVDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1t2MSDlhbzlrrldIFVzZXIubGlua1dpdGhQaG9uZU51bWJlcigpIOWcqOW9k+WJjeeJiOacrOS4reaXoOazleWunueOsOOAgidcbiAgICAgICsgJyDlu7rorq7kvb/nlKggYXV0aC5iaW5kUGhvbmVOdW1iZXIoeyBwaG9uZV9udW1iZXIsIHZlcmlmaWNhdGlvbl90b2tlbiwgc3Vkb190b2tlbiB9KSDmm7/ku6PjgIInLClcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOabtOaWsOaJi+acuuWPt1xuICAgKiBAZGVwcmVjYXRlZCB2MSDlhbzlrrkgQVBJ77yM5b2T5YmN54mI5pys5Lit5peg5rOV55u05o6l5ZyoIFVzZXIg5LiK5a6e546w44CCXG4gICAqIOW7uuiuruS9v+eUqCBhdXRoLnVwZGF0ZVVzZXIoeyBwaG9uZTogbmV3UGhvbmVOdW1iZXIgfSkg5pu/5Luj44CCXG4gICAqL1xuICBVc2VyQ2xhc3MucHJvdG90eXBlLnVwZGF0ZVBob25lTnVtYmVyID0gYXN5bmMgZnVuY3Rpb24gKF9waG9uZU51bWJlcjogc3RyaW5nLCBfcGhvbmVDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1t2MSDlhbzlrrldIFVzZXIudXBkYXRlUGhvbmVOdW1iZXIoKSDlnKjlvZPliY3niYjmnKzkuK3ml6Dms5Xlrp7njrDjgIInXG4gICAgICArICcg5bu66K6u5L2/55SoIGF1dGgudXBkYXRlVXNlcih7IHBob25lOiBuZXdQaG9uZU51bWJlciB9KSDmm7/ku6PjgIInLClcbiAgfVxuXG4gIC8qKlxuICAgKiB2MSBBUEk6IOino+e7keafkOS4queZu+W9leaWueW8j1xuICAgKiBAZGVwcmVjYXRlZCB2MSDlhbzlrrkgQVBJ77yM5b2T5YmN54mI5pys5Lit5peg5rOV55u05o6l5ZyoIFVzZXIg5LiK5a6e546w44CCXG4gICAqIOW7uuiuruS9v+eUqCBhdXRoLnVubGlua0lkZW50aXR5KHsgcHJvdmlkZXI6IGxvZ2luVHlwZSB9KSDmm7/ku6PjgIJcbiAgICovXG4gIFVzZXJDbGFzcy5wcm90b3R5cGUudW5saW5rID0gYXN5bmMgZnVuY3Rpb24gKF9sb2dpblR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignW3YxIOWFvOWuuV0gVXNlci51bmxpbmsoKSDlnKjlvZPliY3niYjmnKzkuK3ml6Dms5Xlrp7njrDjgIInXG4gICAgICArICcg5bu66K6u5L2/55SoIGF1dGgudW5saW5rSWRlbnRpdHkoeyBwcm92aWRlcjogbG9naW5UeXBlIH0pIOabv+S7o+OAgicsKVxuICB9XG59XG4iXX0=
@@ -4,6 +4,7 @@ import type { ICloudbaseRequest } from '@cloudbase/types/request';
4
4
  import type { ICloudbaseAuthConfig, IUser, ILoginState } from '@cloudbase/types/auth';
5
5
  import type { AuthOptions, Credentials } from '@cloudbase/oauth';
6
6
  import { CloudbaseOAuth, AuthError, authModels } from '@cloudbase/oauth';
7
+ import { AuthV1Compat, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider } from './v1-compat';
7
8
  import { CommonRes, DeleteMeReq, GetClaimsRes, GetUserIdentitiesRes, GetUserRes, LinkIdentityReq, LinkIdentityRes, OnAuthStateChangeCallback, ReauthenticateRes, ResendReq, ResendRes, ResetPasswordForEmailRes, ResetPasswordForOldReq, SetSessionReq, SignInAnonymouslyReq, SignInOAuthRes, SignInRes, SignInWithIdTokenReq, SignInWithOAuthReq, SignInWithOtpReq, SignInWithOtpRes, SignInWithPasswordReq, SignUpRes, UnlinkIdentityReq, UpdateUserReq, UpdateUserWithVerificationRes, VerifyOAuthReq, VerifyOAuthRes, VerifyOtpReq } from './type';
8
9
  export type { SignInRes, GetUserRes, CommonRes, SignInWithOtpRes, SignInOAuthRes, GetClaimsRes, ResetPasswordForEmailRes, GetUserIdentitiesRes, LinkIdentityRes, ReauthenticateRes, ResendRes, UpdateUserWithVerificationRes, OnAuthStateChangeCallback, SignInWithPasswordReq, SignInWithIdTokenReq, SignInWithOAuthReq, VerifyOAuthReq, VerifyOtpReq, LinkIdentityReq, UnlinkIdentityReq, UpdateUserReq, SignInWithOtpReq, ResetPasswordForOldReq, ResendReq, SetSessionReq, DeleteMeReq, SignUpRes, } from './type';
9
10
  interface UserInfo {
@@ -79,7 +80,7 @@ interface IAuthConfig extends ICloudbaseAuthConfig {
79
80
  request?: ICloudbaseRequest;
80
81
  runtime?: string;
81
82
  }
82
- declare class Auth {
83
+ declare class Auth extends AuthV1Compat {
83
84
  readonly config: IAuthConfig;
84
85
  oauthInstance: CloudbaseOAuth;
85
86
  readonly cache: ICloudbaseCache;
@@ -249,7 +250,7 @@ declare class Auth {
249
250
  signInWithPhoneAuth({ phoneCode }: {
250
251
  phoneCode?: string;
251
252
  }): Promise<SignInRes>;
252
- private formatPhone;
253
+ protected formatPhone(phone: string): string;
253
254
  private notifyListeners;
254
255
  private setupListeners;
255
256
  private convertToUser;
@@ -275,5 +276,5 @@ export declare function generateAuthInstance(config: TInitAuthOptions & {
275
276
  authInstance: Auth;
276
277
  oauthInstance: CloudbaseOAuth;
277
278
  };
278
- export { UserInfo, Auth };
279
+ export { UserInfo, Auth, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider };
279
280
  export declare function registerAuth(app: Pick<ICloudbase, 'registerComponent'>): void;