@dollhousemcp/mcp-server 1.6.9 → 1.6.10
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/CHANGELOG.md +8 -0
- package/README.md +3 -3
- package/dist/config/error-codes.d.ts +29 -0
- package/dist/config/error-codes.d.ts.map +1 -0
- package/dist/config/error-codes.js +70 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +22 -3
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +6 -1
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.js +5 -5
- package/dist/services/BuildInfoService.d.ts +1 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +3 -2
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +30 -1
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.js +600 -76
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.6.10] - 2025-08-28
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Collection submission pipeline now includes full markdown content with frontmatter (#818)
|
|
7
|
+
- Added missing `localPath` parameter to `submitElementAndHandleResponse()` call
|
|
8
|
+
- Fixes "No frontmatter found" errors in collection workflow
|
|
9
|
+
- Enables proper processing of submitted elements
|
|
10
|
+
|
|
3
11
|
## [1.6.9] - 2025-08-27
|
|
4
12
|
|
|
5
13
|
Fix content truncation in create_persona tool - personas were being truncated at 1000 chars
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ A comprehensive Model Context Protocol (MCP) server that enables dynamic AI pers
|
|
|
30
30
|
**🏪 Collection**: https://github.com/DollhouseMCP/collection
|
|
31
31
|
**📦 NPM Package**: https://www.npmjs.com/package/@dollhousemcp/mcp-server
|
|
32
32
|
**🌍 Website**: https://dollhousemcp.com (planned)
|
|
33
|
-
**📦 Version**: v1.6.
|
|
33
|
+
**📦 Version**: v1.6.10
|
|
34
34
|
|
|
35
35
|
> **🎉 New in v1.6.9**: Fixed version update script to prevent wrong file creation and package-lock.json corruption. The release workflow now works reliably with proper version management.
|
|
36
36
|
|
|
@@ -1147,7 +1147,7 @@ DollhouseMCP/
|
|
|
1147
1147
|
├── scripts/ # Management and utility scripts
|
|
1148
1148
|
├── Dockerfile # Multi-stage Docker build
|
|
1149
1149
|
├── docker-compose.yml # Production and development configs
|
|
1150
|
-
├── package.json # Project config (dollhousemcp v1.
|
|
1150
|
+
├── package.json # Project config (dollhousemcp v1.6.10)
|
|
1151
1151
|
├── tsconfig.json # TypeScript configuration
|
|
1152
1152
|
├── jest.config.cjs # Jest test configuration
|
|
1153
1153
|
├── setup.sh # Automated installation script
|
|
@@ -1547,7 +1547,7 @@ This project is licensed under the **AGPL-3.0** License with Platform Stability
|
|
|
1547
1547
|
|
|
1548
1548
|
## 🏷️ Version History
|
|
1549
1549
|
|
|
1550
|
-
### v1.6.9 - August 26, 2025
|
|
1550
|
+
### v1.6.9 - August 26, 2025
|
|
1551
1551
|
|
|
1552
1552
|
**Critical Fixes**: Fixed OAuth helper NPM packaging and performance testing workflow
|
|
1553
1553
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error codes for collection submission process
|
|
3
|
+
* Implements detailed error tracking as specified in Issue #785
|
|
4
|
+
*/
|
|
5
|
+
export declare enum CollectionErrorCode {
|
|
6
|
+
COLL_AUTH_001 = "COLL_AUTH_001",// Token validation failed
|
|
7
|
+
COLL_AUTH_002 = "COLL_AUTH_002",// Token missing 'public_repo' scope
|
|
8
|
+
COLL_AUTH_003 = "COLL_AUTH_003",// OAuth helper not running
|
|
9
|
+
COLL_AUTH_004 = "COLL_AUTH_004",// Token expired during operation
|
|
10
|
+
COLL_API_001 = "COLL_API_001",// Rate limit exceeded
|
|
11
|
+
COLL_API_002 = "COLL_API_002",// Repository not found
|
|
12
|
+
COLL_API_003 = "COLL_API_003",// Issue creation failed
|
|
13
|
+
COLL_API_004 = "COLL_API_004",// Network timeout
|
|
14
|
+
COLL_CFG_001 = "COLL_CFG_001",// Auto-submit disabled
|
|
15
|
+
COLL_CFG_002 = "COLL_CFG_002",// Collection repo not configured
|
|
16
|
+
COLL_VAL_001 = "COLL_VAL_001",// Invalid element format
|
|
17
|
+
COLL_VAL_002 = "COLL_VAL_002"
|
|
18
|
+
}
|
|
19
|
+
export declare const CollectionErrorMessages: Record<CollectionErrorCode, string>;
|
|
20
|
+
export declare const CollectionErrorSolutions: Record<CollectionErrorCode, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Format a collection error for user display
|
|
23
|
+
* @param code The error code
|
|
24
|
+
* @param step Current step number
|
|
25
|
+
* @param totalSteps Total number of steps
|
|
26
|
+
* @param details Additional error details
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatCollectionError(code: CollectionErrorCode, step: number, totalSteps: number, details?: string): string;
|
|
29
|
+
//# sourceMappingURL=error-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/config/error-codes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,mBAAmB;IAE7B,aAAa,kBAAkB,CAAE,0BAA0B;IAC3D,aAAa,kBAAkB,CAAE,oCAAoC;IACrE,aAAa,kBAAkB,CAAE,2BAA2B;IAC5D,aAAa,kBAAkB,CAAE,iCAAiC;IAGlE,YAAY,iBAAiB,CAAE,sBAAsB;IACrD,YAAY,iBAAiB,CAAE,uBAAuB;IACtD,YAAY,iBAAiB,CAAE,wBAAwB;IACvD,YAAY,iBAAiB,CAAE,kBAAkB;IAGjD,YAAY,iBAAiB,CAAE,uBAAuB;IACtD,YAAY,iBAAiB,CAAE,iCAAiC;IAGhE,YAAY,iBAAiB,CAAE,yBAAyB;IACxD,YAAY,iBAAiB;CAC9B;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAgBvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAgBxE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAcR"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error codes for collection submission process
|
|
3
|
+
* Implements detailed error tracking as specified in Issue #785
|
|
4
|
+
*/
|
|
5
|
+
export var CollectionErrorCode;
|
|
6
|
+
(function (CollectionErrorCode) {
|
|
7
|
+
// Authentication & Authorization (COLL_AUTH_xxx)
|
|
8
|
+
CollectionErrorCode["COLL_AUTH_001"] = "COLL_AUTH_001";
|
|
9
|
+
CollectionErrorCode["COLL_AUTH_002"] = "COLL_AUTH_002";
|
|
10
|
+
CollectionErrorCode["COLL_AUTH_003"] = "COLL_AUTH_003";
|
|
11
|
+
CollectionErrorCode["COLL_AUTH_004"] = "COLL_AUTH_004";
|
|
12
|
+
// GitHub API Operations (COLL_API_xxx)
|
|
13
|
+
CollectionErrorCode["COLL_API_001"] = "COLL_API_001";
|
|
14
|
+
CollectionErrorCode["COLL_API_002"] = "COLL_API_002";
|
|
15
|
+
CollectionErrorCode["COLL_API_003"] = "COLL_API_003";
|
|
16
|
+
CollectionErrorCode["COLL_API_004"] = "COLL_API_004";
|
|
17
|
+
// Configuration (COLL_CFG_xxx)
|
|
18
|
+
CollectionErrorCode["COLL_CFG_001"] = "COLL_CFG_001";
|
|
19
|
+
CollectionErrorCode["COLL_CFG_002"] = "COLL_CFG_002";
|
|
20
|
+
// Content Validation (COLL_VAL_xxx)
|
|
21
|
+
CollectionErrorCode["COLL_VAL_001"] = "COLL_VAL_001";
|
|
22
|
+
CollectionErrorCode["COLL_VAL_002"] = "COLL_VAL_002"; // Content exceeds size limit
|
|
23
|
+
})(CollectionErrorCode || (CollectionErrorCode = {}));
|
|
24
|
+
export const CollectionErrorMessages = {
|
|
25
|
+
[CollectionErrorCode.COLL_AUTH_001]: "Token validation failed",
|
|
26
|
+
[CollectionErrorCode.COLL_AUTH_002]: "Token missing 'public_repo' scope",
|
|
27
|
+
[CollectionErrorCode.COLL_AUTH_003]: "OAuth helper not running",
|
|
28
|
+
[CollectionErrorCode.COLL_AUTH_004]: "Token expired during operation",
|
|
29
|
+
[CollectionErrorCode.COLL_API_001]: "Rate limit exceeded",
|
|
30
|
+
[CollectionErrorCode.COLL_API_002]: "Repository not found",
|
|
31
|
+
[CollectionErrorCode.COLL_API_003]: "Issue creation failed",
|
|
32
|
+
[CollectionErrorCode.COLL_API_004]: "Network timeout",
|
|
33
|
+
[CollectionErrorCode.COLL_CFG_001]: "Auto-submit disabled",
|
|
34
|
+
[CollectionErrorCode.COLL_CFG_002]: "Collection repo not configured",
|
|
35
|
+
[CollectionErrorCode.COLL_VAL_001]: "Invalid element format",
|
|
36
|
+
[CollectionErrorCode.COLL_VAL_002]: "Content exceeds size limit"
|
|
37
|
+
};
|
|
38
|
+
export const CollectionErrorSolutions = {
|
|
39
|
+
[CollectionErrorCode.COLL_AUTH_001]: "Run 'setup_github_auth' to re-authenticate",
|
|
40
|
+
[CollectionErrorCode.COLL_AUTH_002]: "Re-authenticate with 'setup_github_auth' to get proper scopes",
|
|
41
|
+
[CollectionErrorCode.COLL_AUTH_003]: "Run 'setup_github_auth' to restart authentication",
|
|
42
|
+
[CollectionErrorCode.COLL_AUTH_004]: "Token expired. Run 'setup_github_auth' to refresh",
|
|
43
|
+
[CollectionErrorCode.COLL_API_001]: "Wait for rate limit to reset or use a different token",
|
|
44
|
+
[CollectionErrorCode.COLL_API_002]: "Verify repository exists and you have access",
|
|
45
|
+
[CollectionErrorCode.COLL_API_003]: "Check GitHub status and try again",
|
|
46
|
+
[CollectionErrorCode.COLL_API_004]: "Check network connection and retry",
|
|
47
|
+
[CollectionErrorCode.COLL_CFG_001]: "Run 'configure_collection_submission autoSubmit: true'",
|
|
48
|
+
[CollectionErrorCode.COLL_CFG_002]: "Check collection repository configuration",
|
|
49
|
+
[CollectionErrorCode.COLL_VAL_001]: "Verify element has proper metadata and content",
|
|
50
|
+
[CollectionErrorCode.COLL_VAL_002]: "Reduce content size to under 500KB"
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Format a collection error for user display
|
|
54
|
+
* @param code The error code
|
|
55
|
+
* @param step Current step number
|
|
56
|
+
* @param totalSteps Total number of steps
|
|
57
|
+
* @param details Additional error details
|
|
58
|
+
*/
|
|
59
|
+
export function formatCollectionError(code, step, totalSteps, details) {
|
|
60
|
+
const message = CollectionErrorMessages[code];
|
|
61
|
+
const solution = CollectionErrorSolutions[code];
|
|
62
|
+
let output = `Collection Submission Failed at Step ${step}/${totalSteps}:\n`;
|
|
63
|
+
output += `Error ${code}: ${message}\n`;
|
|
64
|
+
if (details) {
|
|
65
|
+
output += `Details: ${details}\n`;
|
|
66
|
+
}
|
|
67
|
+
output += `Solution: ${solution}`;
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2Vycm9yLWNvZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE1BQU0sQ0FBTixJQUFZLG1CQW9CWDtBQXBCRCxXQUFZLG1CQUFtQjtJQUM3QixpREFBaUQ7SUFDakQsc0RBQStCLENBQUE7SUFDL0Isc0RBQStCLENBQUE7SUFDL0Isc0RBQStCLENBQUE7SUFDL0Isc0RBQStCLENBQUE7SUFFL0IsdUNBQXVDO0lBQ3ZDLG9EQUE2QixDQUFBO0lBQzdCLG9EQUE2QixDQUFBO0lBQzdCLG9EQUE2QixDQUFBO0lBQzdCLG9EQUE2QixDQUFBO0lBRTdCLCtCQUErQjtJQUMvQixvREFBNkIsQ0FBQTtJQUM3QixvREFBNkIsQ0FBQTtJQUU3QixvQ0FBb0M7SUFDcEMsb0RBQTZCLENBQUE7SUFDN0Isb0RBQTZCLENBQUEsQ0FBRSw2QkFBNkI7QUFDOUQsQ0FBQyxFQXBCVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBb0I5QjtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUF3QztJQUMxRSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLHlCQUF5QjtJQUM5RCxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLG1DQUFtQztJQUN4RSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLDBCQUEwQjtJQUMvRCxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFLGdDQUFnQztJQUVyRSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLHFCQUFxQjtJQUN6RCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLHNCQUFzQjtJQUMxRCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLHVCQUF1QjtJQUMzRCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLGlCQUFpQjtJQUVyRCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLHNCQUFzQjtJQUMxRCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLGdDQUFnQztJQUVwRSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLHdCQUF3QjtJQUM1RCxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLDRCQUE0QjtDQUNqRSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXdDO0lBQzNFLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUUsNENBQTRDO0lBQ2pGLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUUsK0RBQStEO0lBQ3BHLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUUsbURBQW1EO0lBQ3hGLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUUsbURBQW1EO0lBRXhGLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsdURBQXVEO0lBQzNGLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsOENBQThDO0lBQ2xGLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsbUNBQW1DO0lBQ3ZFLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsb0NBQW9DO0lBRXhFLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsd0RBQXdEO0lBQzVGLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsMkNBQTJDO0lBRS9FLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsZ0RBQWdEO0lBQ3BGLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsb0NBQW9DO0NBQ3pFLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQXlCLEVBQ3pCLElBQVksRUFDWixVQUFrQixFQUNsQixPQUFnQjtJQUVoQixNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoRCxJQUFJLE1BQU0sR0FBRyx3Q0FBd0MsSUFBSSxJQUFJLFVBQVUsS0FBSyxDQUFDO0lBQzdFLE1BQU0sSUFBSSxTQUFTLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQztJQUV4QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLFlBQVksT0FBTyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sSUFBSSxhQUFhLFFBQVEsRUFBRSxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVycm9yIGNvZGVzIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gcHJvY2Vzc1xuICogSW1wbGVtZW50cyBkZXRhaWxlZCBlcnJvciB0cmFja2luZyBhcyBzcGVjaWZpZWQgaW4gSXNzdWUgIzc4NVxuICovXG5cbmV4cG9ydCBlbnVtIENvbGxlY3Rpb25FcnJvckNvZGUge1xuICAvLyBBdXRoZW50aWNhdGlvbiAmIEF1dGhvcml6YXRpb24gKENPTExfQVVUSF94eHgpXG4gIENPTExfQVVUSF8wMDEgPSBcIkNPTExfQVVUSF8wMDFcIiwgLy8gVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWRcbiAgQ09MTF9BVVRIXzAwMiA9IFwiQ09MTF9BVVRIXzAwMlwiLCAvLyBUb2tlbiBtaXNzaW5nICdwdWJsaWNfcmVwbycgc2NvcGVcbiAgQ09MTF9BVVRIXzAwMyA9IFwiQ09MTF9BVVRIXzAwM1wiLCAvLyBPQXV0aCBoZWxwZXIgbm90IHJ1bm5pbmdcbiAgQ09MTF9BVVRIXzAwNCA9IFwiQ09MTF9BVVRIXzAwNFwiLCAvLyBUb2tlbiBleHBpcmVkIGR1cmluZyBvcGVyYXRpb25cbiAgXG4gIC8vIEdpdEh1YiBBUEkgT3BlcmF0aW9ucyAoQ09MTF9BUElfeHh4KVxuICBDT0xMX0FQSV8wMDEgPSBcIkNPTExfQVBJXzAwMVwiLCAvLyBSYXRlIGxpbWl0IGV4Y2VlZGVkXG4gIENPTExfQVBJXzAwMiA9IFwiQ09MTF9BUElfMDAyXCIsIC8vIFJlcG9zaXRvcnkgbm90IGZvdW5kXG4gIENPTExfQVBJXzAwMyA9IFwiQ09MTF9BUElfMDAzXCIsIC8vIElzc3VlIGNyZWF0aW9uIGZhaWxlZFxuICBDT0xMX0FQSV8wMDQgPSBcIkNPTExfQVBJXzAwNFwiLCAvLyBOZXR3b3JrIHRpbWVvdXRcbiAgXG4gIC8vIENvbmZpZ3VyYXRpb24gKENPTExfQ0ZHX3h4eClcbiAgQ09MTF9DRkdfMDAxID0gXCJDT0xMX0NGR18wMDFcIiwgLy8gQXV0by1zdWJtaXQgZGlzYWJsZWRcbiAgQ09MTF9DRkdfMDAyID0gXCJDT0xMX0NGR18wMDJcIiwgLy8gQ29sbGVjdGlvbiByZXBvIG5vdCBjb25maWd1cmVkXG4gIFxuICAvLyBDb250ZW50IFZhbGlkYXRpb24gKENPTExfVkFMX3h4eClcbiAgQ09MTF9WQUxfMDAxID0gXCJDT0xMX1ZBTF8wMDFcIiwgLy8gSW52YWxpZCBlbGVtZW50IGZvcm1hdFxuICBDT0xMX1ZBTF8wMDIgPSBcIkNPTExfVkFMXzAwMlwiICAvLyBDb250ZW50IGV4Y2VlZHMgc2l6ZSBsaW1pdFxufVxuXG5leHBvcnQgY29uc3QgQ29sbGVjdGlvbkVycm9yTWVzc2FnZXM6IFJlY29yZDxDb2xsZWN0aW9uRXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAxXTogXCJUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZFwiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAyXTogXCJUb2tlbiBtaXNzaW5nICdwdWJsaWNfcmVwbycgc2NvcGVcIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwM106IFwiT0F1dGggaGVscGVyIG5vdCBydW5uaW5nXCIsXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVVUSF8wMDRdOiBcIlRva2VuIGV4cGlyZWQgZHVyaW5nIG9wZXJhdGlvblwiLFxuICBcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BUElfMDAxXTogXCJSYXRlIGxpbWl0IGV4Y2VlZGVkXCIsXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVBJXzAwMl06IFwiUmVwb3NpdG9yeSBub3QgZm91bmRcIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BUElfMDAzXTogXCJJc3N1ZSBjcmVhdGlvbiBmYWlsZWRcIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BUElfMDA0XTogXCJOZXR3b3JrIHRpbWVvdXRcIixcbiAgXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQ0ZHXzAwMV06IFwiQXV0by1zdWJtaXQgZGlzYWJsZWRcIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9DRkdfMDAyXTogXCJDb2xsZWN0aW9uIHJlcG8gbm90IGNvbmZpZ3VyZWRcIixcbiAgXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfVkFMXzAwMV06IFwiSW52YWxpZCBlbGVtZW50IGZvcm1hdFwiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX1ZBTF8wMDJdOiBcIkNvbnRlbnQgZXhjZWVkcyBzaXplIGxpbWl0XCJcbn07XG5cbmV4cG9ydCBjb25zdCBDb2xsZWN0aW9uRXJyb3JTb2x1dGlvbnM6IFJlY29yZDxDb2xsZWN0aW9uRXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAxXTogXCJSdW4gJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byByZS1hdXRoZW50aWNhdGVcIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwMl06IFwiUmUtYXV0aGVudGljYXRlIHdpdGggJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byBnZXQgcHJvcGVyIHNjb3Blc1wiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAzXTogXCJSdW4gJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byByZXN0YXJ0IGF1dGhlbnRpY2F0aW9uXCIsXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVVUSF8wMDRdOiBcIlRva2VuIGV4cGlyZWQuIFJ1biAnc2V0dXBfZ2l0aHViX2F1dGgnIHRvIHJlZnJlc2hcIixcbiAgXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVBJXzAwMV06IFwiV2FpdCBmb3IgcmF0ZSBsaW1pdCB0byByZXNldCBvciB1c2UgYSBkaWZmZXJlbnQgdG9rZW5cIixcbiAgW0NvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BUElfMDAyXTogXCJWZXJpZnkgcmVwb3NpdG9yeSBleGlzdHMgYW5kIHlvdSBoYXZlIGFjY2Vzc1wiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FQSV8wMDNdOiBcIkNoZWNrIEdpdEh1YiBzdGF0dXMgYW5kIHRyeSBhZ2FpblwiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FQSV8wMDRdOiBcIkNoZWNrIG5ldHdvcmsgY29ubmVjdGlvbiBhbmQgcmV0cnlcIixcbiAgXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQ0ZHXzAwMV06IFwiUnVuICdjb25maWd1cmVfY29sbGVjdGlvbl9zdWJtaXNzaW9uIGF1dG9TdWJtaXQ6IHRydWUnXCIsXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQ0ZHXzAwMl06IFwiQ2hlY2sgY29sbGVjdGlvbiByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb25cIixcbiAgXG4gIFtDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfVkFMXzAwMV06IFwiVmVyaWZ5IGVsZW1lbnQgaGFzIHByb3BlciBtZXRhZGF0YSBhbmQgY29udGVudFwiLFxuICBbQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX1ZBTF8wMDJdOiBcIlJlZHVjZSBjb250ZW50IHNpemUgdG8gdW5kZXIgNTAwS0JcIlxufTtcblxuLyoqXG4gKiBGb3JtYXQgYSBjb2xsZWN0aW9uIGVycm9yIGZvciB1c2VyIGRpc3BsYXlcbiAqIEBwYXJhbSBjb2RlIFRoZSBlcnJvciBjb2RlXG4gKiBAcGFyYW0gc3RlcCBDdXJyZW50IHN0ZXAgbnVtYmVyXG4gKiBAcGFyYW0gdG90YWxTdGVwcyBUb3RhbCBudW1iZXIgb2Ygc3RlcHNcbiAqIEBwYXJhbSBkZXRhaWxzIEFkZGl0aW9uYWwgZXJyb3IgZGV0YWlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q29sbGVjdGlvbkVycm9yKFxuICBjb2RlOiBDb2xsZWN0aW9uRXJyb3JDb2RlLFxuICBzdGVwOiBudW1iZXIsXG4gIHRvdGFsU3RlcHM6IG51bWJlcixcbiAgZGV0YWlscz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IENvbGxlY3Rpb25FcnJvck1lc3NhZ2VzW2NvZGVdO1xuICBjb25zdCBzb2x1dGlvbiA9IENvbGxlY3Rpb25FcnJvclNvbHV0aW9uc1tjb2RlXTtcbiAgXG4gIGxldCBvdXRwdXQgPSBgQ29sbGVjdGlvbiBTdWJtaXNzaW9uIEZhaWxlZCBhdCBTdGVwICR7c3RlcH0vJHt0b3RhbFN0ZXBzfTpcXG5gO1xuICBvdXRwdXQgKz0gYEVycm9yICR7Y29kZX06ICR7bWVzc2FnZX1cXG5gO1xuICBcbiAgaWYgKGRldGFpbHMpIHtcbiAgICBvdXRwdXQgKz0gYERldGFpbHM6ICR7ZGV0YWlsc31cXG5gO1xuICB9XG4gIFxuICBvdXRwdXQgKz0gYFNvbHV0aW9uOiAke3NvbHV0aW9ufWA7XG4gIFxuICByZXR1cm4gb3V0cHV0O1xufSJdfQ==
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "1.6.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2025-08-
|
|
5
|
+
export declare const PACKAGE_VERSION = "1.6.10";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2025-08-28T19:40:14.869Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,UAAU,EAAE,KAAK,GAAG,KAAa,CAAC;AAC/C,eAAO,MAAM,YAAY,6BAA6B,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '1.6.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2025-08-
|
|
5
|
+
export const PACKAGE_VERSION = '1.6.10';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2025-08-28T19:40:14.869Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjYuMTAnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI1LTA4LTI4VDE5OjQwOjE0Ljg2OVonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;OAEG;YACW,aAAa;IA0D3B;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;OAEG;YACW,aAAa;IA0D3B;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2KnF;;;OAGG;IACG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
|
|
@@ -232,9 +232,28 @@ export class PortfolioRepoManager {
|
|
|
232
232
|
try {
|
|
233
233
|
// First, check if file exists to determine if this is create or update
|
|
234
234
|
const existingFile = await this.githubRequest(`/repos/${username}/${PortfolioRepoManager.PORTFOLIO_REPO_NAME}/contents/${filePath}`);
|
|
235
|
-
//
|
|
235
|
+
// DUPLICATE DETECTION (Issue #792): Check if content is identical
|
|
236
|
+
if (existingFile && existingFile.content) {
|
|
237
|
+
// Decode existing content from base64
|
|
238
|
+
const existingContent = Buffer.from(existingFile.content, 'base64').toString('utf-8');
|
|
239
|
+
// Compare with new content
|
|
240
|
+
if (existingContent === content) {
|
|
241
|
+
logger.info('Skipping duplicate portfolio upload - content identical', {
|
|
242
|
+
elementId: element.id,
|
|
243
|
+
elementName: element.metadata.name,
|
|
244
|
+
filePath
|
|
245
|
+
});
|
|
246
|
+
// Return the existing file URL instead of creating duplicate commit
|
|
247
|
+
const existingUrl = existingFile.html_url ||
|
|
248
|
+
`https://github.com/${username}/${PortfolioRepoManager.PORTFOLIO_REPO_NAME}/blob/main/${filePath}`;
|
|
249
|
+
return existingUrl;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Create or update the file (only if content is different)
|
|
236
253
|
const result = await this.githubRequest(`/repos/${username}/${PortfolioRepoManager.PORTFOLIO_REPO_NAME}/contents/${filePath}`, 'PUT', {
|
|
237
|
-
message:
|
|
254
|
+
message: existingFile ?
|
|
255
|
+
`Update ${element.metadata.name} in portfolio` :
|
|
256
|
+
`Add ${element.metadata.name} to portfolio`,
|
|
238
257
|
content: Buffer.from(content).toString('base64'),
|
|
239
258
|
sha: existingFile?.sha // Include SHA if updating existing file
|
|
240
259
|
});
|
|
@@ -408,4 +427,4 @@ These elements can be imported into your DollhouseMCP installation.
|
|
|
408
427
|
return `# ${element.metadata.name}\n\n${element.metadata.description || ''}`;
|
|
409
428
|
}
|
|
410
429
|
}
|
|
411
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFcEM7UUFDRSxzQ0FBc0M7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELG9F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O1FBRW5FLDREQUE0RDtRQUM1RCx1REFBdUQ7UUFDdkQsZ0VBQWdFO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLGFBQWE7YUFDM0IsV0FBVyxFQUFFO2FBQ2IsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUM7YUFDM0IsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBRSx3QkFBd0I7YUFDNUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtRQUVoRCw2REFBNkQ7UUFDN0QsT0FBTyxRQUFRLElBQUksU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLE9BQWlCO1FBQzVDLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW9SZXBvTWFuYWdlciAtIE1hbmFnZXMgR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3JpZXMgZm9yIGVsZW1lbnQgc3RvcmFnZVxuICogXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEVYUExJQ0lUIENPTlNFTlQgcmVxdWlyZWQgZm9yIGFsbCBvcGVyYXRpb25zXG4gKiAtIENyZWF0ZXMgcG9ydGZvbGlvIHJlcG9zaXRvcmllcyBpbiB1c2VyJ3MgR2l0SHViIGFjY291bnRcbiAqIC0gU2F2ZXMgZWxlbWVudHMgdG8gYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXNcbiAqIC0gSGFuZGxlcyBBUEkgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICogLSBQcm92aWRlcyBhdWRpdCBsb2dnaW5nIGZvciBjb25zZW50IGRlY2lzaW9uc1xuICovXG5cbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRmb2xpb1JlcG9PcHRpb25zIHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGU/OiBib29sZWFuO1xuICBhdXRvX2luaXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUG9ydGZvbGlvUmVwb01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1JURk9MSU9fUkVQT19OQU1FID0gJ2RvbGxob3VzZS1wb3J0Zm9saW8nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RFU0NSSVBUSU9OID0gJ015IERvbGxob3VzZU1DUCBlbGVtZW50IHBvcnRmb2xpbyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdJVEhVQl9BUElfQkFTRSA9ICdodHRwczovL2FwaS5naXRodWIuY29tJztcbiAgXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRva2VuIHdpbGwgYmUgcmV0cmlldmVkIHdoZW4gbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxsc1xuICAgKiBVc2VkIHdoZW4gdG9rZW4gaXMgYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBUb2tlbk1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxscyB3aXRoIHZhbGlkYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCB0b2tlbiB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdG9rZW4gdmFsaWRhdGlvbiBieXBhc3MgKERNQ1AtU0VDLTAwMilcbiAgICogTWV0aG9kIG5hbWUgaW5jbHVkZXMgJ3ZhbGlkYXRlJyB0byBzYXRpc2Z5IHNlY3VyaXR5IHNjYW5uZXIgcGF0dGVyblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRUb2tlbkFuZFZhbGlkYXRlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLnRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdGhpcy50b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4gUGxlYXNlIHVzZSBzZXR1cF9naXRodWJfYXV0aCBmaXJzdC4nKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBWYWxpZGF0ZSB0b2tlbiBiZWZvcmUgdXNlIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICAgIC8vIFVzaW5nIHZhbGlkYXRlVG9rZW5TY29wZXMgd2l0aCBtaW5pbWFsIHJlcXVpcmVkIHNjb3BlcyBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlblNjb3Blcyh0aGlzLnRva2VuLCB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gLy8gTWluaW11bSBzY29wZSBuZWVkZWQgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvciBleHBpcmVkIEdpdEh1YiB0b2tlbjogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yIHx8ICdQbGVhc2UgcmUtYXV0aGVudGljYXRlLid9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExPVyBGSVg6IEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBvcGVyYXRpb25zIChETUNQLVNFQy0wMDYpXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmdldFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucydcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGF1dGhlbnRpY2F0ZWQgR2l0SHViIEFQSSByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdpdGh1YlJlcXVlc3QoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1ldGhvZDogc3RyaW5nID0gJ0dFVCcsXG4gICAgYm9keT86IGFueVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbkFuZFZhbGlkYXRlKCk7XG4gICAgY29uc3QgdXJsID0gYCR7UG9ydGZvbGlvUmVwb01hbmFnZXIuR0lUSFVCX0FQSV9CQVNFfSR7cGF0aH1gO1xuICAgIFxuICAgIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kIGlzIG9mdGVuIGV4cGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIFByb3ZpZGUgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIHN0YXR1cyBjb2Rlc1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZSB8fCBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YDtcbiAgICAgIFxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsZWQgLSBvZnRlbiBtZWFucyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYFJlcG9zaXRvcnkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZGF0YS5tZXNzYWdlIHx8ICduYW1lIGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgYWNjb3VudCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW46ICR7ZGF0YS5tZXNzYWdlIHx8ICdpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgb3IgcmF0ZSBsaW1pdCBleGNlZWRlZCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBBUEkgc2VydmVyIGVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgZXJyb3IgKCR7cmVzcG9uc2Uuc3RhdHVzfSk6ICR7ZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogUG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gTUVESVVNIEZJWDogTm9ybWFsaXplIHVzZXJuYW1lIGZyb20gZWxlbWVudCBtZXRhZGF0YSAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IHJhd1VzZXJuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyc7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdVc2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZ2VuZXJhdGVGaWxlTmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7ZWxlbWVudC50eXBlfS8ke2ZpbGVOYW1lfS5tZGA7XG5cbiAgICAvLyBQcmVwYXJlIGNvbnRlbnQgKGNvdWxkIGJlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudCk7XG4gICAgXG4gICAgLy8gRElBR05PU1RJQzogTG9nIGNvbnRlbnQgc2l6ZSBiZWZvcmUgc2VuZGluZyB0byBHaXRIdWJcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBTYXZpbmcgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIEdpdEh1YiAtIGNvbnRlbnQgc2l6ZTogJHtjb250ZW50Lmxlbmd0aH0gY2hhcnNgKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBGaXJzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoMCwgMjAwKX1gKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBMYXN0IDIwMCBjaGFyczogJHtjb250ZW50LnN1YnN0cmluZyhNYXRoLm1heCgwLCBjb250ZW50Lmxlbmd0aCAtIDIwMCkpfWApO1xuXG4gICAgLy8gU2F2ZSB0byBHaXRIdWJcbiAgICB0cnkge1xuICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIGZpbGUgZXhpc3RzIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGNyZWF0ZSBvciB1cGRhdGVcbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzLyR7ZmlsZVBhdGh9YFxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgZmlsZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IGBBZGQgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9IHRvIHBvcnRmb2xpb2AsXG4gICAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAgIHNoYTogZXhpc3RpbmdGaWxlPy5zaGEgLy8gSW5jbHVkZSBTSEEgaWYgdXBkYXRpbmcgZXhpc3RpbmcgZmlsZVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBGSVg6IEdpdEh1YiBBUEkgcmVzcG9uc2Ugc3RydWN0dXJlIHZhcmllcyAtIGhhbmRsZSBhbGwgY2FzZXNcbiAgICAgIC8vIFRoZSByZXNwb25zZSBtYXkgaGF2ZSBjb21taXQgZGF0YSBhdCBkaWZmZXJlbnQgbGV2ZWxzIG9yIG5vdCBhdCBhbGxcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignW1BPUlRGT0xJT19TWU5DXzAwNF0gR2l0SHViIEFQSSByZXR1cm5lZCBudWxsIHJlc3BvbnNlJywge1xuICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgZmlsZVBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW1BPUlRGT0xJT19TWU5DXzAwNF0gR2l0SHViIEFQSSByZXR1cm5lZCBudWxsIHJlc3BvbnNlIGZvciAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IG11bHRpcGxlIHBhdGhzIHRvIGdldCB0aGUgY29tbWl0IFVSTFxuICAgICAgbGV0IGNvbW1pdFVybDogc3RyaW5nO1xuICAgICAgXG4gICAgICAvLyBQYXRoIDE6IHJlc3VsdC5jb21taXQuaHRtbF91cmwgKHN0YW5kYXJkIGZvciBjb250ZW50IEFQSSlcbiAgICAgIGlmIChyZXN1bHQuY29tbWl0Py5odG1sX3VybCkge1xuICAgICAgICBjb21taXRVcmwgPSByZXN1bHQuY29tbWl0Lmh0bWxfdXJsO1xuICAgICAgfVxuICAgICAgLy8gUGF0aCAyOiByZXN1bHQuY29udGVudC5odG1sX3VybCAoc29tZSBBUEkgcmVzcG9uc2VzKVxuICAgICAgZWxzZSBpZiAocmVzdWx0LmNvbnRlbnQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsO1xuICAgICAgfVxuICAgICAgLy8gUGF0aCAzOiBHZW5lcmF0ZSBVUkwgZnJvbSByZXNwb25zZSBkYXRhXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8ucGF0aCkge1xuICAgICAgICBjb21taXRVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vYmxvYi9tYWluLyR7cmVzdWx0LmNvbnRlbnQucGF0aH1gO1xuICAgICAgfVxuICAgICAgLy8gUGF0aCA0OiBGYWxsYmFjayB0byByZXBvc2l0b3J5IFVSTCAoZ3VhcmFudGVlZCB0byBiZSBzZXQpXG4gICAgICBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tQT1JURk9MSU9fU1lOQ18wMDRdIENvdWxkIG5vdCBleHRyYWN0IGNvbW1pdCBVUkwgZnJvbSBHaXRIdWIgcmVzcG9uc2UsIHVzaW5nIGZhbGxiYWNrJywge1xuICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgcmVzcG9uc2VLZXlzOiBPYmplY3Qua2V5cyhyZXN1bHQpLFxuICAgICAgICAgIGhhc0NvbW1pdDogISFyZXN1bHQuY29tbWl0LFxuICAgICAgICAgIGhhc0NvbnRlbnQ6ICEhcmVzdWx0LmNvbnRlbnRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS90cmVlL21haW4vJHtlbGVtZW50LnR5cGV9YDtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKCdTdWNjZXNzZnVsbHkgc2F2ZWQgZWxlbWVudCB0byBHaXRIdWIgcG9ydGZvbGlvJywge1xuICAgICAgICBlbGVtZW50OiBlbGVtZW50LmlkLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGNvbW1pdFVybFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb21taXRVcmw7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gRW5oYW5jZWQgZXJyb3IgcmVwb3J0aW5nIHdpdGggc3BlY2lmaWMgZXJyb3IgY29kZXNcbiAgICAgIGxldCBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA1JzsgLy8gRGVmYXVsdCBuZXR3b3JrIGVycm9yXG4gICAgICBsZXQgZW5oYW5jZWRNZXNzYWdlID0gJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gcG9ydGZvbGlvJztcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHNwZWNpZmljIGVycm9yIGNvbmRpdGlvbnNcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnNDAxJykgfHwgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2F1dGhlbnRpY2F0aW9uJykpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMSc7XG4gICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgYXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLic7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDQnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwMic7XG4gICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgcnVuIGluaXRfcG9ydGZvbGlvIGZpcnN0Lic7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDMnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygncmF0ZSBsaW1pdCcpKSB7XG4gICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDYnO1xuICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSAnR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwnKSkge1xuICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDA0JztcbiAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gYEdpdEh1YiBBUEkgcmVzcG9uc2UgcGFyc2luZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcihgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgeyBcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudFRvUmVwbycsIGVycm9yLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBlcnJvckNvZGVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBUaHJvdyBlcnJvciB3aXRoIGNvZGUgZm9yIGJldHRlciBoYW5kbGluZyB1cHN0cmVhbVxuICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYFske2Vycm9yQ29kZX1dICR7ZW5oYW5jZWRNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuTkVUV09SS19FUlJPUik7XG4gICAgICAod3JhcHBlZEVycm9yIGFzIGFueSkuY29kZSA9IGVycm9yQ29kZTtcbiAgICAgIHRocm93IHdyYXBwZWRFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgaW5pdGlhbCBwb3J0Zm9saW8gc3RydWN0dXJlIHdpdGggUkVBRE1FIGFuZCBkaXJlY3Rvcmllc1xuICAgKiBTRUNVUklUWTogVXNlcm5hbWUgYWxyZWFkeSBub3JtYWxpemVkIGJ5IGNhbGxpbmcgbWV0aG9kc1xuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQb3J0Zm9saW9TdHJ1Y3R1cmUodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENyZWF0ZSBSRUFETUUubWRcbiAgICBjb25zdCByZWFkbWVDb250ZW50ID0gYCMgRG9sbGhvdXNlTUNQIFBvcnRmb2xpb1xuXG5UaGlzIGlzIG15IHBlcnNvbmFsIGNvbGxlY3Rpb24gb2YgRG9sbGhvdXNlTUNQIGVsZW1lbnRzLlxuXG4jIyBTdHJ1Y3R1cmVcblxuLSAqKnBlcnNvbmFzLyoqIC0gQmVoYXZpb3JhbCBwcm9maWxlc1xuLSAqKnNraWxscy8qKiAtIERpc2NyZXRlIGNhcGFiaWxpdGllcyAgXG4tICoqdGVtcGxhdGVzLyoqIC0gUmV1c2FibGUgY29udGVudCBzdHJ1Y3R1cmVzXG4tICoqYWdlbnRzLyoqIC0gQXV0b25vbW91cyBhY3RvcnNcbi0gKiptZW1vcmllcy8qKiAtIFBlcnNpc3RlbnQgY29udGV4dFxuLSAqKmVuc2VtYmxlcy8qKiAtIEVsZW1lbnQgZ3JvdXBzXG5cbiMjIFVzYWdlXG5cblRoZXNlIGVsZW1lbnRzIGNhbiBiZSBpbXBvcnRlZCBpbnRvIHlvdXIgRG9sbGhvdXNlTUNQIGluc3RhbGxhdGlvbi5cblxuLS0tXG4qR2VuZXJhdGVkIGJ5IERvbGxob3VzZU1DUCpcbmA7XG5cbiAgICBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvUkVBRE1FLm1kYCxcbiAgICAgICdQVVQnLFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiAnSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlJyxcbiAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20ocmVhZG1lQ29udGVudCkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgcGxhY2Vob2xkZXJzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSBbJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnLCAnYWdlbnRzJywgJ21lbW9yaWVzJywgJ2Vuc2VtYmxlcyddO1xuICAgIFxuICAgIGZvciAoY29uc3QgZGlyIG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9jb250ZW50cy8ke2Rpcn0vLmdpdGtlZXBgLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IGBDcmVhdGUgJHtkaXJ9IGRpcmVjdG9yeWAsXG4gICAgICAgICAgY29udGVudDogQnVmZmVyLmZyb20oJycpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IGJlZm9yZSBzYXZpbmdcbiAgICogQHRocm93cyBFcnJvciBpZiBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50Lm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50LmlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogaWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IHR5cGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc2FmZSBmaWxlbmFtZSBmcm9tIGVsZW1lbnQgbmFtZVxuICAgKiBTRUNVUklUWTogQWRkaXRpb25hbCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIGZpbGVuYW1lc1xuICAgKiBTRUNVUklUWSBGSVg6IEZpeGVkIFJlRG9TIHZ1bG5lcmFiaWxpdHkgd2l0aCBpbnB1dCBsZW5ndGggbGltaXQgYW5kIG9wdGltaXplZCByZWdleFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBMaW1pdCBpbnB1dCBsZW5ndGggdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gICAgLy8gRXZlbiB3aXRoIG9wdGltaXplZCByZWdleCwgdmVyeSBsb25nIGlucHV0cyBjb3VsZCBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXNcbiAgICBjb25zdCBNQVhfRklMRU5BTUVfTEVOR1RIID0gMjU1OyAvLyBDb21tb24gZmlsZXN5c3RlbSBsaW1pdFxuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyBpbiBmaWxlbmFtZXNcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFRydW5jYXRlIHRvIHNhZmUgbGVuZ3RoIEJFRk9SRSByZWdleCBvcGVyYXRpb25zXG4gICAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IG5vcm1hbGl6ZWROYW1lLnNsaWNlKDAsIE1BWF9GSUxFTkFNRV9MRU5HVEgpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogT3B0aW1pemVkIHJlZ2V4IG9wZXJhdGlvbnMgdG8gcHJldmVudCBSZURvU1xuICAgIC8vIDEuIENvbnZlcnQgbm9uLWFscGhhbnVtZXJpYyBzZXF1ZW5jZXMgdG8gc2luZ2xlIGRhc2hcbiAgICAvLyAyLiBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBkYXNoZXMgaW4gYSBzaW5nbGUgcGFzcyB1c2luZyB0cmltXG4gICAgY29uc3Qgc2FmZU5hbWUgPSB0cnVuY2F0ZWROYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL14tKy8sICcnKSAgLy8gUmVtb3ZlIGxlYWRpbmcgZGFzaGVzXG4gICAgICAucmVwbGFjZSgvLSskLywgJycpOyAvLyBSZW1vdmUgdHJhaWxpbmcgZGFzaGVzXG4gICAgXG4gICAgLy8gRW5zdXJlIHdlIGhhdmUgYSB2YWxpZCBmaWxlbmFtZSAobm90IGVtcHR5IGFmdGVyIGNsZWFuaW5nKVxuICAgIHJldHVybiBzYWZlTmFtZSB8fCAndW5uYW1lZCc7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGVsZW1lbnQgY29udGVudCBmb3Igc3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRFbGVtZW50Q29udGVudChlbGVtZW50OiBJRWxlbWVudCk6IHN0cmluZyB7XG4gICAgLy8gU2VyaWFsaXplIHRoZSBlbGVtZW50IG9yIGNyZWF0ZSBiYXNpYyBtYXJrZG93blxuICAgIGlmIChlbGVtZW50LnNlcmlhbGl6ZSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplKCk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIGJhc2ljIG1hcmtkb3duIGZvcm1hdFxuICAgIHJldHVybiBgIyAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1cXG5cXG4ke2VsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJyd9YDtcbiAgfVxufSJdfQ==
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvUmVwb01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRdkUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQVUsbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUQsTUFBTSxDQUFVLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxlQUFlLEdBQUcsd0JBQXdCLENBQUM7SUFFM0QsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFcEM7UUFDRSxzQ0FBc0M7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELG9F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QWlCO1FBQzVDLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW9SZXBvTWFuYWdlciAtIE1hbmFnZXMgR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3JpZXMgZm9yIGVsZW1lbnQgc3RvcmFnZVxuICogXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEVYUExJQ0lUIENPTlNFTlQgcmVxdWlyZWQgZm9yIGFsbCBvcGVyYXRpb25zXG4gKiAtIENyZWF0ZXMgcG9ydGZvbGlvIHJlcG9zaXRvcmllcyBpbiB1c2VyJ3MgR2l0SHViIGFjY291bnRcbiAqIC0gU2F2ZXMgZWxlbWVudHMgdG8gYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXNcbiAqIC0gSGFuZGxlcyBBUEkgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICogLSBQcm92aWRlcyBhdWRpdCBsb2dnaW5nIGZvciBjb25zZW50IGRlY2lzaW9uc1xuICovXG5cbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRmb2xpb1JlcG9PcHRpb25zIHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGU/OiBib29sZWFuO1xuICBhdXRvX2luaXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUG9ydGZvbGlvUmVwb01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1JURk9MSU9fUkVQT19OQU1FID0gJ2RvbGxob3VzZS1wb3J0Zm9saW8nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RFU0NSSVBUSU9OID0gJ015IERvbGxob3VzZU1DUCBlbGVtZW50IHBvcnRmb2xpbyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdJVEhVQl9BUElfQkFTRSA9ICdodHRwczovL2FwaS5naXRodWIuY29tJztcbiAgXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRva2VuIHdpbGwgYmUgcmV0cmlldmVkIHdoZW4gbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxsc1xuICAgKiBVc2VkIHdoZW4gdG9rZW4gaXMgYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBUb2tlbk1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZm9yIEFQSSBjYWxscyB3aXRoIHZhbGlkYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCB0b2tlbiB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdG9rZW4gdmFsaWRhdGlvbiBieXBhc3MgKERNQ1AtU0VDLTAwMilcbiAgICogTWV0aG9kIG5hbWUgaW5jbHVkZXMgJ3ZhbGlkYXRlJyB0byBzYXRpc2Z5IHNlY3VyaXR5IHNjYW5uZXIgcGF0dGVyblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRUb2tlbkFuZFZhbGlkYXRlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLnRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdGhpcy50b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4gUGxlYXNlIHVzZSBzZXR1cF9naXRodWJfYXV0aCBmaXJzdC4nKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBWYWxpZGF0ZSB0b2tlbiBiZWZvcmUgdXNlIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICAgIC8vIFVzaW5nIHZhbGlkYXRlVG9rZW5TY29wZXMgd2l0aCBtaW5pbWFsIHJlcXVpcmVkIHNjb3BlcyBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnNcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlblNjb3Blcyh0aGlzLnRva2VuLCB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gLy8gTWluaW11bSBzY29wZSBuZWVkZWQgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvciBleHBpcmVkIEdpdEh1YiB0b2tlbjogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yIHx8ICdQbGVhc2UgcmUtYXV0aGVudGljYXRlLid9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExPVyBGSVg6IEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBvcGVyYXRpb25zIChETUNQLVNFQy0wMDYpXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmdldFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucydcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGF1dGhlbnRpY2F0ZWQgR2l0SHViIEFQSSByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdpdGh1YlJlcXVlc3QoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1ldGhvZDogc3RyaW5nID0gJ0dFVCcsXG4gICAgYm9keT86IGFueVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbkFuZFZhbGlkYXRlKCk7XG4gICAgY29uc3QgdXJsID0gYCR7UG9ydGZvbGlvUmVwb01hbmFnZXIuR0lUSFVCX0FQSV9CQVNFfSR7cGF0aH1gO1xuICAgIFxuICAgIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kIGlzIG9mdGVuIGV4cGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIFByb3ZpZGUgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIHN0YXR1cyBjb2Rlc1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZSB8fCBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YDtcbiAgICAgIFxuICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsZWQgLSBvZnRlbiBtZWFucyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYFJlcG9zaXRvcnkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZGF0YS5tZXNzYWdlIHx8ICduYW1lIGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgYWNjb3VudCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHRva2VuLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBHaXRIdWIgQVBJIGFjY2VzcyBmb3JiaWRkZW46ICR7ZGF0YS5tZXNzYWdlIHx8ICdpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgb3IgcmF0ZSBsaW1pdCBleGNlZWRlZCd9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0dpdEh1YiBBUEkgc2VydmVyIGVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEdpdEh1YiBBUEkgZXJyb3IgKCR7cmVzcG9uc2Uuc3RhdHVzfSk6ICR7ZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHMgZm9yIGEgdXNlclxuICAgKiBObyBjb25zZW50IHJlcXVpcmVkIC0gdGhpcyBpcyBhIHJlYWQtb25seSBvcGVyYXRpb25cbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHVzZXIgaW5wdXQgKERNQ1AtU0VDLTAwNClcbiAgICovXG4gIGFzeW5jIGNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdpdGh1YlJlcXVlc3QoXG4gICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlcG8gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCBvciBBUEkgZXJyb3IgLSBib3RoIHJldHVybiBmYWxzZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja0lmUmVwb0V4aXN0cycsIGVycm9yLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgd2l0aCBFWFBMSUNJVCB1c2VyIGNvbnNlbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB1c2VyIGRlY2xpbmVzIGNvbnNlbnQgb3IgaWYgY29uc2VudCBpcyBub3QgcHJvdmlkZWRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZTogc3RyaW5nLCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBNRURJVU0gRklYOiBOb3JtYWxpemUgdXNlcm5hbWUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkVXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IFZhbGlkYXRlIGNvbnNlbnQgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIGlmIChjb25zZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudCBpcyByZXF1aXJlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25zZW50KSB7XG4gICAgICBsb2dnZXIuaW5mbyhgVXNlciBkZWNsaW5lZCBwb3J0Zm9saW8gY3JlYXRpb24gZm9yICR7dXNlcm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgcG9ydGZvbGlvIGNyZWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGNvbnNlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbiBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgXG4gICAgLy8gTE9XIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbycsXG4gICAgICBkZXRhaWxzOiBgVXNlciAke25vcm1hbGl6ZWRVc2VybmFtZX0gY29uc2VudGVkIHRvIHBvcnRmb2xpbyBjcmVhdGlvbmAsXG4gICAgICBtZXRhZGF0YTogeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFBvcnRmb2xpbyBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdSZXBvLmh0bWxfdXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgJy91c2VyL3JlcG9zJyxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogUG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogUG9ydGZvbGlvUmVwb01hbmFnZXIuREVGQVVMVF9ERVNDUklQVElPTixcbiAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgICBhdXRvX2luaXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUG9ydGZvbGlvU3RydWN0dXJlKG5vcm1hbGl6ZWRVc2VybmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBvLmh0bWxfdXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYWNlIGNvbmRpdGlvbjogaWYgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZCBiZXR3ZWVuIG91ciBjaGVjayBhbmQgY3JlYXRpb24gYXR0ZW1wdFxuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmFtZSBhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0Zm9saW8gcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBmb3IgJHtub3JtYWxpemVkVXNlcm5hbWV9IChyYWNlIGNvbmRpdGlvbiBoYW5kbGVkKWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtY2hlY2sgZm9yIHRoZSBleGlzdGluZyByZXBvc2l0b3J5IGFuZCByZXR1cm4gaXRzIFVSTFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUmVwbyA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdSZXBvICYmIGV4aXN0aW5nUmVwby5odG1sX3VybCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVwby5odG1sX3VybDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlY2hlY2tFcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvUmVwb01hbmFnZXIucmVjaGVja0V4aXN0aW5nUmVwbycsIHJlY2hlY2tFcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdGhlIGV4aXN0aW5nIHJlcG8sIHRocm93IGEgbW9yZSBzcGVjaWZpYyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnRmb2xpbyByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGZvciAke25vcm1hbGl6ZWRVc2VybmFtZX0uIFBsZWFzZSBjaGVjayB5b3VyIEdpdEh1YiBhY2NvdW50LmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpb1JlcG8nLCBlcnJvciwgeyB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgYEZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZm9yICR7bm9ybWFsaXplZFVzZXJuYW1lfS4gJHtlcnJvci5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkLid9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbyB3aXRoIEVYUExJQ0lUIHVzZXIgY29uc2VudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHVzZXIgZGVjbGluZXMgY29uc2VudCBvciBlbGVtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIHNhdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBjb25zZW50OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDUklUSUNBTDogVmFsaWRhdGUgY29uc2VudCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgaWYgKGNvbnNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50IGlzIHJlcXVpcmVkIHRvIHNhdmUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghY29uc2VudCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50ICR7ZWxlbWVudC5pZH0gdG8gcG9ydGZvbGlvYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVjbGluZWQgdG8gc2F2ZSBlbGVtZW50IHRvIHBvcnRmb2xpbycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgIHRoaXMudmFsaWRhdGVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gTUVESVVNIEZJWDogTm9ybWFsaXplIHVzZXJuYW1lIGZyb20gZWxlbWVudCBtZXRhZGF0YSAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IHJhd1VzZXJuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyc7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdVc2VybmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbG9nZ2VyLmluZm8oYFVzZXIgY29uc2VudGVkIHRvIHNhdmUgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIHBvcnRmb2xpb2ApO1xuICAgIFxuICAgIC8vIExPVyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBlbGVtZW50IHNhdmUgKERNQ1AtU0VDLTAwNilcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50JyxcbiAgICAgIGRldGFpbHM6IGBVc2VyIGNvbnNlbnRlZCB0byBzYXZlIGVsZW1lbnQgJHtlbGVtZW50LmlkfSB0byBwb3J0Zm9saW9gLFxuICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgdXNlcm5hbWUgXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlIHBhdGggYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgLy8gRklYOiBEb24ndCBhZGQgJ3MnIC0gZWxlbWVudC50eXBlIGlzIGFscmVhZHkgcGx1cmFsIChlLmcuLCAncGVyc29uYXMnLCAnc2tpbGxzJylcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZ2VuZXJhdGVGaWxlTmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7ZWxlbWVudC50eXBlfS8ke2ZpbGVOYW1lfS5tZGA7XG5cbiAgICAvLyBQcmVwYXJlIGNvbnRlbnQgKGNvdWxkIGJlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZm9ybWF0RWxlbWVudENvbnRlbnQoZWxlbWVudCk7XG4gICAgXG4gICAgLy8gRElBR05PU1RJQzogTG9nIGNvbnRlbnQgc2l6ZSBiZWZvcmUgc2VuZGluZyB0byBHaXRIdWJcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBTYXZpbmcgZWxlbWVudCAke2VsZW1lbnQuaWR9IHRvIEdpdEh1YiAtIGNvbnRlbnQgc2l6ZTogJHtjb250ZW50Lmxlbmd0aH0gY2hhcnNgKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBGaXJzdCAyMDAgY2hhcnM6ICR7Y29udGVudC5zdWJzdHJpbmcoMCwgMjAwKX1gKTtcbiAgICBsb2dnZXIuZGVidWcoYFtDT05URU5ULVRSQUNFXSBMYXN0IDIwMCBjaGFyczogJHtjb250ZW50LnN1YnN0cmluZyhNYXRoLm1heCgwLCBjb250ZW50Lmxlbmd0aCAtIDIwMCkpfWApO1xuXG4gICAgLy8gU2F2ZSB0byBHaXRIdWJcbiAgICB0cnkge1xuICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIGZpbGUgZXhpc3RzIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGNyZWF0ZSBvciB1cGRhdGVcbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzLyR7ZmlsZVBhdGh9YFxuICAgICAgKTtcblxuICAgICAgLy8gRFVQTElDQVRFIERFVEVDVElPTiAoSXNzdWUgIzc5Mik6IENoZWNrIGlmIGNvbnRlbnQgaXMgaWRlbnRpY2FsXG4gICAgICBpZiAoZXhpc3RpbmdGaWxlICYmIGV4aXN0aW5nRmlsZS5jb250ZW50KSB7XG4gICAgICAgIC8vIERlY29kZSBleGlzdGluZyBjb250ZW50IGZyb20gYmFzZTY0XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IEJ1ZmZlci5mcm9tKGV4aXN0aW5nRmlsZS5jb250ZW50LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb21wYXJlIHdpdGggbmV3IGNvbnRlbnRcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gY29udGVudCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdTa2lwcGluZyBkdXBsaWNhdGUgcG9ydGZvbGlvIHVwbG9hZCAtIGNvbnRlbnQgaWRlbnRpY2FsJywge1xuICAgICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgZWxlbWVudE5hbWU6IGVsZW1lbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGZpbGVQYXRoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBleGlzdGluZyBmaWxlIFVSTCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGR1cGxpY2F0ZSBjb21taXRcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1VybCA9IGV4aXN0aW5nRmlsZS5odG1sX3VybCB8fCBcbiAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtmaWxlUGF0aH1gO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiBleGlzdGluZ1VybDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgb3IgdXBkYXRlIHRoZSBmaWxlIChvbmx5IGlmIGNvbnRlbnQgaXMgZGlmZmVyZW50KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7UG9ydGZvbGlvUmVwb01hbmFnZXIuUE9SVEZPTElPX1JFUE9fTkFNRX0vY29udGVudHMvJHtmaWxlUGF0aH1gLFxuICAgICAgICAnUFVUJyxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IGV4aXN0aW5nRmlsZSA/IFxuICAgICAgICAgICAgYFVwZGF0ZSAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gaW4gcG9ydGZvbGlvYCA6IFxuICAgICAgICAgICAgYEFkZCAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdG8gcG9ydGZvbGlvYCxcbiAgICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICAgc2hhOiBleGlzdGluZ0ZpbGU/LnNoYSAvLyBJbmNsdWRlIFNIQSBpZiB1cGRhdGluZyBleGlzdGluZyBmaWxlXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIEZJWDogR2l0SHViIEFQSSByZXNwb25zZSBzdHJ1Y3R1cmUgdmFyaWVzIC0gaGFuZGxlIGFsbCBjYXNlc1xuICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBoYXZlIGNvbW1pdCBkYXRhIGF0IGRpZmZlcmVudCBsZXZlbHMgb3Igbm90IGF0IGFsbFxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUE9SVEZPTElPX1NZTkNfMDA0XSBHaXRIdWIgQVBJIHJldHVybmVkIG51bGwgcmVzcG9uc2UgZm9yICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbXVsdGlwbGUgcGF0aHMgdG8gZ2V0IHRoZSBjb21taXQgVVJMXG4gICAgICBsZXQgY29tbWl0VXJsOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIFBhdGggMTogcmVzdWx0LmNvbW1pdC5odG1sX3VybCAoc3RhbmRhcmQgZm9yIGNvbnRlbnQgQVBJKVxuICAgICAgaWYgKHJlc3VsdC5jb21taXQ/Lmh0bWxfdXJsKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IHJlc3VsdC5jb21taXQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDI6IHJlc3VsdC5jb250ZW50Lmh0bWxfdXJsIChzb21lIEFQSSByZXNwb25zZXMpXG4gICAgICBlbHNlIGlmIChyZXN1bHQuY29udGVudD8uaHRtbF91cmwpIHtcbiAgICAgICAgY29tbWl0VXJsID0gcmVzdWx0LmNvbnRlbnQuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDM6IEdlbmVyYXRlIFVSTCBmcm9tIHJlc3BvbnNlIGRhdGFcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5jb250ZW50Py5wYXRoKSB7XG4gICAgICAgIGNvbW1pdFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9ibG9iL21haW4vJHtyZXN1bHQuY29udGVudC5wYXRofWA7XG4gICAgICB9XG4gICAgICAvLyBQYXRoIDQ6IEZhbGxiYWNrIHRvIHJlcG9zaXRvcnkgVVJMIChndWFyYW50ZWVkIHRvIGJlIHNldClcbiAgICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignW1BPUlRGT0xJT19TWU5DXzAwNF0gQ291bGQgbm90IGV4dHJhY3QgY29tbWl0IFVSTCBmcm9tIEdpdEh1YiByZXNwb25zZSwgdXNpbmcgZmFsbGJhY2snLCB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudC5pZCxcbiAgICAgICAgICByZXNwb25zZUtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCksXG4gICAgICAgICAgaGFzQ29tbWl0OiAhIXJlc3VsdC5jb21taXQsXG4gICAgICAgICAgaGFzQ29udGVudDogISFyZXN1bHQuY29udGVudFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWl0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L3RyZWUvbWFpbi8ke2VsZW1lbnQudHlwZX1gO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1N1Y2Nlc3NmdWxseSBzYXZlZCBlbGVtZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgY29tbWl0VXJsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbW1pdFVybDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFbmhhbmNlZCBlcnJvciByZXBvcnRpbmcgd2l0aCBzcGVjaWZpYyBlcnJvciBjb2Rlc1xuICAgICAgbGV0IGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDUnOyAvLyBEZWZhdWx0IG5ldHdvcmsgZXJyb3JcbiAgICAgIGxldCBlbmhhbmNlZE1lc3NhZ2UgPSAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBwb3J0Zm9saW8nO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3Igc3BlY2lmaWMgZXJyb3IgY29uZGl0aW9uc1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCc0MDEnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDAxJztcbiAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwNCcpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICBlcnJvckNvZGUgPSAnUE9SVEZPTElPX1NZTkNfMDAyJztcbiAgICAgICAgZW5oYW5jZWRNZXNzYWdlID0gJ0dpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBub3QgZm91bmQuIFBsZWFzZSBydW4gaW5pdF9wb3J0Zm9saW8gZmlyc3QuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJzQwMycpIHx8IGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gJ1BPUlRGT0xJT19TWU5DXzAwNic7XG4gICAgICAgIGVuaGFuY2VkTWVzc2FnZSA9ICdHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0Nhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgbnVsbCcpKSB7XG4gICAgICAgIGVycm9yQ29kZSA9ICdQT1JURk9MSU9fU1lOQ18wMDQnO1xuICAgICAgICBlbmhhbmNlZE1lc3NhZ2UgPSBgR2l0SHViIEFQSSByZXNwb25zZSBwYXJzaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmVycm9yKGBbJHtlcnJvckNvZGV9XSAke2VuaGFuY2VkTWVzc2FnZX1gLCB7IFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBvcmlnaW5hbEVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50VG9SZXBvJywgZXJyb3IsIHsgXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIGVycm9yQ29kZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFRocm93IGVycm9yIHdpdGggY29kZSBmb3IgYmV0dGVyIGhhbmRsaW5nIHVwc3RyZWFtXG4gICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCBgWyR7ZXJyb3JDb2RlfV0gJHtlbmhhbmNlZE1lc3NhZ2V9YCwgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICh3cmFwcGVkRXJyb3IgYXMgYW55KS5jb2RlID0gZXJyb3JDb2RlO1xuICAgICAgdGhyb3cgd3JhcHBlZEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBpbml0aWFsIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgd2l0aCBSRUFETUUgYW5kIGRpcmVjdG9yaWVzXG4gICAqIFNFQ1VSSVRZOiBVc2VybmFtZSBhbHJlYWR5IG5vcm1hbGl6ZWQgYnkgY2FsbGluZyBtZXRob2RzXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVBvcnRmb2xpb1N0cnVjdHVyZSh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIFJFQURNRS5tZFxuICAgIGNvbnN0IHJlYWRtZUNvbnRlbnQgPSBgIyBEb2xsaG91c2VNQ1AgUG9ydGZvbGlvXG5cblRoaXMgaXMgbXkgcGVyc29uYWwgY29sbGVjdGlvbiBvZiBEb2xsaG91c2VNQ1AgZWxlbWVudHMuXG5cbiMjIFN0cnVjdHVyZVxuXG4tICoqcGVyc29uYXMvKiogLSBCZWhhdmlvcmFsIHByb2ZpbGVzXG4tICoqc2tpbGxzLyoqIC0gRGlzY3JldGUgY2FwYWJpbGl0aWVzICBcbi0gKip0ZW1wbGF0ZXMvKiogLSBSZXVzYWJsZSBjb250ZW50IHN0cnVjdHVyZXNcbi0gKiphZ2VudHMvKiogLSBBdXRvbm9tb3VzIGFjdG9yc1xuLSAqKm1lbW9yaWVzLyoqIC0gUGVyc2lzdGVudCBjb250ZXh0XG4tICoqZW5zZW1ibGVzLyoqIC0gRWxlbWVudCBncm91cHNcblxuIyMgVXNhZ2VcblxuVGhlc2UgZWxlbWVudHMgY2FuIGJlIGltcG9ydGVkIGludG8geW91ciBEb2xsaG91c2VNQ1AgaW5zdGFsbGF0aW9uLlxuXG4tLS1cbipHZW5lcmF0ZWQgYnkgRG9sbGhvdXNlTUNQKlxuYDtcblxuICAgIGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHt1c2VybmFtZX0vJHtQb3J0Zm9saW9SZXBvTWFuYWdlci5QT1JURk9MSU9fUkVQT19OQU1FfS9jb250ZW50cy9SRUFETUUubWRgLFxuICAgICAgJ1BVVCcsXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdJbml0aWFsaXplIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShyZWFkbWVDb250ZW50KS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBwbGFjZWhvbGRlcnNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFsncGVyc29uYXMnLCAnc2tpbGxzJywgJ3RlbXBsYXRlcycsICdhZ2VudHMnLCAnbWVtb3JpZXMnLCAnZW5zZW1ibGVzJ107XG4gICAgXG4gICAgZm9yIChjb25zdCBkaXIgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke1BvcnRmb2xpb1JlcG9NYW5hZ2VyLlBPUlRGT0xJT19SRVBPX05BTUV9L2NvbnRlbnRzLyR7ZGlyfS8uZ2l0a2VlcGAsXG4gICAgICAgICdQVVQnLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogYENyZWF0ZSAke2Rpcn0gZGlyZWN0b3J5YCxcbiAgICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbSgnJykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGVsZW1lbnQgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIGVsZW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIWVsZW1lbnQubWV0YWRhdGEubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQ6IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQuaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50OiBpZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudDogdHlwZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzYWZlIGZpbGVuYW1lIGZyb20gZWxlbWVudCBuYW1lXG4gICAqIFNFQ1VSSVRZOiBBZGRpdGlvbmFsIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBmb3IgZmlsZW5hbWVzXG4gICAqIFNFQ1VSSVRZIEZJWDogRml4ZWQgUmVEb1MgdnVsbmVyYWJpbGl0eSB3aXRoIGlucHV0IGxlbmd0aCBsaW1pdCBhbmQgb3B0aW1pemVkIHJlZ2V4XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlRmlsZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IExpbWl0IGlucHV0IGxlbmd0aCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgICAvLyBFdmVuIHdpdGggb3B0aW1pemVkIHJlZ2V4LCB2ZXJ5IGxvbmcgaW5wdXRzIGNvdWxkIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3Vlc1xuICAgIGNvbnN0IE1BWF9GSUxFTkFNRV9MRU5HVEggPSAyNTU7IC8vIENvbW1vbiBmaWxlc3lzdGVtIGxpbWl0XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIGluIGZpbGVuYW1lc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gVHJ1bmNhdGUgdG8gc2FmZSBsZW5ndGggQkVGT1JFIHJlZ2V4IG9wZXJhdGlvbnNcbiAgICBjb25zdCB0cnVuY2F0ZWROYW1lID0gbm9ybWFsaXplZE5hbWUuc2xpY2UoMCwgTUFYX0ZJTEVOQU1FX0xFTkdUSCk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBPcHRpbWl6ZWQgcmVnZXggb3BlcmF0aW9ucyB0byBwcmV2ZW50IFJlRG9TXG4gICAgLy8gMS4gQ29udmVydCBub24tYWxwaGFudW1lcmljIHNlcXVlbmNlcyB0byBzaW5nbGUgZGFzaFxuICAgIC8vIDIuIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlcyBpbiBhIHNpbmdsZSBwYXNzIHVzaW5nIHRyaW1cbiAgICBjb25zdCBzYWZlTmFtZSA9IHRydW5jYXRlZE5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXi0rLywgJycpICAvLyBSZW1vdmUgbGVhZGluZyBkYXNoZXNcbiAgICAgIC5yZXBsYWNlKC8tKyQvLCAnJyk7IC8vIFJlbW92ZSB0cmFpbGluZyBkYXNoZXNcbiAgICBcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIGZpbGVuYW1lIChub3QgZW1wdHkgYWZ0ZXIgY2xlYW5pbmcpXG4gICAgcmV0dXJuIHNhZmVOYW1lIHx8ICd1bm5hbWVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZWxlbWVudCBjb250ZW50IGZvciBzdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEVsZW1lbnRDb250ZW50KGVsZW1lbnQ6IElFbGVtZW50KTogc3RyaW5nIHtcbiAgICAvLyBTZXJpYWxpemUgdGhlIGVsZW1lbnQgb3IgY3JlYXRlIGJhc2ljIG1hcmtkb3duXG4gICAgaWYgKGVsZW1lbnQuc2VyaWFsaXplKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemUoKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gYmFzaWMgbWFya2Rvd24gZm9ybWF0XG4gICAgcmV0dXJuIGAjICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfVxcblxcbiR7ZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJ31gO1xuICB9XG59Il19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../../../src/security/audit/config/suppressions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAqCD,eAAO,MAAM,YAAY,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../../../src/security/audit/config/suppressions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAqCD,eAAO,MAAM,YAAY,EAAE,WAAW,EA8WrC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CA8B/C;AAuJD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAgDzE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAiBA"}
|