@cloudbase/oauth 1.2.1-beta → 2.0.0-beta.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 (125) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +26 -0
  3. package/CHANGELOG.md +30 -0
  4. package/Dockerfile +15 -0
  5. package/README.md +183 -0
  6. package/_exmaple/assets/scripts/function/function.ts +99 -0
  7. package/_exmaple/assets/scripts/index.ts +101 -0
  8. package/_exmaple/assets/scripts/request.ts +11 -0
  9. package/_exmaple/index.html +15 -0
  10. package/_exmaple/package.json +33 -0
  11. package/_exmaple/tsconfig.json +71 -0
  12. package/_exmaple/typings.d.ts +0 -0
  13. package/_exmaple/webpack.config.js +42 -0
  14. package/dist/cjs/auth/apis.d.ts +55 -0
  15. package/dist/cjs/auth/apis.js +568 -0
  16. package/{auth → dist/cjs/auth}/consts.d.ts +9 -21
  17. package/dist/cjs/auth/consts.js +61 -0
  18. package/dist/cjs/auth/models.d.ts +354 -0
  19. package/dist/cjs/auth/models.js +3 -0
  20. package/dist/cjs/captcha/captcha.d.ts +35 -0
  21. package/dist/cjs/captcha/captcha.js +267 -0
  22. package/dist/cjs/index.d.ts +14 -0
  23. package/dist/cjs/index.js +63 -0
  24. package/{oauthclient → dist/cjs/oauth2client}/consts.d.ts +22 -1
  25. package/dist/cjs/oauth2client/consts.js +73 -0
  26. package/dist/cjs/oauth2client/interface.d.ts +15 -0
  27. package/dist/cjs/oauth2client/interface.js +10 -0
  28. package/dist/cjs/oauth2client/models.d.ts +47 -0
  29. package/dist/cjs/oauth2client/models.js +3 -0
  30. package/dist/cjs/oauth2client/oauth2client.d.ts +71 -0
  31. package/dist/cjs/oauth2client/oauth2client.js +640 -0
  32. package/dist/cjs/utils/function/single-promise.d.ts +5 -0
  33. package/dist/cjs/utils/function/single-promise.js +89 -0
  34. package/dist/cjs/utils/uuid.d.ts +1 -0
  35. package/dist/cjs/utils/uuid.js +12 -0
  36. package/dist/esm/auth/apis.d.ts +55 -0
  37. package/dist/esm/auth/apis.js +566 -0
  38. package/dist/esm/auth/consts.d.ts +54 -0
  39. package/dist/esm/auth/consts.js +58 -0
  40. package/dist/esm/auth/models.d.ts +354 -0
  41. package/dist/esm/auth/models.js +1 -0
  42. package/dist/esm/captcha/captcha.d.ts +35 -0
  43. package/dist/esm/captcha/captcha.js +264 -0
  44. package/dist/esm/index.d.ts +14 -0
  45. package/dist/esm/index.js +32 -0
  46. package/dist/esm/oauth2client/consts.d.ts +67 -0
  47. package/dist/esm/oauth2client/consts.js +70 -0
  48. package/dist/esm/oauth2client/interface.d.ts +15 -0
  49. package/dist/esm/oauth2client/interface.js +7 -0
  50. package/dist/esm/oauth2client/models.d.ts +47 -0
  51. package/dist/esm/oauth2client/models.js +1 -0
  52. package/dist/esm/oauth2client/oauth2client.d.ts +71 -0
  53. package/dist/esm/oauth2client/oauth2client.js +636 -0
  54. package/dist/esm/utils/function/single-promise.d.ts +5 -0
  55. package/dist/esm/utils/function/single-promise.js +86 -0
  56. package/dist/esm/utils/uuid.d.ts +1 -0
  57. package/dist/esm/utils/uuid.js +8 -0
  58. package/package.json +27 -14
  59. package/publish.sh +2 -0
  60. package/src/auth/apis.ts +642 -0
  61. package/src/auth/consts.ts +57 -0
  62. package/src/auth/models.ts +444 -0
  63. package/src/captcha/captcha.ts +222 -0
  64. package/src/index.ts +49 -0
  65. package/src/oauth2client/consts.ts +69 -0
  66. package/src/oauth2client/interface.ts +57 -0
  67. package/src/oauth2client/models.ts +61 -0
  68. package/src/oauth2client/oauth2client.ts +620 -0
  69. package/src/utils/function/single-promise.ts +40 -0
  70. package/src/utils/uuid.ts +11 -0
  71. package/tsconfig.esm.json +44 -0
  72. package/tsconfig.json +44 -0
  73. package/wiki/README.md +75 -0
  74. package/app/index.d.ts +0 -29
  75. package/app/index.js +0 -50
  76. package/app/index.js.map +0 -1
  77. package/app/internal.d.ts +0 -12
  78. package/app/internal.js +0 -25
  79. package/app/internal.js.map +0 -1
  80. package/app/openuri.d.ts +0 -20
  81. package/app/openuri.js +0 -106
  82. package/app/openuri.js.map +0 -1
  83. package/app/request.d.ts +0 -19
  84. package/app/request.js +0 -52
  85. package/app/request.js.map +0 -1
  86. package/app/storage.d.ts +0 -41
  87. package/app/storage.js +0 -35
  88. package/app/storage.js.map +0 -1
  89. package/auth/consts.js +0 -79
  90. package/auth/consts.js.map +0 -1
  91. package/auth/index.d.ts +0 -242
  92. package/auth/index.js +0 -550
  93. package/auth/index.js.map +0 -1
  94. package/auth/models.d.ts +0 -284
  95. package/auth/models.js +0 -4
  96. package/auth/models.js.map +0 -1
  97. package/captcha/index.d.ts +0 -45
  98. package/captcha/index.js +0 -135
  99. package/captcha/index.js.map +0 -1
  100. package/function/index.d.ts +0 -38
  101. package/function/index.js +0 -80
  102. package/function/index.js.map +0 -1
  103. package/index.d.ts +0 -8
  104. package/index.js +0 -17
  105. package/index.js.map +0 -1
  106. package/oauthclient/consts.js +0 -53
  107. package/oauthclient/consts.js.map +0 -1
  108. package/oauthclient/index.d.ts +0 -18
  109. package/oauthclient/index.js +0 -21
  110. package/oauthclient/index.js.map +0 -1
  111. package/oauthclient/interface.d.ts +0 -29
  112. package/oauthclient/interface.js +0 -10
  113. package/oauthclient/interface.js.map +0 -1
  114. package/oauthclient/models.d.ts +0 -40
  115. package/oauthclient/models.js +0 -3
  116. package/oauthclient/models.js.map +0 -1
  117. package/oauthclient/oauthclient.d.ts +0 -146
  118. package/oauthclient/oauthclient.js +0 -414
  119. package/oauthclient/oauthclient.js.map +0 -1
  120. package/utils/promise.d.ts +0 -18
  121. package/utils/promise.js +0 -48
  122. package/utils/promise.js.map +0 -1
  123. package/utils/uuid.d.ts +0 -5
  124. package/utils/uuid.js +0 -16
  125. package/utils/uuid.js.map +0 -1
@@ -0,0 +1,636 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (_) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { ErrorType } from './consts';
49
+ import { uuidv4 } from '../utils/uuid';
50
+ import { SinglePromise } from '../utils/function/single-promise';
51
+ var RequestIdHeaderName = 'x-request-id';
52
+ var DeviceIdHeaderName = 'x-device-id';
53
+ var DeviceIdSectionName = 'device_id';
54
+ export var defaultRequest = function (url, options) { return __awaiter(void 0, void 0, void 0, function () {
55
+ var result, responseError, copyOptions, responseResult, jsonResponse, error_1;
56
+ return __generator(this, function (_a) {
57
+ switch (_a.label) {
58
+ case 0:
59
+ result = null;
60
+ responseError = null;
61
+ _a.label = 1;
62
+ case 1:
63
+ _a.trys.push([1, 4, , 5]);
64
+ copyOptions = Object.assign({}, options);
65
+ if (!copyOptions.method) {
66
+ copyOptions.method = 'GET';
67
+ }
68
+ if (copyOptions.body && typeof copyOptions.body !== 'string') {
69
+ copyOptions.body = JSON.stringify(copyOptions.body);
70
+ }
71
+ return [4, fetch(url, copyOptions)];
72
+ case 2:
73
+ responseResult = _a.sent();
74
+ return [4, responseResult.json()];
75
+ case 3:
76
+ jsonResponse = _a.sent();
77
+ if (jsonResponse === null || jsonResponse === void 0 ? void 0 : jsonResponse.error) {
78
+ responseError = jsonResponse;
79
+ responseError.error_uri = new URL(url).pathname;
80
+ }
81
+ else {
82
+ result = jsonResponse;
83
+ }
84
+ return [3, 5];
85
+ case 4:
86
+ error_1 = _a.sent();
87
+ responseError = {
88
+ error: ErrorType.UNREACHABLE,
89
+ error_description: error_1.message,
90
+ error_uri: new URL(url).pathname,
91
+ };
92
+ return [3, 5];
93
+ case 5:
94
+ if (responseError) {
95
+ throw responseError;
96
+ }
97
+ else {
98
+ return [2, result];
99
+ }
100
+ return [2];
101
+ }
102
+ });
103
+ }); };
104
+ export var toResponseError = function (error, options) {
105
+ var responseError;
106
+ var formatOptions = options || {};
107
+ if (error instanceof Error) {
108
+ responseError = {
109
+ error: formatOptions.error || ErrorType.LOCAL,
110
+ error_description: formatOptions.error_description || error.message,
111
+ error_uri: formatOptions.error_uri,
112
+ details: formatOptions.details || error.stack,
113
+ };
114
+ }
115
+ else {
116
+ var formatError = error || {};
117
+ responseError = {
118
+ error: formatOptions.error || formatError.error || ErrorType.LOCAL,
119
+ error_description: formatOptions.error_description || formatError.error_description,
120
+ error_uri: formatOptions.error_uri || formatError.error_uri,
121
+ details: formatOptions.details || formatError.details,
122
+ };
123
+ }
124
+ return responseError;
125
+ };
126
+ export function generateRequestId() {
127
+ return uuidv4();
128
+ }
129
+ var DefaultStorage = (function () {
130
+ function DefaultStorage() {
131
+ }
132
+ DefaultStorage.prototype.getItem = function (key) {
133
+ return __awaiter(this, void 0, void 0, function () {
134
+ return __generator(this, function (_a) {
135
+ return [2, window.localStorage.getItem(key)];
136
+ });
137
+ });
138
+ };
139
+ DefaultStorage.prototype.removeItem = function (key) {
140
+ return __awaiter(this, void 0, void 0, function () {
141
+ return __generator(this, function (_a) {
142
+ window.localStorage.removeItem(key);
143
+ return [2];
144
+ });
145
+ });
146
+ };
147
+ DefaultStorage.prototype.setItem = function (key, value) {
148
+ return __awaiter(this, void 0, void 0, function () {
149
+ return __generator(this, function (_a) {
150
+ window.localStorage.setItem(key, value);
151
+ return [2];
152
+ });
153
+ });
154
+ };
155
+ DefaultStorage.prototype.getItemSync = function (key) {
156
+ return window.localStorage.getItem(key);
157
+ };
158
+ DefaultStorage.prototype.removeItemSync = function (key) {
159
+ window.localStorage.removeItem(key);
160
+ };
161
+ DefaultStorage.prototype.setItemSync = function (key, value) {
162
+ window.localStorage.setItem(key, value);
163
+ };
164
+ return DefaultStorage;
165
+ }());
166
+ export var defaultStorage = new DefaultStorage();
167
+ function isCredentialsExpired(credentials) {
168
+ var isExpired = true;
169
+ if ((credentials === null || credentials === void 0 ? void 0 : credentials.expires_at) && (credentials === null || credentials === void 0 ? void 0 : credentials.access_token)) {
170
+ isExpired = credentials.expires_at < new Date();
171
+ }
172
+ return isExpired;
173
+ }
174
+ var LocalCredentials = (function () {
175
+ function LocalCredentials(options) {
176
+ this._credentials = null;
177
+ this._singlePromise = new SinglePromise();
178
+ this._tokenSectionName = options.tokenSectionName;
179
+ this._storage = options.storage;
180
+ }
181
+ LocalCredentials.prototype.setCredentials = function (credentials) {
182
+ return __awaiter(this, void 0, void 0, function () {
183
+ var tokenStr;
184
+ return __generator(this, function (_a) {
185
+ switch (_a.label) {
186
+ case 0:
187
+ if (!(credentials === null || credentials === void 0 ? void 0 : credentials.expires_in)) return [3, 3];
188
+ credentials.expires_at = new Date(Date.now() + (credentials.expires_in - 30) * 1000);
189
+ if (!this._storage) return [3, 2];
190
+ tokenStr = JSON.stringify(credentials);
191
+ return [4, this._storage.setItem(this._tokenSectionName, tokenStr)];
192
+ case 1:
193
+ _a.sent();
194
+ _a.label = 2;
195
+ case 2:
196
+ this._credentials = credentials;
197
+ return [3, 6];
198
+ case 3:
199
+ if (!this._storage) return [3, 5];
200
+ return [4, this._storage.removeItem(this._tokenSectionName)];
201
+ case 4:
202
+ _a.sent();
203
+ _a.label = 5;
204
+ case 5:
205
+ this._credentials = null;
206
+ _a.label = 6;
207
+ case 6: return [2];
208
+ }
209
+ });
210
+ });
211
+ };
212
+ LocalCredentials.prototype.getCredentials = function () {
213
+ return __awaiter(this, void 0, void 0, function () {
214
+ var _this = this;
215
+ return __generator(this, function (_a) {
216
+ return [2, this._singlePromise.run('getCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
217
+ var _a;
218
+ return __generator(this, function (_b) {
219
+ switch (_b.label) {
220
+ case 0:
221
+ if (!isCredentialsExpired(this._credentials)) return [3, 2];
222
+ _a = this;
223
+ return [4, this._getStorageCredentials()];
224
+ case 1:
225
+ _a._credentials = _b.sent();
226
+ _b.label = 2;
227
+ case 2: return [2, this._credentials];
228
+ }
229
+ });
230
+ }); })];
231
+ });
232
+ });
233
+ };
234
+ LocalCredentials.prototype._getStorageCredentials = function () {
235
+ return __awaiter(this, void 0, void 0, function () {
236
+ var _this = this;
237
+ return __generator(this, function (_a) {
238
+ return [2, this._singlePromise.run('_getStorageCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
239
+ var credentials, tokenStr, error_2;
240
+ return __generator(this, function (_a) {
241
+ switch (_a.label) {
242
+ case 0:
243
+ credentials = null;
244
+ return [4, this._storage.getItem(this._tokenSectionName)];
245
+ case 1:
246
+ tokenStr = _a.sent();
247
+ if (!(tokenStr !== undefined && tokenStr !== null)) return [3, 5];
248
+ _a.label = 2;
249
+ case 2:
250
+ _a.trys.push([2, 3, , 5]);
251
+ credentials = JSON.parse(tokenStr);
252
+ if (credentials === null || credentials === void 0 ? void 0 : credentials.expires_at) {
253
+ credentials.expires_at = new Date(credentials.expires_at);
254
+ }
255
+ return [3, 5];
256
+ case 3:
257
+ error_2 = _a.sent();
258
+ return [4, this._storage.removeItem(this._tokenSectionName)];
259
+ case 4:
260
+ _a.sent();
261
+ credentials = null;
262
+ return [3, 5];
263
+ case 5: return [2, credentials];
264
+ }
265
+ });
266
+ }); })];
267
+ });
268
+ });
269
+ };
270
+ LocalCredentials.prototype._getStorageCredentialsSync = function () {
271
+ var credentials = null;
272
+ var tokenStr = this._storage.getItemSync(this._tokenSectionName);
273
+ if (tokenStr !== undefined && tokenStr !== null) {
274
+ try {
275
+ credentials = JSON.parse(tokenStr);
276
+ if (credentials === null || credentials === void 0 ? void 0 : credentials.expires_at) {
277
+ credentials.expires_at = new Date(credentials.expires_at);
278
+ }
279
+ }
280
+ catch (error) {
281
+ this._storage.removeItem(this._tokenSectionName);
282
+ credentials = null;
283
+ }
284
+ }
285
+ return credentials;
286
+ };
287
+ return LocalCredentials;
288
+ }());
289
+ export { LocalCredentials };
290
+ var OAuth2Client = (function () {
291
+ function OAuth2Client(options) {
292
+ this._singlePromise = new SinglePromise();
293
+ this._apiOrigin = options.apiOrigin;
294
+ this._clientId = options.clientId;
295
+ this._retry = this._formatRetry(options.retry, OAuth2Client._defaultRetry);
296
+ if (options.baseRequest != undefined) {
297
+ this._baseRequest = options.baseRequest;
298
+ }
299
+ else {
300
+ this._baseRequest = defaultRequest;
301
+ }
302
+ this._tokenInURL = options.tokenInURL;
303
+ this._headers = options.headers;
304
+ this._storage = options.storage || defaultStorage;
305
+ this._localCredentials = new LocalCredentials({
306
+ tokenSectionName: 'credentials_' + options.clientId,
307
+ storage: this._storage,
308
+ });
309
+ this._clientSecret = options.clientSecret;
310
+ this._refreshTokenFunc =
311
+ options.refreshTokenFunc || this._defaultRefreshTokenFunc;
312
+ }
313
+ OAuth2Client.prototype.setCredentials = function (credentials) {
314
+ return this._localCredentials.setCredentials(credentials);
315
+ };
316
+ OAuth2Client.prototype.getAccessToken = function () {
317
+ return __awaiter(this, void 0, void 0, function () {
318
+ var credentials;
319
+ return __generator(this, function (_a) {
320
+ switch (_a.label) {
321
+ case 0: return [4, this._getCredentials()];
322
+ case 1:
323
+ credentials = _a.sent();
324
+ if (credentials === null || credentials === void 0 ? void 0 : credentials.access_token) {
325
+ return [2, Promise.resolve(credentials.access_token)];
326
+ }
327
+ return [2, Promise.reject({ error: ErrorType.UNAUTHENTICATED })];
328
+ }
329
+ });
330
+ });
331
+ };
332
+ OAuth2Client.prototype.request = function (url, options) {
333
+ return __awaiter(this, void 0, void 0, function () {
334
+ var retry, deviceId, credentials, response, maxRequestTimes, requestTime, responseError_1;
335
+ return __generator(this, function (_a) {
336
+ switch (_a.label) {
337
+ case 0:
338
+ if (!options) {
339
+ options = {};
340
+ }
341
+ retry = this._formatRetry(options.retry, this._retry);
342
+ options.headers = options.headers || {};
343
+ if (this._headers) {
344
+ options.headers = __assign(__assign({}, this._headers), options.headers);
345
+ }
346
+ if (!options.headers[RequestIdHeaderName]) {
347
+ options.headers[RequestIdHeaderName] = generateRequestId();
348
+ }
349
+ if (!!options.headers[DeviceIdHeaderName]) return [3, 2];
350
+ return [4, this._getDeviceId()];
351
+ case 1:
352
+ deviceId = _a.sent();
353
+ options.headers[DeviceIdHeaderName] = deviceId;
354
+ _a.label = 2;
355
+ case 2:
356
+ if (!(options === null || options === void 0 ? void 0 : options.withCredentials)) return [3, 4];
357
+ return [4, this._getCredentials()];
358
+ case 3:
359
+ credentials = _a.sent();
360
+ if (credentials) {
361
+ if (this._tokenInURL) {
362
+ if (url.indexOf('?') < 0) {
363
+ url += '?';
364
+ }
365
+ url += 'access_token=' + credentials.access_token;
366
+ }
367
+ else {
368
+ options.headers['Authorization'] =
369
+ credentials.token_type + ' ' + credentials.access_token;
370
+ }
371
+ }
372
+ return [3, 5];
373
+ case 4:
374
+ if (this._clientId && url.indexOf('client_id') < 0) {
375
+ url += url.indexOf('?') < 0 ? '?' : '&';
376
+ url += 'client_id=' + this._clientId;
377
+ }
378
+ _a.label = 5;
379
+ case 5:
380
+ if (url.startsWith('/')) {
381
+ url = this._apiOrigin + url;
382
+ }
383
+ response = null;
384
+ maxRequestTimes = retry + 1;
385
+ requestTime = 0;
386
+ _a.label = 6;
387
+ case 6:
388
+ if (!(requestTime < maxRequestTimes)) return [3, 15];
389
+ _a.label = 7;
390
+ case 7:
391
+ _a.trys.push([7, 9, , 12]);
392
+ return [4, this._baseRequest(url, options)];
393
+ case 8:
394
+ response = _a.sent();
395
+ return [3, 15];
396
+ case 9:
397
+ responseError_1 = _a.sent();
398
+ if (!(options.withCredentials && responseError_1 && responseError_1.error === ErrorType.UNAUTHENTICATED)) return [3, 11];
399
+ return [4, this.setCredentials(null)];
400
+ case 10:
401
+ _a.sent();
402
+ return [2, Promise.reject(responseError_1)];
403
+ case 11:
404
+ if (requestTime === retry ||
405
+ !responseError_1 ||
406
+ responseError_1.error !== 'unreachable') {
407
+ return [2, Promise.reject(responseError_1)];
408
+ }
409
+ return [3, 12];
410
+ case 12: return [4, this._sleep(OAuth2Client._retryInterval)];
411
+ case 13:
412
+ _a.sent();
413
+ _a.label = 14;
414
+ case 14:
415
+ requestTime++;
416
+ return [3, 6];
417
+ case 15: return [2, response];
418
+ }
419
+ });
420
+ });
421
+ };
422
+ OAuth2Client.prototype._checkRetry = function (retry) {
423
+ var responseError = null;
424
+ if (typeof retry !== 'number' ||
425
+ retry < OAuth2Client._minRetry ||
426
+ retry > OAuth2Client._maxRetry) {
427
+ responseError = {
428
+ error: ErrorType.UNREACHABLE,
429
+ error_description: 'wrong options param: retry',
430
+ };
431
+ }
432
+ if (responseError) {
433
+ throw responseError;
434
+ }
435
+ return retry;
436
+ };
437
+ OAuth2Client.prototype._formatRetry = function (retry, defaultVale) {
438
+ if (typeof retry === 'undefined') {
439
+ return defaultVale;
440
+ }
441
+ else {
442
+ return this._checkRetry(retry);
443
+ }
444
+ };
445
+ OAuth2Client.prototype._sleep = function (ms) {
446
+ return __awaiter(this, void 0, void 0, function () {
447
+ return __generator(this, function (_a) {
448
+ return [2, new Promise(function (resolve) {
449
+ setTimeout(function () {
450
+ resolve();
451
+ }, ms);
452
+ })];
453
+ });
454
+ });
455
+ };
456
+ OAuth2Client.prototype._refreshToken = function (credentials) {
457
+ return __awaiter(this, void 0, void 0, function () {
458
+ var _this = this;
459
+ return __generator(this, function (_a) {
460
+ return [2, this._singlePromise.run('_refreshToken', function () { return __awaiter(_this, void 0, void 0, function () {
461
+ var newCredentials, error_3;
462
+ return __generator(this, function (_a) {
463
+ switch (_a.label) {
464
+ case 0:
465
+ if (!credentials || !credentials.refresh_token) {
466
+ return [2, this._unAuthenticatedError('no refresh token found in credentials')];
467
+ }
468
+ _a.label = 1;
469
+ case 1:
470
+ _a.trys.push([1, 4, , 7]);
471
+ return [4, this._refreshTokenFunc(credentials.refresh_token)];
472
+ case 2:
473
+ newCredentials = _a.sent();
474
+ return [4, this._localCredentials.setCredentials(newCredentials)];
475
+ case 3:
476
+ _a.sent();
477
+ return [2, newCredentials];
478
+ case 4:
479
+ error_3 = _a.sent();
480
+ if (!(error_3.error === ErrorType.INVALID_GRANT)) return [3, 6];
481
+ return [4, this._localCredentials.setCredentials(null)];
482
+ case 5:
483
+ _a.sent();
484
+ return [2, this._unAuthenticatedError(error_3.error_description)];
485
+ case 6: return [2, Promise.reject(error_3)];
486
+ case 7: return [2];
487
+ }
488
+ });
489
+ }); })];
490
+ });
491
+ });
492
+ };
493
+ OAuth2Client.prototype._anonymousSignIn = function (credentials) {
494
+ return __awaiter(this, void 0, void 0, function () {
495
+ var _this = this;
496
+ return __generator(this, function (_a) {
497
+ return [2, this._singlePromise.run('_anonymous', function () { return __awaiter(_this, void 0, void 0, function () {
498
+ var newCredentials, error_4;
499
+ return __generator(this, function (_a) {
500
+ switch (_a.label) {
501
+ case 0:
502
+ if (!credentials || credentials.scope !== 'anonymous') {
503
+ return [2, this._unAuthenticatedError('no anonymous in credentials')];
504
+ }
505
+ _a.label = 1;
506
+ case 1:
507
+ _a.trys.push([1, 4, , 7]);
508
+ return [4, this.request('/auth/v1/signin/anonymously', {
509
+ method: 'POST',
510
+ body: {
511
+ client_id: this._clientId,
512
+ client_secret: this._clientSecret,
513
+ },
514
+ })];
515
+ case 2:
516
+ newCredentials = _a.sent();
517
+ return [4, this._localCredentials.setCredentials(newCredentials)];
518
+ case 3:
519
+ _a.sent();
520
+ return [2, newCredentials];
521
+ case 4:
522
+ error_4 = _a.sent();
523
+ if (!(error_4.error === ErrorType.INVALID_GRANT)) return [3, 6];
524
+ return [4, this._localCredentials.setCredentials(null)];
525
+ case 5:
526
+ _a.sent();
527
+ return [2, this._unAuthenticatedError(error_4.error_description)];
528
+ case 6: return [2, Promise.reject(error_4)];
529
+ case 7: return [2];
530
+ }
531
+ });
532
+ }); })];
533
+ });
534
+ });
535
+ };
536
+ OAuth2Client.prototype._defaultRefreshTokenFunc = function (refreshToken) {
537
+ if (refreshToken === undefined || refreshToken === '') {
538
+ return this._unAuthenticatedError('refresh token not found');
539
+ }
540
+ return this.request('/auth/v1/token', {
541
+ method: 'POST',
542
+ body: {
543
+ client_id: this._clientId,
544
+ client_secret: this._clientSecret,
545
+ grant_type: 'refresh_token',
546
+ refresh_token: refreshToken,
547
+ },
548
+ });
549
+ };
550
+ OAuth2Client.prototype._getCredentials = function () {
551
+ return __awaiter(this, void 0, void 0, function () {
552
+ var credentials;
553
+ return __generator(this, function (_a) {
554
+ switch (_a.label) {
555
+ case 0: return [4, this._localCredentials.getCredentials()];
556
+ case 1:
557
+ credentials = _a.sent();
558
+ if (!isCredentialsExpired(credentials)) return [3, 5];
559
+ if (!(credentials && credentials.scope === 'anonymous')) return [3, 3];
560
+ return [4, this._anonymousSignIn(credentials)];
561
+ case 2:
562
+ credentials = _a.sent();
563
+ return [3, 5];
564
+ case 3: return [4, this._refreshToken(credentials)];
565
+ case 4:
566
+ credentials = _a.sent();
567
+ _a.label = 5;
568
+ case 5: return [2, credentials];
569
+ }
570
+ });
571
+ });
572
+ };
573
+ OAuth2Client.prototype.getCredentialsSync = function () {
574
+ var credentials = this._localCredentials._getStorageCredentialsSync();
575
+ return credentials;
576
+ };
577
+ OAuth2Client.prototype.getCredentialsAsync = function () {
578
+ return this._localCredentials.getCredentials();
579
+ };
580
+ OAuth2Client.prototype.getScope = function () {
581
+ return __awaiter(this, void 0, void 0, function () {
582
+ var credentials;
583
+ return __generator(this, function (_a) {
584
+ switch (_a.label) {
585
+ case 0: return [4, this._localCredentials.getCredentials()];
586
+ case 1:
587
+ credentials = _a.sent();
588
+ if (credentials == null) {
589
+ return [2, this._unAuthenticatedError("credentials not found")];
590
+ }
591
+ return [2, credentials.scope];
592
+ }
593
+ });
594
+ });
595
+ };
596
+ OAuth2Client.prototype._getDeviceId = function () {
597
+ return __awaiter(this, void 0, void 0, function () {
598
+ var deviceId;
599
+ return __generator(this, function (_a) {
600
+ switch (_a.label) {
601
+ case 0:
602
+ if (this._deviceID) {
603
+ return [2, this._deviceID];
604
+ }
605
+ return [4, this._storage.getItem(DeviceIdSectionName)];
606
+ case 1:
607
+ deviceId = _a.sent();
608
+ if (!!(typeof deviceId === 'string' &&
609
+ deviceId.length >= 16 &&
610
+ deviceId.length <= 48)) return [3, 3];
611
+ deviceId = uuidv4();
612
+ return [4, this._storage.setItem(DeviceIdSectionName, deviceId)];
613
+ case 2:
614
+ _a.sent();
615
+ _a.label = 3;
616
+ case 3:
617
+ this._deviceID = deviceId;
618
+ return [2, deviceId];
619
+ }
620
+ });
621
+ });
622
+ };
623
+ OAuth2Client.prototype._unAuthenticatedError = function (err) {
624
+ return Promise.reject({
625
+ error: ErrorType.UNAUTHENTICATED,
626
+ error_description: err,
627
+ });
628
+ };
629
+ OAuth2Client._defaultRetry = 2;
630
+ OAuth2Client._minRetry = 0;
631
+ OAuth2Client._maxRetry = 5;
632
+ OAuth2Client._retryInterval = 1000;
633
+ return OAuth2Client;
634
+ }());
635
+ export { OAuth2Client };
636
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29hdXRoMmNsaWVudC9vYXV0aDJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBYXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWpFLElBQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBQzNDLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLElBQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBU3hDLE1BQU0sQ0FBQyxJQUFNLGNBQWMsR0FBb0IsVUFDN0MsR0FBVyxFQUNYLE9BQXdCOzs7OztnQkFFcEIsTUFBTSxHQUFhLElBQUksQ0FBQztnQkFDeEIsYUFBYSxHQUF5QixJQUFJLENBQUM7Ozs7Z0JBR3ZDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtvQkFDNUQsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDckQ7Z0JBQ2dDLFdBQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBQTs7Z0JBQXhELGNBQWMsR0FBYSxTQUE2QjtnQkFDekMsV0FBTSxjQUFjLENBQUMs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QztTQWxWWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXJyb3JUeXBlIH0gZnJvbSAnLi9jb25zdHMnO1xuXG5pbXBvcnQgeyBBdXRoQ2xpZW50LCBTaW1wbGVTdG9yYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5pbXBvcnQge1xuICBDcmVkZW50aWFscyxcbiAgUmVzcG9uc2VFcnJvcixcbiAgUmVxdWVzdE9wdGlvbnMsXG4gIFJlcXVlc3RGdW5jdGlvbixcbiAgT0F1dGgyQ2xpZW50T3B0aW9ucyxcbiAgQXV0aENsaWVudFJlcXVlc3RPcHRpb25zLFxufSBmcm9tICcuL21vZGVscyc7XG5cbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4uL3V0aWxzL3V1aWQnO1xuXG5pbXBvcnQgeyBTaW5nbGVQcm9taXNlIH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb24vc2luZ2xlLXByb21pc2UnO1xuXG5jb25zdCBSZXF1ZXN0SWRIZWFkZXJOYW1lID0gJ3gtcmVxdWVzdC1pZCc7XG5jb25zdCBEZXZpY2VJZEhlYWRlck5hbWUgPSAneC1kZXZpY2UtaWQnO1xuY29uc3QgRGV2aWNlSWRTZWN0aW9uTmFtZSA9ICdkZXZpY2VfaWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvUmVzcG9uc2VFcnJvck9wdGlvbnMge1xuICBlcnJvcj86IEVycm9yVHlwZTtcbiAgZXJyb3JfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICBlcnJvcl91cmk/OiBzdHJpbmcgfCBudWxsO1xuICBkZXRhaWxzPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0OiBSZXF1ZXN0RnVuY3Rpb24gPSBhc3luYyA8VD4oXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgbGV0IHJlc3VsdDogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIE9iamVjdHMgbXVzdCBiZSBjb3BpZWQgdG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgZGF0YSBzdWNoIGFzIGJvZHkuXG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICBpZiAoIWNvcHlPcHRpb25zLm1ldGhvZCkge1xuICAgICAgY29weU9wdGlvbnMubWV0aG9kID0gJ0dFVCc7XG4gICAgfVxuICAgIGlmIChjb3B5T3B0aW9ucy5ib2R5ICYmIHR5cGVvZiBjb3B5T3B0aW9ucy5ib2R5ICE9PSAnc3RyaW5nJykge1xuICAgICAgY29weU9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvcHlPcHRpb25zLmJvZHkpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZVJlc3VsdDogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGNvcHlPcHRpb25zKTtcbiAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZVJlc3VsdC5qc29uKCk7XG4gICAgaWYgKGpzb25SZXNwb25zZT8uZXJyb3IpIHtcbiAgICAgIHJlc3BvbnNlRXJyb3IgPSBqc29uUmVzcG9uc2UgYXMgUmVzcG9uc2VFcnJvcjtcbiAgICAgIHJlc3BvbnNlRXJyb3IuZXJyb3JfdXJpID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBqc29uUmVzcG9uc2UgYXMgVDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBFcnJvclR5cGUuVU5SRUFDSEFCTEUsXG4gICAgICBlcnJvcl9kZXNjcmlwdGlvbjogZXJyb3IubWVzc2FnZSxcbiAgICAgIGVycm9yX3VyaTogbmV3IFVSTCh1cmwpLnBhdGhuYW1lLFxuICAgIH07XG4gIH1cbiAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICB0aHJvdyByZXNwb25zZUVycm9yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b1Jlc3BvbnNlRXJyb3IgPSAoXG4gIGVycm9yOiBSZXNwb25zZUVycm9yIHwgRXJyb3IsXG4gIG9wdGlvbnM/OiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zLFxuKTogUmVzcG9uc2VFcnJvciA9PiB7XG4gIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yO1xuICBjb25zdCBmb3JtYXRPcHRpb25zOiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgZXJyb3I6IGZvcm1hdE9wdGlvbnMuZXJyb3IgfHwgRXJyb3JUeXBlLkxPQ0FMLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGZvcm1hdE9wdGlvbnMuZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IubWVzc2FnZSxcbiAgICAgIGVycm9yX3VyaTogZm9ybWF0T3B0aW9ucy5lcnJvcl91cmksXG4gICAgICBkZXRhaWxzOiBmb3JtYXRPcHRpb25zLmRldGFpbHMgfHwgZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmb3JtYXRFcnJvcjogVG9SZXNwb25zZUVycm9yT3B0aW9ucyA9IGVycm9yIHx8IHt9O1xuICAgIHJlc3BvbnNlRXJyb3IgPSB7XG4gICAgICBlcnJvcjogZm9ybWF0T3B0aW9ucy5lcnJvciB8fCBmb3JtYXRFcnJvci5lcnJvciB8fCBFcnJvclR5cGUuTE9DQUwsXG4gICAgICBlcnJvcl9kZXNjcmlwdGlvbjpcbiAgICAgICAgZm9ybWF0T3B0aW9ucy5lcnJvcl9kZXNjcmlwdGlvbiB8fCBmb3JtYXRFcnJvci5lcnJvcl9kZXNjcmlwdGlvbixcbiAgICAgIGVycm9yX3VyaTogZm9ybWF0T3B0aW9ucy5lcnJvcl91cmkgfHwgZm9ybWF0RXJyb3IuZXJyb3JfdXJpLFxuICAgICAgZGV0YWlsczogZm9ybWF0T3B0aW9ucy5kZXRhaWxzIHx8IGZvcm1hdEVycm9yLmRldGFpbHMsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2VFcnJvcjtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgcmVxdWVzdCBpZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmVxdWVzdElkKCk6IHN0cmluZyB7XG4gIHJldHVybiB1dWlkdjQoKTtcbn1cblxuXG4vKipcbiAqIERlZmF1bHQgU3RvcmFnZS5cbiAqL1xuY2xhc3MgRGVmYXVsdFN0b3JhZ2UgaW1wbGVtZW50cyBTaW1wbGVTdG9yYWdlIHtcbiAgLyoqXG4gICAgICogR2V0IGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICBhc3luYyBnZXRJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmVtb3ZlIGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICBhc3luYyByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBTZXQgaXRlbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICovXG4gIGFzeW5jIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBHZXQgaXRlbSBzeW5jLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgZ2V0SXRlbVN5bmMoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgaXRlbSBzeW5jLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgcmVtb3ZlSXRlbVN5bmMoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIFNldCBpdGVtIHN5bmMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICBzZXRJdGVtU3luYyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0b3JhZ2UgPSBuZXcgRGVmYXVsdFN0b3JhZ2UoKTtcblxuaW50ZXJmYWNlIExvY2FsQ3JlZGVudGlhbHNPcHRpb25zIHtcbiAgdG9rZW5TZWN0aW9uTmFtZTogc3RyaW5nO1xuICBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNyZWRlbnRpYWxzIGlzIGV4cGlyZWQuXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gIGxldCBpc0V4cGlyZWQgPSB0cnVlO1xuICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQgJiYgY3JlZGVudGlhbHM/LmFjY2Vzc190b2tlbikge1xuICAgIGlzRXhwaXJlZCA9IGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPCBuZXcgRGF0ZSgpO1xuICB9XG4gIHJldHVybiBpc0V4cGlyZWQ7XG59XG5cbi8qKlxuICogTG9jYWwgY3JlZGVudGlhbHMuXG4gKiBMb2NhbCBjcmVkZW50aWFscywgd2l0aCBtZW1vcnkgY2FjaGUgYW5kIHN0b3JhZ2UgY2FjaGUuXG4gKiBJZiB0aGUgbWVtb3J5IGNhY2hlIGV4cGlyZXMsIHRoZSBzdG9yYWdlIGNhY2hlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxDcmVkZW50aWFscyB7XG4gIHByaXZhdGUgX3Rva2VuU2VjdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTaW1wbGVTdG9yYWdlO1xuXG4gIHByaXZhdGUgX2NyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3NpbmdsZVByb21pc2U6IFNpbmdsZVByb21pc2UgPSBuZXcgU2luZ2xlUHJvbWlzZSgpO1xuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0xvY2FsQ3JlZGVudGlhbHNPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbENyZWRlbnRpYWxzT3B0aW9ucykge1xuICAgIHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUgPSBvcHRpb25zLnRva2VuU2VjdGlvbk5hbWU7XG4gICAgdGhpcy5fc3RvcmFnZSA9IG9wdGlvbnMuc3RvcmFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRDcmVkZW50aWFscyBQcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBmZXRjaCBhcGkgcmVxdWVzdCBpbXBsZW1lbnRhdGlvbiB3aXRoIGF1dGggY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRDcmVkZW50aWFscyhjcmVkZW50aWFscz86IENyZWRlbnRpYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNyZWRlbnRpYWxzPy5leHBpcmVzX2luKSB7XG4gICAgICBjcmVkZW50aWFscy5leHBpcmVzX2F0ID0gbmV3IERhdGUoXG4gICAgICAgIERhdGUubm93KCkgKyAoY3JlZGVudGlhbHMuZXhwaXJlc19pbiAtIDMwKSAqIDEwMDAsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNyZWRlbnRpYWxzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUsIHRva2VuU3RyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9zdG9yYWdlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLl90b2tlblNlY3Rpb25OYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fc2luZ2xlUHJvbWlzZS5ydW4oJ2dldENyZWRlbnRpYWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGlzQ3JlZGVudGlhbHNFeHBpcmVkKHRoaXMuX2NyZWRlbnRpYWxzKSkge1xuICAgICAgICB0aGlzLl9jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2dldFN0b3JhZ2VDcmVkZW50aWFscygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2NyZWRlbnRpYWxzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdG9yYWdlIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZVByb21pc2UucnVuKCdfZ2V0U3RvcmFnZUNyZWRlbnRpYWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGw7XG4gICAgICBjb25zdCB0b2tlblN0cjogc3RyaW5nID0gYXdhaXQgdGhpcy5fc3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICB0aGlzLl90b2tlblNlY3Rpb25OYW1lLFxuICAgICAgKTtcbiAgICAgIGlmICh0b2tlblN0ciAhPT0gdW5kZWZpbmVkICYmIHRva2VuU3RyICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKHRva2VuU3RyKTtcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShjcmVkZW50aWFscy5leHBpcmVzX2F0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUpO1xuICAgICAgICAgIGNyZWRlbnRpYWxzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF9nZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGw7XG4gICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbVN5bmMoXG4gICAgICB0aGlzLl90b2tlblNlY3Rpb25OYW1lLFxuICAgICk7XG4gICAgaWYgKHRva2VuU3RyICE9PSB1bmRlZmluZWQgJiYgdG9rZW5TdHIgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gSlNPTi5wYXJzZSh0b2tlblN0cik7XG4gICAgICAgIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19hdCkge1xuICAgICAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShjcmVkZW50aWFscy5leHBpcmVzX2F0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUpO1xuICAgICAgICBjcmVkZW50aWFscyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbn1cblxuLyoqXG4gKiBPQXV0aDJDbGllbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoMkNsaWVudCBpbXBsZW1lbnRzIEF1dGhDbGllbnQge1xuICBwcml2YXRlIHN0YXRpYyBfZGVmYXVsdFJldHJ5ID0gMjtcbiAgcHJpdmF0ZSBzdGF0aWMgX21pblJldHJ5ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX21heFJldHJ5ID0gNTtcbiAgcHJpdmF0ZSBzdGF0aWMgX3JldHJ5SW50ZXJ2YWwgPSAxMDAwO1xuXG4gIHByaXZhdGUgX2FwaU9yaWdpbjogc3RyaW5nO1xuICBwcml2YXRlIF9jbGllbnRJZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXRyeTogbnVtYmVyO1xuICBwcml2YXRlIF9jbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2Jhc2VSZXF1ZXN0OiA8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApID0+IFByb21pc2U8VD47XG4gIHByaXZhdGUgX2xvY2FsQ3JlZGVudGlhbHM6IExvY2FsQ3JlZGVudGlhbHM7XG4gIHByaXZhdGUgX3N0b3JhZ2U6IFNpbXBsZVN0b3JhZ2U7XG4gIHByaXZhdGUgX2RldmljZUlEPzogc3RyaW5nO1xuICBwcml2YXRlIF90b2tlbkluVVJMPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVmcmVzaFRva2VuRnVuYzogKHJlZnJlc2hUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxDcmVkZW50aWFscz47XG4gIHByaXZhdGUgX2hlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIF9zaW5nbGVQcm9taXNlOiBTaW5nbGVQcm9taXNlID0gbmV3IFNpbmdsZVByb21pc2UoKTtcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPQXV0aDJDbGllbnRPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPQXV0aDJDbGllbnRPcHRpb25zKSB7XG4gICAgdGhpcy5fYXBpT3JpZ2luID0gb3B0aW9ucy5hcGlPcmlnaW47XG4gICAgdGhpcy5fY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkO1xuICAgIHRoaXMuX3JldHJ5ID0gdGhpcy5fZm9ybWF0UmV0cnkob3B0aW9ucy5yZXRyeSwgT0F1dGgyQ2xpZW50Ll9kZWZhdWx0UmV0cnkpO1xuICAgIGlmIChvcHRpb25zLmJhc2VSZXF1ZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fYmFzZVJlcXVlc3QgPSBvcHRpb25zLmJhc2VSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9iYXNlUmVxdWVzdCA9IGRlZmF1bHRSZXF1ZXN0O1xuICAgIH1cbiAgICB0aGlzLl90b2tlbkluVVJMID0gb3B0aW9ucy50b2tlbkluVVJMO1xuICAgIHRoaXMuX2hlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuX3N0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2UgfHwgZGVmYXVsdFN0b3JhZ2U7XG4gICAgdGhpcy5fbG9jYWxDcmVkZW50aWFscyA9IG5ldyBMb2NhbENyZWRlbnRpYWxzKHtcbiAgICAgIHRva2VuU2VjdGlvbk5hbWU6ICdjcmVkZW50aWFsc18nICsgb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgIHN0b3JhZ2U6IHRoaXMuX3N0b3JhZ2UsXG4gICAgfSk7XG4gICAgdGhpcy5fY2xpZW50U2VjcmV0ID0gb3B0aW9ucy5jbGllbnRTZWNyZXQ7XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuRnVuYyA9XG4gICAgICBvcHRpb25zLnJlZnJlc2hUb2tlbkZ1bmMgfHwgdGhpcy5fZGVmYXVsdFJlZnJlc2hUb2tlbkZ1bmM7XG4gIH1cblxuICAvKipcbiAgICogc2V0Q3JlZGVudGlhbHMgUHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgZmV0Y2ggYXBpIHJlcXVlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBhdXRoIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBwdWJsaWMgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRBY2Nlc3NUb2tlbiByZXR1cm4gYSB2YWxpZGF0ZSBhY2Nlc3MgdG9rZW5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2dldENyZWRlbnRpYWxzKCk7XG4gICAgaWYgKGNyZWRlbnRpYWxzPy5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgZXJyb3I6IEVycm9yVHlwZS5VTkFVVEhFTlRJQ0FURUQgfSBhcyBSZXNwb25zZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXF1ZXN0IGh0dHAgbGlrZSBzaW1wbGUgZmV0Y2ggYXBpLCBleHA6cmVxdWVzdCgnL3YxL3VzZXIvbWUnLCB7d2l0aENyZWRlbnRpYWxzOnRydWV9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7QXV0aENsaWVudFJlcXVlc3RPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQXV0aENsaWVudFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgcmV0cnk6IG51bWJlciA9IHRoaXMuX2Zvcm1hdFJldHJ5KG9wdGlvbnMucmV0cnksIHRoaXMuX3JldHJ5KTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307XG4gICAgaWYgKHRoaXMuX2hlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4udGhpcy5faGVhZGVycyxcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnNbUmVxdWVzdElkSGVhZGVyTmFtZV0pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tSZXF1ZXN0SWRIZWFkZXJOYW1lXSA9IGdlbmVyYXRlUmVxdWVzdElkKCk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW0RldmljZUlkSGVhZGVyTmFtZV0pIHtcbiAgICAgIGNvbnN0IGRldmljZUlkID0gYXdhaXQgdGhpcy5fZ2V0RGV2aWNlSWQoKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tEZXZpY2VJZEhlYWRlck5hbWVdID0gZGV2aWNlSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBpZiAodGhpcy5fdG9rZW5JblVSTCkge1xuICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgICAgdXJsICs9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgICAgdXJsICs9ICdhY2Nlc3NfdG9rZW49JyArIGNyZWRlbnRpYWxzLmFjY2Vzc190b2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9XG4gICAgICAgICAgICBjcmVkZW50aWFscy50b2tlbl90eXBlICsgJyAnICsgY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9jbGllbnRJZCAmJiB1cmwuaW5kZXhPZignY2xpZW50X2lkJykgPCAwKSB7XG4gICAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpIDwgMCA/ICc/JyA6ICcmJztcbiAgICAgICAgdXJsICs9ICdjbGllbnRfaWQ9JyArIHRoaXMuX2NsaWVudElkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gdGhpcy5fYXBpT3JpZ2luICsgdXJsO1xuICAgIH1cbiAgICBsZXQgcmVzcG9uc2U6IFQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBtYXhSZXF1ZXN0VGltZXM6IG51bWJlciA9IHJldHJ5ICsgMTtcbiAgICBmb3IgKFxuICAgICAgbGV0IHJlcXVlc3RUaW1lID0gMDtcbiAgICAgIHJlcXVlc3RUaW1lIDwgbWF4UmVxdWVzdFRpbWVzO1xuICAgICAgcmVxdWVzdFRpbWUrK1xuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9iYXNlUmVxdWVzdDxUPih1cmwsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICYmIHJlc3BvbnNlRXJyb3IgJiYgcmVzcG9uc2VFcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3JlZGVudGlhbHMobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWVzdFRpbWUgPT09IHJldHJ5IHx8XG4gICAgICAgICAgIXJlc3BvbnNlRXJyb3IgfHxcbiAgICAgICAgICByZXNwb25zZUVycm9yLmVycm9yICE9PSAndW5yZWFjaGFibGUnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5fc2xlZXAoT0F1dGgyQ2xpZW50Ll9yZXRyeUludGVydmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSBfY2hlY2tSZXRyeShyZXRyeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiByZXRyeSAhPT0gJ251bWJlcicgfHxcbiAgICAgIHJldHJ5IDwgT0F1dGgyQ2xpZW50Ll9taW5SZXRyeSB8fFxuICAgICAgcmV0cnkgPiBPQXV0aDJDbGllbnQuX21heFJldHJ5XG4gICAgKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogJ3dyb25nIG9wdGlvbnMgcGFyYW06IHJldHJ5JyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChyZXNwb25zZUVycm9yKSB7XG4gICAgICB0aHJvdyByZXNwb25zZUVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmV0cnk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWxlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgX2Zvcm1hdFJldHJ5KHJldHJ5OiBudW1iZXIsIGRlZmF1bHRWYWxlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgcmV0cnkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja1JldHJ5KHJldHJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2xlZXAuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIGV4cGlyZWQgdG9rZW4uXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5fc2luZ2xlUHJvbWlzZS5ydW4oJ19yZWZyZXNoVG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICFjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWRFcnJvcignbm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjcmVkZW50aWFscycpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fcmVmcmVzaFRva2VuRnVuYyhcbiAgICAgICAgICBjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKTtcbiAgICAgICAgcmV0dXJuIG5ld0NyZWRlbnRpYWxzXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuZXJyb3IgPT09IEVycm9yVHlwZS5JTlZBTElEX0dSQU5UKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhudWxsKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkRXJyb3IoZXJyb3IuZXJyb3JfZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYW5vbnltb3VzIHNpZ25JblxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Fub255bW91c1NpZ25JbihjcmVkZW50aWFsczogQ3JlZGVudGlhbHMpOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZVByb21pc2UucnVuKCdfYW5vbnltb3VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5zY29wZSAhPT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZEVycm9yKCdubyBhbm9ueW1vdXMgaW4gY3JlZGVudGlhbHMnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld0NyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVxdWVzdCgnL2F1dGgvdjEvc2lnbmluL2Fub255bW91c2x5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobmV3Q3JlZGVudGlhbHMpO1xuICAgICAgICByZXR1cm4gbmV3Q3JlZGVudGlhbHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLklOVkFMSURfR1JBTlQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG51bGwpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWRFcnJvcihlcnJvci5lcnJvcl9kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJlZnJlc2ggdG9rZW4gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZyZXNoVG9rZW5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwcml2YXRlIF9kZWZhdWx0UmVmcmVzaFRva2VuRnVuYyhcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBpZiAocmVmcmVzaFRva2VuID09PSB1bmRlZmluZWQgfHwgcmVmcmVzaFRva2VuID09PSAnJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZEVycm9yKCdyZWZyZXNoIHRva2VuIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCcvYXV0aC92MS90b2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keToge1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgX2dldENyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2xvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBpZiAoaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHMpKSB7XG4gICAgICBpZiAoY3JlZGVudGlhbHMgJiYgY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhbm9ueW1vdXMnKSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fYW5vbnltb3VzU2lnbkluKGNyZWRlbnRpYWxzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLl9yZWZyZXNoVG9rZW4oY3JlZGVudGlhbHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gdGhpcy5fbG9jYWxDcmVkZW50aWFscy5fZ2V0U3RvcmFnZUNyZWRlbnRpYWxzU3luYygpO1xuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgcHVibGljIGdldENyZWRlbnRpYWxzQXN5bmMoKTogUHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2NvcGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fbG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpO1xuICAgIGlmIChjcmVkZW50aWFscyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkRXJyb3IoXCJjcmVkZW50aWFscyBub3QgZm91bmRcIilcbiAgICB9XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzLnNjb3BlO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBHZXQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERldmljZUlkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuX2RldmljZUlEKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGV2aWNlSUQ7XG4gICAgfVxuICAgIGxldCBkZXZpY2VJZDogc3RyaW5nID0gYXdhaXQgdGhpcy5fc3RvcmFnZS5nZXRJdGVtKFxuICAgICAgRGV2aWNlSWRTZWN0aW9uTmFtZSxcbiAgICApO1xuICAgIGlmICghKHR5cGVvZiBkZXZpY2VJZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGRldmljZUlkLmxlbmd0aCA+PSAxNiAmJlxuICAgICAgZGV2aWNlSWQubGVuZ3RoIDw9IDQ4KSkge1xuICAgICAgZGV2aWNlSWQgPSB1dWlkdjQoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShEZXZpY2VJZFNlY3Rpb25OYW1lLCBkZXZpY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX2RldmljZUlEID0gZGV2aWNlSWQ7XG4gICAgcmV0dXJuIGRldmljZUlkO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bkF1dGhlbnRpY2F0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn1cbiAgICovXG4gIHByaXZhdGUgX3VuQXV0aGVudGljYXRlZEVycm9yPFQ+KGVycj86IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICBlcnJvcjogRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnIsXG4gICAgfSBhcyBSZXNwb25zZUVycm9yKTtcbiAgfVxufVxuIl19