parse-server 2.8.4 → 8.6.2
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/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
package/lib/vendor/mongodbUrl.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// information
|
|
1
|
+
/*
|
|
2
|
+
* A slightly patched version of node's URL module, with support for `mongodb://` URIs.
|
|
3
|
+
* See https://github.com/nodejs/node for licensing information.
|
|
4
|
+
*/
|
|
6
5
|
|
|
7
6
|
'use strict';
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
var _punycode = _interopRequireDefault(require("punycode/punycode.js"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
10
|
exports.parse = urlParse;
|
|
12
11
|
exports.resolve = urlResolve;
|
|
13
12
|
exports.resolveObject = urlResolveObject;
|
|
14
13
|
exports.format = urlFormat;
|
|
15
|
-
|
|
16
14
|
exports.Url = Url;
|
|
17
|
-
|
|
18
15
|
function Url() {
|
|
19
16
|
this.protocol = null;
|
|
20
17
|
this.slashes = null;
|
|
@@ -40,36 +37,36 @@ const portPattern = /:[0-9]*$/;
|
|
|
40
37
|
// Special case for a simple path URL
|
|
41
38
|
const simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/;
|
|
42
39
|
|
|
43
|
-
const hostnameMaxLen = 255;
|
|
44
40
|
// protocols that can allow "unsafe" and "unwise" chars.
|
|
45
41
|
const unsafeProtocol = {
|
|
46
|
-
|
|
42
|
+
javascript: true,
|
|
47
43
|
'javascript:': true
|
|
48
44
|
};
|
|
49
45
|
// protocols that never have a hostname.
|
|
50
46
|
const hostlessProtocol = {
|
|
51
|
-
|
|
47
|
+
javascript: true,
|
|
52
48
|
'javascript:': true
|
|
53
49
|
};
|
|
54
50
|
// protocols that always contain a // bit.
|
|
55
51
|
const slashedProtocol = {
|
|
56
|
-
|
|
52
|
+
http: true,
|
|
57
53
|
'http:': true,
|
|
58
|
-
|
|
54
|
+
https: true,
|
|
59
55
|
'https:': true,
|
|
60
|
-
|
|
56
|
+
ftp: true,
|
|
61
57
|
'ftp:': true,
|
|
62
|
-
|
|
58
|
+
gopher: true,
|
|
63
59
|
'gopher:': true,
|
|
64
|
-
|
|
60
|
+
file: true,
|
|
65
61
|
'file:': true
|
|
66
62
|
};
|
|
67
63
|
const querystring = require('querystring');
|
|
68
64
|
|
|
69
65
|
/* istanbul ignore next: improve coverage */
|
|
70
66
|
function urlParse(url, parseQueryString, slashesDenoteHost) {
|
|
71
|
-
if (url instanceof Url)
|
|
72
|
-
|
|
67
|
+
if (url instanceof Url) {
|
|
68
|
+
return url;
|
|
69
|
+
}
|
|
73
70
|
var u = new Url();
|
|
74
71
|
u.parse(url, parseQueryString, slashesDenoteHost);
|
|
75
72
|
return u;
|
|
@@ -94,9 +91,11 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
94
91
|
const code = url.charCodeAt(i);
|
|
95
92
|
|
|
96
93
|
// Find first and last non-whitespace characters for trimming
|
|
97
|
-
const isWs = code === 32 /* */ || code === 9 /*\t*/ || code === 13 /*\r*/ || code === 10 /*\n*/ || code === 12 /*\f*/ || code === 160 /*\u00A0*/ || code === 65279 /*\uFEFF
|
|
94
|
+
const isWs = code === 32 /* */ || code === 9 /*\t*/ || code === 13 /*\r*/ || code === 10 /*\n*/ || code === 12 /*\f*/ || code === 160 /*\u00A0*/ || code === 65279; /*\uFEFF*/
|
|
98
95
|
if (start === -1) {
|
|
99
|
-
if (isWs)
|
|
96
|
+
if (isWs) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
100
99
|
lastPos = start = i;
|
|
101
100
|
} else {
|
|
102
101
|
if (inWs) {
|
|
@@ -123,14 +122,16 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
123
122
|
break;
|
|
124
123
|
case 92:
|
|
125
124
|
// '\\'
|
|
126
|
-
if (i - lastPos > 0)
|
|
125
|
+
if (i - lastPos > 0) {
|
|
126
|
+
rest += url.slice(lastPos, i);
|
|
127
|
+
}
|
|
127
128
|
rest += '/';
|
|
128
129
|
lastPos = i + 1;
|
|
129
130
|
break;
|
|
130
131
|
}
|
|
131
132
|
} else if (!hasHash && code === 35 /*#*/) {
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
hasHash = true;
|
|
134
|
+
}
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
// Check if string was non-empty (including strings with only whitespace)
|
|
@@ -139,7 +140,11 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
139
140
|
// We didn't convert any backslashes
|
|
140
141
|
|
|
141
142
|
if (end === -1) {
|
|
142
|
-
if (start === 0)
|
|
143
|
+
if (start === 0) {
|
|
144
|
+
rest = url;
|
|
145
|
+
} else {
|
|
146
|
+
rest = url.slice(start);
|
|
147
|
+
}
|
|
143
148
|
} else {
|
|
144
149
|
rest = url.slice(start, end);
|
|
145
150
|
}
|
|
@@ -151,7 +156,6 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
151
156
|
rest += url.slice(lastPos, end);
|
|
152
157
|
}
|
|
153
158
|
}
|
|
154
|
-
|
|
155
159
|
if (!slashesDenoteHost && !hasHash) {
|
|
156
160
|
// Try fast path regexp
|
|
157
161
|
const simplePath = simplePathPattern.exec(rest);
|
|
@@ -173,7 +177,6 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
173
177
|
return this;
|
|
174
178
|
}
|
|
175
179
|
}
|
|
176
|
-
|
|
177
180
|
var proto = protocolPattern.exec(rest);
|
|
178
181
|
if (proto) {
|
|
179
182
|
proto = proto[0];
|
|
@@ -187,15 +190,13 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
187
190
|
// resolution will treat //foo/bar as host=foo,path=bar because that's
|
|
188
191
|
// how the browser resolves relative URLs.
|
|
189
192
|
if (slashesDenoteHost || proto || /^\/\/[^@\/]+@[^@\/]+/.test(rest)) {
|
|
190
|
-
var slashes = rest.charCodeAt(0) === 47 /*/*/ && rest.charCodeAt(1) === 47
|
|
193
|
+
var slashes = rest.charCodeAt(0) === 47 /*/*/ && rest.charCodeAt(1) === 47; /*/*/
|
|
191
194
|
if (slashes && !(proto && hostlessProtocol[proto])) {
|
|
192
195
|
rest = rest.slice(2);
|
|
193
196
|
this.slashes = true;
|
|
194
197
|
}
|
|
195
198
|
}
|
|
196
|
-
|
|
197
199
|
if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {
|
|
198
|
-
|
|
199
200
|
// there's a hostname.
|
|
200
201
|
// the first instance of /, ?, ;, or # ends the host.
|
|
201
202
|
//
|
|
@@ -234,14 +235,18 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
234
235
|
case 125:
|
|
235
236
|
// '}'
|
|
236
237
|
// Characters that are never ever allowed in a hostname from RFC 2396
|
|
237
|
-
if (nonHost === -1)
|
|
238
|
+
if (nonHost === -1) {
|
|
239
|
+
nonHost = i;
|
|
240
|
+
}
|
|
238
241
|
break;
|
|
239
242
|
case 35: // '#'
|
|
240
243
|
case 47: // '/'
|
|
241
244
|
case 63:
|
|
242
245
|
// '?'
|
|
243
246
|
// Find the first instance of any host-ending characters
|
|
244
|
-
if (nonHost === -1)
|
|
247
|
+
if (nonHost === -1) {
|
|
248
|
+
nonHost = i;
|
|
249
|
+
}
|
|
245
250
|
hostEnd = i;
|
|
246
251
|
break;
|
|
247
252
|
case 64:
|
|
@@ -252,7 +257,9 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
252
257
|
nonHost = -1;
|
|
253
258
|
break;
|
|
254
259
|
}
|
|
255
|
-
if (hostEnd !== -1)
|
|
260
|
+
if (hostEnd !== -1) {
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
256
263
|
}
|
|
257
264
|
start = 0;
|
|
258
265
|
if (atSign !== -1) {
|
|
@@ -272,35 +279,32 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
272
279
|
|
|
273
280
|
// we've indicated that there is a hostname,
|
|
274
281
|
// so even if it's empty, it has to be present.
|
|
275
|
-
if (typeof this.hostname !== 'string')
|
|
276
|
-
|
|
282
|
+
if (typeof this.hostname !== 'string') {
|
|
283
|
+
this.hostname = '';
|
|
284
|
+
}
|
|
277
285
|
var hostname = this.hostname;
|
|
278
286
|
|
|
279
287
|
// if hostname begins with [ and ends with ]
|
|
280
288
|
// assume that it's an IPv6 address.
|
|
281
|
-
var ipv6Hostname = hostname.charCodeAt(0) === 91 /*[*/ && hostname.charCodeAt(hostname.length - 1) === 93 /*]
|
|
289
|
+
var ipv6Hostname = hostname.charCodeAt(0) === 91 /*[*/ && hostname.charCodeAt(hostname.length - 1) === 93; /*]*/
|
|
282
290
|
|
|
283
291
|
// validate a little.
|
|
284
292
|
if (!ipv6Hostname) {
|
|
285
293
|
const result = validateHostname(this, rest, hostname);
|
|
286
|
-
if (result !== undefined)
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
if (this.hostname.length > hostnameMaxLen) {
|
|
290
|
-
this.hostname = '';
|
|
291
|
-
} else {
|
|
292
|
-
// hostnames are always lower case.
|
|
293
|
-
this.hostname = this.hostname.toLowerCase();
|
|
294
|
+
if (result !== undefined) {
|
|
295
|
+
rest = result;
|
|
296
|
+
}
|
|
294
297
|
}
|
|
295
298
|
|
|
299
|
+
// hostnames are always lower case.
|
|
300
|
+
this.hostname = this.hostname.toLowerCase();
|
|
296
301
|
if (!ipv6Hostname) {
|
|
297
302
|
// IDNA Support: Returns a punycoded representation of "domain".
|
|
298
303
|
// It only converts parts of the domain name that
|
|
299
304
|
// have non-ASCII characters, i.e. it doesn't matter if
|
|
300
305
|
// you call it with a domain that already is ASCII-only.
|
|
301
|
-
this.hostname =
|
|
306
|
+
this.hostname = _punycode.default.toASCII(this.hostname);
|
|
302
307
|
}
|
|
303
|
-
|
|
304
308
|
var p = this.port ? ':' + this.port : '';
|
|
305
309
|
var h = this.hostname || '';
|
|
306
310
|
this.host = h + p;
|
|
@@ -322,22 +326,22 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
322
326
|
// escaped, even if encodeURIComponent doesn't think they
|
|
323
327
|
// need to be.
|
|
324
328
|
const result = autoEscapeStr(rest);
|
|
325
|
-
if (result !== undefined)
|
|
329
|
+
if (result !== undefined) {
|
|
330
|
+
rest = result;
|
|
331
|
+
}
|
|
326
332
|
}
|
|
327
|
-
|
|
328
333
|
var questionIdx = -1;
|
|
329
334
|
var hashIdx = -1;
|
|
330
335
|
for (i = 0; i < rest.length; ++i) {
|
|
331
336
|
const code = rest.charCodeAt(i);
|
|
332
337
|
if (code === 35 /*#*/) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
338
|
+
this.hash = rest.slice(i);
|
|
339
|
+
hashIdx = i;
|
|
340
|
+
break;
|
|
341
|
+
} else if (code === 63 /*?*/ && questionIdx === -1) {
|
|
337
342
|
questionIdx = i;
|
|
338
343
|
}
|
|
339
344
|
}
|
|
340
|
-
|
|
341
345
|
if (questionIdx !== -1) {
|
|
342
346
|
if (hashIdx === -1) {
|
|
343
347
|
this.search = rest.slice(questionIdx);
|
|
@@ -354,10 +358,11 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
354
358
|
this.search = '';
|
|
355
359
|
this.query = {};
|
|
356
360
|
}
|
|
357
|
-
|
|
358
361
|
var firstIdx = questionIdx !== -1 && (hashIdx === -1 || questionIdx < hashIdx) ? questionIdx : hashIdx;
|
|
359
362
|
if (firstIdx === -1) {
|
|
360
|
-
if (rest.length > 0)
|
|
363
|
+
if (rest.length > 0) {
|
|
364
|
+
this.pathname = rest;
|
|
365
|
+
}
|
|
361
366
|
} else if (firstIdx > 0) {
|
|
362
367
|
this.pathname = rest.slice(0, firstIdx);
|
|
363
368
|
}
|
|
@@ -381,7 +386,9 @@ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
|
|
|
381
386
|
function validateHostname(self, rest, hostname) {
|
|
382
387
|
for (var i = 0, lastPos; i <= hostname.length; ++i) {
|
|
383
388
|
var code;
|
|
384
|
-
if (i < hostname.length)
|
|
389
|
+
if (i < hostname.length) {
|
|
390
|
+
code = hostname.charCodeAt(i);
|
|
391
|
+
}
|
|
385
392
|
if (code === 46 /*.*/ || i === hostname.length) {
|
|
386
393
|
if (i - lastPos > 0) {
|
|
387
394
|
if (i - lastPos > 63) {
|
|
@@ -391,16 +398,16 @@ function validateHostname(self, rest, hostname) {
|
|
|
391
398
|
}
|
|
392
399
|
lastPos = i + 1;
|
|
393
400
|
continue;
|
|
394
|
-
} else if (code >= 48 /*0*/ && code <= 57 /*9*/ || code >= 97 /*a*/ && code <= 122 /*z*/ || code === 45 /*-*/ || code >= 65 /*A*/ && code <= 90 /*Z*/ || code === 43 /*+*/ || code === 95 /*_*/ ||
|
|
395
|
-
/*
|
|
396
|
-
code === 44 /*,*/ || code === 58 /*:*/ ||
|
|
397
|
-
/* END MONGO URI PATCH */
|
|
401
|
+
} else if (code >= 48 /*0*/ && code <= 57 /*9*/ || code >= 97 /*a*/ && code <= 122 /*z*/ || code === 45 /*-*/ || code >= 65 /*A*/ && code <= 90 /*Z*/ || code === 43 /*+*/ || code === 95 /*_*/ || /* BEGIN MONGO URI PATCH */
|
|
402
|
+
code === 44 /*,*/ || code === 58 /*:*/ || /* END MONGO URI PATCH */
|
|
398
403
|
code > 127) {
|
|
399
404
|
continue;
|
|
400
405
|
}
|
|
401
406
|
// Invalid host character
|
|
402
407
|
self.hostname = hostname.slice(0, i);
|
|
403
|
-
if (i < hostname.length)
|
|
408
|
+
if (i < hostname.length) {
|
|
409
|
+
return '/' + hostname.slice(i) + rest;
|
|
410
|
+
}
|
|
404
411
|
break;
|
|
405
412
|
}
|
|
406
413
|
}
|
|
@@ -415,92 +422,126 @@ function autoEscapeStr(rest) {
|
|
|
415
422
|
switch (rest.charCodeAt(i)) {
|
|
416
423
|
case 9:
|
|
417
424
|
// '\t'
|
|
418
|
-
if (i - lastPos > 0)
|
|
425
|
+
if (i - lastPos > 0) {
|
|
426
|
+
newRest += rest.slice(lastPos, i);
|
|
427
|
+
}
|
|
419
428
|
newRest += '%09';
|
|
420
429
|
lastPos = i + 1;
|
|
421
430
|
break;
|
|
422
431
|
case 10:
|
|
423
432
|
// '\n'
|
|
424
|
-
if (i - lastPos > 0)
|
|
433
|
+
if (i - lastPos > 0) {
|
|
434
|
+
newRest += rest.slice(lastPos, i);
|
|
435
|
+
}
|
|
425
436
|
newRest += '%0A';
|
|
426
437
|
lastPos = i + 1;
|
|
427
438
|
break;
|
|
428
439
|
case 13:
|
|
429
440
|
// '\r'
|
|
430
|
-
if (i - lastPos > 0)
|
|
441
|
+
if (i - lastPos > 0) {
|
|
442
|
+
newRest += rest.slice(lastPos, i);
|
|
443
|
+
}
|
|
431
444
|
newRest += '%0D';
|
|
432
445
|
lastPos = i + 1;
|
|
433
446
|
break;
|
|
434
447
|
case 32:
|
|
435
448
|
// ' '
|
|
436
|
-
if (i - lastPos > 0)
|
|
449
|
+
if (i - lastPos > 0) {
|
|
450
|
+
newRest += rest.slice(lastPos, i);
|
|
451
|
+
}
|
|
437
452
|
newRest += '%20';
|
|
438
453
|
lastPos = i + 1;
|
|
439
454
|
break;
|
|
440
455
|
case 34:
|
|
441
456
|
// '"'
|
|
442
|
-
if (i - lastPos > 0)
|
|
457
|
+
if (i - lastPos > 0) {
|
|
458
|
+
newRest += rest.slice(lastPos, i);
|
|
459
|
+
}
|
|
443
460
|
newRest += '%22';
|
|
444
461
|
lastPos = i + 1;
|
|
445
462
|
break;
|
|
446
463
|
case 39:
|
|
447
464
|
// '\''
|
|
448
|
-
if (i - lastPos > 0)
|
|
465
|
+
if (i - lastPos > 0) {
|
|
466
|
+
newRest += rest.slice(lastPos, i);
|
|
467
|
+
}
|
|
449
468
|
newRest += '%27';
|
|
450
469
|
lastPos = i + 1;
|
|
451
470
|
break;
|
|
452
471
|
case 60:
|
|
453
472
|
// '<'
|
|
454
|
-
if (i - lastPos > 0)
|
|
473
|
+
if (i - lastPos > 0) {
|
|
474
|
+
newRest += rest.slice(lastPos, i);
|
|
475
|
+
}
|
|
455
476
|
newRest += '%3C';
|
|
456
477
|
lastPos = i + 1;
|
|
457
478
|
break;
|
|
458
479
|
case 62:
|
|
459
480
|
// '>'
|
|
460
|
-
if (i - lastPos > 0)
|
|
481
|
+
if (i - lastPos > 0) {
|
|
482
|
+
newRest += rest.slice(lastPos, i);
|
|
483
|
+
}
|
|
461
484
|
newRest += '%3E';
|
|
462
485
|
lastPos = i + 1;
|
|
463
486
|
break;
|
|
464
487
|
case 92:
|
|
465
488
|
// '\\'
|
|
466
|
-
if (i - lastPos > 0)
|
|
489
|
+
if (i - lastPos > 0) {
|
|
490
|
+
newRest += rest.slice(lastPos, i);
|
|
491
|
+
}
|
|
467
492
|
newRest += '%5C';
|
|
468
493
|
lastPos = i + 1;
|
|
469
494
|
break;
|
|
470
495
|
case 94:
|
|
471
496
|
// '^'
|
|
472
|
-
if (i - lastPos > 0)
|
|
497
|
+
if (i - lastPos > 0) {
|
|
498
|
+
newRest += rest.slice(lastPos, i);
|
|
499
|
+
}
|
|
473
500
|
newRest += '%5E';
|
|
474
501
|
lastPos = i + 1;
|
|
475
502
|
break;
|
|
476
503
|
case 96:
|
|
477
504
|
// '`'
|
|
478
|
-
if (i - lastPos > 0)
|
|
505
|
+
if (i - lastPos > 0) {
|
|
506
|
+
newRest += rest.slice(lastPos, i);
|
|
507
|
+
}
|
|
479
508
|
newRest += '%60';
|
|
480
509
|
lastPos = i + 1;
|
|
481
510
|
break;
|
|
482
511
|
case 123:
|
|
483
512
|
// '{'
|
|
484
|
-
if (i - lastPos > 0)
|
|
513
|
+
if (i - lastPos > 0) {
|
|
514
|
+
newRest += rest.slice(lastPos, i);
|
|
515
|
+
}
|
|
485
516
|
newRest += '%7B';
|
|
486
517
|
lastPos = i + 1;
|
|
487
518
|
break;
|
|
488
519
|
case 124:
|
|
489
520
|
// '|'
|
|
490
|
-
if (i - lastPos > 0)
|
|
521
|
+
if (i - lastPos > 0) {
|
|
522
|
+
newRest += rest.slice(lastPos, i);
|
|
523
|
+
}
|
|
491
524
|
newRest += '%7C';
|
|
492
525
|
lastPos = i + 1;
|
|
493
526
|
break;
|
|
494
527
|
case 125:
|
|
495
528
|
// '}'
|
|
496
|
-
if (i - lastPos > 0)
|
|
529
|
+
if (i - lastPos > 0) {
|
|
530
|
+
newRest += rest.slice(lastPos, i);
|
|
531
|
+
}
|
|
497
532
|
newRest += '%7D';
|
|
498
533
|
lastPos = i + 1;
|
|
499
534
|
break;
|
|
500
535
|
}
|
|
501
536
|
}
|
|
502
|
-
if (lastPos === 0)
|
|
503
|
-
|
|
537
|
+
if (lastPos === 0) {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
if (lastPos < rest.length) {
|
|
541
|
+
return newRest + rest.slice(lastPos);
|
|
542
|
+
} else {
|
|
543
|
+
return newRest;
|
|
544
|
+
}
|
|
504
545
|
}
|
|
505
546
|
|
|
506
547
|
// format a parsed object into a url string
|
|
@@ -510,8 +551,13 @@ function urlFormat(obj) {
|
|
|
510
551
|
// If it's an obj, this is a no-op.
|
|
511
552
|
// this way, you can call url_format() on strings
|
|
512
553
|
// to clean up potentially wonky urls.
|
|
513
|
-
if (typeof obj === 'string')
|
|
514
|
-
|
|
554
|
+
if (typeof obj === 'string') {
|
|
555
|
+
obj = urlParse(obj);
|
|
556
|
+
} else if (typeof obj !== 'object' || obj === null) {
|
|
557
|
+
throw new TypeError('Parameter "urlObj" must be an object, not ' + (obj === null ? 'null' : typeof obj));
|
|
558
|
+
} else if (!(obj instanceof Url)) {
|
|
559
|
+
return Url.prototype.format.call(obj);
|
|
560
|
+
}
|
|
515
561
|
return obj.format();
|
|
516
562
|
}
|
|
517
563
|
|
|
@@ -522,13 +568,11 @@ Url.prototype.format = function () {
|
|
|
522
568
|
auth = encodeAuth(auth);
|
|
523
569
|
auth += '@';
|
|
524
570
|
}
|
|
525
|
-
|
|
526
571
|
var protocol = this.protocol || '';
|
|
527
572
|
var pathname = this.pathname || '';
|
|
528
573
|
var hash = this.hash || '';
|
|
529
574
|
var host = false;
|
|
530
575
|
var query = '';
|
|
531
|
-
|
|
532
576
|
if (this.host) {
|
|
533
577
|
host = auth + this.host;
|
|
534
578
|
} else if (this.hostname) {
|
|
@@ -537,49 +581,60 @@ Url.prototype.format = function () {
|
|
|
537
581
|
host += ':' + this.port;
|
|
538
582
|
}
|
|
539
583
|
}
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
584
|
+
if (this.query !== null && typeof this.query === 'object') {
|
|
585
|
+
query = querystring.stringify(this.query);
|
|
586
|
+
}
|
|
543
587
|
var search = this.search || query && '?' + query || '';
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
588
|
+
if (protocol && protocol.charCodeAt(protocol.length - 1) !== 58 /*:*/) {
|
|
589
|
+
protocol += ':';
|
|
590
|
+
}
|
|
547
591
|
var newPathname = '';
|
|
548
592
|
var lastPos = 0;
|
|
549
593
|
for (var i = 0; i < pathname.length; ++i) {
|
|
550
594
|
switch (pathname.charCodeAt(i)) {
|
|
551
595
|
case 35:
|
|
552
596
|
// '#'
|
|
553
|
-
if (i - lastPos > 0)
|
|
597
|
+
if (i - lastPos > 0) {
|
|
598
|
+
newPathname += pathname.slice(lastPos, i);
|
|
599
|
+
}
|
|
554
600
|
newPathname += '%23';
|
|
555
601
|
lastPos = i + 1;
|
|
556
602
|
break;
|
|
557
603
|
case 63:
|
|
558
604
|
// '?'
|
|
559
|
-
if (i - lastPos > 0)
|
|
605
|
+
if (i - lastPos > 0) {
|
|
606
|
+
newPathname += pathname.slice(lastPos, i);
|
|
607
|
+
}
|
|
560
608
|
newPathname += '%3F';
|
|
561
609
|
lastPos = i + 1;
|
|
562
610
|
break;
|
|
563
611
|
}
|
|
564
612
|
}
|
|
565
613
|
if (lastPos > 0) {
|
|
566
|
-
if (lastPos !== pathname.length)
|
|
614
|
+
if (lastPos !== pathname.length) {
|
|
615
|
+
pathname = newPathname + pathname.slice(lastPos);
|
|
616
|
+
} else {
|
|
617
|
+
pathname = newPathname;
|
|
618
|
+
}
|
|
567
619
|
}
|
|
568
620
|
|
|
569
621
|
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
|
|
570
622
|
// unless they had them to begin with.
|
|
571
623
|
if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {
|
|
572
624
|
host = '//' + (host || '');
|
|
573
|
-
if (pathname && pathname.charCodeAt(0) !== 47 /*/*/)
|
|
625
|
+
if (pathname && pathname.charCodeAt(0) !== 47 /*/*/) {
|
|
626
|
+
pathname = '/' + pathname;
|
|
627
|
+
}
|
|
574
628
|
} else if (!host) {
|
|
575
629
|
host = '';
|
|
576
630
|
}
|
|
577
|
-
|
|
578
631
|
search = search.replace('#', '%23');
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
632
|
+
if (hash && hash.charCodeAt(0) !== 35 /*#*/) {
|
|
633
|
+
hash = '#' + hash;
|
|
634
|
+
}
|
|
635
|
+
if (search && search.charCodeAt(0) !== 63 /*?*/) {
|
|
636
|
+
search = '?' + search;
|
|
637
|
+
}
|
|
583
638
|
return protocol + host + pathname + search + hash;
|
|
584
639
|
};
|
|
585
640
|
|
|
@@ -595,7 +650,9 @@ Url.prototype.resolve = function (relative) {
|
|
|
595
650
|
|
|
596
651
|
/* istanbul ignore next: improve coverage */
|
|
597
652
|
function urlResolveObject(source, relative) {
|
|
598
|
-
if (!source)
|
|
653
|
+
if (!source) {
|
|
654
|
+
return relative;
|
|
655
|
+
}
|
|
599
656
|
return urlParse(source, false, true).resolveObject(relative);
|
|
600
657
|
}
|
|
601
658
|
|
|
@@ -606,7 +663,6 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
606
663
|
rel.parse(relative, false, true);
|
|
607
664
|
relative = rel;
|
|
608
665
|
}
|
|
609
|
-
|
|
610
666
|
var result = new Url();
|
|
611
667
|
var tkeys = Object.keys(this);
|
|
612
668
|
for (var tk = 0; tk < tkeys.length; tk++) {
|
|
@@ -630,18 +686,18 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
630
686
|
var rkeys = Object.keys(relative);
|
|
631
687
|
for (var rk = 0; rk < rkeys.length; rk++) {
|
|
632
688
|
var rkey = rkeys[rk];
|
|
633
|
-
if (rkey !== 'protocol')
|
|
689
|
+
if (rkey !== 'protocol') {
|
|
690
|
+
result[rkey] = relative[rkey];
|
|
691
|
+
}
|
|
634
692
|
}
|
|
635
693
|
|
|
636
694
|
//urlParse appends trailing / to urls like http://www.example.com
|
|
637
695
|
if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {
|
|
638
696
|
result.path = result.pathname = '/';
|
|
639
697
|
}
|
|
640
|
-
|
|
641
698
|
result.href = result.format();
|
|
642
699
|
return result;
|
|
643
700
|
}
|
|
644
|
-
|
|
645
701
|
if (relative.protocol && relative.protocol !== result.protocol) {
|
|
646
702
|
// if it's a known url protocol, then changing
|
|
647
703
|
// the protocol does weird things
|
|
@@ -660,15 +716,28 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
660
716
|
result.href = result.format();
|
|
661
717
|
return result;
|
|
662
718
|
}
|
|
663
|
-
|
|
664
719
|
result.protocol = relative.protocol;
|
|
665
720
|
if (!relative.host && !/^file:?$/.test(relative.protocol) && !hostlessProtocol[relative.protocol]) {
|
|
666
721
|
const relPath = (relative.pathname || '').split('/');
|
|
667
|
-
while (relPath.length
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
722
|
+
while (relPath.length) {
|
|
723
|
+
const shifted = relPath.shift();
|
|
724
|
+
if (shifted) {
|
|
725
|
+
relative.host = shifted;
|
|
726
|
+
break;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (!relative.host) {
|
|
730
|
+
relative.host = '';
|
|
731
|
+
}
|
|
732
|
+
if (!relative.hostname) {
|
|
733
|
+
relative.hostname = '';
|
|
734
|
+
}
|
|
735
|
+
if (relPath[0] !== '') {
|
|
736
|
+
relPath.unshift('');
|
|
737
|
+
}
|
|
738
|
+
if (relPath.length < 2) {
|
|
739
|
+
relPath.unshift('');
|
|
740
|
+
}
|
|
672
741
|
result.pathname = relPath.join('/');
|
|
673
742
|
} else {
|
|
674
743
|
result.pathname = relative.pathname;
|
|
@@ -689,7 +758,6 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
689
758
|
result.href = result.format();
|
|
690
759
|
return result;
|
|
691
760
|
}
|
|
692
|
-
|
|
693
761
|
var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/';
|
|
694
762
|
var isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/';
|
|
695
763
|
var mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname;
|
|
@@ -707,20 +775,27 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
707
775
|
result.hostname = '';
|
|
708
776
|
result.port = null;
|
|
709
777
|
if (result.host) {
|
|
710
|
-
if (srcPath[0] === '')
|
|
778
|
+
if (srcPath[0] === '') {
|
|
779
|
+
srcPath[0] = result.host;
|
|
780
|
+
} else {
|
|
781
|
+
srcPath.unshift(result.host);
|
|
782
|
+
}
|
|
711
783
|
}
|
|
712
784
|
result.host = '';
|
|
713
785
|
if (relative.protocol) {
|
|
714
786
|
relative.hostname = null;
|
|
715
787
|
relative.port = null;
|
|
716
788
|
if (relative.host) {
|
|
717
|
-
if (relPath[0] === '')
|
|
789
|
+
if (relPath[0] === '') {
|
|
790
|
+
relPath[0] = relative.host;
|
|
791
|
+
} else {
|
|
792
|
+
relPath.unshift(relative.host);
|
|
793
|
+
}
|
|
718
794
|
}
|
|
719
795
|
relative.host = null;
|
|
720
796
|
}
|
|
721
797
|
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
|
|
722
798
|
}
|
|
723
|
-
|
|
724
799
|
if (isRelAbs) {
|
|
725
800
|
// it's absolute.
|
|
726
801
|
result.host = relative.host || relative.host === '' ? relative.host : result.host;
|
|
@@ -732,7 +807,9 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
732
807
|
} else if (relPath.length) {
|
|
733
808
|
// it's relative
|
|
734
809
|
// throw away the existing file, and take the new path instead.
|
|
735
|
-
if (!srcPath)
|
|
810
|
+
if (!srcPath) {
|
|
811
|
+
srcPath = [];
|
|
812
|
+
}
|
|
736
813
|
srcPath.pop();
|
|
737
814
|
srcPath = srcPath.concat(relPath);
|
|
738
815
|
result.search = relative.search;
|
|
@@ -761,7 +838,6 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
761
838
|
result.href = result.format();
|
|
762
839
|
return result;
|
|
763
840
|
}
|
|
764
|
-
|
|
765
841
|
if (!srcPath.length) {
|
|
766
842
|
// no path at all. easy.
|
|
767
843
|
// we've already handled the other stuff above.
|
|
@@ -804,20 +880,21 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
804
880
|
srcPath.unshift('..');
|
|
805
881
|
}
|
|
806
882
|
}
|
|
807
|
-
|
|
808
883
|
if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
|
|
809
884
|
srcPath.unshift('');
|
|
810
885
|
}
|
|
811
|
-
|
|
812
886
|
if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {
|
|
813
887
|
srcPath.push('');
|
|
814
888
|
}
|
|
815
|
-
|
|
816
889
|
var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/';
|
|
817
890
|
|
|
818
891
|
// put the host back
|
|
819
892
|
if (psychotic) {
|
|
820
|
-
|
|
893
|
+
if (isAbsolute) {
|
|
894
|
+
result.hostname = result.host = '';
|
|
895
|
+
} else {
|
|
896
|
+
result.hostname = result.host = srcPath.length ? srcPath.shift() : '';
|
|
897
|
+
}
|
|
821
898
|
//occasionally the auth can get stuck only in host
|
|
822
899
|
//this especially happens in cases like
|
|
823
900
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
|
|
@@ -827,13 +904,10 @@ Url.prototype.resolveObject = function (relative) {
|
|
|
827
904
|
result.host = result.hostname = authInHost.shift();
|
|
828
905
|
}
|
|
829
906
|
}
|
|
830
|
-
|
|
831
907
|
mustEndAbs = mustEndAbs || result.host && srcPath.length;
|
|
832
|
-
|
|
833
908
|
if (mustEndAbs && !isAbsolute) {
|
|
834
909
|
srcPath.unshift('');
|
|
835
910
|
}
|
|
836
|
-
|
|
837
911
|
if (!srcPath.length) {
|
|
838
912
|
result.pathname = null;
|
|
839
913
|
result.path = null;
|
|
@@ -862,18 +936,23 @@ Url.prototype.parseHost = function () {
|
|
|
862
936
|
}
|
|
863
937
|
host = host.slice(0, host.length - port.length);
|
|
864
938
|
}
|
|
865
|
-
if (host)
|
|
939
|
+
if (host) {
|
|
940
|
+
this.hostname = host;
|
|
941
|
+
}
|
|
866
942
|
};
|
|
867
943
|
|
|
868
944
|
// About 1.5x faster than the two-arg version of Array#splice().
|
|
869
945
|
/* istanbul ignore next: improve coverage */
|
|
870
946
|
function spliceOne(list, index) {
|
|
871
|
-
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
|
|
947
|
+
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
|
|
948
|
+
list[i] = list[k];
|
|
949
|
+
}
|
|
872
950
|
list.pop();
|
|
873
951
|
}
|
|
874
|
-
|
|
875
952
|
var hexTable = new Array(256);
|
|
876
|
-
for (var i = 0; i < 256; ++i)
|
|
953
|
+
for (var i = 0; i < 256; ++i) {
|
|
954
|
+
hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
|
|
955
|
+
}
|
|
877
956
|
/* istanbul ignore next: improve coverage */
|
|
878
957
|
function encodeAuth(str) {
|
|
879
958
|
// faster encodeURIComponent alternative for encoding auth uri components
|
|
@@ -888,12 +967,12 @@ function encodeAuth(str) {
|
|
|
888
967
|
// digits
|
|
889
968
|
// alpha (uppercase)
|
|
890
969
|
// alpha (lowercase)
|
|
891
|
-
if (c === 0x21 || c ===
|
|
970
|
+
if (c === 0x21 || c === 0x2d || c === 0x2e || c === 0x5f || c === 0x7e || c >= 0x27 && c <= 0x2a || c >= 0x30 && c <= 0x3a || c >= 0x41 && c <= 0x5a || c >= 0x61 && c <= 0x7a) {
|
|
892
971
|
continue;
|
|
893
972
|
}
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
973
|
+
if (i - lastPos > 0) {
|
|
974
|
+
out += str.slice(lastPos, i);
|
|
975
|
+
}
|
|
897
976
|
lastPos = i + 1;
|
|
898
977
|
|
|
899
978
|
// Other ASCII characters
|
|
@@ -904,22 +983,30 @@ function encodeAuth(str) {
|
|
|
904
983
|
|
|
905
984
|
// Multi-byte characters ...
|
|
906
985
|
if (c < 0x800) {
|
|
907
|
-
out += hexTable[
|
|
986
|
+
out += hexTable[0xc0 | c >> 6] + hexTable[0x80 | c & 0x3f];
|
|
908
987
|
continue;
|
|
909
988
|
}
|
|
910
|
-
if (c <
|
|
911
|
-
out += hexTable[
|
|
989
|
+
if (c < 0xd800 || c >= 0xe000) {
|
|
990
|
+
out += hexTable[0xe0 | c >> 12] + hexTable[0x80 | c >> 6 & 0x3f] + hexTable[0x80 | c & 0x3f];
|
|
912
991
|
continue;
|
|
913
992
|
}
|
|
914
993
|
// Surrogate pair
|
|
915
994
|
++i;
|
|
916
995
|
var c2;
|
|
917
|
-
if (i < str.length)
|
|
918
|
-
|
|
919
|
-
|
|
996
|
+
if (i < str.length) {
|
|
997
|
+
c2 = str.charCodeAt(i) & 0x3ff;
|
|
998
|
+
} else {
|
|
999
|
+
c2 = 0;
|
|
1000
|
+
}
|
|
1001
|
+
c = 0x10000 + ((c & 0x3ff) << 10 | c2);
|
|
1002
|
+
out += hexTable[0xf0 | c >> 18] + hexTable[0x80 | c >> 12 & 0x3f] + hexTable[0x80 | c >> 6 & 0x3f] + hexTable[0x80 | c & 0x3f];
|
|
1003
|
+
}
|
|
1004
|
+
if (lastPos === 0) {
|
|
1005
|
+
return str;
|
|
1006
|
+
}
|
|
1007
|
+
if (lastPos < str.length) {
|
|
1008
|
+
return out + str.slice(lastPos);
|
|
920
1009
|
}
|
|
921
|
-
if (lastPos === 0) return str;
|
|
922
|
-
if (lastPos < str.length) return out + str.slice(lastPos);
|
|
923
1010
|
return out;
|
|
924
1011
|
}
|
|
925
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3IvbW9uZ29kYlVybC5qcyJdLCJuYW1lcyI6WyJwdW55Y29kZSIsInJlcXVpcmUiLCJleHBvcnRzIiwicGFyc2UiLCJ1cmxQYXJzZSIsInJlc29sdmUiLCJ1cmxSZXNvbHZlIiwicmVzb2x2ZU9iamVjdCIsInVybFJlc29sdmVPYmplY3QiLCJmb3JtYXQiLCJ1cmxGb3JtYXQiLCJVcmwiLCJwcm90b2NvbCIsInNsYXNoZXMiLCJhdXRoIiwiaG9zdCIsInBvcnQiLCJob3N0bmFtZSIsImhhc2giLCJzZWFyY2giLCJxdWVyeSIsInBhdGhuYW1lIiwicGF0aCIsImhyZWYiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwiaG9zdG5hbWVNYXhMZW4iLCJ1bnNhZmVQcm90b2NvbCIsImhvc3RsZXNzUHJvdG9jb2wiLCJzbGFzaGVkUHJvdG9jb2wiLCJxdWVyeXN0cmluZyIsInVybCIsInBhcnNlUXVlcnlTdHJpbmciLCJzbGFzaGVzRGVub3RlSG9zdCIsInUiLCJwcm90b3R5cGUiLCJUeXBlRXJyb3IiLCJoYXNIYXNoIiwic3RhcnQiLCJlbmQiLCJyZXN0IiwibGFzdFBvcyIsImkiLCJpbldzIiwic3BsaXQiLCJsZW5ndGgiLCJjb2RlIiwiY2hhckNvZGVBdCIsImlzV3MiLCJzbGljZSIsInNpbXBsZVBhdGgiLCJleGVjIiwicHJvdG8iLCJsb3dlclByb3RvIiwidG9Mb3dlckNhc2UiLCJ0ZXN0IiwiaG9zdEVuZCIsImF0U2lnbiIsIm5vbkhvc3QiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwYXJzZUhvc3QiLCJpcHY2SG9zdG5hbWUiLCJyZXN1bHQiLCJ2YWxpZGF0ZUhvc3RuYW1lIiwidW5kZWZpbmVkIiwidG9BU0NJSSIsInAiLCJoIiwiYXV0b0VzY2FwZVN0ciIsInF1ZXN0aW9uSWR4IiwiaGFzaElkeCIsImZpcnN0SWR4IiwicyIsInNlbGYiLCJuZXdSZXN0Iiwib2JqIiwiY2FsbCIsImVuY29kZUF1dGgiLCJpbmRleE9mIiwic3RyaW5naWZ5IiwibmV3UGF0aG5hbWUiLCJyZXBsYWNlIiwic291cmNlIiwicmVsYXRpdmUiLCJyZWwiLCJ0a2V5cyIsIk9iamVjdCIsImtleXMiLCJ0ayIsInRrZXkiLCJya2V5cyIsInJrIiwicmtleSIsInYiLCJrIiwicmVsUGF0aCIsInNoaWZ0IiwidW5zaGlmdCIsImpvaW4iLCJpc1NvdXJjZUFicyIsImNoYXJBdCIsImlzUmVsQWJzIiwibXVzdEVuZEFicyIsInJlbW92ZUFsbERvdHMiLCJzcmNQYXRoIiwicHN5Y2hvdGljIiwicG9wIiwiY29uY2F0IiwiYXV0aEluSG9zdCIsImxhc3QiLCJoYXNUcmFpbGluZ1NsYXNoIiwidXAiLCJzcGxpY2VPbmUiLCJzdWJzdHIiLCJwdXNoIiwiaXNBYnNvbHV0ZSIsImxpc3QiLCJpbmRleCIsIm4iLCJoZXhUYWJsZSIsIkFycmF5IiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsInN0ciIsIm91dCIsImMiLCJjMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxNQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUFDLFFBQVFDLEtBQVIsR0FBZ0JDLFFBQWhCO0FBQ0FGLFFBQVFHLE9BQVIsR0FBa0JDLFVBQWxCO0FBQ0FKLFFBQVFLLGFBQVIsR0FBd0JDLGdCQUF4QjtBQUNBTixRQUFRTyxNQUFSLEdBQWlCQyxTQUFqQjs7QUFFQVIsUUFBUVMsR0FBUixHQUFjQSxHQUFkOztBQUVBLFNBQVNBLEdBQVQsR0FBZTtBQUNiLE9BQUtDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxPQUFLQyxPQUFMLEdBQWUsSUFBZjtBQUNBLE9BQUtDLElBQUwsR0FBWSxJQUFaO0FBQ0EsT0FBS0MsSUFBTCxHQUFZLElBQVo7QUFDQSxPQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNBLE9BQUtDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxPQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNBLE9BQUtD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dEIsSUFDQU4sU0FBUyxPQUFTTSxLQUFLLENBQU4sR0FBVyxJQUE1QixDQURBLEdBRUFOLFNBQVMsT0FBUU0sSUFBSSxJQUFyQixDQUZQO0FBR0E7QUFDRDtBQUNEO0FBQ0EsTUFBRW5GLENBQUY7QUFDQSxRQUFJb0YsRUFBSjtBQUNBLFFBQUlwRixJQUFJaUYsSUFBSTlFLE1BQVosRUFDRWlGLEtBQUtILElBQUk1RSxVQUFKLENBQWVMLENBQWYsSUFBb0IsS0FBekIsQ0FERixLQUdFb0YsS0FBSyxDQUFMO0FBQ0ZELFFBQUksV0FBWSxDQUFDQSxJQUFJLEtBQUwsS0FBZSxFQUFoQixHQUFzQkMsRUFBakMsQ0FBSjtBQUNBRixXQUFPTCxTQUFTLE9BQVFNLEtBQUssRUFBdEIsSUFDQU4sU0FBUyxPQUFTTSxLQUFLLEVBQU4sR0FBWSxJQUE3QixDQURBLEdBRUFOLFNBQVMsT0FBU00sS0FBSyxDQUFOLEdBQVcsSUFBNUIsQ0FGQSxHQUdBTixTQUFTLE9BQVFNLElBQUksSUFBckIsQ0FIUDtBQUlEO0FBQ0QsTUFBSXBGLFlBQVksQ0FBaEIsRUFDRSxPQUFPa0YsR0FBUDtBQUNGLE1BQUlsRixVQUFVa0YsSUFBSTlFLE1BQWxCLEVBQ0UsT0FBTytFLE1BQU1ELElBQUkxRSxLQUFKLENBQVVSLE9BQVYsQ0FBYjtBQUNGLFNBQU9tRixHQUFQO0FBQ0QiLCJmaWxlIjoibW9uZ29kYlVybC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgc2xpZ2h0bHkgcGF0Y2hlZCB2ZXJzaW9uIG9mIG5vZGUncyB1cmwgbW9kdWxlLCB3aXRoIHN1cHBvcnQgZm9yIG1vbmdvZGI6Ly9cbi8vIHVyaXMuXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9MSUNFTlNFIGZvciBsaWNlbnNpbmdcbi8vIGluZm9ybWF0aW9uXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxuY29uc3QgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaTtcbmNvbnN0IHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLztcblxuLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuY29uc3Qgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvO1xuXG5jb25zdCBob3N0bmFtZU1heExlbiA9IDI1NTtcbi8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuY29uc3QgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxufTtcbi8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbmNvbnN0IGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxufTtcbi8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuY29uc3Qgc2xhc2hlZFByb3RvY29sID0ge1xuICAnaHR0cCc6IHRydWUsXG4gICdodHRwOic6IHRydWUsXG4gICdodHRwcyc6IHRydWUsXG4gICdodHRwczonOiB0cnVlLFxuICAnZnRwJzogdHJ1ZSxcbiAgJ2Z0cDonOiB0cnVlLFxuICAnZ29waGVyJzogdHJ1ZSxcbiAgJ2dvcGhlcjonOiB0cnVlLFxuICAnZmlsZSc6IHRydWUsXG4gICdmaWxlOic6IHRydWVcbn07XG5jb25zdCBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmw7XG5cbiAgdmFyIHUgPSBuZXcgVXJsKCk7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyYW1ldGVyIFwidXJsXCIgbXVzdCBiZSBhIHN0cmluZywgbm90ICcgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIGhhc0hhc2ggPSBmYWxzZTtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIHJlc3QgPSAnJztcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICB2YXIgaSA9IDA7XG4gIGZvciAodmFyIGluV3MgPSBmYWxzZSwgc3BsaXQgPSBmYWxzZTsgaSA8IHVybC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvZGUgPSB1cmwuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIEZpbmQgZmlyc3QgYW5kIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb3IgdHJpbW1pbmdcbiAgICBjb25zdCBpc1dzID0gY29kZSA9PT0gMzIvKiAqLyB8fFxuICAgICAgICAgICAgICAgICBjb2RlID09PSA5LypcXHQqLyB8fFxuICAgICAgICAgICAgICAgICBjb2RlID09PSAxMy8qXFxyKi8gfHxcbiAgICAgICAgICAgICAgICAgY29kZSA9PT0gMTAvKlxcbiovIHx8XG4gICAgICAgICAgICAgICAgIGNvZGUgPT09IDEyLypcXGYqLyB8fFxuICAgICAgICAgICAgICAgICBjb2RlID09PSAxNjAvKlxcdTAwQTAqLyB8fFxuICAgICAgICAgICAgICAgICBjb2RlID09PSA2NTI3OS8qXFx1RkVGRiovO1xuICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgIGlmIChpc1dzKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGxhc3RQb3MgPSBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbldzKSB7XG4gICAgICAgIGlmICghaXNXcykge1xuICAgICAgICAgIGVuZCA9IC0xO1xuICAgICAgICAgIGluV3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dzKSB7XG4gICAgICAgIGVuZCA9IGk7XG4gICAgICAgIGluV3MgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgY29udmVydCBiYWNrc2xhc2hlcyB3aGlsZSB3ZSBoYXZlbid0IHNlZW4gYSBzcGxpdCBjaGFyYWN0ZXJcbiAgICBpZiAoIXNwbGl0KSB7XG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgMzU6IC8vICcjJ1xuICAgICAgICBoYXNIYXNoID0gdHJ1ZTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICBjYXNlIDYzOiAvLyAnPydcbiAgICAgICAgc3BsaXQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTI6IC8vICdcXFxcJ1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICAgIHJlc3QgKz0gdXJsLnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgICByZXN0ICs9ICcvJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFoYXNIYXNoICYmIGNvZGUgPT09IDM1LyojKi8pIHtcbiAgICAgIGhhc0hhc2ggPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHN0cmluZyB3YXMgbm9uLWVtcHR5IChpbmNsdWRpbmcgc3RyaW5ncyB3aXRoIG9ubHkgd2hpdGVzcGFjZSlcbiAgaWYgKHN0YXJ0ICE9PSAtMSkge1xuICAgIGlmIChsYXN0UG9zID09PSBzdGFydCkge1xuICAgICAgLy8gV2UgZGlkbid0IGNvbnZlcnQgYW55IGJhY2tzbGFzaGVzXG5cbiAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gMClcbiAgICAgICAgICByZXN0ID0gdXJsO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzdCA9IHVybC5zbGljZShzdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0ID0gdXJsLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSAmJiBsYXN0UG9zIDwgdXJsLmxlbmd0aCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zKTtcbiAgICB9IGVsc2UgaWYgKGVuZCAhPT0gLTEgJiYgbGFzdFBvcyA8IGVuZCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zLCBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgIWhhc0hhc2gpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIGNvbnN0IHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zbGljZSgxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCAvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLy50ZXN0KHJlc3QpKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LmNoYXJDb2RlQXQoMCkgPT09IDQ3LyovKi8gJiZcbiAgICAgICAgICAgICAgICAgIHJlc3QuY2hhckNvZGVBdCgxKSA9PT0gNDcvKi8qLztcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmIgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgdmFyIGF0U2lnbiA9IC0xO1xuICAgIHZhciBub25Ib3N0ID0gLTE7XG4gICAgZm9yIChpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN3aXRjaCAocmVzdC5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDk6ICAgLy8gJ1xcdCdcbiAgICAgIGNhc2UgMTA6ICAvLyAnXFxuJ1xuICAgICAgY2FzZSAxMzogIC8vICdcXHInXG4gICAgICBjYXNlIDMyOiAgLy8gJyAnXG4gICAgICBjYXNlIDM0OiAgLy8gJ1wiJ1xuICAgICAgY2FzZSAzNzogIC8vICclJ1xuICAgICAgY2FzZSAzOTogIC8vICdcXCcnXG4gICAgICBjYXNlIDU5OiAgLy8gJzsnXG4gICAgICBjYXNlIDYwOiAgLy8gJzwnXG4gICAgICBjYXNlIDYyOiAgLy8gJz4nXG4gICAgICBjYXNlIDkyOiAgLy8gJ1xcXFwnXG4gICAgICBjYXNlIDk0OiAgLy8gJ14nXG4gICAgICBjYXNlIDk2OiAgLy8gJ2AnXG4gICAgICBjYXNlIDEyMzogLy8gJ3snXG4gICAgICBjYXNlIDEyNDogLy8gJ3wnXG4gICAgICBjYXNlIDEyNTogLy8gJ30nXG4gICAgICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUgZnJvbSBSRkMgMjM5NlxuICAgICAgICBpZiAobm9uSG9zdCA9PT0gLTEpXG4gICAgICAgICAgbm9uSG9zdCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzNTogLy8gJyMnXG4gICAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkgaG9zdC1lbmRpbmcgY2hhcmFjdGVyc1xuICAgICAgICBpZiAobm9uSG9zdCA9PT0gLTEpXG4gICAgICAgICAgbm9uSG9zdCA9IGk7XG4gICAgICAgIGhvc3RFbmQgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjQ6IC8vICdAJ1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAgICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgICAgIGF0U2lnbiA9IGk7XG4gICAgICAgIG5vbkhvc3QgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaG9zdEVuZCAhPT0gLTEpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdGFydCA9IDA7XG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYXV0aCA9IGRlY29kZVVSSUNvbXBvbmVudChyZXN0LnNsaWNlKDAsIGF0U2lnbikpO1xuICAgICAgc3RhcnQgPSBhdFNpZ24gKyAxO1xuICAgIH1cbiAgICBpZiAobm9uSG9zdCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2Uoc3RhcnQpO1xuICAgICAgcmVzdCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvc3QgPSByZXN0LnNsaWNlKHN0YXJ0LCBub25Ib3N0KTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKG5vbkhvc3QpO1xuICAgIH1cblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICBpZiAodHlwZW9mIHRoaXMuaG9zdG5hbWUgIT09ICdzdHJpbmcnKVxuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuXG4gICAgdmFyIGhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZTtcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoMCkgPT09IDkxLypbKi8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUuY2hhckNvZGVBdChob3N0bmFtZS5sZW5ndGggLSAxKSA9PT0gOTMvKl0qLztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZUhvc3RuYW1lKHRoaXMsIHJlc3QsIGhvc3RuYW1lKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcmVzdCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBjb25zdCByZXN1bHQgPSBhdXRvRXNjYXBlU3RyKHJlc3QpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgIHJlc3QgPSByZXN1bHQ7XG4gIH1cblxuICB2YXIgcXVlc3Rpb25JZHggPSAtMTtcbiAgdmFyIGhhc2hJZHggPSAtMTtcbiAgZm9yIChpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gcmVzdC5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjb2RlID09PSAzNS8qIyovKSB7XG4gICAgICB0aGlzLmhhc2ggPSByZXN0LnNsaWNlKGkpO1xuICAgICAgaGFzaElkeCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDYzLyo/Ki8gJiYgcXVlc3Rpb25JZHggPT09IC0xKSB7XG4gICAgICBxdWVzdGlvbklkeCA9IGk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXN0aW9uSWR4ICE9PSAtMSkge1xuICAgIGlmIChoYXNoSWR4ID09PSAtMSkge1xuICAgICAgdGhpcy5zZWFyY2ggPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4KTtcbiAgICAgIHRoaXMucXVlcnkgPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zbGljZShxdWVzdGlvbklkeCwgaGFzaElkeCk7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zbGljZShxdWVzdGlvbklkeCArIDEsIGhhc2hJZHgpO1xuICAgIH1cbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuXG4gIHZhciBmaXJzdElkeCA9IChxdWVzdGlvbklkeCAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgIChoYXNoSWR4ID09PSAtMSB8fCBxdWVzdGlvbklkeCA8IGhhc2hJZHgpXG4gICAgPyBxdWVzdGlvbklkeFxuICAgIDogaGFzaElkeCk7XG4gIGlmIChmaXJzdElkeCA9PT0gLTEpIHtcbiAgICBpZiAocmVzdC5sZW5ndGggPiAwKVxuICAgICAgdGhpcy5wYXRobmFtZSA9IHJlc3Q7XG4gIH0gZWxzZSBpZiAoZmlyc3RJZHggPiAwKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9IHJlc3Quc2xpY2UoMCwgZmlyc3RJZHgpO1xuICB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICBjb25zdCBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICBjb25zdCBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZShzZWxmLCByZXN0LCBob3N0bmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbGFzdFBvczsgaSA8PSBob3N0bmFtZS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjb2RlO1xuICAgIGlmIChpIDwgaG9zdG5hbWUubGVuZ3RoKVxuICAgICAgY29kZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPT09IDQ2LyouKi8gfHwgaSA9PT0gaG9zdG5hbWUubGVuZ3RoKSB7XG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7XG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDYzKSB7XG4gICAgICAgICAgc2VsZi5ob3N0bmFtZSA9IGhvc3RuYW1lLnNsaWNlKDAsIGxhc3RQb3MgKyA2Myk7XG4gICAgICAgICAgcmV0dXJuICcvJyArIGhvc3RuYW1lLnNsaWNlKGxhc3RQb3MgKyA2MykgKyByZXN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKChjb2RlID49IDQ4LyowKi8gJiYgY29kZSA8PSA1Ny8qOSovKSB8fFxuICAgICAgICAgICAgICAgKGNvZGUgPj0gOTcvKmEqLyAmJiBjb2RlIDw9IDEyMi8qeiovKSB8fFxuICAgICAgICAgICAgICAgY29kZSA9PT0gNDUvKi0qLyB8fFxuICAgICAgICAgICAgICAgKGNvZGUgPj0gNjUvKkEqLyAmJiBjb2RlIDw9IDkwLypaKi8pIHx8XG4gICAgICAgICAgICAgICBjb2RlID09PSA0My8qKyovIHx8XG4gICAgICAgICAgICAgICBjb2RlID09PSA5NS8qXyovIHx8XG4gICAgICAgICAgICAgICAvKiBCRUdJTiBNT05HTyBVUkkgUEFUQ0ggKi9cbiAgICAgICAgICAgICAgIGNvZGUgPT09IDQ0LyosKi8gfHxcbiAgICAgICAgICAgICAgIGNvZGUgPT09IDU4Lyo6Ki8gfHxcbiAgICAgICAgICAgICAgIC8qIEVORCBNT05HTyBVUkkgUEFUQ0ggKi9cbiAgICAgICAgICAgICAgIGNvZGUgPiAxMjcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkIGhvc3QgY2hhcmFjdGVyXG4gICAgc2VsZi5ob3N0bmFtZSA9IGhvc3RuYW1lLnNsaWNlKDAsIGkpO1xuICAgIGlmIChpIDwgaG9zdG5hbWUubGVuZ3RoKVxuICAgICAgcmV0dXJuICcvJyArIGhvc3RuYW1lLnNsaWNlKGkpICsgcmVzdDtcbiAgICBicmVhaztcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gYXV0b0VzY2FwZVN0cihyZXN0KSB7XG4gIHZhciBuZXdSZXN0ID0gJyc7XG4gIHZhciBsYXN0UG9zID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgLy8gQXV0b21hdGljYWxseSBlc2NhcGUgYWxsIGRlbGltaXRlcnMgYW5kIHVud2lzZSBjaGFyYWN0ZXJzIGZyb20gUkZDIDIzOTZcbiAgICAvLyBBbHNvIGVzY2FwZSBzaW5nbGUgcXVvdGVzIGluIGNhc2Ugb2YgYW4gWFNTIGF0dGFja1xuICAgIHN3aXRjaCAocmVzdC5jaGFyQ29kZUF0KGkpKSB7XG4gICAgY2FzZSA5OiAgIC8vICdcXHQnXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclMDknO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDogIC8vICdcXG4nXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclMEEnO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzogIC8vICdcXHInXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclMEQnO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzMjogIC8vICcgJ1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgbmV3UmVzdCArPSAnJTIwJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzQ6ICAvLyAnXCInXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclMjInO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOTogIC8vICdcXCcnXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclMjcnO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2MDogIC8vICc8J1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgbmV3UmVzdCArPSAnJTNDJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjI6ICAvLyAnPidcbiAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApXG4gICAgICAgIG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTtcbiAgICAgIG5ld1Jlc3QgKz0gJyUzRSc7XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDkyOiAgLy8gJ1xcXFwnXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclNUMnO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5NDogIC8vICdeJ1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgbmV3UmVzdCArPSAnJTVFJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTY6ICAvLyAnYCdcbiAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApXG4gICAgICAgIG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTtcbiAgICAgIG5ld1Jlc3QgKz0gJyU2MCc7XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyMzogLy8gJ3snXG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgICBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdSZXN0ICs9ICclN0InO1xuICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjQ6IC8vICd8J1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgbmV3UmVzdCArPSAnJTdDJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTI1OiAvLyAnfSdcbiAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApXG4gICAgICAgIG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTtcbiAgICAgIG5ld1Jlc3QgKz0gJyU3RCc7XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RQb3MgPT09IDApXG4gICAgcmV0dXJuO1xuICBpZiAobGFzdFBvcyA8IHJlc3QubGVuZ3RoKVxuICAgIHJldHVybiBuZXdSZXN0ICsgcmVzdC5zbGljZShsYXN0UG9zKTtcbiAgZWxzZVxuICAgIHJldHVybiBuZXdSZXN0O1xufVxuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvLyBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAvLyBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAvLyB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gIC8vIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgb2JqID0gdXJsUGFyc2Uob2JqKTtcblxuICBlbHNlIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyYW1ldGVyIFwidXJsT2JqXCIgbXVzdCBiZSBhbiBvYmplY3QsIG5vdCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBvYmopO1xuXG4gIGVsc2UgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcblxuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZUF1dGgoYXV0aCk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sIHx8ICcnO1xuICB2YXIgcGF0aG5hbWUgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJztcbiAgdmFyIGhvc3QgPSBmYWxzZTtcbiAgdmFyIHF1ZXJ5ID0gJyc7XG5cbiAgaWYgKHRoaXMuaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdGhpcy5ob3N0O1xuICB9IGVsc2UgaWYgKHRoaXMuaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArICh0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSA9PT0gLTEgP1xuICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcpXG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuY2hhckNvZGVBdChwcm90b2NvbC5sZW5ndGggLSAxKSAhPT0gNTgvKjoqLylcbiAgICBwcm90b2NvbCArPSAnOic7XG5cbiAgdmFyIG5ld1BhdGhuYW1lID0gJyc7XG4gIHZhciBsYXN0UG9zID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRobmFtZS5sZW5ndGg7ICsraSkge1xuICAgIHN3aXRjaCAocGF0aG5hbWUuY2hhckNvZGVBdChpKSkge1xuICAgIGNhc2UgMzU6IC8vICcjJ1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UGF0aG5hbWUgKz0gcGF0aG5hbWUuc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdQYXRobmFtZSArPSAnJTIzJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMClcbiAgICAgICAgbmV3UGF0aG5hbWUgKz0gcGF0aG5hbWUuc2xpY2UobGFzdFBvcywgaSk7XG4gICAgICBuZXdQYXRobmFtZSArPSAnJTNGJztcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdFBvcyA+IDApIHtcbiAgICBpZiAobGFzdFBvcyAhPT0gcGF0aG5hbWUubGVuZ3RoKVxuICAgICAgcGF0aG5hbWUgPSBuZXdQYXRobmFtZSArIHBhdGhuYW1lLnNsaWNlKGxhc3RQb3MpO1xuICAgIGVsc2VcbiAgICAgIHBhdGhuYW1lID0gbmV3UGF0aG5hbWU7XG4gIH1cblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQ29kZUF0KDApICE9PSA0Ny8qLyovKVxuICAgICAgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckNvZGVBdCgwKSAhPT0gMzUvKiMqLykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJDb2RlQXQoMCkgIT09IDYzLyo/Ki8pIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIHJlbGF0aXZlID09PSAnc3RyaW5nJykge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiZcbiAgICAgICAgIS9eZmlsZTo/JC8udGVzdChyZWxhdGl2ZS5wcm90b2NvbCkgJiZcbiAgICAgICAgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICBjb25zdCByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoICYmICEocmVsYXRpdmUuaG9zdCA9IHJlbFBhdGguc2hpZnQoKSkpO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0KSByZWxhdGl2ZS5ob3N0ID0gJyc7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSByZWxhdGl2ZS5ob3N0bmFtZSA9ICcnO1xuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoIDwgMikgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gKHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpO1xuICB2YXIgaXNSZWxBYnMgPSAoXG4gICAgcmVsYXRpdmUuaG9zdCB8fFxuICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgKTtcbiAgdmFyIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSk7XG4gIHZhciByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicztcbiAgdmFyIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW107XG4gIHZhciByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXTtcbiAgdmFyIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lIDogcmVzdWx0Lmhvc3RuYW1lO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgc3JjUGF0aCA9IHJlbFBhdGg7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkb3QtaGFuZGxpbmcgYmVsb3cuXG4gIH0gZWxzZSBpZiAocmVsUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBpdCdzIHJlbGF0aXZlXG4gICAgLy8gdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgaWYgKCFzcmNQYXRoKSBzcmNQYXRoID0gW107XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmIChyZWxhdGl2ZS5zZWFyY2ggIT09IG51bGwgJiYgcmVsYXRpdmUuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICBjb25zdCBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSAhPT0gbnVsbCB8fCByZXN1bHQuc2VhcmNoICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNwbGljZU9uZShzcmNQYXRoLCBpKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICBjb25zdCBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmIChyZXN1bHQucGF0aG5hbWUgIT09IG51bGwgfHwgcmVzdWx0LnNlYXJjaCAhPT0gbnVsbCkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zbGljZSgxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc2xpY2UoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpXG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIGxpc3QucG9wKCk7XG59XG5cbnZhciBoZXhUYWJsZSA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSlcbiAgaGV4VGFibGVbaV0gPSAnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIGVuY29kZUF1dGgoc3RyKSB7XG4gIC8vIGZhc3RlciBlbmNvZGVVUklDb21wb25lbnQgYWx0ZXJuYXRpdmUgZm9yIGVuY29kaW5nIGF1dGggdXJpIGNvbXBvbmVudHNcbiAgdmFyIG91dCA9ICcnO1xuICB2YXIgbGFzdFBvcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIFRoZXNlIGNoYXJhY3RlcnMgZG8gbm90IG5lZWQgZXNjYXBpbmc6XG4gICAgLy8gISAtIC4gXyB+XG4gICAgLy8gJyAoICkgKiA6XG4gICAgLy8gZGlnaXRzXG4gICAgLy8gYWxwaGEgKHVwcGVyY2FzZSlcbiAgICAvLyBhbHBoYSAobG93ZXJjYXNlKVxuICAgIGlmIChjID09PSAweDIxIHx8IGMgPT09IDB4MkQgfHwgYyA9PT0gMHgyRSB8fCBjID09PSAweDVGIHx8IGMgPT09IDB4N0UgfHxcbiAgICAgICAgKGMgPj0gMHgyNyAmJiBjIDw9IDB4MkEpIHx8XG4gICAgICAgIChjID49IDB4MzAgJiYgYyA8PSAweDNBKSB8fFxuICAgICAgICAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgfHxcbiAgICAgICAgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKVxuICAgICAgb3V0ICs9IHN0ci5zbGljZShsYXN0UG9zLCBpKTtcblxuICAgIGxhc3RQb3MgPSBpICsgMTtcblxuICAgIC8vIE90aGVyIEFTQ0lJIGNoYXJhY3RlcnNcbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIG91dCArPSBoZXhUYWJsZVtjXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE11bHRpLWJ5dGUgY2hhcmFjdGVycyAuLi5cbiAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICBvdXQgKz0gaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICtcbiAgICAgICAgICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildICtcbiAgICAgICAgICAgICBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gU3Vycm9nYXRlIHBhaXJcbiAgICArK2k7XG4gICAgdmFyIGMyO1xuICAgIGlmIChpIDwgc3RyLmxlbmd0aClcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweDNGRjtcbiAgICBlbHNlXG4gICAgICBjMiA9IDA7XG4gICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IGMyKTtcbiAgICBvdXQgKz0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV0gK1xuICAgICAgICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXSArXG4gICAgICAgICAgIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV0gK1xuICAgICAgICAgICBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gIH1cbiAgaWYgKGxhc3RQb3MgPT09IDApXG4gICAgcmV0dXJuIHN0cjtcbiAgaWYgKGxhc3RQb3MgPCBzdHIubGVuZ3RoKVxuICAgIHJldHVybiBvdXQgKyBzdHIuc2xpY2UobGFzdFBvcyk7XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
1012
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVueWNvZGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImV4cG9ydHMiLCJwYXJzZSIsInVybFBhcnNlIiwicmVzb2x2ZSIsInVybFJlc29sdmUiLCJyZXNvbHZlT2JqZWN0IiwidXJsUmVzb2x2ZU9iamVjdCIsImZvcm1hdCIsInVybEZvcm1hdCIsIlVybCIsInByb3RvY29sIiwic2xhc2hlcyIsImF1dGgiLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5IiwicGF0aG5hbWUiLCJwYXRoIiwiaHJlZiIsInByb3RvY29sUGF0dGVybiIsInBvcnRQYXR0ZXJuIiwic2ltcGxlUGF0aFBhdHRlcm4iLCJ1bnNhZmVQcm90b2NvbCIsImphdmFzY3JpcHQiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwiZmlsZSIsInF1ZXJ5c3RyaW5nIiwidXJsIiwicGFyc2VRdWVyeVN0cmluZyIsInNsYXNoZXNEZW5vdGVIb3N0IiwidSIsInByb3RvdHlwZSIsIlR5cGVFcnJvciIsImhhc0hhc2giLCJzdGFydCIsImVuZCIsInJlc3QiLCJsYXN0UG9zIiwiaSIsImluV3MiLCJzcGxpdCIsImxlbmd0aCIsImNvZGUiLCJjaGFyQ29kZUF0IiwiaXNXcyIsInNsaWNlIiwic2ltcGxlUGF0aCIsImV4ZWMiLCJwcm90byIsImxvd2VyUHJvdG8iLCJ0b0xvd2VyQ2FzZSIsInRlc3QiLCJob3N0RW5kIiwiYXRTaWduIiwibm9uSG9zdCIsImRlY29kZVVSSUNvbXBvbmVudCIsInBhcnNlSG9zdCIsImlwdjZIb3N0bmFtZSIsInJlc3VsdCIsInZhbGlkYXRlSG9zdG5hbWUiLCJ1bmRlZmluZWQiLCJwdW55Y29kZSIsInRvQVNDSUkiLCJwIiwiaCIsImF1dG9Fc2NhcGVTdHIiLCJxdWVzdGlvbklkeCIsImhhc2hJZHgiLCJmaXJzdElkeCIsInMiLCJzZWxmIiwibmV3UmVzdCIsIm9iaiIsImNhbGwiLCJlbmNvZGVBdXRoIiwiaW5kZXhPZiIsInN0cmluZ2lmeSIsIm5ld1BhdGhuYW1lIiwicmVwbGFjZSIsInNvdXJjZSIsInJlbGF0aXZlIiwicmVsIiwidGtleXMiLCJPYmplY3QiLCJrZXlzIiwidGsiLCJ0a2V5IiwicmtleXMiLCJyayIsInJrZXkiLCJ2IiwiayIsInJlbFBhdGgiLCJzaGlmdGVkIiwic2hpZnQiLCJ1bnNoaWZ0Iiwiam9pbiIsImlzU291cmNlQWJzIiwiY2hhckF0IiwiaXNSZWxBYnMiLCJtdXN0RW5kQWJzIiwicmVtb3ZlQWxsRG90cyIsInNyY1BhdGgiLCJwc3ljaG90aWMiLCJwb3AiLCJjb25jYXQiLCJhdXRoSW5Ib3N0IiwibGFzdCIsImhhc1RyYWlsaW5nU2xhc2giLCJ1cCIsInNwbGljZU9uZSIsInN1YnN0ciIsInB1c2giLCJpc0Fic29sdXRlIiwibGlzdCIsImluZGV4IiwibiIsImhleFRhYmxlIiwiQXJyYXkiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwic3RyIiwib3V0IiwiYyIsImMyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZlbmRvci9tb25nb2RiVXJsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBIHNsaWdodGx5IHBhdGNoZWQgdmVyc2lvbiBvZiBub2RlJ3MgVVJMIG1vZHVsZSwgd2l0aCBzdXBwb3J0IGZvciBgbW9uZ29kYjovL2AgVVJJcy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCBwdW55Y29kZSBmcm9tICdwdW55Y29kZS9wdW55Y29kZS5qcyc7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG5jb25zdCBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pO1xuY29uc3QgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvO1xuXG4vLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG5jb25zdCBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC87XG5cbi8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuY29uc3QgdW5zYWZlUHJvdG9jb2wgPSB7XG4gIGphdmFzY3JpcHQ6IHRydWUsXG4gICdqYXZhc2NyaXB0Oic6IHRydWUsXG59O1xuLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuY29uc3QgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgamF2YXNjcmlwdDogdHJ1ZSxcbiAgJ2phdmFzY3JpcHQ6JzogdHJ1ZSxcbn07XG4vLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbmNvbnN0IHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgaHR0cDogdHJ1ZSxcbiAgJ2h0dHA6JzogdHJ1ZSxcbiAgaHR0cHM6IHRydWUsXG4gICdodHRwczonOiB0cnVlLFxuICBmdHA6IHRydWUsXG4gICdmdHA6JzogdHJ1ZSxcbiAgZ29waGVyOiB0cnVlLFxuICAnZ29waGVyOic6IHRydWUsXG4gIGZpbGU6IHRydWUsXG4gICdmaWxlOic6IHRydWUsXG59O1xuY29uc3QgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsIGluc3RhbmNlb2YgVXJsKSB7IHJldHVybiB1cmw7IH1cblxuICB2YXIgdSA9IG5ldyBVcmwoKTtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyYW1ldGVyIFwidXJsXCIgbXVzdCBiZSBhIHN0cmluZywgbm90ICcgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIGhhc0hhc2ggPSBmYWxzZTtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIHJlc3QgPSAnJztcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICB2YXIgaSA9IDA7XG4gIGZvciAodmFyIGluV3MgPSBmYWxzZSwgc3BsaXQgPSBmYWxzZTsgaSA8IHVybC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvZGUgPSB1cmwuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIEZpbmQgZmlyc3QgYW5kIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb3IgdHJpbW1pbmdcbiAgICBjb25zdCBpc1dzID1cbiAgICAgIGNvZGUgPT09IDMyIC8qICovIHx8XG4gICAgICBjb2RlID09PSA5IC8qXFx0Ki8gfHxcbiAgICAgIGNvZGUgPT09IDEzIC8qXFxyKi8gfHxcbiAgICAgIGNvZGUgPT09IDEwIC8qXFxuKi8gfHxcbiAgICAgIGNvZGUgPT09IDEyIC8qXFxmKi8gfHxcbiAgICAgIGNvZGUgPT09IDE2MCAvKlxcdTAwQTAqLyB8fFxuICAgICAgY29kZSA9PT0gNjUyNzk7IC8qXFx1RkVGRiovXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKGlzV3MpIHsgY29udGludWU7IH1cbiAgICAgIGxhc3RQb3MgPSBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbldzKSB7XG4gICAgICAgIGlmICghaXNXcykge1xuICAgICAgICAgIGVuZCA9IC0xO1xuICAgICAgICAgIGluV3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dzKSB7XG4gICAgICAgIGVuZCA9IGk7XG4gICAgICAgIGluV3MgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgY29udmVydCBiYWNrc2xhc2hlcyB3aGlsZSB3ZSBoYXZlbid0IHNlZW4gYSBzcGxpdCBjaGFyYWN0ZXJcbiAgICBpZiAoIXNwbGl0KSB7XG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAzNTogLy8gJyMnXG4gICAgICAgICAgaGFzSGFzaCA9IHRydWU7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgICAgICBjYXNlIDYzOiAvLyAnPydcbiAgICAgICAgICBzcGxpdCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTI6IC8vICdcXFxcJ1xuICAgICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgcmVzdCArPSB1cmwuc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgICByZXN0ICs9ICcvJztcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaGFzSGFzaCAmJiBjb2RlID09PSAzNSAvKiMqLykge1xuICAgICAgaGFzSGFzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgc3RyaW5nIHdhcyBub24tZW1wdHkgKGluY2x1ZGluZyBzdHJpbmdzIHdpdGggb25seSB3aGl0ZXNwYWNlKVxuICBpZiAoc3RhcnQgIT09IC0xKSB7XG4gICAgaWYgKGxhc3RQb3MgPT09IHN0YXJ0KSB7XG4gICAgICAvLyBXZSBkaWRuJ3QgY29udmVydCBhbnkgYmFja3NsYXNoZXNcblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAwKSB7IHJlc3QgPSB1cmw7IH1cbiAgICAgICAgZWxzZSB7IHJlc3QgPSB1cmwuc2xpY2Uoc3RhcnQpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0ID0gdXJsLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSAmJiBsYXN0UG9zIDwgdXJsLmxlbmd0aCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zKTtcbiAgICB9IGVsc2UgaWYgKGVuZCAhPT0gLTEgJiYgbGFzdFBvcyA8IGVuZCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zLCBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgIWhhc0hhc2gpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIGNvbnN0IHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zbGljZSgxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCAvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLy50ZXN0KHJlc3QpKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qLyovICYmIHJlc3QuY2hhckNvZGVBdCgxKSA9PT0gNDc7IC8qLyovXG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDIpO1xuICAgICAgdGhpcy5zbGFzaGVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpiIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIHZhciBhdFNpZ24gPSAtMTtcbiAgICB2YXIgbm9uSG9zdCA9IC0xO1xuICAgIGZvciAoaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBzd2l0Y2ggKHJlc3QuY2hhckNvZGVBdChpKSkge1xuICAgICAgICBjYXNlIDk6IC8vICdcXHQnXG4gICAgICAgIGNhc2UgMTA6IC8vICdcXG4nXG4gICAgICAgIGNhc2UgMTM6IC8vICdcXHInXG4gICAgICAgIGNhc2UgMzI6IC8vICcgJ1xuICAgICAgICBjYXNlIDM0OiAvLyAnXCInXG4gICAgICAgIGNhc2UgMzc6IC8vICclJ1xuICAgICAgICBjYXNlIDM5OiAvLyAnXFwnJ1xuICAgICAgICBjYXNlIDU5OiAvLyAnOydcbiAgICAgICAgY2FzZSA2MDogLy8gJzwnXG4gICAgICAgIGNhc2UgNjI6IC8vICc+J1xuICAgICAgICBjYXNlIDkyOiAvLyAnXFxcXCdcbiAgICAgICAgY2FzZSA5NDogLy8gJ14nXG4gICAgICAgIGNhc2UgOTY6IC8vICdgJ1xuICAgICAgICBjYXNlIDEyMzogLy8gJ3snXG4gICAgICAgIGNhc2UgMTI0OiAvLyAnfCdcbiAgICAgICAgY2FzZSAxMjU6IC8vICd9J1xuICAgICAgICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUgZnJvbSBSRkMgMjM5NlxuICAgICAgICAgIGlmIChub25Ib3N0ID09PSAtMSkgeyBub25Ib3N0ID0gaTsgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM1OiAvLyAnIydcbiAgICAgICAgY2FzZSA0NzogLy8gJy8nXG4gICAgICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0LWVuZGluZyBjaGFyYWN0ZXJzXG4gICAgICAgICAgaWYgKG5vbkhvc3QgPT09IC0xKSB7IG5vbkhvc3QgPSBpOyB9XG4gICAgICAgICAgaG9zdEVuZCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjQ6IC8vICdAJ1xuICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgICAgICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgICAgICAgIGF0U2lnbiA9IGk7XG4gICAgICAgICAgbm9uSG9zdCA9IC0xO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhvc3RFbmQgIT09IC0xKSB7IGJyZWFrOyB9XG4gICAgfVxuICAgIHN0YXJ0ID0gMDtcbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3Quc2xpY2UoMCwgYXRTaWduKSk7XG4gICAgICBzdGFydCA9IGF0U2lnbiArIDE7XG4gICAgfVxuICAgIGlmIChub25Ib3N0ID09PSAtMSkge1xuICAgICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZShzdGFydCk7XG4gICAgICByZXN0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2Uoc3RhcnQsIG5vbkhvc3QpO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2Uobm9uSG9zdCk7XG4gICAgfVxuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICB0aGlzLnBhcnNlSG9zdCgpO1xuXG4gICAgLy8gd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAvLyBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0bmFtZSAhPT0gJ3N0cmluZycpIHsgdGhpcy5ob3N0bmFtZSA9ICcnOyB9XG5cbiAgICB2YXIgaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lO1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID1cbiAgICAgIGhvc3RuYW1lLmNoYXJDb2RlQXQoMCkgPT09IDkxIC8qWyovICYmIGhvc3RuYW1lLmNoYXJDb2RlQXQoaG9zdG5hbWUubGVuZ3RoIC0gMSkgPT09IDkzOyAvKl0qL1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlSG9zdG5hbWUodGhpcywgcmVzdCwgaG9zdG5hbWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7IHJlc3QgPSByZXN1bHQ7IH1cbiAgICB9XG5cbiAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBjb25zdCByZXN1bHQgPSBhdXRvRXNjYXBlU3RyKHJlc3QpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgeyByZXN0ID0gcmVzdWx0OyB9XG4gIH1cblxuICB2YXIgcXVlc3Rpb25JZHggPSAtMTtcbiAgdmFyIGhhc2hJZHggPSAtMTtcbiAgZm9yIChpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gcmVzdC5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjb2RlID09PSAzNSAvKiMqLykge1xuICAgICAgdGhpcy5oYXNoID0gcmVzdC5zbGljZShpKTtcbiAgICAgIGhhc2hJZHggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA2MyAvKj8qLyAmJiBxdWVzdGlvbklkeCA9PT0gLTEpIHtcbiAgICAgIHF1ZXN0aW9uSWR4ID0gaTtcbiAgICB9XG4gIH1cblxuICBpZiAocXVlc3Rpb25JZHggIT09IC0xKSB7XG4gICAgaWYgKGhhc2hJZHggPT09IC0xKSB7XG4gICAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc2xpY2UocXVlc3Rpb25JZHgpO1xuICAgICAgdGhpcy5xdWVyeSA9IHJlc3Quc2xpY2UocXVlc3Rpb25JZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2ggPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4LCBoYXNoSWR4KTtcbiAgICAgIHRoaXMucXVlcnkgPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4ICsgMSwgaGFzaElkeCk7XG4gICAgfVxuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG5cbiAgdmFyIGZpcnN0SWR4ID1cbiAgICBxdWVzdGlvbklkeCAhPT0gLTEgJiYgKGhhc2hJZHggPT09IC0xIHx8IHF1ZXN0aW9uSWR4IDwgaGFzaElkeCkgPyBxdWVzdGlvbklkeCA6IGhhc2hJZHg7XG4gIGlmIChmaXJzdElkeCA9PT0gLTEpIHtcbiAgICBpZiAocmVzdC5sZW5ndGggPiAwKSB7IHRoaXMucGF0aG5hbWUgPSByZXN0OyB9XG4gIH0gZWxzZSBpZiAoZmlyc3RJZHggPiAwKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9IHJlc3Quc2xpY2UoMCwgZmlyc3RJZHgpO1xuICB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiYgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIGNvbnN0IHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB2YWxpZGF0ZUhvc3RuYW1lKHNlbGYsIHJlc3QsIGhvc3RuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsYXN0UG9zOyBpIDw9IGhvc3RuYW1lLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNvZGU7XG4gICAgaWYgKGkgPCBob3N0bmFtZS5sZW5ndGgpIHsgY29kZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoaSk7IH1cbiAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8gfHwgaSA9PT0gaG9zdG5hbWUubGVuZ3RoKSB7XG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7XG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDYzKSB7XG4gICAgICAgICAgc2VsZi5ob3N0bmFtZSA9IGhvc3RuYW1lLnNsaWNlKDAsIGxhc3RQb3MgKyA2Myk7XG4gICAgICAgICAgcmV0dXJuICcvJyArIGhvc3RuYW1lLnNsaWNlKGxhc3RQb3MgKyA2MykgKyByZXN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGNvZGUgPj0gNDggLyowKi8gJiYgY29kZSA8PSA1NykgLyo5Ki8gfHxcbiAgICAgIChjb2RlID49IDk3IC8qYSovICYmIGNvZGUgPD0gMTIyKSAvKnoqLyB8fFxuICAgICAgY29kZSA9PT0gNDUgLyotKi8gfHxcbiAgICAgIChjb2RlID49IDY1IC8qQSovICYmIGNvZGUgPD0gOTApIC8qWiovIHx8XG4gICAgICBjb2RlID09PSA0MyAvKisqLyB8fFxuICAgICAgY29kZSA9PT0gOTUgLypfKi8gfHxcbiAgICAgIC8qIEJFR0lOIE1PTkdPIFVSSSBQQVRDSCAqL1xuICAgICAgY29kZSA9PT0gNDQgLyosKi8gfHxcbiAgICAgIGNvZGUgPT09IDU4IC8qOiovIHx8XG4gICAgICAvKiBFTkQgTU9OR08gVVJJIFBBVENIICovXG4gICAgICBjb2RlID4gMTI3XG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gSW52YWxpZCBob3N0IGNoYXJhY3RlclxuICAgIHNlbGYuaG9zdG5hbWUgPSBob3N0bmFtZS5zbGljZSgwLCBpKTtcbiAgICBpZiAoaSA8IGhvc3RuYW1lLmxlbmd0aCkgeyByZXR1cm4gJy8nICsgaG9zdG5hbWUuc2xpY2UoaSkgKyByZXN0OyB9XG4gICAgYnJlYWs7XG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIGF1dG9Fc2NhcGVTdHIocmVzdCkge1xuICB2YXIgbmV3UmVzdCA9ICcnO1xuICB2YXIgbGFzdFBvcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7ICsraSkge1xuICAgIC8vIEF1dG9tYXRpY2FsbHkgZXNjYXBlIGFsbCBkZWxpbWl0ZXJzIGFuZCB1bndpc2UgY2hhcmFjdGVycyBmcm9tIFJGQyAyMzk2XG4gICAgLy8gQWxzbyBlc2NhcGUgc2luZ2xlIHF1b3RlcyBpbiBjYXNlIG9mIGFuIFhTUyBhdHRhY2tcbiAgICBzd2l0Y2ggKHJlc3QuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSA5OiAvLyAnXFx0J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclMDknO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDogLy8gJ1xcbidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTBBJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6IC8vICdcXHInXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyUwRCc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyOiAvLyAnICdcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTIwJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzQ6IC8vICdcIidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTIyJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6IC8vICdcXCcnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyUyNyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOiAvLyAnPCdcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTNDJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vICc+J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclM0UnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MjogLy8gJ1xcXFwnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyU1Qyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk0OiAvLyAnXidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTVFJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTY6IC8vICdgJ1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclNjAnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjM6IC8vICd7J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0InO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjQ6IC8vICd8J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0MnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU6IC8vICd9J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0QnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdFBvcyA9PT0gMCkgeyByZXR1cm47IH1cbiAgaWYgKGxhc3RQb3MgPCByZXN0Lmxlbmd0aCkgeyByZXR1cm4gbmV3UmVzdCArIHJlc3Quc2xpY2UobGFzdFBvcyk7IH1cbiAgZWxzZSB7IHJldHVybiBuZXdSZXN0OyB9XG59XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7IG9iaiA9IHVybFBhcnNlKG9iaik7IH1cbiAgZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKVxuICB7IHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1BhcmFtZXRlciBcInVybE9ialwiIG11c3QgYmUgYW4gb2JqZWN0LCBub3QgJyArIChvYmogPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygb2JqKVxuICApOyB9XG4gIGVsc2UgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgeyByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopOyB9XG5cbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlQXV0aChhdXRoKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJyc7XG4gIHZhciBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoIHx8ICcnO1xuICB2YXIgaG9zdCA9IGZhbHNlO1xuICB2YXIgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/IHRoaXMuaG9zdG5hbWUgOiAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcpXG4gIHsgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7IH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICc/JyArIHF1ZXJ5KSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuY2hhckNvZGVBdChwcm90b2NvbC5sZW5ndGggLSAxKSAhPT0gNTggLyo6Ki8pIHsgcHJvdG9jb2wgKz0gJzonOyB9XG5cbiAgdmFyIG5ld1BhdGhuYW1lID0gJyc7XG4gIHZhciBsYXN0UG9zID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRobmFtZS5sZW5ndGg7ICsraSkge1xuICAgIHN3aXRjaCAocGF0aG5hbWUuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAzNTogLy8gJyMnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UGF0aG5hbWUgKz0gcGF0aG5hbWUuc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UGF0aG5hbWUgKz0gJyUyMyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYzOiAvLyAnPydcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdQYXRobmFtZSArPSBwYXRobmFtZS5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdQYXRobmFtZSArPSAnJTNGJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RQb3MgPiAwKSB7XG4gICAgaWYgKGxhc3RQb3MgIT09IHBhdGhuYW1lLmxlbmd0aCkgeyBwYXRobmFtZSA9IG5ld1BhdGhuYW1lICsgcGF0aG5hbWUuc2xpY2UobGFzdFBvcyk7IH1cbiAgICBlbHNlIHsgcGF0aG5hbWUgPSBuZXdQYXRobmFtZTsgfVxuICB9XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHwgKCghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJDb2RlQXQoMCkgIT09IDQ3IC8qLyovKSB7IHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7IH1cbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckNvZGVBdCgwKSAhPT0gMzUgLyojKi8pIHsgaGFzaCA9ICcjJyArIGhhc2g7IH1cbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckNvZGVBdCgwKSAhPT0gNjMgLyo/Ki8pIHsgc2VhcmNoID0gJz8nICsgc2VhcmNoOyB9XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSB7IHJldHVybiByZWxhdGl2ZTsgfVxuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbiAocmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiByZWxhdGl2ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJykgeyByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTsgfVxuICAgIH1cblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbdl07XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdC5wcm90b2NvbCA9IHJlbGF0aXZlLnByb3RvY29sO1xuICAgIGlmIChcbiAgICAgICFyZWxhdGl2ZS5ob3N0ICYmXG4gICAgICAhL15maWxlOj8kLy50ZXN0KHJlbGF0aXZlLnByb3RvY29sKSAmJlxuICAgICAgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ZWQgPSByZWxQYXRoLnNoaWZ0KCk7XG4gICAgICAgIGlmIChzaGlmdGVkKSB7XG4gICAgICAgICAgcmVsYXRpdmUuaG9zdCA9IHNoaWZ0ZWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgeyByZWxhdGl2ZS5ob3N0ID0gJyc7IH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHsgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJzsgfVxuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSB7IHJlbFBhdGgudW5zaGlmdCgnJyk7IH1cbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHsgcmVsUGF0aC51bnNoaWZ0KCcnKTsgfVxuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB2YXIgaXNSZWxBYnMgPSByZWxhdGl2ZS5ob3N0IHx8IChyZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyk7XG4gIHZhciBtdXN0RW5kQWJzID0gaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKTtcbiAgdmFyIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzO1xuICB2YXIgc3JjUGF0aCA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykpIHx8IFtdO1xuICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpKSB8fCBbXTtcbiAgdmFyIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHsgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0OyB9XG4gICAgICBlbHNlIHsgc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTsgfVxuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHsgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7IH1cbiAgICAgICAgZWxzZSB7IHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTsgfVxuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJyA/IHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPVxuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnID8gcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHsgc3JjUGF0aCA9IFtdOyB9XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmIChyZWxhdGl2ZS5zZWFyY2ggIT09IG51bGwgJiYgcmVsYXRpdmUuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICBjb25zdCBhdXRoSW5Ib3N0ID1cbiAgICAgICAgcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/IHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSAhPT0gbnVsbCB8fCByZXN1bHQuc2VhcmNoICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgKyAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9XG4gICAgKChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiYgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSkgfHxcbiAgICBsYXN0ID09PSAnJztcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNwbGljZU9uZShzcmNQYXRoLCBpKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJiAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHwgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIGlmIChpc0Fic29sdXRlKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgfVxuICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICBjb25zdCBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/IHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKHJlc3VsdC5wYXRobmFtZSAhPT0gbnVsbCB8fCByZXN1bHQuc2VhcmNoICE9PSBudWxsKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICsgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnNsaWNlKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zbGljZSgwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdDsgfVxufTtcblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpIHsgbGlzdFtpXSA9IGxpc3Rba107IH1cbiAgbGlzdC5wb3AoKTtcbn1cblxudmFyIGhleFRhYmxlID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKVxueyBoZXhUYWJsZVtpXSA9ICclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCk7IH1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiBlbmNvZGVBdXRoKHN0cikge1xuICAvLyBmYXN0ZXIgZW5jb2RlVVJJQ29tcG9uZW50IGFsdGVybmF0aXZlIGZvciBlbmNvZGluZyBhdXRoIHVyaSBjb21wb25lbnRzXG4gIHZhciBvdXQgPSAnJztcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAvLyBUaGVzZSBjaGFyYWN0ZXJzIGRvIG5vdCBuZWVkIGVzY2FwaW5nOlxuICAgIC8vICEgLSAuIF8gflxuICAgIC8vICcgKCApICogOlxuICAgIC8vIGRpZ2l0c1xuICAgIC8vIGFscGhhICh1cHBlcmNhc2UpXG4gICAgLy8gYWxwaGEgKGxvd2VyY2FzZSlcbiAgICBpZiAoXG4gICAgICBjID09PSAweDIxIHx8XG4gICAgICBjID09PSAweDJkIHx8XG4gICAgICBjID09PSAweDJlIHx8XG4gICAgICBjID09PSAweDVmIHx8XG4gICAgICBjID09PSAweDdlIHx8XG4gICAgICAoYyA+PSAweDI3ICYmIGMgPD0gMHgyYSkgfHxcbiAgICAgIChjID49IDB4MzAgJiYgYyA8PSAweDNhKSB8fFxuICAgICAgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NWEpIHx8XG4gICAgICAoYyA+PSAweDYxICYmIGMgPD0gMHg3YSlcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgb3V0ICs9IHN0ci5zbGljZShsYXN0UG9zLCBpKTsgfVxuXG4gICAgbGFzdFBvcyA9IGkgKyAxO1xuXG4gICAgLy8gT3RoZXIgQVNDSUkgY2hhcmFjdGVyc1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgb3V0ICs9IGhleFRhYmxlW2NdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTXVsdGktYnl0ZSBjaGFyYWN0ZXJzIC4uLlxuICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIG91dCArPSBoZXhUYWJsZVsweGMwIHwgKGMgPj4gNildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzZildO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICBvdXQgKz1cbiAgICAgICAgaGV4VGFibGVbMHhlMCB8IChjID4+IDEyKV0gK1xuICAgICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzZildICtcbiAgICAgICAgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzZildO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFN1cnJvZ2F0ZSBwYWlyXG4gICAgKytpO1xuICAgIHZhciBjMjtcbiAgICBpZiAoaSA8IHN0ci5sZW5ndGgpIHsgYzIgPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4M2ZmOyB9XG4gICAgZWxzZSB7IGMyID0gMDsgfVxuICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M2ZmKSA8PCAxMCkgfCBjMik7XG4gICAgb3V0ICs9XG4gICAgICBoZXhUYWJsZVsweGYwIHwgKGMgPj4gMTgpXSArXG4gICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpXSArXG4gICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzZildICtcbiAgICAgIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M2YpXTtcbiAgfVxuICBpZiAobGFzdFBvcyA9PT0gMCkgeyByZXR1cm4gc3RyOyB9XG4gIGlmIChsYXN0UG9zIDwgc3RyLmxlbmd0aCkgeyByZXR1cm4gb3V0ICsgc3RyLnNsaWNlKGxhc3RQb3MpOyB9XG4gIHJldHVybiBvdXQ7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBRVosSUFBQUEsU0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQTRDLFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTVDRyxPQUFPLENBQUNDLEtBQUssR0FBR0MsUUFBUTtBQUN4QkYsT0FBTyxDQUFDRyxPQUFPLEdBQUdDLFVBQVU7QUFDNUJKLE9BQU8sQ0FBQ0ssYUFBYSxHQUFHQyxnQkFBZ0I7QUFDeENOLE9BQU8sQ0FBQ08sTUFBTSxHQUFHQyxTQUFTO0FBRTFCUixPQUFPLENBQUNTLEdBQUcsR0FBR0EsR0FBRztBQUVqQixTQUFTQSxHQUFHQSxDQUFBLEVBQUc7RUFDYixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7RUFDbkIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUNoQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBQ2hCLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7RUFDaEIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtFQUNwQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBQ2hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUk7RUFDbEIsSUFBSSxDQUFDQyxLQUFLLEdBQUcsSUFBSTtFQUNqQixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7RUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtBQUNsQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLG1CQUFtQjtBQUMzQyxNQUFNQyxXQUFXLEdBQUcsVUFBVTs7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
|