@milkio/redis 1.0.0-beta.99 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1,30 +1,28 @@
1
- import {
2
- __require,
3
- __toESM
4
- } from "./chunk-6sxyen7j.js";
5
-
6
1
  // packages/milkio-redis/index.ts
7
- async function createRedis(options) {
8
- const NodeRedis = await import("./chunk-xt8gwvgg.js");
9
- const redis = await NodeRedis.default.createClient(options).connect();
2
+ async function createRedis(redisClient) {
3
+ const redis = redisClient;
10
4
  const milkioRedis = {
11
5
  redis,
12
- useCache: (key, options2) => ({
6
+ useCache: (key, options) => ({
13
7
  set: async (value, expireMs) => {
14
- await redis.PSETEX(key, expireMs, JSON.stringify(value));
8
+ if (expireMs === null) {
9
+ await redis.SET(key, JSON.stringify(value));
10
+ } else {
11
+ await redis.PSETEX(key, expireMs, JSON.stringify(value));
12
+ }
15
13
  return value;
16
14
  },
17
15
  get: async () => {
18
16
  const result = await redis.GET(key);
19
17
  if (result === null)
20
- return options2?.defaultValue;
18
+ return options?.defaultValue;
21
19
  return reviveJSONParse(JSON.parse(result));
22
20
  },
23
21
  pull: async () => {
24
22
  const resultRaw = await redis.MULTI().GET(key).DEL(key).EXEC();
25
23
  const result = resultRaw[0];
26
24
  if (result === null)
27
- return options2?.defaultValue;
25
+ return options?.defaultValue;
28
26
  return reviveJSONParse(JSON.parse(result));
29
27
  },
30
28
  has: async () => {
@@ -35,29 +33,29 @@ async function createRedis(options) {
35
33
  await redis.DEL(key);
36
34
  }
37
35
  }),
38
- useFetch: (key, options2) => {
39
- if (typeof options2.expireMs !== "number" || options2.expireMs <= 0) {
40
- throw new Error("expireMs must be a positive number");
36
+ useFetch: (key, options) => {
37
+ if (options.expireMs !== null && (typeof options.expireMs !== "number" || options.expireMs <= 0)) {
38
+ throw new Error("expireMs must be a positive number or null");
41
39
  }
42
- if (options2.lockInterval !== undefined && (typeof options2.lockInterval !== "number" || options2.lockInterval <= 0)) {
40
+ if (options.lockInterval !== undefined && (typeof options.lockInterval !== "number" || options.lockInterval <= 0)) {
43
41
  throw new Error("lockInterval must be a positive number if provided");
44
42
  }
45
- if (options2.realExpireMs !== undefined && (typeof options2.realExpireMs !== "number" || options2.realExpireMs <= 0)) {
46
- throw new Error("realExpireMs must be a positive number if provided");
43
+ if (options.realExpireMs !== undefined && options.realExpireMs !== null && (typeof options.realExpireMs !== "number" || options.realExpireMs <= 0)) {
44
+ throw new Error("realExpireMs must be a positive number or null if provided");
47
45
  }
48
- if (options2.notFoundExpireMs !== undefined && (typeof options2.notFoundExpireMs !== "number" || options2.notFoundExpireMs <= 0)) {
49
- throw new Error("notFoundExpireMs must be a positive number if provided");
46
+ if (options.notFoundExpireMs !== undefined && options.notFoundExpireMs !== null && (typeof options.notFoundExpireMs !== "number" || options.notFoundExpireMs <= 0)) {
47
+ throw new Error("notFoundExpireMs must be a positive number or null if provided");
50
48
  }
51
- if (options2.refreshLockInterval !== undefined) {
52
- if (typeof options2.refreshLockInterval !== "number" || options2.refreshLockInterval <= 0) {
49
+ if (options.refreshLockInterval !== undefined) {
50
+ if (typeof options.refreshLockInterval !== "number" || options.refreshLockInterval <= 0) {
53
51
  throw new Error("refreshLockInterval must be a positive number if provided");
54
52
  }
55
- const lockInterval = options2.lockInterval ?? 8192;
56
- if (options2.refreshLockInterval <= lockInterval) {
53
+ const lockInterval = options.lockInterval ?? 8192;
54
+ if (options.refreshLockInterval <= lockInterval) {
57
55
  throw new Error("refreshLockInterval must be greater than lockInterval");
58
56
  }
59
57
  }
60
- if (typeof options2.fetch !== "function") {
58
+ if (typeof options.fetch !== "function") {
61
59
  throw new Error("fetch must be a function");
62
60
  }
63
61
  return {
@@ -69,9 +67,12 @@ async function createRedis(options) {
69
67
  await redis.DEL(key);
70
68
  },
71
69
  fetch: async () => {
72
- const lockInterval = options2.lockInterval ?? 8192;
73
- const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
74
- const notFoundExpireMs = options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
70
+ const lockInterval = options.lockInterval ?? 8192;
71
+ let realExpireMs = options.realExpireMs ?? null;
72
+ if (options.expireMs !== null) {
73
+ realExpireMs = options.realExpireMs ?? Math.floor(options.expireMs * (Math.random() + 0.5)) + 8192;
74
+ }
75
+ const notFoundExpireMs = options.notFoundExpireMs ?? (options.expireMs !== null ? Math.min(options.expireMs, 16384) : 86400000);
75
76
  const resultRaw = await redis.GET(key);
76
77
  const result = resultRaw ? reviveJSONParse(JSON.parse(resultRaw)) : undefined;
77
78
  const now = Date.now();
@@ -80,13 +81,34 @@ async function createRedis(options) {
80
81
  }
81
82
  const refreshLockKey = `${key}:refresh-lock`;
82
83
  if (await redis.EXISTS(refreshLockKey)) {
83
- return result ? result.R : options2?.defaultValue;
84
+ return result ? result.R : options?.defaultValue;
84
85
  }
85
86
  const lockKey = `${key}:lock`;
86
87
  const lockSet = await redis.SET(lockKey, "1", { PX: lockInterval, NX: true });
87
88
  const gotLock = lockSet === "OK";
88
- if (!gotLock)
89
- return result ? result.R : options2.defaultValue;
89
+ if (!gotLock) {
90
+ const maxWaitTime = lockInterval;
91
+ const waitInterval = 42;
92
+ let waited = 0;
93
+ while (waited < maxWaitTime) {
94
+ await new Promise((resolve) => setTimeout(resolve, waitInterval));
95
+ waited += waitInterval;
96
+ const waitedResultRaw = await redis.GET(key);
97
+ const waitedResult = waitedResultRaw ? reviveJSONParse(JSON.parse(waitedResultRaw)) : undefined;
98
+ if (waitedResult && waitedResult.T > now) {
99
+ return waitedResult.R;
100
+ }
101
+ if (!await redis.EXISTS(lockKey)) {
102
+ break;
103
+ }
104
+ }
105
+ const finalResultRaw = await redis.GET(key);
106
+ const finalResult = finalResultRaw ? reviveJSONParse(JSON.parse(finalResultRaw)) : undefined;
107
+ if (finalResult && finalResult.T > now) {
108
+ return finalResult.R;
109
+ }
110
+ return result ? result.R : options.defaultValue;
111
+ }
90
112
  const recheckRaw = await redis.GET(key);
91
113
  const recheck = recheckRaw ? reviveJSONParse(JSON.parse(recheckRaw)) : undefined;
92
114
  if (recheck && recheck.T > now) {
@@ -94,14 +116,21 @@ async function createRedis(options) {
94
116
  }
95
117
  let data;
96
118
  try {
97
- data = await options2.fetch();
119
+ data = await options.fetch();
98
120
  } catch (error) {
99
121
  await redis.DEL(lockKey);
100
122
  throw error;
101
123
  }
102
- const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : notFoundExpireMs;
124
+ let effectiveExpireMs = null;
125
+ if (data !== undefined) {
126
+ if (options.expireMs !== null) {
127
+ effectiveExpireMs = options.expireMs + (realExpireMs ?? 0);
128
+ }
129
+ } else {
130
+ effectiveExpireMs = notFoundExpireMs;
131
+ }
103
132
  const cacheValue = {
104
- T: now + (data !== undefined ? options2.expireMs : notFoundExpireMs),
133
+ T: now + (data !== undefined ? options.expireMs ?? Number.MAX_SAFE_INTEGER : notFoundExpireMs),
105
134
  R: data
106
135
  };
107
136
  const refreshLockExists = await redis.EXISTS(refreshLockKey);
@@ -109,30 +138,48 @@ async function createRedis(options) {
109
138
  await redis.DEL(lockKey);
110
139
  return data;
111
140
  }
112
- await redis.MULTI().PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue)).DEL(lockKey).EXEC();
141
+ if (effectiveExpireMs === null) {
142
+ await redis.MULTI().SET(key, JSON.stringify(cacheValue)).DEL(lockKey).EXEC();
143
+ } else {
144
+ await redis.MULTI().PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue)).DEL(lockKey).EXEC();
145
+ }
113
146
  return data;
114
147
  },
115
148
  refresh: async () => {
116
149
  const refreshLockKey = `${key}:refresh-lock`;
117
- const refreshLockInterval = options2.refreshLockInterval ?? (options2.lockInterval ?? 8192) + 1024;
150
+ const refreshLockInterval = options.refreshLockInterval ?? (options.lockInterval ?? 8192) + 1024;
118
151
  await redis.SET(refreshLockKey, "1", {
119
152
  PX: refreshLockInterval
120
153
  });
121
154
  const now = Date.now();
122
155
  let data;
123
156
  try {
124
- data = await options2.fetch();
157
+ data = await options.fetch();
125
158
  } catch (error) {
126
159
  await redis.DEL(refreshLockKey);
127
160
  throw error;
128
161
  }
129
- const realExpireMs = options2.realExpireMs ?? Math.floor(options2.expireMs * (Math.random() + 0.5)) + 8192;
130
- const effectiveExpireMs = data !== undefined ? options2.expireMs + realExpireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384);
162
+ let realExpireMs = options.realExpireMs ?? null;
163
+ if (options.expireMs !== null) {
164
+ realExpireMs = options.realExpireMs ?? Math.floor(options.expireMs * (Math.random() + 0.5)) + 8192;
165
+ }
166
+ let effectiveExpireMs = null;
167
+ if (data !== undefined) {
168
+ if (options.expireMs !== null) {
169
+ effectiveExpireMs = options.expireMs + (realExpireMs ?? 0);
170
+ }
171
+ } else {
172
+ effectiveExpireMs = options.notFoundExpireMs ?? (options.expireMs !== null ? Math.min(options.expireMs, 16384) : 86400000);
173
+ }
131
174
  const cacheValue = {
132
- T: now + (data !== undefined ? options2.expireMs : options2.notFoundExpireMs ?? Math.min(options2.expireMs, 16384)),
175
+ T: now + (data !== undefined ? options.expireMs ?? Number.MAX_SAFE_INTEGER : options.notFoundExpireMs ?? (options.expireMs !== null ? Math.min(options.expireMs, 16384) : 86400000)),
133
176
  R: data
134
177
  };
135
- await redis.PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue));
178
+ if (effectiveExpireMs === null) {
179
+ await redis.SET(key, JSON.stringify(cacheValue));
180
+ } else {
181
+ await redis.PSETEX(key, effectiveExpireMs, JSON.stringify(cacheValue));
182
+ }
136
183
  }
137
184
  };
138
185
  },
@@ -142,7 +189,10 @@ async function createRedis(options) {
142
189
  return result ? Number(result) : 0;
143
190
  },
144
191
  add: async (amount, expireMs) => {
145
- if (!expireMs) {
192
+ if (expireMs === null) {
193
+ const result = await redis.INCRBY(key, amount);
194
+ return result;
195
+ } else if (!expireMs) {
146
196
  const result = await redis.INCRBY(key, amount);
147
197
  return result;
148
198
  } else {
@@ -196,14 +246,15 @@ async function createRedis(options) {
196
246
  };
197
247
  return milkioRedis;
198
248
  }
249
+ var isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
199
250
  function reviveJSONParse(json) {
200
- const isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
201
- if (json instanceof Date)
202
- return json;
203
- if (Array.isArray(json)) {
204
- return json.map((item) => reviveJSONParse(item));
205
- }
206
- if (typeof json === "object" && json !== null) {
251
+ if (json !== null && typeof json === "object") {
252
+ if (json instanceof Date || typeof json.getTime === "function" && typeof json.toISOString === "function") {
253
+ return json;
254
+ }
255
+ if (Array.isArray(json)) {
256
+ return json.map((item) => reviveJSONParse(item));
257
+ }
207
258
  return Object.entries(json).reduce((acc, [key, value]) => {
208
259
  acc[key] = reviveJSONParse(value);
209
260
  return acc;
@@ -219,8 +270,9 @@ function reviveJSONParse(json) {
219
270
  return json;
220
271
  }
221
272
  export {
273
+ reviveJSONParse,
222
274
  createRedis
223
275
  };
224
276
 
225
- //# debugId=6F6F9ACDCC3531F264756E2164756E21
226
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgUmVkaXNDbGllbnRPcHRpb25zIH0gZnJvbSBcInJlZGlzXCI7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1JlZGlzQ2FjaGVPcHRpb25zPFQ+ID0ge1xuICBkZWZhdWx0VmFsdWU/OiBUIHwgdW5kZWZpbmVkO1xuICBleHBpcmVNczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8VD4gPSB7XG4gIGRlZmF1bHRWYWx1ZT86IFQgfCB1bmRlZmluZWQ7XG4gIGV4cGlyZU1zOiBudW1iZXI7XG4gIHJlYWxFeHBpcmVNcz86IG51bWJlcjtcbiAgbG9ja0ludGVydmFsPzogbnVtYmVyO1xuICByZWZyZXNoTG9ja0ludGVydmFsPzogbnVtYmVyO1xuICBub3RGb3VuZEV4cGlyZU1zPzogbnVtYmVyO1xuICBmZXRjaDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVkaXM8T3B0aW9ucyBleHRlbmRzIFJlZGlzQ2xpZW50T3B0aW9ucz4ob3B0aW9uczogT3B0aW9ucykge1xuICBjb25zdCBOb2RlUmVkaXMgPSBhd2FpdCBpbXBvcnQoXCJyZWRpc1wiKTtcbiAgY29uc3QgcmVkaXMgPSBhd2FpdCBOb2RlUmVkaXMuZGVmYXVsdC5jcmVhdGVDbGllbnQob3B0aW9ucykuY29ubmVjdCgpO1xuXG4gIGNvbnN0IG1pbGtpb1JlZGlzID0ge1xuICAgIHJlZGlzLFxuICAgIHVzZUNhY2hlOiA8VD4oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBNaWxraW9SZWRpc0NhY2hlT3B0aW9uczxUPikgPT4gKHtcbiAgICAgIHNldDogYXN5bmMgKHZhbHVlOiBULCBleHBpcmVNczogbnVtYmVyKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLlBTRVRFWChrZXksIGV4cGlyZU1zLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICB9LFxuICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5NVUxUSSgpLkdFVChrZXkpLkRFTChrZXkpLkVYRUMoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0UmF3WzBdO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0IGFzIHN0cmluZykpO1xuICAgICAgfSxcbiAgICAgIGhhczogYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gbnVsbDtcbiAgICAgIH0sXG4gICAgICBkZWw6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XG4gICAgICB9LFxuICAgIH0pLFxuXG4gICAgdXNlRmV0Y2g6IDxPcHRpb25zIGV4dGVuZHMgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8YW55Pj4oa2V5OiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLmV4cGlyZU1zIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwaXJlTXMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubG9ja0ludGVydmFsICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLmxvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLmxvY2tJbnRlcnZhbCA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucmVhbEV4cGlyZU1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnJlYWxFeHBpcmVNcyAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlYWxFeHBpcmVNcyA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFsRXhwaXJlTXMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zICE9PSBcIm51bWJlclwiIHx8IG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3RGb3VuZEV4cGlyZU1zIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgaWYgcHJvdmlkZWRcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gXCJudW1iZXJcIiB8fCBvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZnJlc2hMb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJbnRlcnZhbCA9IG9wdGlvbnMubG9ja0ludGVydmFsID8/IDgxOTI7XG4gICAgICAgIGlmIChvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gbG9ja0ludGVydmFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsb2NrSW50ZXJ2YWxcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZldGNoICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmV0Y2ggbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXM6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBkZWw6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCByZWRpcy5ERUwoa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZmV0Y2g6IGFzeW5jICgpOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+Pj4gPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2tJbnRlcnZhbCA9IG9wdGlvbnMubG9ja0ludGVydmFsID8/IDgxOTI7XG4gICAgICAgICAgY29uc3QgcmVhbEV4cGlyZU1zID0gb3B0aW9ucy5yZWFsRXhwaXJlTXMgPz8gTWF0aC5mbG9vcihvcHRpb25zLmV4cGlyZU1zICogKE1hdGgucmFuZG9tKCkgKyAwLjUpKSArIDgxOTI7XG5cbiAgICAgICAgICBjb25zdCBub3RGb3VuZEV4cGlyZU1zID0gb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zID8/IE1hdGgubWluKG9wdGlvbnMuZXhwaXJlTXMsIDE2Mzg0KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdFJhdyA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFJhdyA/IChyZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyZXN1bHRSYXcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5UID4gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LlI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XG4gICAgICAgICAgaWYgKGF3YWl0IHJlZGlzLkVYSVNUUyhyZWZyZXNoTG9ja0tleSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsb2NrS2V5ID0gYCR7a2V5fTpsb2NrYDtcbiAgICAgICAgICBjb25zdCBsb2NrU2V0ID0gYXdhaXQgcmVkaXMuU0VUKGxvY2tLZXksIFwiMVwiLCB7IFBYOiBsb2NrSW50ZXJ2YWwsIE5YOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnN0IGdvdExvY2sgPSBsb2NrU2V0ID09PSBcIk9LXCI7XG5cbiAgICAgICAgICBpZiAoIWdvdExvY2spIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgICAgY29uc3QgcmVjaGVja1JhdyA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICAgIGNvbnN0IHJlY2hlY2sgPSByZWNoZWNrUmF3ID8gKHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlY2hlY2tSYXcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbXCJmZXRjaFwiXT4+IH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKHJlY2hlY2sgJiYgcmVjaGVjay5UID4gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjaGVjay5SO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1tcImZldGNoXCJdPj47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBvcHRpb25zLmZldGNoKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChsb2NrS2V5KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4cGlyZU1zID0gZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyArIHJlYWxFeHBpcmVNcyA6IG5vdEZvdW5kRXhwaXJlTXM7XG5cbiAgICAgICAgICBjb25zdCBjYWNoZVZhbHVlID0ge1xuICAgICAgICAgICAgVDogbm93ICsgKGRhdGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXhwaXJlTXMgOiBub3RGb3VuZEV4cGlyZU1zKSxcbiAgICAgICAgICAgIFI6IGRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHJlZnJlc2hMb2NrRXhpc3RzID0gYXdhaXQgcmVkaXMuRVhJU1RTKHJlZnJlc2hMb2NrS2V5KTtcbiAgICAgICAgICBpZiAocmVmcmVzaExvY2tFeGlzdHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLkRFTChsb2NrS2V5KTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKS5ERUwobG9ja0tleSkuRVhFQygpO1xuXG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0tleSA9IGAke2tleX06cmVmcmVzaC1sb2NrYDtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0ludGVydmFsID0gb3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsID8/IChvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyKSArIDEwMjQ7XG5cbiAgICAgICAgICBhd2FpdCByZWRpcy5TRVQocmVmcmVzaExvY2tLZXksIFwiMVwiLCB7XG4gICAgICAgICAgICBQWDogcmVmcmVzaExvY2tJbnRlcnZhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgbGV0IGRhdGE6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxPcHRpb25zW1wiZmV0Y2hcIl0+PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IG9wdGlvbnMuZmV0Y2goKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKHJlZnJlc2hMb2NrS2V5KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlYWxFeHBpcmVNcyA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IE1hdGguZmxvb3Iob3B0aW9ucy5leHBpcmVNcyAqIChNYXRoLnJhbmRvbSgpICsgMC41KSkgKyA4MTkyO1xuICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUV4cGlyZU1zID0gZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyArIHJlYWxFeHBpcmVNcyA6IChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpKTtcblxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XG4gICAgICAgICAgICBUOiBub3cgKyAoZGF0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHBpcmVNcyA6IChvcHRpb25zLm5vdEZvdW5kRXhwaXJlTXMgPz8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpKSksXG4gICAgICAgICAgICBSOiBkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhd2FpdCByZWRpcy5QU0VURVgoa2V5LCBlZmZlY3RpdmVFeHBpcmVNcywgSlNPTi5zdHJpbmdpZnkoY2FjaGVWYWx1ZSkpOyAvLyBEbyBub3QgY2xlYW4gdGhlIHVwZGF0ZSBsb2NrISBJbnN0ZWFkLCB3YWl0IGZvciBpdCB0byBleHBpcmUgbmF0dXJhbGx5XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB1c2VDb3VudDogKGtleTogc3RyaW5nKSA9PiAoe1xuICAgICAgZ2V0OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPyBOdW1iZXIocmVzdWx0KSA6IDA7XG4gICAgICB9LFxuICAgICAgYWRkOiBhc3luYyAoYW1vdW50OiBudW1iZXIsIGV4cGlyZU1zPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgaWYgKCFleHBpcmVNcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLklOQ1JCWShrZXksIGFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5NVUxUSSgpLklOQ1JCWShrZXksIGFtb3VudCkuUEVYUElSRShrZXksIGV4cGlyZU1zKS5FWEVDKCk7XG4gICAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHRbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc3ViOiBhc3luYyAoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5ERUNSQlkoa2V5LCBhbW91bnQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICB9KSxcblxuICAgIHVzZUNsb2NrSW46IChrZXk6IHN0cmluZywgY2xlYW5EYXRlOiBEYXRlKSA9PiAoe1xuICAgICAgY2xvY2tJbjogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuU0VUQklUKGtleSwgb2Zmc2V0LCAxKS5QRVhQSVJFQVQoa2V5LCBjbGVhbkRhdGUuZ2V0VGltZSgpKS5FWEVDKCk7XG4gICAgICB9LFxuICAgICAgY2hlY2s6IGFzeW5jIChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVRCSVQoa2V5LCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAxO1xuICAgICAgfSxcbiAgICAgIGZpcnN0Q2xvY2tJbjogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIGxhc3RDbG9ja0luOiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUUE9TKGtleSwgMSwgLTEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHRvQXJyYXk6IGFzeW5jIChsZW5ndGg6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbltdPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJhdyA9IGF3YWl0IHJlZGlzLkJJVEZJRUxEKGtleSwgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJHRVRcIixcbiAgICAgICAgICAgIGVuY29kaW5nOiBgdSR7bGVuZ3RofWAsXG4gICAgICAgICAgICBvZmZzZXQ6IFwiIzBcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlSW50KGAke3Jlc3VsdFJhd31gKS50b1N0cmluZygyKS5zcGxpdChcIlwiKTtcbiAgICAgICAgY29uc3QgZmlsbCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aCAtIHJlc3VsdC5sZW5ndGg7IGkrKykgZmlsbC5wdXNoKFwiMFwiKTtcbiAgICAgICAgcmV0dXJuIFsuLi5maWxsLCAuLi5yZXN1bHRdLm1hcCgodikgPT4gdiA9PT0gXCIxXCIpO1xuICAgICAgfSxcbiAgICAgIGNvdW50OiBhc3luYyAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuQklUQ09VTlQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBjbGVhbjogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCByZWRpcy5ERUwoa2V5KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG5cbiAgcmV0dXJuIG1pbGtpb1JlZGlzO1xufVxuXG5mdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICBjb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG4gIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcbiAgfVxuICBpZiAodHlwZW9mIGpzb24gPT09IFwib2JqZWN0XCIgJiYganNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFRdID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgVCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBqc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlU3RyaW5nID0gbWF0Y2hbMl0gPyBgJHttYXRjaFsxXX0ke21hdGNoWzJdLnJlcGxhY2UoXCI6XCIsIFwiXCIpfWAgOiBgJHttYXRjaFsxXX1aYDtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZXhwb3J0IHR5cGUgUmVkaXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlZGlzPj47XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7QUFpQkEsZUFBc0IsV0FBK0MsQ0FBQyxTQUFrQjtBQUFBLEVBQ3RGLE1BQU0sWUFBWSxNQUFhO0FBQUEsRUFDL0IsTUFBTSxRQUFRLE1BQU0sVUFBVSxRQUFRLGFBQWEsT0FBTyxFQUFFLFFBQVE7QUFBQSxFQUVwRSxNQUFNLGNBQWM7QUFBQSxJQUNsQjtBQUFBLElBQ0EsVUFBVSxDQUFJLEtBQWEsY0FBMEM7QUFBQSxNQUNuRSxLQUFLLE9BQU8sT0FBVSxhQUFpQztBQUFBLFFBQ3JELE1BQU0sTUFBTSxPQUFPLEtBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxDQUFDO0FBQUEsUUFDdkQsT0FBTztBQUFBO0FBQUEsTUFFVCxLQUFLLFlBQW9DO0FBQUEsUUFDdkMsTUFBTSxTQUFTLE1BQU0sTUFBTSxJQUFJLEdBQUc7QUFBQSxRQUNsQyxJQUFJLFdBQVc7QUFBQSxVQUFNLE9BQU8sVUFBUztBQUFBLFFBQ3JDLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxNQUFNLENBQUM7QUFBQTtBQUFBLE1BRTNDLE1BQU0sWUFBWTtBQUFBLFFBQ2hCLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUs7QUFBQSxRQUM3RCxNQUFNLFNBQVMsVUFBVTtBQUFBLFFBQ3pCLElBQUksV0FBVztBQUFBLFVBQU0sT0FBTyxVQUFTO0FBQUEsUUFDckMsT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLE1BQWdCLENBQUM7QUFBQTtBQUFBLE1BRXJELEtBQUssWUFBOEI7QUFBQSxRQUNqQyxNQUFNLFNBQVMsTUFBTSxNQUFNLElBQUksR0FBRztBQUFBLFFBQ2xDLE9BQU8sV0FBVztBQUFBO0FBQUEsTUFFcEIsS0FBSyxZQUFZO0FBQUEsUUFD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QUksR0FBRztBQUFBO0FBQUEsSUFFdkI7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHVCxTQUFTLGVBQWtCLENBQUMsTUFBWTtBQUFBLEVBQ3RDLE1BQU0saUJBQWlCO0FBQUEsRUFFdkIsSUFBSSxnQkFBZ0I7QUFBQSxJQUFNLE9BQU87QUFBQSxFQUNqQyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFBQSxJQUN2QixPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLElBQUksQ0FBQztBQUFBLEVBQ2pEO0FBQUEsRUFDQSxJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUFBLElBQzdDLE9BQU8sT0FBTyxRQUFRLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVc7QUFBQSxNQUN4RCxJQUFJLE9BQWtCLGdCQUFnQixLQUFLO0FBQUEsTUFDM0MsT0FBTztBQUFBLE9BQ04sQ0FBQyxDQUFNO0FBQUEsRUFDWjtBQUFBLEVBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLElBQzVCLE1BQU0sUUFBUSxLQUFLLE1BQU0sY0FBYztBQUFBLElBQ3ZDLElBQUksT0FBTztBQUFBLE1BQ1QsTUFBTSx1QkFBdUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLE1BQU0sR0FBRyxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTTtBQUFBLE1BQzdGLE9BQU8sSUFBSSxLQUFLLG9CQUFvQjtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNkY2RjlBQ0RDQzM1MzFGMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
277
+ //# debugId=512607529B76886364756E2164756E21
278
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvUmVkaXNDYWNoZU9wdGlvbnM8VD4gPSB7XG4gIGRlZmF1bHRWYWx1ZT86IFQgfCB1bmRlZmluZWQ7XG4gIGV4cGlyZU1zOiBudW1iZXIgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8VD4gPSB7XG4gIGRlZmF1bHRWYWx1ZT86IFQgfCB1bmRlZmluZWQ7XG4gIGV4cGlyZU1zOiBudW1iZXIgfCBudWxsO1xuICByZWFsRXhwaXJlTXM/OiBudW1iZXIgfCBudWxsO1xuICBsb2NrSW50ZXJ2YWw/OiBudW1iZXI7XG4gIHJlZnJlc2hMb2NrSW50ZXJ2YWw/OiBudW1iZXI7XG4gIG5vdEZvdW5kRXhwaXJlTXM/OiBudW1iZXIgfCBudWxsO1xuICBmZXRjaDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgdHlwZSBNaWxraW9SZWRpczxSZWRpc1QgPSBhbnk+ID0ge1xuICByZWRpczogUmVkaXNUO1xuICB1c2VDYWNoZTogPFQ+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBNaWxraW9SZWRpc0NhY2hlT3B0aW9uczxUPixcbiAgKSA9PiB7XG4gICAgc2V0OiAodmFsdWU6IFQsIGV4cGlyZU1zOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPFQ+O1xuICAgIGdldDogKCkgPT4gUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBwdWxsOiAoKSA9PiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgIGhhczogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBkZWw6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIH07XG4gIHVzZUZldGNoOiA8VD4oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogTWlsa2lvUmVkaXNGZXRjaE9wdGlvbnM8VD4sXG4gICkgPT4ge1xuICAgIGhhczogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBkZWw6ICgpID0+IFByb21pc2U8dm9pZD47XG4gICAgZmV0Y2g6ICgpID0+IFByb21pc2U8VD47XG4gICAgcmVmcmVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfTtcbiAgdXNlQ291bnQ6IChrZXk6IHN0cmluZykgPT4ge1xuICAgIGdldDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuICAgIGFkZDogKGFtb3VudDogbnVtYmVyLCBleHBpcmVNcz86IG51bWJlciB8IG51bGwpID0+IFByb21pc2U8bnVtYmVyPjtcbiAgICBzdWI6IChhbW91bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxudW1iZXI+O1xuICB9O1xuICB1c2VDbG9ja0luOiAoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgY2xlYW5EYXRlOiBEYXRlLFxuICApID0+IHtcbiAgICBjbG9ja0luOiAob2Zmc2V0OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XG4gICAgY2hlY2s6IChvZmZzZXQ6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBmaXJzdENsb2NrSW46ICgpID0+IFByb21pc2U8bnVtYmVyPjtcbiAgICBsYXN0Q2xvY2tJbjogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuICAgIHRvQXJyYXk6IChsZW5ndGg6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuW10+O1xuICAgIGNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG4gICAgY2xlYW46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIH07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVkaXM8UmVkaXNUIGV4dGVuZHMgeyBQU0VURVg6IGFueTsgU0VUOiBhbnk7IFtvdGhlcnM6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueSB9PihyZWRpc0NsaWVudDogUmVkaXNUKTogUHJvbWlzZTxNaWxraW9SZWRpczxSZWRpc1Q+PiB7XG4gIGNvbnN0IHJlZGlzID0gcmVkaXNDbGllbnQgYXMgYW55O1xuXG4gIGNvbnN0IG1pbGtpb1JlZGlzOiBhbnkgPSB7XG4gICAgcmVkaXMsXG4gICAgdXNlQ2FjaGU6IDxUPihrZXk6IHN0cmluZywgb3B0aW9ucz86IE1pbGtpb1JlZGlzQ2FjaGVPcHRpb25zPFQ+KSA9PiAoe1xuICAgICAgc2V0OiBhc3luYyAodmFsdWU6IFQsIGV4cGlyZU1zOiBudW1iZXIgfCBudWxsKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGlmIChleHBpcmVNcyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIOawuOS5heS/neWtmFxuICAgICAgICAgIGF3YWl0IHJlZGlzLlNFVChrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuIG9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlc3VsdCBhcyBhbnkgYXMgc3RyaW5nKSk7XG4gICAgICB9LFxuICAgICAgcHVsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5NVUxUSSgpLkdFVChrZXkpLkRFTChrZXkpLkVYRUMoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0UmF3WzBdO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gb3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0IGFzIGFueSBhcyBzdHJpbmcpKTtcbiAgICAgIH0sXG4gICAgICBoYXM6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgIT09IG51bGw7XG4gICAgICB9LFxuICAgICAgZGVsOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xuICAgICAgfSxcbiAgICB9KSxcblxuICAgIHVzZUZldGNoOiA8T3B0aW9ucyBleHRlbmRzIE1pbGtpb1JlZGlzRmV0Y2hPcHRpb25zPGFueT4+KGtleTogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5leHBpcmVNcyAhPT0gbnVsbCAmJiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlTXMgIT09ICdudW1iZXInIHx8IG9wdGlvbnMuZXhwaXJlTXMgPD0gMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIG51bGwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubG9ja0ludGVydmFsICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLmxvY2tJbnRlcnZhbCAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5sb2NrSW50ZXJ2YWwgPD0gMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2NrSW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBpZiBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5yZWFsRXhwaXJlTXMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlYWxFeHBpcmVNcyAhPT0gbnVsbCAmJiAodHlwZW9mIG9wdGlvbnMucmVhbEV4cGlyZU1zICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlYWxFeHBpcmVNcyA8PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWxFeHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIG51bGwgaWYgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gbnVsbCAmJiAodHlwZW9mIG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zIDw9IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm90Rm91bmRFeHBpcmVNcyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIG51bGwgaWYgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaExvY2tJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlZnJlc2hMb2NrSW50ZXJ2YWwgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrSW50ZXJ2YWwgPSBvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyO1xuICAgICAgICBpZiAob3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsIDw9IGxvY2tJbnRlcnZhbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVmcmVzaExvY2tJbnRlcnZhbCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBsb2NrSW50ZXJ2YWwnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZXRjaCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzOiBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGtleSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoOiBhc3luYyAoKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1snZmV0Y2gnXT4+PiA9PiB7XG4gICAgICAgICAgY29uc3QgbG9ja0ludGVydmFsID0gb3B0aW9ucy5sb2NrSW50ZXJ2YWwgPz8gODE5MjtcblxuICAgICAgICAgIC8vIOWkhOeQhuawuOS5heS/neWtmOeahOaDheWGtVxuICAgICAgICAgIGxldCByZWFsRXhwaXJlTXM6IG51bWJlciB8IG51bGwgPSBvcHRpb25zLnJlYWxFeHBpcmVNcyA/PyBudWxsO1xuICAgICAgICAgIGlmIChvcHRpb25zLmV4cGlyZU1zICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZWFsRXhwaXJlTXMgPSBvcHRpb25zLnJlYWxFeHBpcmVNcyA/PyBNYXRoLmZsb29yKG9wdGlvbnMuZXhwaXJlTXMgKiAoTWF0aC5yYW5kb20oKSArIDAuNSkpICsgODE5MjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3RGb3VuZEV4cGlyZU1zID0gb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zID8/IChvcHRpb25zLmV4cGlyZU1zICE9PSBudWxsID8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpIDogODY0MDAwMDApOyAvLyDpu5jorqQx5aSpXG5cbiAgICAgICAgICBjb25zdCByZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRSYXcgPyAocmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzdWx0UmF3IGFzIHN0cmluZykpIGFzIHsgVDogbnVtYmVyOyBSOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1snZmV0Y2gnXT4+IH0pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5UID4gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LlI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmcmVzaExvY2tLZXkgPSBgJHtrZXl9OnJlZnJlc2gtbG9ja2A7XG4gICAgICAgICAgaWYgKGF3YWl0IHJlZGlzLkVYSVNUUyhyZWZyZXNoTG9ja0tleSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQuUiA6IG9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsb2NrS2V5ID0gYCR7a2V5fTpsb2NrYDtcbiAgICAgICAgICBjb25zdCBsb2NrU2V0ID0gYXdhaXQgcmVkaXMuU0VUKGxvY2tLZXksICcxJywgeyBQWDogbG9ja0ludGVydmFsLCBOWDogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zdCBnb3RMb2NrID0gbG9ja1NldCA9PT0gJ09LJztcblxuICAgICAgICAgIGlmICghZ290TG9jaykge1xuICAgICAgICAgICAgY29uc3QgbWF4V2FpdFRpbWUgPSBsb2NrSW50ZXJ2YWw7XG4gICAgICAgICAgICBjb25zdCB3YWl0SW50ZXJ2YWwgPSA0MjtcbiAgICAgICAgICAgIGxldCB3YWl0ZWQgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHdhaXRlZCA8IG1heFdhaXRUaW1lKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHdhaXRJbnRlcnZhbCkpO1xuICAgICAgICAgICAgICB3YWl0ZWQgKz0gd2FpdEludGVydmFsO1xuICAgICAgICAgICAgICBjb25zdCB3YWl0ZWRSZXN1bHRSYXcgPSBhd2FpdCByZWRpcy5HRVQoa2V5KTtcbiAgICAgICAgICAgICAgY29uc3Qgd2FpdGVkUmVzdWx0ID0gd2FpdGVkUmVzdWx0UmF3ID8gKHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHdhaXRlZFJlc3VsdFJhdyBhcyBzdHJpbmcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbJ2ZldGNoJ10+PiB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgaWYgKHdhaXRlZFJlc3VsdCAmJiB3YWl0ZWRSZXN1bHQuVCA+IG5vdykge1xuICAgICAgICAgICAgICAgIHJldHVybiB3YWl0ZWRSZXN1bHQuUjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIShhd2FpdCByZWRpcy5FWElTVFMobG9ja0tleSkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpbmFsUmVzdWx0UmF3ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgICAgICBjb25zdCBmaW5hbFJlc3VsdCA9IGZpbmFsUmVzdWx0UmF3ID8gKHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGZpbmFsUmVzdWx0UmF3IGFzIHN0cmluZykpIGFzIHsgVDogbnVtYmVyOyBSOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1snZmV0Y2gnXT4+IH0pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICYmIGZpbmFsUmVzdWx0LlQgPiBub3cpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0LlI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0LlIgOiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWNoZWNrUmF3ID0gYXdhaXQgcmVkaXMuR0VUKGtleSk7XG4gICAgICAgICAgY29uc3QgcmVjaGVjayA9IHJlY2hlY2tSYXcgPyAocmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVjaGVja1JhdyBhcyBzdHJpbmcpKSBhcyB7IFQ6IG51bWJlcjsgUjogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbJ2ZldGNoJ10+PiB9KSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChyZWNoZWNrICYmIHJlY2hlY2suVCA+IG5vdykge1xuICAgICAgICAgICAgcmV0dXJuIHJlY2hlY2suUjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgZGF0YTogQXdhaXRlZDxSZXR1cm5UeXBlPE9wdGlvbnNbJ2ZldGNoJ10+PjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IG9wdGlvbnMuZmV0Y2goKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVkaXMuREVMKGxvY2tLZXkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g6K6h566X6L+H5pyf5pe26Ze0XG4gICAgICAgICAgbGV0IGVmZmVjdGl2ZUV4cGlyZU1zOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5leHBpcmVNcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBlZmZlY3RpdmVFeHBpcmVNcyA9IG9wdGlvbnMuZXhwaXJlTXMgKyAocmVhbEV4cGlyZU1zID8/IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5aaC5p6cIGV4cGlyZU1zIOS4uiBudWxs77yMZWZmZWN0aXZlRXhwaXJlTXMg5L+d5oyBIG51bGzvvIjmsLjkuYXkv53lrZjvvIlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWZmZWN0aXZlRXhwaXJlTXMgPSBub3RGb3VuZEV4cGlyZU1zO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XG4gICAgICAgICAgICBUOiBub3cgKyAoZGF0YSAhPT0gdW5kZWZpbmVkID8gKG9wdGlvbnMuZXhwaXJlTXMgPz8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIDogbm90Rm91bmRFeHBpcmVNcyksXG4gICAgICAgICAgICBSOiBkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0V4aXN0cyA9IGF3YWl0IHJlZGlzLkVYSVNUUyhyZWZyZXNoTG9ja0tleSk7XG4gICAgICAgICAgaWYgKHJlZnJlc2hMb2NrRXhpc3RzKSB7XG4gICAgICAgICAgICBhd2FpdCByZWRpcy5ERUwobG9ja0tleSk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZWZmZWN0aXZlRXhwaXJlTXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOawuOS5heS/neWtmFxuICAgICAgICAgICAgYXdhaXQgcmVkaXMuTVVMVEkoKS5TRVQoa2V5LCBKU09OLnN0cmluZ2lmeShjYWNoZVZhbHVlKSkuREVMKGxvY2tLZXkpLkVYRUMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcmVkaXMuTVVMVEkoKS5QU0VURVgoa2V5LCBlZmZlY3RpdmVFeHBpcmVNcywgSlNPTi5zdHJpbmdpZnkoY2FjaGVWYWx1ZSkpLkRFTChsb2NrS2V5KS5FWEVDKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0tleSA9IGAke2tleX06cmVmcmVzaC1sb2NrYDtcbiAgICAgICAgICBjb25zdCByZWZyZXNoTG9ja0ludGVydmFsID0gb3B0aW9ucy5yZWZyZXNoTG9ja0ludGVydmFsID8/IChvcHRpb25zLmxvY2tJbnRlcnZhbCA/PyA4MTkyKSArIDEwMjQ7XG5cbiAgICAgICAgICBhd2FpdCByZWRpcy5TRVQocmVmcmVzaExvY2tLZXksICcxJywge1xuICAgICAgICAgICAgUFg6IHJlZnJlc2hMb2NrSW50ZXJ2YWwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8T3B0aW9uc1snZmV0Y2gnXT4+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkYXRhID0gYXdhaXQgb3B0aW9ucy5mZXRjaCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZWRpcy5ERUwocmVmcmVzaExvY2tLZXkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5aSE55CG5rC45LmF5L+d5a2Y55qE5oOF5Ya1XG4gICAgICAgICAgbGV0IHJlYWxFeHBpcmVNczogbnVtYmVyIHwgbnVsbCA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IG51bGw7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlTXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlYWxFeHBpcmVNcyA9IG9wdGlvbnMucmVhbEV4cGlyZU1zID8/IE1hdGguZmxvb3Iob3B0aW9ucy5leHBpcmVNcyAqIChNYXRoLnJhbmRvbSgpICsgMC41KSkgKyA4MTkyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOiuoeeul+i/h+acn+aXtumXtFxuICAgICAgICAgIGxldCBlZmZlY3RpdmVFeHBpcmVNczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlTXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWZmZWN0aXZlRXhwaXJlTXMgPSBvcHRpb25zLmV4cGlyZU1zICsgKHJlYWxFeHBpcmVNcyA/PyAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWmguaenCBleHBpcmVNcyDkuLogbnVsbO+8jGVmZmVjdGl2ZUV4cGlyZU1zIOS/neaMgSBudWxs77yI5rC45LmF5L+d5a2Y77yJXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVmZmVjdGl2ZUV4cGlyZU1zID0gb3B0aW9ucy5ub3RGb3VuZEV4cGlyZU1zID8/IChvcHRpb25zLmV4cGlyZU1zICE9PSBudWxsID8gTWF0aC5taW4ob3B0aW9ucy5leHBpcmVNcywgMTYzODQpIDogODY0MDAwMDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSB7XG4gICAgICAgICAgICBUOiBub3cgKyAoZGF0YSAhPT0gdW5kZWZpbmVkID8gKG9wdGlvbnMuZXhwaXJlTXMgPz8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIDogKG9wdGlvbnMubm90Rm91bmRFeHBpcmVNcyA/PyAob3B0aW9ucy5leHBpcmVNcyAhPT0gbnVsbCA/IE1hdGgubWluKG9wdGlvbnMuZXhwaXJlTXMsIDE2Mzg0KSA6IDg2NDAwMDAwKSkpLFxuICAgICAgICAgICAgUjogZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGVmZmVjdGl2ZUV4cGlyZU1zID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDmsLjkuYXkv53lrZhcbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLlNFVChrZXksIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcmVkaXMuUFNFVEVYKGtleSwgZWZmZWN0aXZlRXhwaXJlTXMsIEpTT04uc3RyaW5naWZ5KGNhY2hlVmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRG8gbm90IGNsZWFuIHRoZSB1cGRhdGUgbG9jayEgSW5zdGVhZCwgd2FpdCBmb3IgaXQgdG8gZXhwaXJlIG5hdHVyYWxseVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdXNlQ291bnQ6IChrZXk6IHN0cmluZykgPT4gKHtcbiAgICAgIGdldDogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkdFVChrZXkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID8gTnVtYmVyKHJlc3VsdCkgOiAwO1xuICAgICAgfSxcbiAgICAgIGFkZDogYXN5bmMgKGFtb3VudDogbnVtYmVyLCBleHBpcmVNcz86IG51bWJlciB8IG51bGwpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBpZiAoZXhwaXJlTXMgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyDmsLjkuYXkv53lrZhcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5JTkNSQlkoa2V5LCBhbW91bnQpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHBpcmVNcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLklOQ1JCWShrZXksIGFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBudW1iZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVkaXMuTVVMVEkoKS5JTkNSQlkoa2V5LCBhbW91bnQpLlBFWFBJUkUoa2V5LCBleHBpcmVNcykuRVhFQygpO1xuICAgICAgICAgIHJldHVybiBOdW1iZXIocmVzdWx0WzBdKSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdWI6IGFzeW5jIChhbW91bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkRFQ1JCWShrZXksIGFtb3VudCk7XG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xuICAgICAgfSxcbiAgICB9KSxcblxuICAgIHVzZUNsb2NrSW46IChrZXk6IHN0cmluZywgY2xlYW5EYXRlOiBEYXRlKSA9PiAoe1xuICAgICAgY2xvY2tJbjogYXN5bmMgKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLk1VTFRJKCkuU0VUQklUKGtleSwgb2Zmc2V0LCAxKS5QRVhQSVJFQVQoa2V5LCBjbGVhbkRhdGUuZ2V0VGltZSgpKS5FWEVDKCk7XG4gICAgICB9LFxuICAgICAgY2hlY2s6IGFzeW5jIChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWRpcy5HRVRCSVQoa2V5LCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAxO1xuICAgICAgfSxcbiAgICAgIGZpcnN0Q2xvY2tJbjogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBsYXN0Q2xvY2tJbjogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVFBPUyhrZXksIDEsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBudW1iZXI7XG4gICAgICB9LFxuICAgICAgdG9BcnJheTogYXN5bmMgKGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuW10+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmF3ID0gYXdhaXQgcmVkaXMuQklURklFTEQoa2V5LCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnR0VUJyxcbiAgICAgICAgICAgIGVuY29kaW5nOiBgdSR7bGVuZ3RofWAsXG4gICAgICAgICAgICBvZmZzZXQ6ICcjMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE51bWJlci5wYXJzZUludChgJHtyZXN1bHRSYXd9YCkudG9TdHJpbmcoMikuc3BsaXQoJycpO1xuICAgICAgICBjb25zdCBmaWxsID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoIC0gcmVzdWx0Lmxlbmd0aDsgaSsrKSBmaWxsLnB1c2goJzAnKTtcbiAgICAgICAgcmV0dXJuIFsuLi5maWxsLCAuLi5yZXN1bHRdLm1hcCgodikgPT4gdiA9PT0gJzEnKTtcbiAgICAgIH0sXG4gICAgICBjb3VudDogYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZGlzLkJJVENPVU5UKGtleSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgbnVtYmVyO1xuICAgICAgfSxcbiAgICAgIGNsZWFuOiBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IHJlZGlzLkRFTChrZXkpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfTtcblxuICByZXR1cm4gbWlsa2lvUmVkaXM7XG59XG5cbmNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICBpZiAoanNvbiAhPT0gbnVsbCAmJiB0eXBlb2YganNvbiA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoanNvbiBpbnN0YW5jZW9mIERhdGUgfHwgKHR5cGVvZiAoanNvbiBhcyBhbnkpLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIChqc29uIGFzIGFueSkudG9JU09TdHJpbmcgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgIHJldHVybiBqc29uLm1hcCgoaXRlbSkgPT4gcmV2aXZlSlNPTlBhcnNlKGl0ZW0pKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFRdID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgVCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1hdGNoID0ganNvbi5tYXRjaChpc29EYXRlUGF0dGVybik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRGF0ZVN0cmluZyA9IG1hdGNoWzJdID8gYCR7bWF0Y2hbMV19JHttYXRjaFsyXS5yZXBsYWNlKCc6JywgJycpfWAgOiBgJHttYXRjaFsxXX1aYDtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZXhw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QSxRQUNyRCxNQUFNLFlBQVksTUFBTSxNQUFNLFNBQVMsS0FBSztBQUFBLFVBQzFDO0FBQUEsWUFDRSxXQUFXO0FBQUEsWUFDWCxVQUFVLElBQUk7QUFBQSxZQUNkLFFBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRixDQUFDO0FBQUEsUUFDRCxNQUFNLFNBQVMsT0FBTyxTQUFTLEdBQUcsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtBQUFBLFFBQ25FLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFDZCxTQUFTLElBQUksRUFBRyxJQUFJLFNBQVMsT0FBTyxRQUFRO0FBQUEsVUFBSyxLQUFLLEtBQUssR0FBRztBQUFBLFFBQzlELE9BQU8sQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sTUFBTSxHQUFHO0FBQUE7QUFBQSxNQUVsRCxPQUFPLFlBQTZCO0FBQUEsUUFDbEMsTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTLEdBQUc7QUFBQSxRQUN2QyxPQUFPO0FBQUE7QUFBQSxNQUVULE9BQU8sWUFBMkI7QUFBQSxRQUNoQyxNQUFNLE1BQU0sSUFBSSxHQUFHO0FBQUE7QUFBQSxJQUV2QjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdULElBQU0saUJBQWlCO0FBRWhCLFNBQVMsZUFBa0IsQ0FBQyxNQUFZO0FBQUEsRUFDN0MsSUFBSSxTQUFTLFFBQVEsT0FBTyxTQUFTLFVBQVU7QUFBQSxJQUM3QyxJQUFJLGdCQUFnQixRQUFTLE9BQVEsS0FBYSxZQUFZLGNBQWMsT0FBUSxLQUFhLGdCQUFnQixZQUFhO0FBQUEsTUFDNUgsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksTUFBTSxRQUFRLElBQUksR0FBRztBQUFBLE1BQ3ZCLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsSUFDakQ7QUFBQSxJQUNBLE9BQU8sT0FBTyxRQUFRLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVc7QUFBQSxNQUN4RCxJQUFJLE9BQWtCLGdCQUFnQixLQUFLO0FBQUEsTUFDM0MsT0FBTztBQUFBLE9BQ04sQ0FBQyxDQUFNO0FBQUEsRUFDWjtBQUFBLEVBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLElBQzVCLE1BQU0sUUFBUSxLQUFLLE1BQU0sY0FBYztBQUFBLElBQ3ZDLElBQUksT0FBTztBQUFBLE1BQ1QsTUFBTSx1QkFBdUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLE1BQU0sR0FBRyxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTTtBQUFBLE1BQzdGLE9BQU8sSUFBSSxLQUFLLG9CQUFvQjtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNTEyNjA3NTI5Qjc2ODg2MzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1 +1,12 @@
1
- {"name":"@milkio/redis","version":"1.0.0-beta.99","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}
1
+ {
2
+ "name": "@milkio/redis",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "exports": "./index.js",
6
+ "types": "./index.d.ts",
7
+ "dependencies": {},
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/akirarika/milkio"
11
+ }
12
+ }
package/chunk-6sxyen7j.js DELETED
@@ -1,24 +0,0 @@
1
- import { createRequire } from "node:module";
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
- var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
19
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
-
21
- export { __toESM, __commonJS, __require };
22
-
23
- //# debugId=21F72A06ECE4C28164756E2164756E21
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIjIxRjcyQTA2RUNFNEMyODE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9