@dollhousemcp/mcp-server 2.0.28 → 2.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/generated/version.d.ts +2 -2
  3. package/dist/generated/version.js +3 -3
  4. package/dist/services/BuildInfoService.d.ts +9 -1
  5. package/dist/services/BuildInfoService.d.ts.map +1 -1
  6. package/dist/services/BuildInfoService.js +37 -3
  7. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
  8. package/dist/tools/portfolio/submitToPortfolioTool.js +4 -3
  9. package/dist/utils/permissionHookInstallers.d.ts +27 -0
  10. package/dist/utils/permissionHookInstallers.d.ts.map +1 -0
  11. package/dist/utils/permissionHookInstallers.js +465 -0
  12. package/dist/utils/permissionHookShared.d.ts +126 -0
  13. package/dist/utils/permissionHookShared.d.ts.map +1 -0
  14. package/dist/utils/permissionHookShared.js +388 -0
  15. package/dist/utils/permissionHookStatus.d.ts +10 -0
  16. package/dist/utils/permissionHookStatus.d.ts.map +1 -0
  17. package/dist/utils/permissionHookStatus.js +256 -0
  18. package/dist/utils/permissionHooks.d.ts +3 -73
  19. package/dist/utils/permissionHooks.d.ts.map +1 -1
  20. package/dist/utils/permissionHooks.js +4 -780
  21. package/dist/web/public/permissions.js +10 -0
  22. package/dist/web/public/setup.js +36 -0
  23. package/dist/web/routes/healthRoutes.d.ts +3 -0
  24. package/dist/web/routes/healthRoutes.d.ts.map +1 -1
  25. package/dist/web/routes/healthRoutes.js +22 -2
  26. package/dist/web/routes/permissionRoutes.d.ts +1 -0
  27. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  28. package/dist/web/routes/permissionRoutes.js +28 -7
  29. package/dist/web/routes/setupRoutes.d.ts +5 -1
  30. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  31. package/dist/web/routes/setupRoutes.js +28 -14
  32. package/dist/web/server.d.ts.map +1 -1
  33. package/dist/web/server.js +12 -1
  34. package/package.json +3 -1
  35. package/scripts/permission-hook-config.sh +67 -0
  36. package/scripts/pretooluse-dollhouse.sh +42 -13
  37. package/scripts/pretooluse-vscode.sh +23 -10
  38. package/scripts/pretooluse-windsurf.sh +6 -6
  39. package/server.json +2 -2
@@ -22,6 +22,7 @@ import { EarlyTerminationSearch } from '../../utils/EarlyTerminationSearch.js';
22
22
  import { CollectionErrorCode, formatCollectionError } from '../../config/error-codes.js';
23
23
  import * as path from 'path';
24
24
  import { SecureYamlParser } from '../../security/secureYamlParser.js';
25
+ import { PACKAGE_VERSION } from '../../generated/version.js';
25
26
  export class SubmitToPortfolioTool {
26
27
  authManager;
27
28
  portfolioRepoManager;
@@ -1455,7 +1456,7 @@ export class SubmitToPortfolioTool {
1455
1456
  elementName: params.elementName,
1456
1457
  contentLength: elementContent.length,
1457
1458
  securityIssues: validationResult.detectedPatterns?.length || 0,
1458
- buildVersion: 'v1.6.9-beta1-collection-fix' // Version identifier for verification
1459
+ buildVersion: `v${PACKAGE_VERSION}`,
1459
1460
  });
1460
1461
  }
1461
1462
  catch (error) {
@@ -1502,7 +1503,7 @@ ${elementContent}
1502
1503
  - [ ] No duplicate of existing collection content
1503
1504
 
1504
1505
  ---
1505
- *This submission was created automatically via the DollhouseMCP submit_collection_content tool (v1.6.9-beta1-collection-fix).*`;
1506
+ *This submission was created automatically via the DollhouseMCP submit_collection_content tool (v${PACKAGE_VERSION}).*`;
1506
1507
  // Determine labels based on element type
1507
1508
  const labels = [
1508
1509
  'element-submission', // CRITICAL: Triggers automation workflow
@@ -2091,4 +2092,4 @@ ${elementContent}
2091
2092
  return false;
2092
2093
  }
2093
2094
  }
2094
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSXBDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDcEIsTUFBTSxxQ0FBcUMsQ0FBQztBQU03QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQTBCdEUsTUFBTSxPQUFP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QUssR0FBRztZQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNoQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb29sIGZvciBzdWJtaXR0aW5nIGNvbnRlbnQgdG8gR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3JpZXNcbiAqIFJlcGxhY2VzIHRoZSBicm9rZW4gaXNzdWUtYmFzZWQgc3VibWlzc2lvbiB3aXRoIGRpcmVjdCByZXBvc2l0b3J5IHNhdmVzXG4gKiBcbiAqIEZJWEVTIElNUExFTUVOVEVEIChQUiAjNTAzKTpcbiAqIDEuIFRZUEUgU0FGRVRZIEZJWCAjMSAoSXNzdWUgIzQ5Nyk6IENoYW5nZWQgYXBpQ2FjaGUgZnJvbSAnYW55JyB0byBwcm9wZXIgQVBJQ2FjaGUgdHlwZVxuICogMi4gVFlQRSBTQUZFVFkgRklYICMyIChJc3N1ZSAjNDk3KTogUmVwbGFjZWQgY29tcGxleCB0eXBlIGNhc3Rpbmcgd2l0aCBQb3J0Zm9saW9FbGVtZW50QWRhcHRlclxuICogMy4gUEVSRk9STUFOQ0UgKFBSICM0OTYgcmVjb21tZW5kYXRpb24pOiBVc2luZyBGaWxlRGlzY292ZXJ5VXRpbCBmb3Igb3B0aW1pemVkIGZpbGUgc2VhcmNoXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBHaXRIdWJBdXRoTWFuYWdlciB9IGZyb20gJy4uLy4uL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvUmVwb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvUmVwb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIGdldEVsZW1lbnRGaWxlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlciB9IGZyb20gJy4vUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIuanMnO1xuaW1wb3J0IHsgRmlsZURpc2NvdmVyeVV0aWwgfSBmcm9tICcuLi8uLi91dGlscy9GaWxlRGlzY292ZXJ5VXRpbC5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHtcbiAgRklMRV9TSVpFX0xJTUlUUyxcbiAgUkVUUllfQ09ORklHLFxuICBTRUFSQ0hfQ09ORklHLFxuICBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsXG4gIGdldFZhbGlkYXRlZFRpbWVvdXQsXG4gIGNhbGN1bGF0ZVJldHJ5RGVsYXlcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BvcnRmb2xpby1jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvRWxlbWVudCwgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMsIFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuZXhwb3J0IHR5cGUgeyBQb3J0Zm9saW9FbGVtZW50LCBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcywgU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQgfTtcbmltcG9ydCB7IElSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL0dpdEh1YlJhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IEVhcmx5VGVybWluYXRpb25TZWFyY2ggfSBmcm9tICcuLi8uLi91dGlscy9FYXJseVRlcm1pbmF0aW9uU2VhcmNoLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FcnJvckNvZGUsIGZvcm1hdENvbGxlY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uL2NvbmZpZy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIFBvcnRmb2xpb0VsZW1lbnQsIFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zLCBhbmQgU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHRcbi8vIGFyZSBpbXBvcnRlZCBmcm9tIC4vdHlwZXMudHMgYW5kIHJlLWV4cG9ydGVkIGFib3ZlXG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERldGVjdGlvbk1hdGNoIHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uUmVzdWx0IHtcbiAgZm91bmQ6IGJvb2xlYW47XG4gIG1hdGNoZXM6IEVsZW1lbnREZXRlY3Rpb25NYXRjaFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvUG9ydGZvbGlvVG9vbERlcGVuZGVuY2llcyB7XG4gIGF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcG9ydGZvbGlvUmVwb01hbmFnZXI6IFBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwb3J0Zm9saW9JbmRleE1hbmFnZXI6IFBvcnRmb2xpb0luZGV4TWFuYWdlcjtcbiAgcmF0ZUxpbWl0ZXI6IElSYXRlTGltaXRlcjtcbiAgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHRva2VuTWFuYWdlcjogVG9rZW5NYW5hZ2VyO1xufVxuXG5leHBvcnQgY2xhc3MgU3VibWl0VG9Qb3J0Zm9saW9Ub29sIHtcbiAgcHJpdmF0ZSBhdXRoTWFuYWdlcjogR2l0SHViQXV0aE1hbmFnZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvUmVwb01hbmFnZXI6IFBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgcmF0ZUxpbWl0ZXI6IElSYXRlTGltaXRlcjtcbiAgcHJpdmF0ZSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgcHJpdmF0ZSB0b2tlbk1hbmFnZXI6IFRva2VuTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUsIGRlcGVuZGVuY2llczogU3VibWl0VG9Qb3J0Zm9saW9Ub29sRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gVFlQRSBTQUZFVFkgRklYICMxOiBQcm9wZXIgdHlwaW5nIGZvciBhcGlDYWNoZSBwYXJhbWV0ZXJcbiAgICAvLyBQcmV2aW91c2x5OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogYW55KVxuICAgIC8vIE5vdzogY29uc3RydWN0b3IoYXBpQ2FjaGU6IEFQSUNhY2hlKSB3aXRoIHByb3BlciBpbXBvcnRcbiAgICBpZiAoIWRlcGVuZGVuY2llcyB8fCAhZGVwZW5kZW5jaWVzLmF1dGhNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCByZXF1aXJlcyBhIEdpdEh1YkF1dGhNYW5hZ2VyIGluc3RhbmNlJyk7XG4gICAgfVxuICAgIGlmICghZGVwZW5kZW5jaWVzLnBvcnRmb2xpb01hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VibWl0VG9Qb3J0Zm9saW9Ub29sIHJlcXVpcmVzIGEgUG9ydGZvbGlvTWFuYWdlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgICBpZiAoIWRlcGVuZGVuY2llcy5wb3J0Zm9saW9JbmRleE1hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VibWl0VG9Qb3J0Zm9saW9Ub29sIHJlcXVpcmVzIGEgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIGluc3RhbmNlJyk7XG4gICAgfVxuICAgIGlmICghZGVwZW5kZW5jaWVzLnJhdGVMaW1pdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCByZXF1aXJlcyBhbiBJUmF0ZUxpbWl0ZXIgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dGhNYW5hZ2VyID0gZGVwZW5kZW5jaWVzLmF1dGhNYW5hZ2VyO1xuICAgIHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIgPSBkZXBlbmRlbmNpZXMucG9ydGZvbGlvUmVwb01hbmFnZXI7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gZGVwZW5kZW5jaWVzLnBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5wb3J0Zm9saW9JbmRleE1hbmFnZXIgPSBkZXBlbmRlbmNpZXMucG9ydGZvbGlvSW5kZXhNYW5hZ2VyO1xuICAgIHRoaXMucmF0ZUxpbWl0ZXIgPSBkZXBlbmRlbmNpZXMucmF0ZUxpbWl0ZXI7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGRlcGVuZGVuY2llcy5maWxlT3BlcmF0aW9ucztcbiAgICB0aGlzLnRva2VuTWFuYWdlciA9IGRlcGVuZGVuY2llcy50b2tlbk1hbmFnZXI7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGlucHV0IHBhcmFtZXRlcnMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgYW5kIGVuc3VyZSBkYXRhIHNhZmV0eVxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBub3JtYWxpemVkIG5hbWUgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmROb3JtYWxpemVQYXJhbXMocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc2FmZU5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIE5vcm1hbGl6ZSB1c2VyIGlucHV0IHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIChETUNQLVNFQy0wMDQpXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShwYXJhbXMubmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEludmFsaWQgVW5pY29kZSBpbiBlbGVtZW50IG5hbWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LlswXSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gLFxuICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9JTlBVVCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBzYWZlTmFtZTogbm9ybWFsaXplZE5hbWUubm9ybWFsaXplZENvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViXG4gICAqIEByZXR1cm5zIEF1dGhlbnRpY2F0aW9uIGNoZWNrIHJlc3VsdCB3aXRoIHN0YXR1cyBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0F1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYXV0aFN0YXR1cz86IGFueTtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgIGlmICghYXV0aFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIC8vIExvZyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCAodXNpbmcgZXhpc3RpbmcgZXZlbnQgdHlwZSlcbiAgICAgIGxvZ2dlci53YXJuKCdVc2VyIGF0dGVtcHRlZCBwb3J0Zm9saW8gc3VibWlzc2lvbiB3aXRob3V0IGF1dGhlbnRpY2F0aW9uJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnTm90IGF1dGhlbnRpY2F0ZWQuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QgdXNpbmcgdGhlIEdpdEh1YiBPQXV0aCBmbG93LlxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICdWaXNpdDogaHR0cHM6Ly9kb2NzLmFudGhyb3BpYy5jb20vZW4vZG9jcy9jbGF1ZGUtY29kZS9vYXV0aC1zZXR1cFxcbicgK1xuICAgICAgICAgICAgICAgICAgICdPciBydW46IGdoIGF1dGggbG9naW4gLS13ZWInLFxuICAgICAgICAgIGVycm9yOiAnTk9UX0FVVEhFTlRJQ0FURUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhdXRoU3RhdHVzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgY29udGVudCBsb2NhbGx5IHdpdGggc21hcnQgdHlwZSBkZXRlY3Rpb25cbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gZXhwbGljaXRUeXBlIE9wdGlvbmFsIGV4cGxpY2l0IGVsZW1lbnQgdHlwZSBwcm92aWRlZCBieSB1c2VyXG4gICAqIEBwYXJhbSBvcmlnaW5hbE5hbWUgT3JpZ2luYWwgdXNlci1wcm92aWRlZCBuYW1lIGZvciBlcnJvciBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyBDb250ZW50IGRpc2NvdmVyeSByZXN1bHQgd2l0aCBlbGVtZW50IHR5cGUgYW5kIHBhdGggb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZXhwbGljaXRUeXBlPzogRWxlbWVudFR5cGUsIFxuICAgIG9yaWdpbmFsTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVsZW1lbnRUeXBlPzogRWxlbWVudFR5cGU7XG4gICAgbG9jYWxQYXRoPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBsZXQgZWxlbWVudFR5cGUgPSBleHBsaWNpdFR5cGU7XG4gICAgbGV0IGxvY2FsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBUeXBlIGV4cGxpY2l0bHkgcHJvdmlkZWQgLSBzZWFyY2ggaW4gdGhhdCBzcGVjaWZpYyBkaXJlY3Rvcnkgb25seVxuICAgICAgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KHNhZmVOYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIWxvY2FsUGF0aCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogUHJvdmlkZSBoZWxwZnVsIHN1Z2dlc3Rpb25zIGZvciBmaW5kaW5nIGNvbnRlbnRcbiAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kICR7ZWxlbWVudFR5cGV9IG5hbWVkIFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgaW4gbG9jYWwgcG9ydGZvbGlvLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipTZWFyY2hlZCBpbioqOiAke2VsZW1lbnREaXJ9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIHVzaW5nIHlvdXIgZmlsZSBleHBsb3JlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFRyeSB1c2luZyB0aGUgZXhhY3QgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSAke2VsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIElmIHVuc3VyZSBvZiB0aGUgdHlwZSwgb21pdCAtLXR5cGUgYW5kIGxldCB0aGUgc3lzdGVtIGRldGVjdCBpdFxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipDb21tb24gbmFtZSBmb3JtYXRzIHRoYXQgd29yayoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwibXktZWxlbWVudFwiIChrZWJhYi1jYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwiTXkgRWxlbWVudFwiICh3aXRoIHNwYWNlcylcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15RWxlbWVudFwiIChQYXNjYWxDYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFBhcnRpYWwgbWF0Y2hlcyBhcmUgc3VwcG9ydGVkYCxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDUklUSUNBTCBGSVg6IE5vIHR5cGUgcHJvdmlkZWQgLSBpbXBsZW1lbnQgc21hcnQgZGV0ZWN0aW9uIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIGRlZmF1bHQgdG8gUEVSU09OQSBhbmQgZW5hYmxlcyBwcm9wZXIgdHlwZSBkZXRlY3Rpb25cbiAgICAgIGNvbnN0IGRldGVjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZGV0ZWN0RWxlbWVudFR5cGUoc2FmZU5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoIWRldGVjdGlvblJlc3VsdC5mb3VuZCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZ3VpZGFuY2Ugd2l0aCBzcGVjaWZpYyBzdWdnZXN0aW9uc1xuICAgICAgICBjb25zdCBhdmFpbGFibGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbnMgZm9yIHNpbWlsYXIgbmFtZXNcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNhZmVOYW1lKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBtZXNzYWdlID0gYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBub3QgZm91bmQgaW4gcG9ydGZvbGlvLlxcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCflI0gKipTZWFyY2hlZCBpbiBhbGwgZWxlbWVudCB0eXBlcyoqOiAke2F2YWlsYWJsZVR5cGVzfVxcblxcbmA7XG4gICAgICAgIFxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgKipEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlPyoqXFxuYDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMuc2xpY2UoMCwgU0VBUkNIX0NPTkZJRy5NQVhfU1VHR0VTVElPTlMpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgIOKAoiBcIiR7c3VnZ2VzdGlvbi5uYW1lfVwiICgke3N1Z2dlc3Rpb24udHlwZX0pXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbWVzc2FnZSArPSBg8J+boO+4jyAqKlRyb3VibGVzaG9vdGluZyBTdGVwcyoqOlxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDEuIPCfk50gVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGNvbnRlbnRcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAyLiDwn5SNIENoZWNrIGV4YWN0IHNwZWxsaW5nIGFuZCB0cnkgdmFyaWF0aW9uczpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnRvTG93ZXJDYXNlKCl9XCIgKGxvd2VyY2FzZSlcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnJlcGxhY2VBbGwoL1teYS16MC05XS9naSwgJy0nKS50b0xvd2VyQ2FzZSgpfVwiIChub3JtYWxpemVkKVxcbmA7XG4gICAgICAgIGlmICgob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlQWxsKCcuJywgJycpfVwiIChubyBkb3RzKVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBgMy4g8J+OryBTcGVjaWZ5IGVsZW1lbnQgdHlwZTogXFxgc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIC0tdHlwZT1wZXJzb25hc1xcYFxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDQuIPCfk4EgQ2hlY2sgaWYgZmlsZSBleGlzdHMgaW4gcG9ydGZvbGlvIGRpcmVjdG9yaWVzXFxuXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TnSAqKlRpcCoqOiBUaGUgc3lzdGVtIHNlYXJjaGVzIGZpbGVuYW1lcyBBTkQgbWV0YWRhdGEgbmFtZXMgd2l0aCBmdXp6eSBtYXRjaGluZy5gO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6ICdDT05URU5UX05PVF9GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHQubWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIE11bHRpcGxlIG1hdGNoZXMgZm91bmQgLSBhc2sgdXNlciB0byBzcGVjaWZ5IHR5cGVcbiAgICAgICAgY29uc3QgbWF0Y2hEZXRhaWxzID0gZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubWFwKG0gPT4gYC0gJHttLnR5cGV9OiAke20ucGF0aH1gKS5qb2luKCdcXG4nKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGZvdW5kIGluIG11bHRpcGxlIGVsZW1lbnQgdHlwZXM6XFxuXFxuJHttYXRjaERldGFpbHN9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2Ugc3BlY2lmeSB0aGUgZWxlbWVudCB0eXBlIHVzaW5nIHRoZSAtLXR5cGUgcGFyYW1ldGVyIHRvIGF2b2lkIGFtYmlndWl0eS5gLFxuICAgICAgICAgICAgZXJyb3I6ICdNVUxUSVBMRV9NQVRDSEVTX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2luZ2xlIG1hdGNoIGZvdW5kIC0gdXNlIGl0XG4gICAgICBjb25zdCBtYXRjaCA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzWzBdO1xuICAgICAgZWxlbWVudFR5cGUgPSBtYXRjaC50eXBlO1xuICAgICAgbG9jYWxQYXRoID0gbWF0Y2gucGF0aDtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFNtYXJ0IGRldGVjdGlvbjogRm91bmQgXCIke3NhZmVOYW1lfVwiIGFzICR7ZWxlbWVudFR5cGV9YCwgeyBcbiAgICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICAgIGRldGVjdGVkVHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdGg6IGxvY2FsUGF0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxvY2FsUGF0aFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGZpbGUgc2l6ZSBhbmQgY29udGVudCBzZWN1cml0eSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgKiBAcGFyYW0gbG9jYWxQYXRoIFBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBjb250ZW50IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogVmFsaWRhdGUgZmlsZSBwYXRoIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgcGF0aFZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlUG9ydGZvbGlvUGF0aChsb2NhbFBhdGgpO1xuICAgIGlmICghcGF0aFZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBwYXRoVmFsaWRhdGlvbi5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHZhbGlkYXRlZCBzYWZlIHBhdGggZm9yIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBzYWZlUGF0aCA9IHBhdGhWYWxpZGF0aW9uLnNhZmVQYXRoITtcblxuICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZSBiZWZvcmUgcmVhZGluZ1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KHNhZmVQYXRoKTtcbiAgICBpZiAoc3RhdHMuc2l6ZSA+IEZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgRmlsZSBzaXplICR7c3RhdHMuc2l6ZX0gZXhjZWVkcyBsaW1pdCBvZiAke0ZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBGaWxlIHNpemUgZXhjZWVkcyAke0ZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRV9NQn1NQiBsaW1pdGAsXG4gICAgICAgICAgZXJyb3I6ICdGSUxFX1RPT19MQVJHRSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHNlY3VyaXR5XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc2FmZVBhdGgsIHsgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlRmlsZUFuZENvbnRlbnQnIH0pO1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgQ3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgIGVycm9yOiAnVkFMSURBVElPTl9GQUlMRUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBjb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBtZXRhZGF0YSBmb3IgdGhlIHBvcnRmb2xpbyBlbGVtZW50XG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZVxuICAgKiBAcmV0dXJucyBNZXRhZGF0YSBvYmplY3QgZm9yIHRoZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVFbGVtZW50TWV0YWRhdGEoXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLCBcbiAgICBhdXRoU3RhdHVzOiBhbnksXG4gICAgZmlsZVBhdGg/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE+IHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIHRoZSBmaWxlIGlmIHBhdGggaXMgcHJvdmlkZWRcbiAgICBsZXQgZmlsZU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBmaWxlTWV0YWRhdGEgPSBhd2FpdCB0aGlzLmV4dHJhY3RFbGVtZW50TWV0YWRhdGEoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUWVBFIFNBRkVUWTogRGVmaW5lIGV4dGVuZGVkIG1ldGFkYXRhIGludGVyZmFjZSBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG4gICAgaW50ZXJmYWNlIEV4dGVuZGVkTWV0YWRhdGEgZXh0ZW5kcyBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEge1xuICAgICAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgICAgYWdlX3JhdGluZz86IHN0cmluZztcbiAgICAgIGFpX2dlbmVyYXRlZD86IGJvb2xlYW47XG4gICAgICBnZW5lcmF0aW9uX21ldGhvZD86IHN0cmluZztcbiAgICAgIGxpY2Vuc2U/OiBzdHJpbmc7XG4gICAgICB0YWdzPzogc3RyaW5nW107XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIHdpdGggcmVhbCB2YWx1ZXMgZnJvbSBmaWxlLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHNcbiAgICBjb25zdCBtZXRhZGF0YTogRXh0ZW5kZWRNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGZpbGVNZXRhZGF0YT8uZGVzY3JpcHRpb24gfHwgXG4gICAgICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5zdW1tYXJ5IHx8IFxuICAgICAgICAgICAgICAgICAgIGAke2VsZW1lbnRUeXBlfSBzdWJtaXR0ZWQgZnJvbSBsb2NhbCBwb3J0Zm9saW9gLFxuICAgICAgYXV0aG9yOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8IGZpbGVNZXRhZGF0YT8uYXV0aG9yIHx8ICd1bmtub3duJyxcbiAgICAgIGNyZWF0ZWQ6IGZpbGVNZXRhZGF0YT8uY3JlYXRlZCB8fCBcbiAgICAgICAgICAgICAgIGZpbGVNZXRhZGF0YT8uY3JlYXRlZF9kYXRlIHx8IFxuICAgICAgICAgICAgICAgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdXBkYXRlZDogZmlsZU1ldGFkYXRhPy51cGRhdGVkIHx8IFxuICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5tb2RpZmllZCB8fCBcbiAgICAgICAgICAgICAgIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHZlcnNpb246IGZpbGVNZXRhZGF0YT8udmVyc2lvbiB8fCAnMS4wLjAnXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgYWRkaXRpb25hbCBtZXRhZGF0YSBmaWVsZHMgaWYgcHJlc2VudCAod2l0aCB0eXBlIHNhZmV0eSlcbiAgICBpZiAoZmlsZU1ldGFkYXRhKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvdGhlciBtZXRhZGF0YSBmaWVsZHMgdGhhdCBtaWdodCBiZSB1c2VmdWxcbiAgICAgIGlmIChmaWxlTWV0YWRhdGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShmaWxlTWV0YWRhdGEudHJpZ2dlcnMpKSB7XG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzID0gZmlsZU1ldGFkYXRhLnRyaWdnZXJzO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5jYXRlZ29yeSAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmNhdGVnb3J5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5jYXRlZ29yeSA9IGZpbGVNZXRhZGF0YS5jYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuYWdlX3JhdGluZyAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmFnZV9yYXRpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmFnZV9yYXRpbmcgPSBmaWxlTWV0YWRhdGEuYWdlX3JhdGluZztcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEuYWlfZ2VuZXJhdGVkID0gQm9vbGVhbihmaWxlTWV0YWRhdGEuYWlfZ2VuZXJhdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgPSBmaWxlTWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2Q7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmxpY2Vuc2UgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5saWNlbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5saWNlbnNlID0gZmlsZU1ldGFkYXRhLmxpY2Vuc2U7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShmaWxlTWV0YWRhdGEudGFncykpIHtcbiAgICAgICAgbWV0YWRhdGEudGFncyA9IGZpbGVNZXRhZGF0YS50YWdzO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuaW5mbygnUHJlcGFyZWQgZWxlbWVudCBtZXRhZGF0YScsIHtcbiAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZSxcbiAgICAgIGhhc0ZpbGVNZXRhZGF0YTogISFmaWxlTWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIDEwMCkgLy8gTG9nIGZpcnN0IDEwMCBjaGFyc1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIG1ldGFkYXRhIGFzIFlBTUwgc3RyaW5nIGZvciBkaXNwbGF5XG4gICAqIFBFUkZPUk1BTkNFOiBVc2VzIGFycmF5IGpvaW4gaW5zdGVhZCBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE1ldGFkYXRhQXNZYW1sKGJhc2VNZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLCBleHRlbmRlZE1ldGE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWFtbExpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgIGBuYW1lOiAke2Jhc2VNZXRhZGF0YS5uYW1lfWAsXG4gICAgICBgZGVzY3JpcHRpb246ICR7YmFzZU1ldGFkYXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgICBgYXV0aG9yOiAke2Jhc2VNZXRhZGF0YS5hdXRob3J9YCxcbiAgICAgIGB2ZXJzaW9uOiAke2Jhc2VNZXRhZGF0YS52ZXJzaW9ufWAsXG4gICAgICBgY3JlYXRlZDogJHtiYXNlTWV0YWRhdGEuY3JlYXRlZH1gLFxuICAgICAgYHVwZGF0ZWQ6ICR7YmFzZU1ldGFkYXRhLnVwZGF0ZWR9YFxuICAgIF07XG4gICAgXG4gICAgLy8gQWRkIG9wdGlvbmFsIGZpZWxkcyBpZiBwcmVzZW50XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5jYXRlZ29yeSkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGNhdGVnb3J5OiAke2V4dGVuZGVkTWV0YS5jYXRlZ29yeX1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KGV4dGVuZGVkTWV0YS50cmlnZ2VycykgJiYgZXh0ZW5kZWRNZXRhLnRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGB0cmlnZ2VyczogWyR7ZXh0ZW5kZWRNZXRhLnRyaWdnZXJzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmFnZV9yYXRpbmcpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBhZ2VfcmF0aW5nOiAke2V4dGVuZGVkTWV0YS5hZ2VfcmF0aW5nfWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmFpX2dlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgYWlfZ2VuZXJhdGVkOiAke2V4dGVuZGVkTWV0YS5haV9nZW5lcmF0ZWR9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuZ2VuZXJhdGlvbl9tZXRob2QpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBnZW5lcmF0aW9uX21ldGhvZDogJHtleHRlbmRlZE1ldGEuZ2VuZXJhdGlvbl9tZXRob2R9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEubGljZW5zZSkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGxpY2Vuc2U6ICR7ZXh0ZW5kZWRNZXRhLmxpY2Vuc2V9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEudGFncyAmJiBBcnJheS5pc0FycmF5KGV4dGVuZGVkTWV0YS50YWdzKSAmJiBleHRlbmRlZE1ldGEudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgdGFnczogWyR7ZXh0ZW5kZWRNZXRhLnRhZ3Muam9pbignLCAnKX1dYCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB5YW1sTGluZXMuam9pbignXFxuJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBtZXRhZGF0YSBmcm9tIGFuIGVsZW1lbnQgZmlsZVxuICAgKiBQYXJzZXMgWUFNTCBmcm9udG1hdHRlciB0byBnZXQgdGhlIGFjdHVhbCBtZXRhZGF0YVxuICAgKiBTRUNVUklUWTogVXNlcyBTZWN1cmVZYW1sUGFyc2VyIGluc3RlYWQgb2YgeWFtbC5sb2FkIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb24gKERNQ1AtU0VDLTAwNSlcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGVsZW1lbnQgZmlsZVxuICAgKiBAcmV0dXJucyBFeHRyYWN0ZWQgbWV0YWRhdGEgb3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4dHJhY3RFbGVtZW50TWV0YWRhdGEoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHsgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4dHJhY3RFbGVtZW50TWV0YWRhdGEnIH0pO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgICAgLy8gUHJldmlvdXNseSB3b3VsZCBoYXZlIHVzZWQ6IHlhbWwubG9hZCh5YW1sQ29udGVudCkgd2hpY2ggaXMgdnVsbmVyYWJsZVxuICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB3aGljaCB2YWxpZGF0ZXMgYW5kIHNhbml0aXplc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgIC8vIDY0S0IgbGltaXQgZm9yIFlBTUxcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLCAgICAvLyBEb24ndCB2YWxpZGF0ZSBjb250ZW50IGZpZWxkIChqdXN0IG1ldGFkYXRhKVxuICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgICAgIC8vIERvbid0IGVuZm9yY2UgcGVyc29uYS1zcGVjaWZpYyBydWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSB3ZSBnb3QgYW4gb2JqZWN0IGJhY2tcbiAgICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHR5cGVvZiBwYXJzZWQuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0ZWQgbWV0YWRhdGEgZnJvbSBlbGVtZW50IGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIG1ldGFkYXRhS2V5czogT2JqZWN0LmtleXMocGFyc2VkLmRhdGEpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1BhcnNlZCBkYXRhIGlzIG5vdCBhIHZhbGlkIG1ldGFkYXRhIG9iamVjdCcsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTZWN1cmVZYW1sUGFyc2VyIHRocm93cyBvbiBpbnZhbGlkIFlBTUwsIHRyeSBhbHRlcm5hdGUgZnJvbnRtYXR0ZXIgcGF0dGVyblxuICAgICAgICAvLyBIYW5kbGUgZmlsZXMgdGhhdCBtaWdodCBoYXZlIGZyb250bWF0dGVyIHdpdGhvdXQgZnVsbCBkb2N1bWVudCBzdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXJNYXRjaCA9IGNvbnRlbnQubWF0Y2goL14tLS1cXHI/XFxuKFtcXHNcXFNdKj8pXFxyP1xcbi0tLS8pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGZyb250bWF0dGVyTWF0Y2ggJiYgZnJvbnRtYXR0ZXJNYXRjaFsxXSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBmdWxsIGRvY3VtZW50IGZvciBTZWN1cmVZYW1sUGFyc2VyXG4gICAgICAgICAgICBjb25zdCBmdWxsQ29udGVudCA9IGAtLS1cXG4ke2Zyb250bWF0dGVyTWF0Y2hbMV19XFxuLS0tXFxuYDtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZnVsbENvbnRlbnQsIHtcbiAgICAgICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCxcbiAgICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHR5cGVvZiBwYXJzZWQuZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGlubmVyRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIHBhcnNlIGZyb250bWF0dGVyIHdpdGggU2VjdXJlWWFtbFBhcnNlcicsIHtcbiAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiBpbm5lckVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBpbm5lckVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoaW5uZXJFcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyB2YWxpZCBmcm9udG1hdHRlciBmb3VuZCBpbiBlbGVtZW50IGZpbGUnLCB7IHBhdGg6IGZpbGVQYXRoIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbSBlbGVtZW50IGZpbGUnLCB7XG4gICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgR2l0SHViIHRva2VuIGFuZCBjaGVja3MgZm9yIGV4cGlyYXRpb24gYmVmb3JlIHVzYWdlXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM1KTogVG9rZW4gZXhwaXJhdGlvbiB2YWxpZGF0aW9uIHRvIHByZXZlbnQgc3RhbGUgdG9rZW4gdXNhZ2VcbiAgICogQHBhcmFtIHRva2VuIFRoZSBHaXRIdWIgdG9rZW4gdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzdGF0dXMgYW5kIGV4cGlyYXRpb24gaW5mb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGlzVmFsaWQ6IGJvb2xlYW47XG4gICAgaXNOZWFyRXhwaXJ5PzogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIHRva2VuIGZvcm1hdCBmaXJzdCAoYmFzaWMgdmFsaWRhdGlvbilcbiAgICAgIGlmICghdGhpcy50b2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiAnVG9rZW4gaGFzIGludmFsaWQgZm9ybWF0J1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgdG9rZW4gZm9ybWF0LiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfVE9LRU5fRk9STUFUJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdG9rZW4gd2l0aCBHaXRIdWIgQVBJIHRvIGNoZWNrIGV4cGlyYXRpb24gYW5kIHBlcm1pc3Npb25zXG4gICAgICAvLyBOT1RFOiBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgc2NvcGUsIG5vdCAncmVwbydcbiAgICAgIC8vIFVzaW5nIGNlbnRyYWxpemVkIHNjb3BlIG1hbmFnZW1lbnQgZm9yIGNvbnNpc3RlbmN5XG4gICAgICBjb25zdCByZXF1aXJlZFNjb3BlcyA9IHRoaXMudG9rZW5NYW5hZ2VyLmdldFJlcXVpcmVkU2NvcGVzKCdjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy50b2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlblNjb3Blcyh0b2tlbiwgcmVxdWlyZWRTY29wZXMpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6IGBUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yfWBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgT0F1dGgtc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgICAgbGV0IGVycm9yQ29kZTogQ29sbGVjdGlvbkVycm9yQ29kZTtcbiAgICAgICAgbGV0IGVuaGFuY2VkRGV0YWlsczogc3RyaW5nIHwgdW5kZWZpbmVkID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICAgICAgXG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yPy5pbmNsdWRlcygnTWlzc2luZyByZXF1aXJlZCBzY29wZXMnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9IENvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwMjtcbiAgICAgICAgICAvLyBQcm92aWRlIE9BdXRoLXNwZWNpZmljIGd1aWRhbmNlIGlmIGl0J3MgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJykge1xuICAgICAgICAgICAgZW5oYW5jZWREZXRhaWxzID0gYE9BdXRoIHRva2VuIG1pc3NpbmcgJ3B1YmxpY19yZXBvJyBzY29wZS4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZSB3aXRoICdzZXR1cF9naXRodWJfYXV0aCcgdG8gZ2V0IHRoZSBjb3JyZWN0IHNjb3BlLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yQ29kZSA9IENvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0Q29sbGVjdGlvbkVycm9yKGVycm9yQ29kZSwgMywgNSwgZW5oYW5jZWREZXRhaWxzKSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvckNvZGVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRva2VuIGlzIG5lYXIgZXhwaXJhdGlvbiAocmF0ZSBsaW1pdCByZXNldCB0aW1lIGNhbiBpbmRpY2F0ZSB0b2tlbiBmcmVzaG5lc3MpXG4gICAgICBsZXQgaXNOZWFyRXhwaXJ5ID0gZmFsc2U7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQ/LnJlc2V0VGltZSkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCB0aW1lVW50aWxSZXNldCA9IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBvbmVIb3VyID0gNjAgKiA2MCAqIDEwMDA7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zaWRlciB0b2tlbiBcIm5lYXIgZXhwaXJ5XCIgaWYgcmF0ZSBsaW1pdCByZXNldCBpcyBtb3JlIHRoYW4gMjMgaG91cnMgYXdheVxuICAgICAgICAvLyAoR2l0SHViIHJhdGUgbGltaXRzIHJlc2V0IGV2ZXJ5IGhvdXIsIHNvIHRoaXMgc3VnZ2VzdHMgdG9rZW4gYWdlKVxuICAgICAgICBpZiAodGltZVVudGlsUmVzZXQgPiAyMyAqIG9uZUhvdXIpIHtcbiAgICAgICAgICBpc05lYXJFeHBpcnkgPSB0cnVlO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdHaXRIdWIgdG9rZW4gbWF5IGJlIG5lYXIgZXhwaXJhdGlvbicsIHtcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLnRva2VuTWFuYWdlci5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWU6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgZm9yIGxvbmcgb3BlcmF0aW9ucydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlIHVzYWdlJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0b2tlblR5cGU6IHRoaXMudG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICAgICAgc2NvcGVzOiB2YWxpZGF0aW9uUmVzdWx0LnNjb3BlcyxcbiAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0Py5yZW1haW5pbmcsXG4gICAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBpc05lYXJFeHBpcnlcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdCBleGNlZWRlZCBzcGVjaWZpY2FsbHlcbiAgICAgIGlmIChlcnJvcj8uY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlZCwgYWxsb3dpbmcgb3BlcmF0aW9uIHRvIHByb2NlZWQgd2l0aCBjYWNoZWQgc3RhdHVzJyk7XG4gICAgICAgIC8vIFN0aWxsIGFsbG93IG9wZXJhdGlvbiBidXQgbG9nIHdpdGggQ09MTF9BUElfMDAxXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZScsXG4gICAgICAgICAgZGV0YWlsczogJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVkIGJ1dCBwcm9jZWVkaW5nIHdpdGggY2FjaGVkIHN0YXR1cydcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTsgLy8gQWxsb3cgdG8gcHJvY2VlZCBpZiByYXRlIGxpbWl0ZWQsIGFzIGJhc2ljIGZvcm1hdCBjaGVjayBwYXNzZWRcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZScsXG4gICAgICAgIGRldGFpbHM6IGBUb2tlbiB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2UgfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHZhbGlkYXRlIEdpdEh1YiB0b2tlbi4gUGxlYXNlIGNoZWNrIHlvdXIgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgZXJyb3I6ICdUT0tFTl9WQUxJREFUSU9OX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlZCBwYXRoIHZhbGlkYXRpb24gZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zIHdpdGggY29tcHJlaGVuc2l2ZSBzZWN1cml0eSBjaGVja3NcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzcpOiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgbWFsaWNpb3VzIHBhdHRlcm5zXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgZmlsZSBwYXRoIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc2VjdXJlIHBhdGggb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVQb3J0Zm9saW9QYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIHNhZmVQYXRoPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQmFzaWMgbnVsbC91bmRlZmluZWQgY2hlY2tcbiAgICAgIGlmICghZmlsZVBhdGggfHwgdHlwZW9mIGZpbGVQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiAnSW52YWxpZCBwYXRoIHByb3ZpZGVkIC0gbnVsbCwgdW5kZWZpbmVkLCBvciBub24tc3RyaW5nJ1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgZmlsZSBwYXRoIHByb3ZpZGVkJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9QQVRIJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHN1c3BpY2lvdXMgcGF0dGVybnMgdGhhdCBjb3VsZCBpbmRpY2F0ZSBwYXRoIHRyYXZlcnNhbCBvciBpbmplY3Rpb25cbiAgICAgIGNvbnN0IHN1c3BpY2lvdXNQYXR0ZXJucyA9IFtcbiAgICAgICAgL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgICAvLyBQYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFwvXFwuXFwuLywgICAgICAgICAgICAgICAgICAvLyBVbml4IHBhdGggdHJhdmVyc2FsXG4gICAgICAgIC9cXFxcXFwuXFwuLywgICAgICAgICAgICAgICAgICAvLyBXaW5kb3dzIHBhdGggdHJhdmVyc2FsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgZGV0ZWN0aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgICAgIC9cXHUwMDAwLywgICAgICAgICAgICAgICAgICAgIC8vIE5PU09OQVIgLSBOdWxsIGJ5dGVzIGRldGVjdGlvbiBmb3Igc2VjdXJpdHlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSBkZXRlY3RpbmcgY29udHJvbCBjaGFycyBmb3Igc2VjdXJpdHlcbiAgICAgICAgL1tcXHUwMDAxLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZdLywgICAgLy8gTk9TT05BUiAtIENvbnRyb2wgY2hhcmFjdGVycyBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIC9bPD46XCJ8PypdLywgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGZpbGVuYW1lIGNoYXJhY3RlcnMgb24gV2luZG93c1xuICAgICAgICAvXihDT058UFJOfEFVWHxOVUx8Q09NWzEtOV18TFBUWzEtOV0pJC9pLCAvLyBSZXNlcnZlZCBXaW5kb3dzIG5hbWVzXG4gICAgICAgIC9eXFwuLywgICAgICAgICAgICAgICAgICAgICAvLyBIaWRkZW4gZmlsZXMgKHN0YXJ0aW5nIHdpdGggZG90KVxuICAgICAgICAvXFxzKyQvLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAvXltcXHNdKiQvLCAgICAgICAgICAgICAgICAgLy8gT25seSB3aGl0ZXNwYWNlXG4gICAgICAgIC8lWzAtOWEtZkEtRl17Mn0vLCAgICAgICAgIC8vIFVSTCBlbmNvZGluZyAocG90ZW50aWFsIGJ5cGFzcyBhdHRlbXB0KVxuICAgICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS8sICAgICAgIC8vIEhleCBlbmNvZGluZ1xuICAgICAgICAvXFwkXFx7LipcXH0vLCAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZSBsaXRlcmFsIGluamVjdGlvblxuICAgICAgICAvYC4qYC8sICAgICAgICAgICAgICAgICAgICAvLyBCYWNrdGljayBpbmplY3Rpb25cbiAgICAgICAgL1tcXFxcXFwvXXsyLH0vICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgY29uc2VjdXRpdmUgc2xhc2hlc1xuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHN1c3BpY2lvdXNQYXR0ZXJucykge1xuICAgICAgICBpZiAocGF0dGVybi50ZXN0KGZpbGVQYXRoKSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBTdXNwaWNpb3VzIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gZmlsZSBwYXRoOiAke3BhdHRlcm4uc291cmNlfWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY29udGFpbnMgaW52YWxpZCBvciBzdXNwaWNpb3VzIGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICBlcnJvcjogJ1NVU1BJQ0lPVVNfUEFUSF9QQVRURVJOJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgcGF0aCBsZW5ndGggKHByZXZlbnQgYnVmZmVyIG92ZXJmbG93IGF0dGVtcHRzKVxuICAgICAgY29uc3QgTUFYX1BBVEhfTEVOR1RIID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IDI2MCA6IDQwOTY7XG4gICAgICBpZiAoZmlsZVBhdGgubGVuZ3RoID4gTUFYX1BBVEhfTEVOR1RIKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBGaWxlIHBhdGggZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHtmaWxlUGF0aC5sZW5ndGh9ID4gJHtNQVhfUEFUSF9MRU5HVEh9YFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGUgcGF0aCBpcyB0b28gbG9uZycsXG4gICAgICAgICAgICBlcnJvcjogJ1BBVEhfVE9PX0xPTkcnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aCB0byByZXNvbHZlIGFueSByZWxhdGl2ZSBjb21wb25lbnRzIHNhZmVseVxuICAgICAgbGV0IG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZW1vdmUgbnVsbCBieXRlcyBhbmQgbm9ybWFsaXplXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgcmVtb3ZpbmcgbnVsbCBieXRlcyBmb3Igc2VjdXJpdHlcbiAgICAgICAgY29uc3QgY2xlYW5QYXRoID0gZmlsZVBhdGgucmVwbGFjZUFsbCgvXFx1MDAwMC9nLCAnJyk7IC8vIE5PU09OQVIgLSBSZW1vdmluZyBudWxsIGJ5dGVzIGZvciBzZWN1cml0eVxuICAgICAgICBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGNsZWFuUGF0aCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBwYXRoIGlzIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgY29uc3QgcG9ydGZvbGlvQmFzZSA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRCYXNlRGlyKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBGb3IgYWJzb2x1dGUgcGF0aHMsIHZlcmlmeSB0aGV5J3JlIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWRQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKHBvcnRmb2xpb0Jhc2UpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFBhdGggbXVzdCBiZSB3aXRoaW4gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICAgICAgICBpZiAoIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBpcyBvdXRzaWRlIHBvcnRmb2xpbyBkaXJlY3RvcnknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgICAvLyBSZWxhdGl2ZSBwYXRocyB3aXRoIC4uIGFyZSBub3QgYWxsb3dlZFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBjb250YWlucyBkaXJlY3RvcnkgdHJhdmVyc2FsJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUGF0aCBub3JtYWxpemF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvdWxkIG5vdCBiZSBzYWZlbHkgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgIGVycm9yOiAnUEFUSF9OT1JNQUxJWkFUSU9OX0ZBSUxFRCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGZpbGUgZXh0ZW5zaW9uIChvbmx5IGFsbG93IHNhZmUgZXh0ZW5zaW9ucyBmb3IgcG9ydGZvbGlvIGNvbnRlbnQpXG4gICAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9ucyA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnLCAnLmpzb24nXTtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBwYXRoLmV4dG5hbWUobm9ybWFsaXplZFBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIGlmIChmaWxlRXh0ZW5zaW9uICYmICFhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRGlzYWxsb3dlZCBmaWxlIGV4dGVuc2lvbjogJHtmaWxlRXh0ZW5zaW9ufWAsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGFsbG93ZWRFeHRlbnNpb25zOiBhbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYEZpbGUgZXh0ZW5zaW9uICcke2ZpbGVFeHRlbnNpb259JyBpcyBub3QgYWxsb3dlZC4gQWxsb3dlZCBleHRlbnNpb25zOiAke2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9GSUxFX0VYVEVOU0lPTidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIGNoYXJhY3RlcnMgKG9ubHkgYWxsb3cgc2FmZSBjaGFyYWN0ZXJzKVxuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIGNvbnN0IHNhZmVGaWxlbmFtZVBhdHRlcm4gPSAvXlthLXpBLVowLTlcXC1fLlxccygpW1xcXXt9XSskLztcbiAgICAgIFxuICAgICAgaWYgKGJhc2VuYW1lICYmICFzYWZlRmlsZW5hbWVQYXR0ZXJuLnRlc3QoYmFzZW5hbWUpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6ICdGaWxlbmFtZSBjb250YWlucyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY2hhcmFjdGVycycsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGZpbGVuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgIGFsbG93ZWRQYXR0ZXJuOiBzYWZlRmlsZW5hbWVQYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIE9ubHkgbGV0dGVycywgbnVtYmVycywgc3BhY2VzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cywgYW5kIGNvbW1vbiBicmFja2V0cyBhcmUgYWxsb3dlZC4nLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uIHdpdGggY29ycmVjdCBldmVudCB0eXBlIGZvciBwYXRoIHZhbGlkYXRpb25cbiAgICAgIC8vIEZpeGVkOiBXYXMgdXNpbmcgVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTIHdoaWNoIGlzIHNlbWFudGljYWxseSBpbmNvcnJlY3QgZm9yIHBhdGggdmFsaWRhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiAnRmlsZSBwYXRoIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgb3JpZ2luYWxQYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGhMZW5ndGg6IG5vcm1hbGl6ZWRQYXRoLmxlbmd0aCxcbiAgICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmaWxlRXh0ZW5zaW9uIHx8ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FmZVBhdGg6IG5vcm1hbGl6ZWRQYXRoXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgZGV0YWlsczogYFBhdGggdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBmaWxlIHBhdGguIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1BBVEhfVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgbG9uZyBvcGVyYXRpb25zIHdpdGggcmVmcmVzaC1saWtlIGNhcGFiaWxpdGllc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBUb2tlbiByZWZyZXNoIGxvZ2ljIGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICogXG4gICAqIE5vdGU6IEdpdEh1YiBPQXV0aCBkZXZpY2UgZmxvdyB0b2tlbnMgZG9uJ3QgaGF2ZSB0cmFkaXRpb25hbCByZWZyZXNoIHRva2VucyxcbiAgICogYnV0IHdlIGNhbiBpbXBsZW1lbnQgc21hcnQgdmFsaWRhdGlvbiBhbmQgZ3VpZGFuY2UgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogQHBhcmFtIG9wZXJhdGlvblR5cGUgVHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEByZXR1cm5zIFRva2VuIG1hbmFnZW1lbnQgcmVzdWx0IHdpdGggcmVjb21tZW5kYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbihvcGVyYXRpb25UeXBlOiAncG9ydGZvbGlvX2NyZWF0aW9uJyB8ICdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nIHwgJ2ZpbGVfdXBsb2FkJyk6IFByb21pc2U8e1xuICAgIGNhblByb2NlZWQ6IGJvb2xlYW47XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaFJlY29tbWVuZGVkPzogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMudG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnTm8gR2l0SHViIHRva2VuIGF2YWlsYWJsZS4gUGxlYXNlIGF1dGhlbnRpY2F0ZSBmaXJzdC4nLFxuICAgICAgICAgICAgZXJyb3I6ICdOT19UT0tFTidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvciB0aGUgc3BlY2lmaWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdmFsaWRhdGlvbi5lcnJvclxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbG9uZyBvcGVyYXRpb24gdGhhdCBtaWdodCBiZW5lZml0IGZyb20gZnJlc2ggYXV0aGVudGljYXRpb25cbiAgICAgIGNvbnN0IGxvbmdPcGVyYXRpb25zID0gWydwb3J0Zm9saW9fY3JlYXRpb24nLCAnY29sbGVjdGlvbl9zdWJtaXNzaW9uJ107XG4gICAgICBjb25zdCBpc0xvbmdPcGVyYXRpb24gPSBsb25nT3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb25UeXBlKTtcblxuICAgICAgLy8gR2V0IHRva2VuIHR5cGUgdG8gZGV0ZXJtaW5lIHJlZnJlc2ggY2FwYWJpbGl0aWVzXG4gICAgICAvLyBjb2RlcWxbanMvY2xlYXItdGV4dC1sb2dnaW5nXSDigJQgT25seSB0b2tlblR5cGUgKGEgZGVzY3JpcHRpdmUgc3RyaW5nIGxpa2UgXCJPQXV0aCBBY2Nlc3MgVG9rZW5cIikgaXMgbG9nZ2VkLCBuZXZlciB0aGUgYWN0dWFsIHRva2VuIHZhbHVlXG4gICAgICBjb25zdCB0b2tlblR5cGUgPSB0aGlzLnRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgbGV0IHJlZnJlc2hSZWNvbW1lbmRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBGb3IgbG9uZyBvcGVyYXRpb25zLCBjaGVjayB0b2tlbiBhZ2UgYW5kIHJlY29tbWVuZCByZWZyZXNoIGlmIG5lZWRlZFxuICAgICAgaWYgKGlzTG9uZ09wZXJhdGlvbiAmJiB2YWxpZGF0aW9uLmlzTmVhckV4cGlyeSkge1xuICAgICAgICByZWZyZXNoUmVjb21tZW5kZWQgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiAnTG9uZyBvcGVyYXRpb24gZGV0ZWN0ZWQgd2l0aCBhZ2luZyB0b2tlbiAtIHJlZnJlc2ggcmVjb21tZW5kZWQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsb2dnZXIud2FybignTG9uZyBvcGVyYXRpb24gd2l0aCBwb3RlbnRpYWxseSBhZ2luZyB0b2tlbiBkZXRlY3RlZCcsIHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlLWF1dGhlbnRpY2F0aW5nIGlmIG9wZXJhdGlvbiBmYWlscydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBPQXV0aCB0b2tlbnMgaW4gbG9uZyBvcGVyYXRpb25zLCB3ZSBjYW4gcHJvdmlkZSBndWlkYW5jZVxuICAgICAgaWYgKHRva2VuVHlwZSA9PT0gJ09BdXRoIEFjY2VzcyBUb2tlbicgJiYgaXNMb25nT3BlcmF0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdPQXV0aCB0b2tlbiBkZXRlY3RlZCBmb3IgbG9uZyBvcGVyYXRpb24nLCB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgZ3VpZGFuY2U6ICdPQXV0aCB0b2tlbnMgYXJlIHRpbWUtbGltaXRlZC4gSWYgb3BlcmF0aW9uIGZhaWxzLCByZS1hdXRoZW50aWNhdGUgdXNpbmcgc2V0dXBfZ2l0aHViX2F1dGgnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB0b2tlbiBtYW5hZ2VtZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiAnVG9rZW4gbWFuYWdlbWVudCBzdWNjZXNzZnVsIGZvciBsb25nIG9wZXJhdGlvbicsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgaXNMb25nT3BlcmF0aW9uLFxuICAgICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUHJvY2VlZDogdHJ1ZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBUb2tlbiBtYW5hZ2VtZW50IGVycm9yOiAke2Vycm9yLm1lc3NhZ2UgfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIG1hbmFnZSB0b2tlbiBmb3Igb3BlcmF0aW9uLiBQbGVhc2UgY2hlY2sgeW91ciBhdXRoZW50aWNhdGlvbiBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgZXJyb3I6ICdUT0tFTl9NQU5BR0VNRU5UX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB1c2VyIGd1aWRhbmNlIGZvciB0b2tlbiByZWZyZXNoIHdoZW4gb3BlcmF0aW9ucyBmYWlsIGR1ZSB0byB0b2tlbiBpc3N1ZXNcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogVXNlciBndWlkYW5jZSBmb3IgYXV0aGVudGljYXRpb24gcmVmcmVzaFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZShvcGVyYXRpb25UeXBlOiBzdHJpbmcsIHRva2VuVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZ3VpZGFuY2UgPSAnXFxuXFxu8J+UhCAqKlRva2VuIFJlZnJlc2ggR3VpZGFuY2UqKjpcXG4nO1xuICAgIFxuICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgT0F1dGggdG9rZW4gbWF5IGhhdmUgZXhwaXJlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFJ1biBgc2V0dXBfZ2l0aHViX2F1dGhgIHRvIGF1dGhlbnRpY2F0ZSBhZ2Fpblxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZyZXNoIHRva2VuIGZvciBjb250aW51ZWQgYWNjZXNzXFxuJztcbiAgICB9IGVsc2UgaWYgKHRva2VuVHlwZSA9PT0gJ1BlcnNvbmFsIEFjY2VzcyBUb2tlbicpIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBQZXJzb25hbCBBY2Nlc3MgVG9rZW4gbWF5IGhhdmUgZXhwaXJlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIENoZWNrIHlvdXIgR2l0SHViIHNldHRpbmdzOiBodHRwczovL2dpdGh1Yi5jb20vc2V0dGluZ3MvdG9rZW5zXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgR2VuZXJhdGUgYSBuZXcgdG9rZW4gaWYgbmVlZGVkIGFuZCB1cGRhdGUgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlXFxuJztcbiAgICB9IGVsc2Uge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIEdpdEh1YiB0b2tlbiBtYXkgaGF2ZSBleHBpcmVkIG9yIGJlZW4gcmV2b2tlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFJlLWF1dGhlbnRpY2F0ZSB1c2luZyBgc2V0dXBfZ2l0aHViX2F1dGhgXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgRW5zdXJlIHlvdXIgdG9rZW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uc1xcbic7XG4gICAgfVxuXG4gICAgZ3VpZGFuY2UgKz0gYFxcbioqT3BlcmF0aW9uKio6ICR7b3BlcmF0aW9uVHlwZX1cXG5gO1xuICAgIGd1aWRhbmNlICs9ICcqKlJlcXVpcmVkIHNjb3BlcyoqOiByZXBvLCB1c2VyOmVtYWlsXFxuXFxuJztcbiAgICBndWlkYW5jZSArPSAn8J+SoSAqKlRpcCoqOiBGcmVzaCB0b2tlbnMgd29yayBiZXR0ZXIgZm9yIGNvbXBsZXggb3BlcmF0aW9ucyBsaWtlIHBvcnRmb2xpbyBjcmVhdGlvbi4nO1xuXG4gICAgcmV0dXJuIGd1aWRhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgR2l0SHViIHJlcG9zaXRvcnkgYWNjZXNzIGFuZCBlbnN1cmVzIHBvcnRmb2xpbyByZXBvc2l0b3J5IGV4aXN0c1xuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZVxuICAgKiBAcmV0dXJucyBTZXR1cCByZXN1bHQgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBHaXRIdWJSZXBvc2l0b3J5KGF1dGhTdGF0dXM6IGFueSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFNtYXJ0IHRva2VuIG1hbmFnZW1lbnQgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdwb3J0Zm9saW9fY3JlYXRpb24nKTtcbiAgICBpZiAoIXRva2VuTWFuYWdlbWVudC5jYW5Qcm9jZWVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHRva2VuTWFuYWdlbWVudC5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRva2VuTWFuYWdlbWVudC50b2tlbiE7XG5cbiAgICAvLyBQcm92aWRlIHVzZXIgZ3VpZGFuY2UgaWYgcmVmcmVzaCBpcyByZWNvbW1lbmRlZCBmb3IgdGhpcyBsb25nIG9wZXJhdGlvblxuICAgIGlmICh0b2tlbk1hbmFnZW1lbnQucmVmcmVzaFJlY29tbWVuZGVkKSB7XG4gICAgICBjb25zdCB0b2tlblR5cGUgPSB0aGlzLnRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgY29uc3QgZ3VpZGFuY2UgPSB0aGlzLmZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKCdwb3J0Zm9saW8gY3JlYXRpb24nLCB0b2tlblR5cGUpO1xuICAgICAgbG9nZ2VyLndhcm4oYFRva2VuIHJlZnJlc2ggcmVjb21tZW5kZWQgZm9yIHBvcnRmb2xpbyBjcmVhdGlvbjoke2d1aWRhbmNlfWApO1xuICAgIH1cblxuICAgIHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuc2V0VG9rZW4odG9rZW4pO1xuXG4gICAgLy8gQ2hlY2sgaWYgcG9ydGZvbGlvIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IHVzZXJuYW1lID0gYXV0aFN0YXR1cy51c2VybmFtZSB8fCAndW5rbm93bic7XG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5jaGVja1BvcnRmb2xpb0V4aXN0cyh1c2VybmFtZSk7XG4gICAgXG4gICAgaWYgKCFwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyBwb3J0Zm9saW8gcmVwb3NpdG9yeS4uLicpO1xuICAgICAgLy8gUmVxdWVzdCBjb25zZW50IGZvciBwb3J0Zm9saW8gY3JlYXRpb25cbiAgICAgIGNvbnN0IHJlcG9VcmwgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZSwgdHJ1ZSk7XG4gICAgICBpZiAoIXJlcG9VcmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIGNyZWF0ZSBwb3J0Zm9saW8gcmVwb3NpdG9yeScsXG4gICAgICAgICAgICBlcnJvcjogJ0NSRUFURV9GQUlMRUQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8gcmVwb3NpdG9yeVxuICAgKiBQcmV2ZW50cyBkdXBsaWNhdGUgdXBsb2FkcyBieSBjb21wYXJpbmcgY29udGVudCBoYXNoZXNcbiAgICogQHBhcmFtIHJlcG9GdWxsTmFtZSBHaXRIdWIgcmVwb3NpdG9yeSBmdWxsIG5hbWUgKG93bmVyL3JlcG8pXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlIGluIHRoZSByZXBvc2l0b3J5XG4gICAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgdG8gY2hlY2sgYWdhaW5zdCBleGlzdGluZ1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGlkZW50aWNhbCBjb250ZW50IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrRXhpc3RpbmdDb250ZW50KFxuICAgIHJlcG9GdWxsTmFtZTogc3RyaW5nLCBcbiAgICBmaWxlUGF0aDogc3RyaW5nLCBcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQXR0ZW1wdCB0byBmZXRjaCBleGlzdGluZyBmaWxlIGZyb20gR2l0SHViXG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3JlcG9GdWxsTmFtZX0vY29udGVudHMvJHtmaWxlUGF0aH1gO1xuICAgICAgXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdCBhIGR1cGxpY2F0ZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBjaGVjayBleGlzdGluZyBjb250ZW50Jywge1xuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHBhdGg6IGZpbGVQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbiBlcnJvciwgYWxsb3cgdXBsb2FkIHRvIHByb2NlZWRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgXG4gICAgICAvLyBHaXRIdWIgcmV0dXJucyBjb250ZW50IGFzIGJhc2U2NFxuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gQnVmZmVyLmZyb20oZGF0YS5jb250ZW50LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICBcbiAgICAgIC8vIENvbXBhcmUgY29udGVudCBoYXNoZXNcbiAgICAgIGNvbnN0IGV4aXN0aW5nSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShleGlzdGluZ0NvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICBjb25zdCBuZXdIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gZXhpc3RpbmdIYXNoID09PSBuZXdIYXNoO1xuICAgICAgXG4gICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0R1cGxpY2F0ZSBjb250ZW50IGRldGVjdGVkLCBza2lwcGluZyB1cGxvYWQnLCB7XG4gICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgaGFzaDogbmV3SGFzaC5zdWJzdHJpbmcoMCwgOCkgLy8gTG9nIHBhcnRpYWwgaGFzaCBmb3IgZGVidWdnaW5nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gaXNEdXBsaWNhdGU7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGNoZWNraW5nIGZvciBleGlzdGluZyBjb250ZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgICAvLyBPbiBlcnJvciwgYWxsb3cgdXBsb2FkIHRvIHByb2NlZWQgcmF0aGVyIHRoYW4gYmxvY2tpbmdcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gaXNzdWUgZm9yIHRoaXMgY29udGVudCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgTmFtZSBvZiB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlciBzdWJtaXR0aW5nIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSB0b2tlbiBHaXRIdWIgdG9rZW4gZm9yIEFQSSBhY2Nlc3NcbiAgICogQHJldHVybnMgVVJMIG9mIGV4aXN0aW5nIGlzc3VlIGlmIGZvdW5kLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0V4aXN0aW5nSXNzdWUoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgZXhpc3RpbmcgaXNzdWVzIHdpdGggdGhpcyBlbGVtZW50IG5hbWVcbiAgICAgIC8vIFVzaW5nIGJvdGggdGl0bGUgYW5kIGF1dGhvciB0byBlbnN1cmUgaXQncyB0aGUgc2FtZSBzdWJtaXNzaW9uXG4gICAgICBjb25zdCBxdWVyeSA9IGByZXBvOkRvbGxob3VzZU1DUC9jb2xsZWN0aW9uIGlzOmlzc3VlIFwiJHtlbGVtZW50TmFtZX1cIiBpbjp0aXRsZSBhdXRob3I6JHt1c2VybmFtZX1gO1xuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vc2VhcmNoL2lzc3Vlcz9xPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0mc29ydD1jcmVhdGVkJm9yZGVyPWRlc2NgO1xuICAgICAgXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBzZWFyY2ggZm9yIGV4aXN0aW5nIGlzc3VlcycsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBcbiAgICAgIGlmIChkYXRhLml0ZW1zICYmIGRhdGEuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBGb3VuZCBleGlzdGluZyBpc3N1ZShzKVxuICAgICAgICBjb25zdCBleGlzdGluZ0lzc3VlID0gZGF0YS5pdGVtc1swXTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0ZvdW5kIGV4aXN0aW5nIGNvbGxlY3Rpb24gaXNzdWUnLCB7XG4gICAgICAgICAgaXNzdWVVcmw6IGV4aXN0aW5nSXNzdWUuaHRtbF91cmwsXG4gICAgICAgICAgZWxlbWVudE5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0lzc3VlLmh0bWxfdXJsO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRXJyb3IgY2hlY2tpbmcgZm9yIGV4aXN0aW5nIGNvbGxlY3Rpb24gaXNzdWUnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVsZW1lbnROYW1lXG4gICAgICB9KTtcbiAgICAgIC8vIE9uIGVycm9yLCBhbGxvdyBzdWJtaXNzaW9uIHRvIHByb2NlZWRcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGVzIHRoZSBjb21wbGV0ZSByZXNwb25zZSB3b3JrZmxvd1xuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWUgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIENvbXBsZXRlIHN1Ym1pc3Npb24gcmVzdWx0IHdpdGggc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1Ym1pdEVsZW1lbnRBbmRIYW5kbGVSZXNwb25zZShcbiAgICBzYWZlTmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBhdXRoU3RhdHVzOiBhbnksXG4gICAgbG9jYWxQYXRoPzogc3RyaW5nICAvLyBMb2NhbCBmaWxlIHBhdGggZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICApOiBQcm9taXNlPFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0PiB7XG4gICAgLy8gRFVQTElDQVRFIERFVEVDVElPTjogQ2hlY2sgaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBpbiBwb3J0Zm9saW9cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSBgJHthdXRoU3RhdHVzLnVzZXJuYW1lfS8ke3RoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuZ2V0UmVwb3NpdG9yeU5hbWUoKX1gO1xuICAgIC8vIElzc3VlICM4MTU6IFVzZSBjb3JyZWN0IGZpbGUgZXh0ZW5zaW9uIHBlciBlbGVtZW50IHR5cGVcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2VsZW1lbnRUeXBlfS8ke3NhZmVOYW1lfSR7Z2V0RWxlbWVudEZpbGVFeHRlbnNpb24oZWxlbWVudFR5cGUpfWA7XG4gICAgXG4gICAgLy8gUHJlcGFyZSB0aGUgZnVsbCBjb250ZW50IHRoYXQgd291bGQgYmUgc2F2ZWRcbiAgICAvLyBJc3N1ZSAjODUyOiBNZW1vcmllcyBhcmUgcHVyZSBZQU1MIOKAlCBkb24ndCB3cmFwIGluIG1hcmtkb3duIGZyb250bWF0dGVyXG4gICAgY29uc3QgaXNZYW1sVHlwZSA9IGdldEVsZW1lbnRGaWxlRXh0ZW5zaW9uKGVsZW1lbnRUeXBlKSA9PT0gJy55YW1sJztcbiAgICBjb25zdCBmdWxsQ29udGVudCA9IGlzWWFtbFR5cGVcbiAgICAgID8gY29udGVudCAgLy8gWUFNTCBlbGVtZW50czogdXNlIHJhdyBjb250ZW50IChtYXRjaGVzIHNlcmlhbGl6ZSgpIG91dHB1dClcbiAgICAgIDogYC0tLVxcbiR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpfVxcbi0tLVxcblxcbiR7Y29udGVudH1gO1xuICAgIFxuICAgIGNvbnN0IGlzRHVwbGljYXRlID0gYXdhaXQgdGhpcy5jaGVja0V4aXN0aW5nQ29udGVudChcbiAgICAgIHJlcG9GdWxsTmFtZSwgXG4gICAgICBmaWxlUGF0aCwgXG4gICAgICBmdWxsQ29udGVudCxcbiAgICAgIGF1dGhTdGF0dXMudG9rZW5cbiAgICApO1xuICAgIFxuICAgIGxldCBmaWxlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgIC8vIENvbnRlbnQgYWxyZWFkeSBleGlzdHMsIGNvbnN0cnVjdCB0aGUgVVJMIHdpdGhvdXQgdXBsb2FkaW5nXG4gICAgICBmaWxlVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9GdWxsTmFtZX0vYmxvYi9tYWluLyR7ZmlsZVBhdGh9YDtcbiAgICAgIGxvZ2dlci5pbmZvKCdTa2lwcGVkIGR1cGxpY2F0ZSB1cGxvYWQgdG8gcG9ydGZvbGlvJywge1xuICAgICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWUsXG4gICAgICAgIHBhdGg6IGZpbGVQYXRoXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGVsZW1lbnQgc3RydWN0dXJlIHRvIHNhdmVcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IFBvcnRmb2xpb0VsZW1lbnQgPSB7XG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgY29udGVudFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gVFlQRSBTQUZFVFkgRklYICMyOiBVc2UgYWRhcHRlciBwYXR0ZXJuIGluc3RlYWQgb2YgY29tcGxleCB0eXBlIGNhc3RpbmdcbiAgICAgIC8vIFByZXZpb3VzbHk6IGVsZW1lbnQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLnNhdmVFbGVtZW50PlswXVxuICAgICAgLy8gTm93OiBDbGVhbiBhZGFwdGVyIHBhdHRlcm4gdGhhdCBpbXBsZW1lbnRzIElFbGVtZW50IGludGVyZmFjZSBwcm9wZXJseVxuICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlcihlbGVtZW50KTtcbiAgICAgIFxuICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBmaWxlVXJsID0gYXdhaXQgdGhpcy5zYXZlRWxlbWVudFdpdGhSZXRyeShhZGFwdGVyLCBzYWZlTmFtZSwgZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIWZpbGVVcmwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBHaXRIdWIgcG9ydGZvbGlvIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLlxcblxcbicgK1xuICAgICAgICAgICAgICAgICfwn5KhICoqVHJvdWJsZXNob290aW5nIFRpcHMqKjpcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIENoZWNrIHlvdXIgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiBgZ2ggYXV0aCBzdGF0dXNgXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBWZXJpZnkgcmVwb3NpdG9yeSBwZXJtaXNzaW9uc1xcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVHJ5IGFnYWluIGluIGEgZmV3IG1pbnV0ZXMgKEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHMpXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayBHaXRIdWIgc3RhdHVzOiBodHRwczovL3N0YXR1cy5naXRodWIuY29tJyxcbiAgICAgICAgZXJyb3I6ICdTQVZFX0ZBSUxFRCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTG9nIHN1Ym1pc3Npb24gcmVzdWx0IChETUNQLVNFQy0wMDYpXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB3YXMgYSBkdXBsaWNhdGUgc2tpcCBvciBhY3R1YWwgdXBsb2FkXG4gICAgY29uc3Qgd2FzRHVwbGljYXRlID0gZmlsZVVybCAmJiBmaWxlVXJsLmluY2x1ZGVzKCdibG9iL21haW4vJykgJiYgIWZpbGVVcmwuaW5jbHVkZXMoJy9jb21taXQvJyk7XG4gICAgXG4gICAgaWYgKHdhc0R1cGxpY2F0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwZWQgZHVwbGljYXRlIHVwbG9hZCBmb3IgJHtzYWZlTmFtZX0gLSBhbHJlYWR5IGluIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgICBmaWxlVXJsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgJHtzYWZlTmFtZX0gdG8gR2l0SHViIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgICBmaWxlVXJsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBjb25zdCBjb2xsZWN0aW9uVG9rZW5NYW5hZ2VtZW50ID0gYXdhaXQgdGhpcy5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24oJ2NvbGxlY3Rpb25fc3VibWlzc2lvbicpO1xuICAgIGlmICghY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5jYW5Qcm9jZWVkKSB7XG4gICAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IGZhaWxlZCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uLCBidXQgbWFpbiBzdWJtaXNzaW9uIHN1Y2NlZWRlZFxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5lcnJvcj8ubWVzc2FnZSB8fCAnVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQnO1xuICAgICAgY29uc3QgcG9ydGZvbGlvTWVzc2FnZSA9IHdhc0R1cGxpY2F0ZSA/IFxuICAgICAgICBg4pyFICR7c2FmZU5hbWV9IGFscmVhZHkgZXhpc3RzIGluIHlvdXIgR2l0SHViIHBvcnRmb2xpbyAobm8gY2hhbmdlcyBuZWVkZWQpYCA6XG4gICAgICAgIGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFgO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgJHtwb3J0Zm9saW9NZXNzYWdlfVxcbvCfk4EgUG9ydGZvbGlvIFVSTDogJHtmaWxlVXJsfVxcblxcbuKaoO+4jyBDb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2tpcHBlZDogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgdXJsOiBmaWxlVXJsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC50b2tlbiE7XG5cbiAgICAvLyBQcm92aWRlIHJlZnJlc2ggZ3VpZGFuY2UgaWYgcmVjb21tZW5kZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgIGlmIChjb2xsZWN0aW9uVG9rZW5NYW5hZ2VtZW50LnJlZnJlc2hSZWNvbW1lbmRlZCkge1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW9uIHN1Ym1pc3Npb24gcHJvY2VlZGluZyB3aXRoIGFnaW5nIHRva2VuJywge1xuICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnSWYgY29sbGVjdGlvbiBzdWJtaXNzaW9uIGZhaWxzLCB0cnkgcmUtYXV0aGVudGljYXRpbmcgd2l0aCBzZXR1cF9naXRodWJfYXV0aCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogQXNrIHVzZXIgaWYgdGhleSB3YW50IHRvIHN1Ym1pdCB0byBjb2xsZWN0aW9uXG4gICAgLy8gVGhpcyBjb21wbGV0ZXMgdGhlIGNvbW11bml0eSBjb250cmlidXRpb24gd29ya2Zsb3dcbiAgICBjb25zdCBjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdCA9IGF3YWl0IHRoaXMucHJvbXB0Rm9yQ29sbGVjdGlvblN1Ym1pc3Npb24oe1xuICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBwb3J0Zm9saW9Vcmw6IGZpbGVVcmwsXG4gICAgICB1c2VybmFtZTogYXV0aFN0YXR1cy51c2VybmFtZSB8fCAndW5rbm93bicsXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIHRva2VuLFxuICAgICAgbG9jYWxQYXRoICAvLyBQYXNzIHRoZSBsb2NhbCBmaWxlIHBhdGggZm9yIHJlYWRpbmcgY29udGVudFxuICAgIH0pO1xuXG4gICAgLy8gQnVpbGQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgYmFzZWQgb24gd2hhdCBoYXBwZW5lZFxuICAgIGNvbnN0IHBvcnRmb2xpb01lc3NhZ2UgPSB3YXNEdXBsaWNhdGUgPyBcbiAgICAgIGDinIUgJHtzYWZlTmFtZX0gYWxyZWFkeSBleGlzdHMgaW4geW91ciBHaXRIdWIgcG9ydGZvbGlvIChubyBjaGFuZ2VzIG5lZWRlZClgIDpcbiAgICAgIGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFgO1xuICAgIFxuICAgIGxldCBtZXNzYWdlID0gYCR7cG9ydGZvbGlvTWVzc2FnZX1cXG5gO1xuICAgIG1lc3NhZ2UgKz0gYPCfk4EgUG9ydGZvbGlvIFVSTDogJHtmaWxlVXJsfVxcblxcbmA7XG4gICAgXG4gICAgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LnN1Ym1pdHRlZCkge1xuICAgICAgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmlzRHVwbGljYXRlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk4sgQ29sbGVjdGlvbiBpc3N1ZSBhbHJlYWR5IGV4aXN0cyAobm8gbmV3IHN1Ym1pc3Npb24gbmVlZGVkKVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCflJcgSXNzdWU6ICR7Y29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuaXNzdWVVcmx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfjokgQWxzbyBzdWJtaXR0ZWQgdG8gRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gZm9yIGNvbW11bml0eSByZXZpZXchXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TiyBJc3N1ZTogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc3N1ZVVybH1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZGVjbGluZWQpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgWW91IGNhbiBzdWJtaXQgdG8gdGhlIGNvbGxlY3Rpb24gbGF0ZXIgdXNpbmcgdGhlIHNhbWUgY29tbWFuZC5gO1xuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYOKaoO+4jyBDb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbGVkOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmVycm9yfVxcbmA7XG4gICAgICBtZXNzYWdlICs9IGDwn5KhIFlvdSBjYW4gbWFudWFsbHkgc3VibWl0IGF0OiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vaXNzdWVzL25ld2A7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdXJsOiBmaWxlVXJsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8U3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWluZ3M6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygn8J+agCBTVUJNSVNTSU9OIFdPUktGTE9XIFNUQVJUSU5HJywge1xuICAgICAgcGFyYW1zOiBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9KTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gU3RlcCAxOiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGlucHV0IHBhcmFtZXRlcnNcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5OLIFN0ZXAgMS84OiBWYWxpZGF0aW5nIHBhcmFtZXRlcnMuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXAxU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmROb3JtYWxpemVQYXJhbXMocGFyYW1zKTtcbiAgICAgIHRpbWluZ3NbJ3ZhbGlkYXRpb24nXSA9IERhdGUubm93KCkgLSBzdGVwMVN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDEgY29tcGxldGUgKCR7dGltaW5nc1sndmFsaWRhdGlvbiddfW1zKWApO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FmZU5hbWUgPSB2YWxpZGF0aW9uUmVzdWx0LnNhZmVOYW1lITtcblxuICAgICAgLy8gU3RlcCAyOiBGaW5kIGNvbnRlbnQgbG9jYWxseSB3aXRoIHNtYXJ0IHR5cGUgZGV0ZWN0aW9uXG4gICAgICBsb2dnZXIuaW5mbygn8J+UjSBTdGVwIDIvODogRmluZGluZyBjb250ZW50IGxvY2FsbHkuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXAyU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMuZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oc2FmZU5hbWUhLCBwYXJhbXMudHlwZSwgcGFyYW1zLm5hbWUpO1xuICAgICAgdGltaW5nc1snY29udGVudERpc2NvdmVyeSddID0gRGF0ZS5ub3coKSAtIHN0ZXAyU3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgMiBjb21wbGV0ZSAoJHt0aW1pbmdzWydjb250ZW50RGlzY292ZXJ5J119bXMpYCwge1xuICAgICAgICBmb3VuZDogY29udGVudFJlc3VsdC5zdWNjZXNzLFxuICAgICAgICBlbGVtZW50VHlwZTogY29udGVudFJlc3VsdC5lbGVtZW50VHlwZSxcbiAgICAgICAgcGF0aDogY29udGVudFJlc3VsdC5sb2NhbFBhdGhcbiAgICAgIH0pO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb250ZW50UmVzdWx0LmVsZW1lbnRUeXBlITtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IGNvbnRlbnRSZXN1bHQubG9jYWxQYXRoITtcblxuICAgICAgLy8gU3RlcCAzOiBWYWxpZGF0ZSBmaWxlIGFuZCBjb250ZW50IHNlY3VyaXR5IChpbmNsdWRpbmcgc2l6ZSBjaGVjaylcbiAgICAgIC8vIFRoaXMgaGFwcGVucyBCRUZPUkUgYXV0aGVudGljYXRpb24gc28gdXNlcnMgZ2V0IGltbWVkaWF0ZSBmZWVkYmFjayBhYm91dCBmaWxlIGlzc3Vlc1xuICAgICAgbG9nZ2VyLmluZm8oJ/CflJIgU3RlcCAzLzg6IFZhbGlkYXRpbmcgc2VjdXJpdHkgYW5kIGZpbGUgc2l6ZS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDNTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBzZWN1cml0eVJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVGaWxlQW5kQ29udGVudChsb2NhbFBhdGgpO1xuICAgICAgdGltaW5nc1snc2VjdXJpdHknXSA9IERhdGUubm93KCkgLSBzdGVwM1N0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDMgY29tcGxldGUgKCR7dGltaW5nc1snc2VjdXJpdHknXX1tcylgKTtcbiAgICAgIGlmICghc2VjdXJpdHlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gc2VjdXJpdHlSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudCA9IHNlY3VyaXR5UmVzdWx0LmNvbnRlbnQhO1xuXG4gICAgICAvLyBTdGVwIDQ6IENoZWNrIGF1dGhlbnRpY2F0aW9uIHN0YXR1c1xuICAgICAgLy8gVGhpcyBoYXBwZW5zIEFGVEVSIGZpbGUgdmFsaWRhdGlvbiBzbyB1c2VycyBkb24ndCBuZWVkIHRvIGF1dGgganVzdCB0byBsZWFybiB0aGVpciBmaWxlIGlzIHRvbyBsYXJnZVxuICAgICAgbG9nZ2VyLmluZm8oJ/CflJAgU3RlcCA0Lzg6IENoZWNraW5nIGF1dGhlbnRpY2F0aW9uLi4uJyk7XG4gICAgICBjb25zdCBzdGVwNFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGF1dGhSZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrQXV0aGVudGljYXRpb24oKTtcbiAgICAgIHRpbWluZ3NbJ2F1dGhlbnRpY2F0aW9uJ10gPSBEYXRlLm5vdygpIC0gc3RlcDRTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCA0IGNvbXBsZXRlICgke3RpbWluZ3NbJ2F1dGhlbnRpY2F0aW9uJ119bXMpYCwge1xuICAgICAgICB1c2VybmFtZTogYXV0aFJlc3VsdC5hdXRoU3RhdHVzPy51c2VybmFtZSxcbiAgICAgICAgaGFzVG9rZW46ICEhYXV0aFJlc3VsdC5hdXRoU3RhdHVzPy5oYXNUb2tlblxuICAgICAgfSk7XG4gICAgICBpZiAoIWF1dGhSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gYXV0aFJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXV0aFJlc3VsdC5hdXRoU3RhdHVzITtcblxuICAgICAgLy8gU3RlcCA1OiBQcmVwYXJlIG1ldGFkYXRhIGZvciBlbGVtZW50XG4gICAgICBsb2dnZXIuaW5mbygn8J+TnSBTdGVwIDUvODogUHJlcGFyaW5nIG1ldGFkYXRhLi4uJyk7XG4gICAgICBjb25zdCBzdGVwNVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wcmVwYXJlRWxlbWVudE1ldGFkYXRhKHNhZmVOYW1lISwgZWxlbWVudFR5cGUsIGF1dGhTdGF0dXMsIGxvY2FsUGF0aCk7XG4gICAgICB0aW1pbmdzWydtZXRhZGF0YSddID0gRGF0ZS5ub3coKSAtIHN0ZXA1U3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgNSBjb21wbGV0ZSAoJHt0aW1pbmdzWydtZXRhZGF0YSddfW1zKWAsIHtcbiAgICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0ZXAgNjogU2V0IHVwIEdpdEh1YiByZXBvc2l0b3J5IGFjY2Vzc1xuICAgICAgbG9nZ2VyLmluZm8oJ/CflKcgU3RlcCA2Lzg6IFNldHRpbmcgdXAgR2l0SHViIHJlcG9zaXRvcnkuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXA2U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVwb1Jlc3VsdCA9IGF3YWl0IHRoaXMuc2V0dXBHaXRIdWJSZXBvc2l0b3J5KGF1dGhTdGF0dXMpO1xuICAgICAgdGltaW5nc1sncmVwb1NldHVwJ10gPSBEYXRlLm5vdygpIC0gc3RlcDZTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCA2IGNvbXBsZXRlICgke3RpbWluZ3NbJ3JlcG9TZXR1cCddfW1zKWAsIHtcbiAgICAgICAgc3VjY2VzczogcmVwb1Jlc3VsdC5zdWNjZXNzXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVwb1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiByZXBvUmVzdWx0LmVycm9yITtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCA3OiBTdWJtaXQgZWxlbWVudCB0byBwb3J0Zm9saW8gYW5kIGhhbmRsZSBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICAgIGxvZ2dlci5pbmZvKCfwn5OkIFN0ZXAgNy84OiBTdWJtaXR0aW5nIHRvIHBvcnRmb2xpby4uLicpO1xuICAgICAgY29uc3Qgc3RlcDdTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdEVsZW1lbnRBbmRIYW5kbGVSZXNwb25zZShcbiAgICAgICAgc2FmZU5hbWUhLCBcbiAgICAgICAgZWxlbWVudFR5cGUsIFxuICAgICAgICBtZXRhZGF0YSwgXG4gICAgICAgIGNvbnRlbnQsIFxuICAgICAgICBhdXRoU3RhdHVzLFxuICAgICAgICBsb2NhbFBhdGggIC8vIFBhc3MgZmlsZSBwYXRoIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICAgICk7XG4gICAgICB0aW1pbmdzWydzdWJtaXNzaW9uJ10gPSBEYXRlLm5vdygpIC0gc3RlcDdTdGFydDtcbiAgICAgIFxuICAgICAgLy8gU3RlcCA4OiBGaW5hbCByZXBvcnRpbmdcbiAgICAgIHRpbWluZ3NbJ3RvdGFsJ10gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ+KcqCBTVUJNSVNTSU9OIFdPUktGTE9XIENPTVBMRVRFJywge1xuICAgICAgICBzdWNjZXNzOiByZXN1bHQuc3VjY2VzcyxcbiAgICAgICAgdGltaW5ncyxcbiAgICAgICAgdG90YWxUaW1lOiBgJHt0aW1pbmdzWyd0b3RhbCddfW1zYFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogRW5oYW5jZWQgZXJyb3IgaGFuZGxpbmcgd2l0aCB0b2tlbiByZWZyZXNoIGd1aWRhbmNlXG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ3N1Ym1pdFRvUG9ydGZvbGlvJywgZXJyb3IsIHtcbiAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5uYW1lLFxuICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLnR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBlcnJvciBpcyB0b2tlbi1yZWxhdGVkIGFuZCBwcm92aWRlIHJlZnJlc2ggZ3VpZGFuY2VcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGlzVG9rZW5FcnJvciA9IGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0b2tlbicpIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXV0aCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCc0MDEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnNDAzJyk7XG5cbiAgICAgIGxldCBmb3JtYXR0ZWRFcnJvciA9IEVycm9ySGFuZGxlci5mb3JtYXRGb3JSZXNwb25zZShlcnJvcik7XG5cbiAgICAgIGlmIChpc1Rva2VuRXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBHZXQgY3VycmVudCB0b2tlbiB0byBkZXRlcm1pbmUgdHlwZSBmb3IgZ3VpZGFuY2VcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbikge1xuICAgICAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKGN1cnJlbnRUb2tlbik7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoR3VpZGFuY2UgPSB0aGlzLmZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKCdwb3J0Zm9saW8gc3VibWlzc2lvbicsIHRva2VuVHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFwcGVuZCByZWZyZXNoIGd1aWRhbmNlIHRvIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRFcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZEVycm9yLm1lc3NhZ2UgKz0gcmVmcmVzaEd1aWRhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZ2V0IHRva2VuIGluZm8sIHByb3ZpZGUgZ2VuZXJpYyBndWlkYW5jZVxuICAgICAgICAgIGZvcm1hdHRlZEVycm9yLm1lc3NhZ2UgKz0gJ1xcblxcbvCflIQgKipBdXRoZW50aWNhdGlvbiBJc3N1ZSoqOiBUcnkgcnVubmluZyBgc2V0dXBfZ2l0aHViX2F1dGhgIHRvIHJlZnJlc2ggeW91ciBhdXRoZW50aWNhdGlvbi4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtYXR0ZWRFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvbXB0cyB1c2VyIHRvIHN1Ym1pdCBjb250ZW50IHRvIHRoZSBEb2xsaG91c2VNQ1AgY29sbGVjdGlvblxuICAgKiBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IENvbXBsZXRlIHRoZSBjb21tdW5pdHkgY29udHJpYnV0aW9uIHdvcmtmbG93XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb21wdEZvckNvbGxlY3Rpb25TdWJtaXNzaW9uKHBhcmFtczoge1xuICAgIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICAgIHBvcnRmb2xpb1VybDogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YTtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGxvY2FsUGF0aD86IHN0cmluZzsgIC8vIFBhdGggdG8gdGhlIGxvY2FsIGVsZW1lbnQgZmlsZVxuICB9KTogUHJvbWlzZTx7IHN1Ym1pdHRlZDogYm9vbGVhbjsgZGVjbGluZWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nOyBpc3N1ZVVybD86IHN0cmluZzsgaXNEdXBsaWNhdGU/OiBib29sZWFuIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIHByb21wdCBtZXNzYWdlIGZvciB0aGUgdXNlclxuICAgICAgLy8gTm90ZTogSW4gTUNQIGNvbnRleHQsIHdlIGNhbid0IGRvIGludGVyYWN0aXZlIHByb21wdHMsIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAgIC8vIGVpdGhlciBtYWtlIHRoaXMgYXV0b21hdGljIG9yIHJlcXVpcmUgYSBwYXJhbWV0ZXJcbiAgICAgIFxuICAgICAgLy8gRm9yIG5vdywgbGV0J3MgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgICAgLy8gdG8gYXV0by1zdWJtaXQgdG8gY29sbGVjdGlvbiAob3B0LWluIGJlaGF2aW9yKVxuICAgICAgY29uc3QgYXV0b1N1Ym1pdCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OID09PSAndHJ1ZSc7XG4gICAgICBcbiAgICAgIGlmICghYXV0b1N1Ym1pdCkge1xuICAgICAgICAvLyBVc2VyIGhhc24ndCBvcHRlZCBpbiB0byBhdXRvLXN1Ym1pc3Npb25cbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBza2lwcGVkIChzZXQgRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT049dHJ1ZSB0byBlbmFibGUpJyk7XG4gICAgICAgIC8vIFVzZSBDT0xMX0NGR18wMDEgZXJyb3IgY29kZSBmb3IgYXV0by1zdWJtaXQgZGlzYWJsZWRcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZm9ybWF0Q29sbGVjdGlvbkVycm9yKENvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9DRkdfMDAxLCA1LCA1KTtcbiAgICAgICAgcmV0dXJuIHsgc3VibWl0dGVkOiBmYWxzZSwgZGVjbGluZWQ6IHRydWUsIGVycm9yOiBlcnJvck1lc3NhZ2UgfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ0F1dG8tc3VibWl0dGluZyB0byBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbi4uLicpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIGlzc3VlIGluIHRoZSBjb2xsZWN0aW9uIHJlcG9zaXRvcnlcbiAgICAgIGNvbnN0IGlzc3VlVXJsID0gYXdhaXQgdGhpcy5jcmVhdGVDb2xsZWN0aW9uSXNzdWUoe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHRva2VuOiBwYXJhbXMudG9rZW4sXG4gICAgICAgIGxvY2FsUGF0aDogcGFyYW1zLmxvY2FsUGF0aCAgLy8gUGFzcyB0aHJvdWdoIHRoZSBmaWxlIHBhdGhcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNzdWVVcmwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB3YXMgYW4gZXhpc3RpbmcgaXNzdWUgKGR1cGxpY2F0ZSkgb3IgbmV3bHkgY3JlYXRlZFxuICAgICAgICAvLyBUaGUgY2hlY2tFeGlzdGluZ0lzc3VlIG1ldGhvZCByZXR1cm5zIGVhcmx5IHdpdGggZXhpc3RpbmcgVVJMIGlmIGR1cGxpY2F0ZSBmb3VuZFxuICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGlzc3VlVXJsLmluY2x1ZGVzKCcvaXNzdWVzLycpICYmICFpc3N1ZVVybC5pbmNsdWRlcygnbmV3Jyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBpc3N1ZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJuaW5nIGV4aXN0aW5nIGlzc3VlJywgeyBpc3N1ZVVybCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIHN1Ym1pdHRlZDogdHJ1ZSwgXG4gICAgICAgICAgICBkZWNsaW5lZDogZmFsc2UsIFxuICAgICAgICAgICAgaXNzdWVVcmwsXG4gICAgICAgICAgICBpc0R1cGxpY2F0ZTogdHJ1ZSBcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdWNjZXNzZnVsbHkgY3JlYXRlZCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gaXNzdWUnLCB7IGlzc3VlVXJsIH0pO1xuICAgICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgc3VibWl0dGVkOiB0cnVlLCBcbiAgICAgICAgICAgIGRlY2xpbmVkOiBmYWxzZSwgXG4gICAgICAgICAgICBpc3N1ZVVybCxcbiAgICAgICAgICAgIGlzRHVwbGljYXRlOiBmYWxzZSBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBzdWJtaXR0ZWQ6IGZhbHNlLCBkZWNsaW5lZDogZmFsc2UsIGVycm9yOiAnRmFpbGVkIHRvIGNyZWF0ZSBpc3N1ZScgfTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGNvbGxlY3Rpb24gc3VibWlzc2lvbiBwcm9tcHQnLCB7IGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgZGVjbGluZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcidcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaXNzdWUgaW4gdGhlIERvbGxob3VzZU1DUC9jb2xsZWN0aW9uIHJlcG9zaXRvcnlcbiAgICogRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBHaXRIdWIgQVBJIGludGVncmF0aW9uIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29sbGVjdGlvbklzc3VlKHBhcmFtczoge1xuICAgIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICAgIHBvcnRmb2xpb1VybDogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YTtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGxvY2FsUGF0aD86IHN0cmluZzsgIC8vIFBhdGggdG8gdGhlIGxvY2FsIGVsZW1lbnQgZmlsZVxuICB9KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT046IENoZWNrIGlmIGlzc3VlIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdGluZ0lzc3VlVXJsID0gYXdhaXQgdGhpcy5jaGVja0V4aXN0aW5nSXNzdWUoXG4gICAgICAgIHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgcGFyYW1zLnVzZXJuYW1lLFxuICAgICAgICBwYXJhbXMudG9rZW5cbiAgICAgICk7XG4gICAgICBcbiAgICAgIGlmIChleGlzdGluZ0lzc3VlVXJsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW9uIGlzc3VlIGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyBjcmVhdGlvbicsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgIGlzc3VlVXJsOiBleGlzdGluZ0lzc3VlVXJsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJc3N1ZVVybDtcbiAgICAgIH1cblxuICAgICAgLy8gRm9ybWF0IHRoZSBpc3N1ZSB0aXRsZVxuICAgICAgY29uc3QgdGl0bGUgPSBgWyR7cGFyYW1zLmVsZW1lbnRUeXBlfV0gQWRkICR7cGFyYW1zLmVsZW1lbnROYW1lfSBieSBAJHtwYXJhbXMudXNlcm5hbWV9YDtcblxuICAgICAgLy8gRm9ybWF0IHRoZSBpc3N1ZSBib2R5IHdpdGggYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uXG4gICAgICAvLyBCdWlsZCBhZGRpdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBmb3IgZGlzcGxheVxuICAgICAgLy8gVFlQRSBTQUZFVFk6IERlZmluZSBpbnRlcmZhY2UgZm9yIGV4dGVuZGVkIG1ldGFkYXRhXG4gICAgICBpbnRlcmZhY2UgRXh0ZW5kZWRNZXRhIGV4dGVuZHMgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhIHtcbiAgICAgICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgICAgIHRyaWdnZXJzPzogc3RyaW5nW107XG4gICAgICAgIGFnZV9yYXRpbmc/OiBzdHJpbmc7XG4gICAgICAgIGFpX2dlbmVyYXRlZD86IGJvb2xlYW47XG4gICAgICAgIGdlbmVyYXRpb25fbWV0aG9kPzogc3RyaW5nO1xuICAgICAgICBsaWNlbnNlPzogc3RyaW5nO1xuICAgICAgICB0YWdzPzogc3RyaW5nW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBtZXRhID0gcGFyYW1zLm1ldGFkYXRhIGFzIEV4dGVuZGVkTWV0YTtcbiAgICAgIFxuICAgICAgaWYgKG1ldGEuY2F0ZWdvcnkpIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipDYXRlZ29yeSoqOiAke21ldGEuY2F0ZWdvcnl9YCk7XG4gICAgICBpZiAobWV0YS52ZXJzaW9uKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqVmVyc2lvbioqOiAke21ldGEudmVyc2lvbn1gKTtcbiAgICAgIGlmIChtZXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkobWV0YS50cmlnZ2VycykgJiYgbWV0YS50cmlnZ2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipUcmlnZ2VycyoqOiAke21ldGEudHJpZ2dlcnMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhLmFnZV9yYXRpbmcpIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipBZ2UgUmF0aW5nKio6ICR7bWV0YS5hZ2VfcmF0aW5nfWApO1xuICAgICAgaWYgKG1ldGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkFJIEdlbmVyYXRlZCoqOiAke21ldGEuYWlfZ2VuZXJhdGVkID8gJ1llcycgOiAnTm8nfWApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGEuZ2VuZXJhdGlvbl9tZXRob2QpIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipHZW5lcmF0aW9uIE1ldGhvZCoqOiAke21ldGEuZ2VuZXJhdGlvbl9tZXRob2R9YCk7XG4gICAgICBpZiAobWV0YS5saWNlbnNlKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqTGljZW5zZSoqOiAke21ldGEubGljZW5zZX1gKTtcbiAgICAgIGlmIChtZXRhLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShtZXRhLnRhZ3MpICYmIG1ldGEudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipUYWdzKio6ICR7bWV0YS50YWdzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlYWQgdGhlIGZ1bGwgZWxlbWVudCBmaWxlIGNvbnRlbnQgaWYgcGF0aCBpcyBwcm92aWRlZFxuICAgICAgbGV0IGVsZW1lbnRDb250ZW50ID0gJyc7XG4gICAgICBpZiAocGFyYW1zLmxvY2FsUGF0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBmaWxlIHNpemUgYmVmb3JlIHJlYWRpbmcgdG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvblxuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KHBhcmFtcy5sb2NhbFBhdGgpO1xuICAgICAgICAgIGlmIChzdGF0cy5zaXplID4gRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICAgICAgICAvLyBETyBOT1QgdHJ1bmNhdGUgdXNlciBjb250ZW50IC0gcmVqZWN0IGlmIHRvbyBsYXJnZVxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFbGVtZW50IGZpbGUgZXhjZWVkcyBzaXplIGxpbWl0IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBzdGF0cy5zaXplLFxuICAgICAgICAgICAgICBtYXhTaXplOiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuY3JlYXRlQ29sbGVjdGlvbklzc3VlJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbmAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlU2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICBsaW1pdDogRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgbWVzc2FnZSBpbnN0ZWFkIG9mIHRydW5jYXRpbmdcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlYWQgdGhlIGZ1bGwgbWFya2Rvd24gZmlsZSB3aXRoIGZyb250bWF0dGVyIGFuZCBjb250ZW50XG4gICAgICAgICAgZWxlbWVudENvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHBhcmFtcy5sb2NhbFBhdGgsIHsgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZScgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICAgIC8vIE5vdGU6IFdlIGFscmVhZHkgdmFsaWRhdGVkIHRoaXMgY29udGVudCBpbiB2YWxpZGF0ZUZpbGVBbmRDb250ZW50KClcbiAgICAgICAgICAvLyBidXQgd2UgcmUtdmFsaWRhdGUgaGVyZSBzaW5jZSB0aGlzIGlzIGJlaW5nIHBvc3RlZCB0byBhIHB1YmxpYyBpc3N1ZVxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZWxlbWVudENvbnRlbnQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRWxlbWVudCBjb250ZW50IGZhaWxlZCBzZWN1cml0eSB2YWxpZGF0aW9uIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGlzc3VlczogdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5jcmVhdGVDb2xsZWN0aW9uSXNzdWUnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgQ3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkIGluIGNvbGxlY3Rpb24gc3VibWlzc2lvbmAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBkZXRlY3RlZFBhdHRlcm5zOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPIE5PVCBzdWJtaXQgY29udGVudCB3aXRoIHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVzZSB0aGUgc2FuaXRpemVkIGNvbnRlbnQgKGJ1dCBOT1QgdHJ1bmNhdGVkKVxuICAgICAgICAgIGVsZW1lbnRDb250ZW50ID0gdmFsaWRhdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGVsZW1lbnRDb250ZW50O1xuICAgICAgICAgIFxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVhZCBhbmQgdmFsaWRhdGVkIGVsZW1lbnQgZmlsZSBjb250ZW50IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgY29udGVudExlbmd0aDogZWxlbWVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgc2VjdXJpdHlJc3N1ZXM6IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgICBidWlsZFZlcnNpb246ICd2MS42LjktYmV0YTEtY29sbGVjdGlvbi1maXgnICAvLyBWZXJzaW9uIGlkZW50aWZpZXIgZm9yIHZlcmlmaWNhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVhZCBlbGVtZW50IGZpbGUgY29udGVudCwgZmFsbGluZyBiYWNrIHRvIG1ldGFkYXRhIG9ubHknLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBqdXN0IHRoZSBtZXRhZGF0YSBpZiB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlXG4gICAgICAgICAgZWxlbWVudENvbnRlbnQgPSB0aGlzLmZvcm1hdE1ldGFkYXRhQXNZYW1sKHBhcmFtcy5tZXRhZGF0YSwgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGZpbGUgcGF0aCBwcm92aWRlZCwgdXNlIG1ldGFkYXRhIGFzIGZhbGxiYWNrXG4gICAgICAgIGxvZ2dlci53YXJuKCdObyBmaWxlIHBhdGggcHJvdmlkZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgdXNpbmcgbWV0YWRhdGEgb25seScsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50Q29udGVudCA9IHRoaXMuZm9ybWF0TWV0YWRhdGFBc1lhbWwocGFyYW1zLm1ldGFkYXRhLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgYm9keSA9IGAjIyBOZXcgJHtwYXJhbXMuZWxlbWVudFR5cGV9IFN1Ym1pc3Npb25cblxuKipOYW1lKio6ICR7cGFyYW1zLmVsZW1lbnROYW1lfVxuKipBdXRob3IqKjogQCR7cGFyYW1zLnVzZXJuYW1lfVxuKipUeXBlKio6ICR7cGFyYW1zLmVsZW1lbnRUeXBlfVxuXG4jIyMgRGVzY3JpcHRpb25cbiR7cGFyYW1zLm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZCd9XG5cbiMjIyBFbGVtZW50IERldGFpbHNcbiR7YWRkaXRpb25hbEZpZWxkcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbEZpZWxkcy5qb2luKCdcXG4nKSA6ICcqTm8gYWRkaXRpb25hbCBtZXRhZGF0YSBhdmFpbGFibGUqJ31cblxuIyMjIFBvcnRmb2xpbyBMaW5rXG4ke3BhcmFtcy5wb3J0Zm9saW9Vcmx9XG5cbiMjIyBFbGVtZW50IENvbnRlbnRcblxcYFxcYFxcYHlhbWxcbiR7ZWxlbWVudENvbnRlbnR9XG5cXGBcXGBcXGBcblxuIyMjIFJldmlldyBDaGVja2xpc3Rcbi0gWyBdIENvbnRlbnQgaXMgYXBwcm9wcmlhdGUgYW5kIGZvbGxvd3MgY29tbXVuaXR5IGd1aWRlbGluZXNcbi0gWyBdIE5vIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBvciBtYWxpY2lvdXMgcGF0dGVybnNcbi0gWyBdIE1ldGFkYXRhIGlzIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZVxuLSBbIF0gRWxlbWVudCB3b3JrcyBhcyBkZXNjcmliZWRcbi0gWyBdIE5vIGR1cGxpY2F0ZSBvZiBleGlzdGluZyBjb2xsZWN0aW9uIGNvbnRlbnRcblxuLS0tXG4qVGhpcyBzdWJtaXNzaW9uIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBEb2xsaG91c2VNQ1Agc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCB0b29sICh2MS42LjktYmV0YTEtY29sbGVjdGlvbi1maXgpLipgO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgbGFiZWxzIGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgY29uc3QgbGFiZWxzID0gW1xuICAgICAgICAnZWxlbWVudC1zdWJtaXNzaW9uJywgIC8vIENSSVRJQ0FMOiBUcmlnZ2VycyBhdXRvbWF0aW9uIHdvcmtmbG93XG4gICAgICAgICdjb2xsZWN0aW9uLXJlcG8nLCAgICAgLy8gSW5kaWNhdGVzIHRoaXMgaXMgZm9yIHRoZSBjb2xsZWN0aW9uXG4gICAgICAgICdjb250cmlidXRpb24nLCAgICAgICAgLy8gQWxsIHN1Ym1pc3Npb25zIGdldCB0aGlzXG4gICAgICAgICdwZW5kaW5nLXJldmlldycsICAgICAgLy8gTmVlZHMgcmV2aWV3XG4gICAgICAgIHBhcmFtcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpIC8vIEVsZW1lbnQgdHlwZSBsYWJlbCAoZS5nLiwgJ3BlcnNvbmFzJylcbiAgICAgIF07XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjNik6IFVzZSBHaXRIdWIgcmF0ZSBsaW1pdGVyIGZvciBBUEkgY2FsbHNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgaGl0dGluZyBHaXRIdWIgcmF0ZSBsaW1pdHMgYW5kIHByb3ZpZGVzIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgICAgY29uc3QgaXNzdWVVcmwgPSBhd2FpdCB0aGlzLnJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgd2FybmluZyBpZiBhcHByb2FjaGluZyByYXRlIGxpbWl0XG4gICAgICAgICAgICBpZiAocmF0ZUxpbWl0UmVtYWluaW5nICYmIE51bWJlci5wYXJzZUludChyYXRlTGltaXRSZW1haW5pbmcpIDwgMTAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdBcHByb2FjaGluZyBHaXRIdWIgQVBJIHJhdGUgbGltaXQnLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlLWNvbGxlY3Rpb24taXNzdWUnLFxuICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnaGlnaCcgLy8gSGlnaCBwcmlvcml0eSBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4gaXNzdWVVcmw7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBIYW5kbGUgdGltZW91dCBzcGVjaWZpY2FsbHlcbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBHaXRIdWIgQVBJIHJlcXVlc3QgdGltZW91dCBhZnRlciAke2dldFZhbGlkYXRlZFRpbWVvdXQoKX1tc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbGxlY3Rpb24gaXNzdWUnLCB7IFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTG9jYWxDb250ZW50KG5hbWU6IHN0cmluZywgdHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gTUVUQURBVEEgSU5ERVggRklYOiBVc2UgcG9ydGZvbGlvIGluZGV4IGZvciBmYXN0IG1ldGFkYXRhLWJhc2VkIGxvb2t1cHNcbiAgICAgIC8vIFRoaXMgc29sdmVzIHRoZSBjcml0aWNhbCBpc3N1ZSB3aGVyZSBcIlNhZmUgUm91bmR0cmlwIFRlc3RlclwiIGNvdWxkbid0IGJlIGZvdW5kXG4gICAgICAvLyBiZWNhdXNlIGZpbmRMb2NhbENvbnRlbnQgb25seSBzZWFyY2hlZCBmaWxlbmFtZXMsIG5vdCBtZXRhZGF0YSBuYW1lc1xuICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gdGhpcy5wb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBFbmhhbmNlZCBzZWFyY2ggd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgICAgY29uc3QgaW5kZXhFbnRyeSA9IGF3YWl0IGluZGV4TWFuYWdlci5maW5kQnlOYW1lKG5hbWUsIHsgXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgICBmdXp6eU1hdGNoOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGluZGV4RW50cnkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHZpYSBtZXRhZGF0YSBpbmRleCcsIHsgXG4gICAgICAgICAgc2VhcmNoTmFtZTogbmFtZSwgXG4gICAgICAgICAgbWV0YWRhdGFOYW1lOiBpbmRleEVudHJ5Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgZmlsZW5hbWU6IGluZGV4RW50cnkuZmlsZW5hbWUsXG4gICAgICAgICAgZmlsZVBhdGg6IGluZGV4RW50cnkuZmlsZVBhdGgsXG4gICAgICAgICAgdHlwZSBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmRleEVudHJ5LmZpbGVQYXRoO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGQUxMQkFDSzogVXNlIG9yaWdpbmFsIGZpbGUgZGlzY292ZXJ5IGlmIGluZGV4IGxvb2t1cCBmYWlsc1xuICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgaGFuZGxlcyBlZGdlIGNhc2VzXG4gICAgICBsb2dnZXIuZGVidWcoJ0luZGV4IGxvb2t1cCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBmaWxlIGRpc2NvdmVyeScsIHsgbmFtZSwgdHlwZSB9KTtcbiAgICAgIFxuICAgICAgY29uc3QgcG9ydGZvbGlvRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJc3N1ZSAjODE1OiBNZW1vcnkgZmlsZXMgYXJlIHN0b3JlZCBpbiBkYXRlZCBzdWJkaXJlY3RvcmllcyAoWVlZWS1NTS1ERC8pLlxuICAgICAgLy8gRmlsZURpc2NvdmVyeVV0aWwgb25seSBzZWFyY2hlcyBmbGF0IGRpcmVjdG9yaWVzLCBzbyB0cmF2ZXJzZSBzdWJkaXJzIGZvciBtZW1vcmllcy5cbiAgICAgIGlmICghZmlsZSAmJiB0eXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBVc2UgcmVhZGRpciB3aXRoIHdpdGhGaWxlVHlwZXMgdG8gaWRlbnRpZnkgZGF0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCB7IHJlYWRkaXI6IHJlYWRkaXJGcyB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXJGcyhwb3J0Zm9saW9EaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zdCBzdWJkaXJzID0gZW50cmllcy5maWx0ZXIoZSA9PiBlLmlzRGlyZWN0b3J5KCkgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoZS5uYW1lKSk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKC9bXmEtejAtOV0vZywgJy0nKS5yZXBsYWNlQWxsKC8tKy9nLCAnLScpLnJlcGxhY2VBbGwoLyheLSl8KC0kKS9nLCAnJyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJkaXJQYXRoID0gcGF0aC5qb2luKHBvcnRmb2xpb0Rpciwgc3ViZGlyLm5hbWUpO1xuICAgICAgICAgICAgLy8gVXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgZmlsZSBsaXN0aW5nIChyZXNwZWN0cyBzYW5kYm94aW5nKVxuICAgICAgICAgICAgY29uc3Qgc3ViZGlyRmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3Rvcnkoc3ViZGlyUGF0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygc3ViZGlyRmlsZXMpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBiYWNrdXAgZmlsZXMgKHNhbWUgZmlsdGVyaW5nIGFzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKVxuICAgICAgICAgICAgICBpZiAoZi5pbmNsdWRlcygnLmJhY2t1cC0nKSB8fCBmLmluY2x1ZGVzKCcuYmFja3VwLicpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShmKTtcbiAgICAgICAgICAgICAgaWYgKCFbJy55YW1sJywgJy55bWwnLCAnLm1kJ10uaW5jbHVkZXMoZmlsZUV4dCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZi5zbGljZSgwLCAtZmlsZUV4dC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChiYXNlID09PSBub3JtYWxpemVkU2VhcmNoIHx8IGJhc2UgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoLmpvaW4oc3ViZGlyUGF0aCwgZik7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBtZW1vcnkgaW4gZGF0ZWQgc3ViZGlyZWN0b3J5JywgeyBuYW1lLCBzdWJkaXI6IHN1YmRpci5uYW1lLCBmaWxlIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZSkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeSBzdWJkaXJlY3RvcnkgdHJhdmVyc2FsIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIG5hbWUsIHR5cGUsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZUFsbCgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZUFsbCgvKF4tKXwoLSQpL2csICcnKTsgICAgICAvLyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBkYXNoZXNcbiAgICAgICAgICBcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lICE9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyeWluZyBub3JtYWxpemVkIG5hbWUgc2VhcmNoJywgeyBcbiAgICAgICAgICAgIG9yaWdpbmFsOiBuYW1lLCBcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgdHlwZSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBub3JtYWxpemVkTmFtZSwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgc2VhcmNoaW5nIGJ5IGRpc3BsYXkgbmFtZSBwYXR0ZXJuc1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIC8vIFRyeSBjb21tb24gdmFyaWF0aW9ucyBsaWtlIHJlbW92aW5nIGRvdHMsIHNwYWNlcywgZXRjLlxuICAgICAgICBjb25zdCB2YXJpYXRpb25zID0gW1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgnLicsICcnKSwgICAgICAgIC8vIFJlbW92ZSBkb3RzOiBcIkouQS5SLlYuSS5TLlwiIC0+IFwiSkFSVklTXCJcbiAgICAgICAgICBuYW1lLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKSwgICAgICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgvW1xcc1xcLl0vZywgJycpLCAgICAvLyBSZW1vdmUgc3BhY2VzIGFuZCBkb3RzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlQWxsKC9bXFxzXFwuXS9nLCAnLScpLCAgIC8vIFJlcGxhY2Ugc3BhY2VzIGFuZCBkb3RzIHdpdGggZGFzaGVzXG4gICAgICAgIF0uZmlsdGVyKHYgPT4gdiAhPT0gbmFtZSAmJiB2Lmxlbmd0aCA+IDApO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucykge1xuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIHZhcmlhdGlvbiwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB1c2luZyBuYW1lIHZhcmlhdGlvbicsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsXG4gICAgICAgICAgICAgIHZhcmlhdGlvbixcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBsb2NhbCBjb250ZW50IGZpbGUgdmlhIGZhbGxiYWNrJywgeyBuYW1lLCB0eXBlLCBmaWxlIH0pO1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjb250ZW50IGZvdW5kJywgeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBmaW5kaW5nIGxvY2FsIGNvbnRlbnQnLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24gLSBzZWFyY2hlcyBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXMgZm9yIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlcyBlYXJseSB0ZXJtaW5hdGlvbiBmb3IgZXhhY3QgbWF0Y2hlc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgZGVmYXVsdCB0byBQRVJTT05BIGFuZCBlbmFibGVzIHByb3BlciB0eXBlIGRldGVjdGlvblxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRlbnQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIERldGVjdGlvbiByZXN1bHQgd2l0aCBmb3VuZCBtYXRjaGVzIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RFbGVtZW50VHlwZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEVsZW1lbnREZXRlY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlIGVhcmx5IHRlcm1pbmF0aW9uIHNlYXJjaCB1dGlsaXR5XG4gICAgICAvLyBDcmVhdGUgc2VhcmNoIGZ1bmN0aW9ucyBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zID0gZWxlbWVudFR5cGVzLm1hcCgodHlwZSkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KG5hbWUsIHR5cGUpO1xuICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSBhcyBFbGVtZW50VHlwZSwgcGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBMb2cgdW5leHBlY3RlZCBlcnJvcnMgYnV0IGRvbid0IGZhaWwgdGhlIHNlYXJjaFxuICAgICAgICAgIGlmIChlcnJvcj8uY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3I/LmNvZGUgIT09ICdFTk9URElSJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBzZWFyY2hpbmcgJHt0eXBlfSBkaXJlY3RvcnkgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uYCwgeyBcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgIGNvZGU6IGVycm9yPy5jb2RlIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHVybiBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IG90aGVyIHNlYXJjaGVzIGNvbnRpbnVlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBEZWZpbmUgZXhhY3QgbWF0Y2ggY3JpdGVyaWFcbiAgICAgIGNvbnN0IGlzRXhhY3RNYXRjaCA9IChtYXRjaDogRWxlbWVudERldGVjdGlvbk1hdGNoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShtYXRjaC5wYXRoLCBwYXRoLmV4dG5hbWUobWF0Y2gucGF0aCkpO1xuICAgICAgICByZXR1cm4gZmlsZW5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRXhlY3V0ZSBzZWFyY2hlcyB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGF3YWl0IEVhcmx5VGVybWluYXRpb25TZWFyY2guZXhlY3V0ZVdpdGhFYXJseVRlcm1pbmF0aW9uKFxuICAgICAgICBzZWFyY2hGdW5jdGlvbnMsXG4gICAgICAgIGlzRXhhY3RNYXRjaCxcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdlbGVtZW50LXR5cGUtZGV0ZWN0aW9uJyxcbiAgICAgICAgICB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoOiAxMDAwLCAvLyBXYWl0IDEgc2Vjb25kIGZvciBvdGhlciBzZWFyY2hlcyBhZnRlciBleGFjdCBtYXRjaFxuICAgICAgICAgIG1heFBhcmFsbGVsU2VhcmNoZXM6IDggLy8gTGltaXQgY29uY3VycmVudCBzZWFyY2hlcyB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBFbmhhbmNlZCBiYXRjaCBvcGVyYXRpb24gcmVwb3J0aW5nXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgY29tcGxldGVkU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgZXhhY3RNYXRjaEZvdW5kOiAhIXNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaCxcbiAgICAgICAgZXhhY3RNYXRjaFR5cGU6IHNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaD8udHlwZSxcbiAgICAgICAgZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZDogc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkLFxuICAgICAgICBwZXJmb3JtYW5jZUdhaW46IHNlYXJjaFJlc3VsdHMucGVyZm9ybWFuY2VHYWluLFxuICAgICAgICBtYXRjaGVkVHlwZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5tYXAobSA9PiBtLnR5cGUpLFxuICAgICAgICBmYWlsZWRUeXBlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5tYXAoZiA9PiBlbGVtZW50VHlwZXNbZi5pbmRleF0pLmZpbHRlcihCb29sZWFuKVxuICAgICAgfTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50IHR5cGUgZGV0ZWN0aW9uIGNvbXBsZXRlZCB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbicsIGJhdGNoUmVzdWx0cyk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENsZWFyIHJlcG9ydGluZyBvZiBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzZWFyY2hlcyBmYWlsZWQgZHVyaW5nIGJhdGNoIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+ICh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZXNbZi5pbmRleF0gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgZXJyb3I6IGYuZXJyb3Iuc3Vic3RyaW5nKDAsIDEwMCkgLy8gVHJ1bmNhdGUgbG9uZyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdWNjZXNzUmF0ZTogYCR7c2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlc30vJHtzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXN9YCxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPiAwIFxuICAgICAgICAgICAgPyAnTm8gaW1wYWN0IC0gbWF0Y2hlcyBmb3VuZCBpbiBzdWNjZXNzZnVsIHNlYXJjaGVzJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBtYXRjaGVzIGZvdW5kJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGZhaWx1cmVzIGFuZCBubyBtYXRjaGVzLCBwcm92aWRlIGFjdGlvbmFibGUgZ3VpZGFuY2VcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPT09IDAgJiYgc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0JhdGNoIG9wZXJhdGlvbiBoYWQgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMgZm91bmQnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciBjaGVja2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIGVhcmx5IHRlcm1pbmF0aW9uXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb24gYXBwbGllZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgICAgc2VhcmNoZXNDb21wbGV0ZWQ6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgICAgc2VhcmNoZXNUb3RhbDogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24nLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgcmVzdWx0IG9uIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogZmFsc2UsXG4gICAgICAgIG1hdGNoZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogR2VuZXJhdGUgbmFtZSBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiBoYW5kbGluZyB3aXRoIGNsZWFyIHBhcnRpYWwgZmFpbHVyZSByZXBvcnRpbmdcbiAgICogSGVscHMgdXNlcnMgZmluZCBjb250ZW50IHdoZW4gZXhhY3QgbWF0Y2hlcyBmYWlsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+ID0gW107XG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgXG4gICAgICAvLyBUcmFjayBiYXRjaCBvcGVyYXRpb24gcmVzdWx0cyBmb3IgYmV0dGVyIGRpYWdub3N0aWNzXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsVHlwZXM6IGVsZW1lbnRUeXBlcy5sZW5ndGgsXG4gICAgICAgIHN1Y2Nlc3NmdWxTY2FuczogMCxcbiAgICAgICAgZmFpbGVkU2NhbnM6IDAsXG4gICAgICAgIGZhaWx1cmVEZXRhaWxzOiBbXSBhcyBBcnJheTx7IHR5cGU6IEVsZW1lbnRUeXBlOyBlcnJvcjogc3RyaW5nIH0+LFxuICAgICAgICB0b3RhbFN1Z2dlc3Rpb25zOiAwLFxuICAgICAgICBzdWdnZXN0aW9uc0J5VHlwZToge30gYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBhbGwgZWxlbWVudCB0eXBlcyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKGVsZW1lbnREaXIsICcqJywge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGxldCB0eXBlU3VnZ2VzdGlvbnMgPSAwO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHBhdGguZXh0bmFtZShmaWxlUGF0aCkpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgdXNpbmcgc2ltcGxlIG1ldHJpY3NcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHlwZVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZXMsIHBhdGguZXh0bmFtZShmaWxlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucysrO1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5zdWdnZXN0aW9uc0J5VHlwZVtlbGVtZW50VHlwZV0gPSB0eXBlU3VnZ2VzdGlvbnM7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogVHJhY2sgYW5kIHJlcG9ydCBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWx1cmVEZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIGluZGl2aWR1YWwgZmFpbHVyZXMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gc2NhbiBlbGVtZW50IHR5cGUgZm9yIHN1Z2dlc3Rpb25zJywge1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubGVuZ3RoO1xuICAgICAgXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBDb21wcmVoZW5zaXZlIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTmFtZSBzdWdnZXN0aW9uIGJhdGNoIG9wZXJhdGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgIC4uLmJhdGNoUmVzdWx0cyxcbiAgICAgICAgc3VjY2Vzc1JhdGU6IGAke2JhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnN9LyR7YmF0Y2hSZXN1bHRzLnRvdGFsVHlwZXN9YCxcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGZ1bGwgZmFpbHVyZSBkZXRhaWxzIGF0IGRlYnVnIGxldmVsIHRvIGF2b2lkIHNwYW1cbiAgICAgICAgaGFzRmFpbHVyZXM6IGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXBvcnQgZmFpbHVyZXMgY2xlYXJseSBpZiB0aGV5IG9jY3VycmVkXG4gICAgICBpZiAoYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBlbGVtZW50IHR5cGUgc2NhbnMgZmFpbGVkIGR1cmluZyBuYW1lIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbicsIHtcbiAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgIGZhaWxlZFR5cGVzOiBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMubWFwKGYgPT4gZi50eXBlKSxcbiAgICAgICAgICBzdWNjZXNzZnVsVHlwZXM6IGJhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnMsXG4gICAgICAgICAgaW1wYWN0T25SZXN1bHRzOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA+IDAgXG4gICAgICAgICAgICA/ICdQYXJ0aWFsIGltcGFjdCAtIHN1Z2dlc3Rpb25zIGZvdW5kIGZyb20gc3VjY2Vzc2Z1bCBzY2FucycgXG4gICAgICAgICAgICA6ICdQb3RlbnRpYWwgaW1wYWN0IC0gbm8gc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkJyxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPT09IDAgJiYgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgICAgICAgPyAnQ2hlY2sgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGZpbGUgcGVybWlzc2lvbnMnXG4gICAgICAgICAgICA6ICdTdWdnZXN0aW9uIGdlbmVyYXRpb24gcGFydGlhbGx5IHN1Y2Nlc3NmdWwgZGVzcGl0ZSBzb21lIGZhaWx1cmVzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU29ydCBieSBzaW1pbGFyaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhbmQgcmV0dXJuIHRvcCBzdWdnZXN0aW9uc1xuICAgICAgY29uc3Qgc29ydGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpbUEgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGEubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qgc2ltQiA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICByZXR1cm4gc2ltQiAtIHNpbUE7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLmxlbmd0aCxcbiAgICAgICAgdG9wU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLnNsaWNlKDAsIDMpLm1hcChzID0+IHMubmFtZSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gc29ydGVkU3VnZ2VzdGlvbnM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIC0gYmF0Y2ggb3BlcmF0aW9uIGZhaWxlZCBjb21wbGV0ZWx5JywgeyBcbiAgICAgICAgc2VhcmNoTmFtZSwgXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ2hlY2sgcG9ydGZvbGlvIHN0cnVjdHVyZSBhbmQgcGVybWlzc2lvbnMnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTaW1wbGUgc2ltaWxhcml0eSBjYWxjdWxhdGlvbiB1c2luZyBMZXZlbnNodGVpbi1saWtlIGFwcHJvYWNoXG4gICAqIFJldHVybnMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAxIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTaW1pbGFyaXR5KHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBIYW5kbGUgZXhhY3QgbWF0Y2hlc1xuICAgIGlmIChzdHIxID09PSBzdHIyKSByZXR1cm4gMTtcbiAgICBcbiAgICAvLyBIYW5kbGUgc3Vic3RyaW5nIG1hdGNoZXNcbiAgICBpZiAoc3RyMS5pbmNsdWRlcyhzdHIyKSB8fCBzdHIyLmluY2x1ZGVzKHN0cjEpKSByZXR1cm4gMC44O1xuICAgIFxuICAgIC8vIEhhbmRsZSBwYXJ0aWFsIG1hdGNoZXNcbiAgICBjb25zdCBsb25nZXIgPSBzdHIxLmxlbmd0aCA+IHN0cjIubGVuZ3RoID8gc3RyMSA6IHN0cjI7XG4gICAgY29uc3Qgc2hvcnRlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIyIDogc3RyMTtcbiAgICBcbiAgICBpZiAobG9uZ2VyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgXG4gICAgLy8gQ291bnQgY29tbW9uIGNoYXJhY3RlcnNcbiAgICBsZXQgY29tbW9uID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNob3J0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb25nZXIuaW5jbHVkZXMoc2hvcnRlcltpXSkpIHtcbiAgICAgICAgY29tbW9uKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb21tb24gLyBsb25nZXIubGVuZ3RoO1xuICB9XG4gIFxuICAvKipcbiAgICogVVggSU1QUk9WRU1FTlQ6IFNhdmUgZWxlbWVudCB3aXRoIGF1dG9tYXRpYyByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqIEhhbmRsZXMgY29tbW9uIEdpdEh1YiBBUEkgaXNzdWVzIGxpa2UgcmF0ZSBsaW1pdHMgYW5kIHRlbXBvcmFyeSBuZXR3b3JrIHByb2JsZW1zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVFbGVtZW50V2l0aFJldHJ5KFxuICAgIGFkYXB0ZXI6IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLCBcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gUkVUUllfQ09ORklHLk1BWF9BVFRFTVBUU1xuICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBhbnkgPSBudWxsO1xuICAgIFxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBBdHRlbXB0aW5nIHRvIHNhdmUgZWxlbWVudCAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHRcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudChhZGFwdGVyLCB0cnVlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmaWxlVXJsKSB7XG4gICAgICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgRWxlbWVudCBzYXZlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0c2AsIHtcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlVXJsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbGVVcmw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHNhdmVFbGVtZW50IHJldHVybnMgbnVsbCwgdHJlYXQgYXMgYSBmYWlsdXJlIGJ1dCBkb24ndCByZXRyeSBpbW1lZGlhdGVseVxuICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYHNhdmVFbGVtZW50IHJldHVybmVkIG51bGwgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSB0aGlzLmlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNhdmUgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZGAsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGlzUmV0cnlhYmxlLFxuICAgICAgICAgIHdpbGxSZXRyeTogaXNSZXRyeWFibGUgJiYgYXR0ZW1wdCA8IG1heFJldHJpZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHJldHJ5YWJsZSBlcnJvciwgZmFpbCBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdOb24tcmV0cnlhYmxlIGVycm9yIGVuY291bnRlcmVkLCBhYm9ydGluZyByZXRyaWVzJywge1xuICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgYXR0ZW1wdHMsIHdhaXQgYmVmb3JlIHJldHJ5aW5nXG4gICAgICAgIGlmIChhdHRlbXB0IDwgbWF4UmV0cmllcykge1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gY2FsY3VsYXRlUmV0cnlEZWxheShhdHRlbXB0KTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFdhaXRpbmcgJHtkZWxheX1tcyBiZWZvcmUgcmV0cnlgLCB7IGF0dGVtcHQsIGRlbGF5IH0pO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICBsb2dnZXIuZXJyb3IoYEFsbCAke21heFJldHJpZXN9IHNhdmUgYXR0ZW1wdHMgZmFpbGVkYCwge1xuICAgICAgZWxlbWVudE5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxhc3RFcnJvcjogbGFzdEVycm9yPy5tZXNzYWdlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYW4gZXJyb3IgaXMgd29ydGggcmV0cnlpbmdcbiAgICogUmV0cnlhYmxlOiBuZXR3b3JrIGlzc3VlcywgcmF0ZSBsaW1pdHMsIHRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAqIE5vbi1yZXRyeWFibGU6IGF1dGhlbnRpY2F0aW9uIGlzc3VlcywgdmFsaWRhdGlvbiBlcnJvcnMsIHBlcm1hbmVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBpc1JldHJ5YWJsZUVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCBlcnJvckNvZGUgPSBlcnJvcj8uY29kZTtcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZXJyb3I/LnN0YXR1cyB8fCBlcnJvcj8uc3RhdHVzQ29kZTtcbiAgICBcbiAgICAvLyBOZXR3b3JrIGFuZCB0aW1lb3V0IGVycm9yc1xuICAgIGlmIChlcnJvckNvZGUgPT09ICdFTk9URk9VTkQnIHx8IGVycm9yQ29kZSA9PT0gJ0VDT05OUkVTRVQnIHx8IGVycm9yQ29kZSA9PT0gJ0VUSU1FRE9VVCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBHaXRIdWIgQVBJIHJhdGUgbGltaXRzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIGlzc3Vlc1xuICAgIGlmIChzdGF0dXNDb2RlID49IDUwMCAmJiBzdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGVtcG9yYXJ5IEdpdEh1YiBBUEkgcHJvYmxlbXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3NlcnZpY2UgdW5hdmFpbGFibGUnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludGVybmFsIHNlcnZlciBlcnJvcicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29ubmVjdGlvbiBpc3N1ZXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdjb25uZWN0aW9uJykgJiYgXG4gICAgICAgIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3Jlc2V0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgYXV0aGVudGljYXRpb24gb3IgcGVybWlzc2lvbiBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAxIHx8IHN0YXR1c0NvZGUgPT09IDQwMyB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd1bmF1dGhvcml6ZWQnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdmb3JiaWRkZW4nKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2F1dGhlbnRpY2F0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAwIHx8IHN0YXR1c0NvZGUgPT09IDQyMiB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3ZhbGlkYXRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRvIG5vdCByZXRyeWluZyBmb3IgdW5rbm93biBlcnJvcnMgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
2095
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSXBDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDcEIsTUFBTSxxQ0FBcUMsQ0FBQztBQU03QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUs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QUVELGdDQUFnQztRQUNoQyxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEdBQUc7WUFDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDaEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbCBmb3Igc3VibWl0dGluZyBjb250ZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzXG4gKiBSZXBsYWNlcyB0aGUgYnJva2VuIGlzc3VlLWJhc2VkIHN1Ym1pc3Npb24gd2l0aCBkaXJlY3QgcmVwb3NpdG9yeSBzYXZlc1xuICogXG4gKiBGSVhFUyBJTVBMRU1FTlRFRCAoUFIgIzUwMyk6XG4gKiAxLiBUWVBFIFNBRkVUWSBGSVggIzEgKElzc3VlICM0OTcpOiBDaGFuZ2VkIGFwaUNhY2hlIGZyb20gJ2FueScgdG8gcHJvcGVyIEFQSUNhY2hlIHR5cGVcbiAqIDIuIFRZUEUgU0FGRVRZIEZJWCAjMiAoSXNzdWUgIzQ5Nyk6IFJlcGxhY2VkIGNvbXBsZXggdHlwZSBjYXN0aW5nIHdpdGggUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXJcbiAqIDMuIFBFUkZPUk1BTkNFIChQUiAjNDk2IHJlY29tbWVuZGF0aW9uKTogVXNpbmcgRmlsZURpc2NvdmVyeVV0aWwgZm9yIG9wdGltaXplZCBmaWxlIHNlYXJjaFxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuLi8uLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBnZXRFbGVtZW50RmlsZUV4dGVuc2lvbiB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgfSBmcm9tICcuL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcbmltcG9ydCB7IEZpbGVEaXNjb3ZlcnlVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmlsZURpc2NvdmVyeVV0aWwuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7XG4gIEZJTEVfU0laRV9MSU1JVFMsXG4gIFJFVFJZX0NPTkZJRyxcbiAgU0VBUkNIX0NPTkZJRyxcbiAgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICBnZXRWYWxpZGF0ZWRUaW1lb3V0LFxuICBjYWxjdWxhdGVSZXRyeURlbGF5XG59IGZyb20gJy4uLy4uL2NvbmZpZy9wb3J0Zm9saW8tY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0VsZW1lbnQsIFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zLCBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmV4cG9ydCB0eXBlIHsgUG9ydGZvbGlvRWxlbWVudCwgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMsIFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0IH07XG5pbXBvcnQgeyBJUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9HaXRIdWJSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBFYXJseVRlcm1pbmF0aW9uU2VhcmNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvRWFybHlUZXJtaW5hdGlvblNlYXJjaC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRXJyb3JDb2RlLCBmb3JtYXRDb2xsZWN0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi9jb25maWcvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG4vLyBQb3J0Zm9saW9FbGVtZW50LCBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcywgYW5kIFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0XG4vLyBhcmUgaW1wb3J0ZWQgZnJvbSAuL3R5cGVzLnRzIGFuZCByZS1leHBvcnRlZCBhYm92ZVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREZXRlY3Rpb25NYXRjaCB7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERldGVjdGlvblJlc3VsdCB7XG4gIGZvdW5kOiBib29sZWFuO1xuICBtYXRjaGVzOiBFbGVtZW50RGV0ZWN0aW9uTWF0Y2hbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb1BvcnRmb2xpb1Rvb2xEZXBlbmRlbmNpZXMge1xuICBhdXRoTWFuYWdlcjogR2l0SHViQXV0aE1hbmFnZXI7XG4gIHBvcnRmb2xpb1JlcG9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcbiAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcG9ydGZvbGlvSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHJhdGVMaW1pdGVyOiBJUmF0ZUxpbWl0ZXI7XG4gIGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICB0b2tlbk1hbmFnZXI6IFRva2VuTWFuYWdlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFN1Ym1pdFRvUG9ydGZvbGlvVG9vbCB7XG4gIHByaXZhdGUgYXV0aE1hbmFnZXI6IEdpdEh1YkF1dGhNYW5hZ2VyO1xuICBwcml2YXRlIHBvcnRmb2xpb1JlcG9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIHBvcnRmb2xpb0luZGV4TWFuYWdlcjogUG9ydGZvbGlvSW5kZXhNYW5hZ2VyO1xuICBwcml2YXRlIHJhdGVMaW1pdGVyOiBJUmF0ZUxpbWl0ZXI7XG4gIHByaXZhdGUgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgdG9rZW5NYW5hZ2VyOiBUb2tlbk1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoYXBpQ2FjaGU6IEFQSUNhY2hlLCBkZXBlbmRlbmNpZXM6IFN1Ym1pdFRvUG9ydGZvbGlvVG9vbERlcGVuZGVuY2llcykge1xuICAgIC8vIFRZUEUgU0FGRVRZIEZJWCAjMTogUHJvcGVyIHR5cGluZyBmb3IgYXBpQ2FjaGUgcGFyYW1ldGVyXG4gICAgLy8gUHJldmlvdXNseTogY29uc3RydWN0b3IoYXBpQ2FjaGU6IGFueSlcbiAgICAvLyBOb3c6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBBUElDYWNoZSkgd2l0aCBwcm9wZXIgaW1wb3J0XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMgfHwgIWRlcGVuZGVuY2llcy5hdXRoTWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wgcmVxdWlyZXMgYSBHaXRIdWJBdXRoTWFuYWdlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgICBpZiAoIWRlcGVuZGVuY2llcy5wb3J0Zm9saW9NYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCByZXF1aXJlcyBhIFBvcnRmb2xpb01hbmFnZXIgaW5zdGFuY2UnKTtcbiAgICB9XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMucG9ydGZvbGlvSW5kZXhNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbCByZXF1aXJlcyBhIFBvcnRmb2xpb0luZGV4TWFuYWdlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgICBpZiAoIWRlcGVuZGVuY2llcy5yYXRlTGltaXRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wgcmVxdWlyZXMgYW4gSVJhdGVMaW1pdGVyIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRoTWFuYWdlciA9IGRlcGVuZGVuY2llcy5hdXRoTWFuYWdlcjtcbiAgICB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyID0gZGVwZW5kZW5jaWVzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IGRlcGVuZGVuY2llcy5wb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMucG9ydGZvbGlvSW5kZXhNYW5hZ2VyID0gZGVwZW5kZW5jaWVzLnBvcnRmb2xpb0luZGV4TWFuYWdlcjtcbiAgICB0aGlzLnJhdGVMaW1pdGVyID0gZGVwZW5kZW5jaWVzLnJhdGVMaW1pdGVyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBkZXBlbmRlbmNpZXMuZmlsZU9wZXJhdGlvbnM7XG4gICAgdGhpcy50b2tlbk1hbmFnZXIgPSBkZXBlbmRlbmNpZXMudG9rZW5NYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBpbnB1dCBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIGFuZCBlbnN1cmUgZGF0YSBzYWZldHlcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgaW5wdXQgcGFyYW1ldGVycyBmcm9tIHRoZSB1c2VyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggbm9ybWFsaXplZCBuYW1lIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQW5kTm9ybWFsaXplUGFyYW1zKHBhcmFtczogU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIHNhZmVOYW1lPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBOb3JtYWxpemUgdXNlciBpbnB1dCB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocGFyYW1zLm5hbWUpO1xuICAgIGlmICghbm9ybWFsaXplZE5hbWUuaXNWYWxpZCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIFVuaWNvZGUgaW4gZWxlbWVudCBuYW1lOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEludmFsaWQgY2hhcmFjdGVycyBpbiBlbGVtZW50IG5hbWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LlswXSB8fCAndW5rbm93biBlcnJvcid9YCxcbiAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfSU5QVVQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2FmZU5hbWU6IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YlxuICAgKiBAcmV0dXJucyBBdXRoZW50aWNhdGlvbiBjaGVjayByZXN1bHQgd2l0aCBzdGF0dXMgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tBdXRoZW50aWNhdGlvbigpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGF1dGhTdGF0dXM/OiBhbnk7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIGNvbnN0IGF1dGhTdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGhNYW5hZ2VyLmdldEF1dGhTdGF0dXMoKTtcbiAgICBpZiAoIWF1dGhTdGF0dXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAvLyBMb2cgYXV0aGVudGljYXRpb24gcmVxdWlyZWQgKHVzaW5nIGV4aXN0aW5nIGV2ZW50IHR5cGUpXG4gICAgICBsb2dnZXIud2FybignVXNlciBhdHRlbXB0ZWQgcG9ydGZvbGlvIHN1Ym1pc3Npb24gd2l0aG91dCBhdXRoZW50aWNhdGlvbicpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ05vdCBhdXRoZW50aWNhdGVkLiBQbGVhc2UgYXV0aGVudGljYXRlIGZpcnN0IHVzaW5nIHRoZSBHaXRIdWIgT0F1dGggZmxvdy5cXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAnVmlzaXQ6IGh0dHBzOi8vZG9jcy5hbnRocm9waWMuY29tL2VuL2RvY3MvY2xhdWRlLWNvZGUvb2F1dGgtc2V0dXBcXG4nICtcbiAgICAgICAgICAgICAgICAgICAnT3IgcnVuOiBnaCBhdXRoIGxvZ2luIC0td2ViJyxcbiAgICAgICAgICBlcnJvcjogJ05PVF9BVVRIRU5USUNBVEVEJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYXV0aFN0YXR1c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGNvbnRlbnQgbG9jYWxseSB3aXRoIHNtYXJ0IHR5cGUgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIHRvIHNlYXJjaCBmb3JcbiAgICogQHBhcmFtIGV4cGxpY2l0VHlwZSBPcHRpb25hbCBleHBsaWNpdCBlbGVtZW50IHR5cGUgcHJvdmlkZWQgYnkgdXNlclxuICAgKiBAcGFyYW0gb3JpZ2luYWxOYW1lIE9yaWdpbmFsIHVzZXItcHJvdmlkZWQgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHJldHVybnMgQ29udGVudCBkaXNjb3ZlcnkgcmVzdWx0IHdpdGggZWxlbWVudCB0eXBlIGFuZCBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc2NvdmVyQ29udGVudFdpdGhUeXBlRGV0ZWN0aW9uKFxuICAgIHNhZmVOYW1lOiBzdHJpbmcsIFxuICAgIGV4cGxpY2l0VHlwZT86IEVsZW1lbnRUeXBlLCBcbiAgICBvcmlnaW5hbE5hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlbGVtZW50VHlwZT86IEVsZW1lbnRUeXBlO1xuICAgIGxvY2FsUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgbGV0IGVsZW1lbnRUeXBlID0gZXhwbGljaXRUeXBlO1xuICAgIGxldCBsb2NhbFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIFxuICAgIGlmIChlbGVtZW50VHlwZSkge1xuICAgICAgLy8gVHlwZSBleHBsaWNpdGx5IHByb3ZpZGVkIC0gc2VhcmNoIGluIHRoYXQgc3BlY2lmaWMgZGlyZWN0b3J5IG9ubHlcbiAgICAgIGxvY2FsUGF0aCA9IGF3YWl0IHRoaXMuZmluZExvY2FsQ29udGVudChzYWZlTmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgaWYgKCFsb2NhbFBhdGgpIHtcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IFByb3ZpZGUgaGVscGZ1bCBzdWdnZXN0aW9ucyBmb3IgZmluZGluZyBjb250ZW50XG4gICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgZmluZCAke2VsZW1lbnRUeXBlfSBuYW1lZCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGluIGxvY2FsIHBvcnRmb2xpby5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqU2VhcmNoZWQgaW4qKjogJHtlbGVtZW50RGlyfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipUcm91Ymxlc2hvb3RpbmcgVGlwcyoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyB1c2luZyB5b3VyIGZpbGUgZXhwbG9yZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBUcnkgdXNpbmcgdGhlIGV4YWN0IGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBVc2UgXFxgbGlzdF9wb3J0Zm9saW9cXGAgdG8gc2VlIGFsbCBhdmFpbGFibGUgJHtlbGVtZW50VHlwZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBJZiB1bnN1cmUgb2YgdGhlIHR5cGUsIG9taXQgLS10eXBlIGFuZCBsZXQgdGhlIHN5c3RlbSBkZXRlY3QgaXRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqQ29tbW9uIG5hbWUgZm9ybWF0cyB0aGF0IHdvcmsqKjpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIm15LWVsZW1lbnRcIiAoa2ViYWItY2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15IEVsZW1lbnRcIiAod2l0aCBzcGFjZXMpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgXCJNeUVsZW1lbnRcIiAoUGFzY2FsQ2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBQYXJ0aWFsIG1hdGNoZXMgYXJlIHN1cHBvcnRlZGAsXG4gICAgICAgICAgICBlcnJvcjogJ0NPTlRFTlRfTk9UX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ1JJVElDQUwgRklYOiBObyB0eXBlIHByb3ZpZGVkIC0gaW1wbGVtZW50IHNtYXJ0IGRldGVjdGlvbiBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAgICBjb25zdCBkZXRlY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmRldGVjdEVsZW1lbnRUeXBlKHNhZmVOYW1lKTtcbiAgICAgIFxuICAgICAgaWYgKCFkZXRlY3Rpb25SZXN1bHQuZm91bmQpIHtcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEVuaGFuY2VkIGd1aWRhbmNlIHdpdGggc3BlY2lmaWMgc3VnZ2VzdGlvbnNcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xuICAgICAgICBcbiAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIG5hbWVzXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU5hbWVTdWdnZXN0aW9ucyhzYWZlTmFtZSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb250ZW50IFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgbm90IGZvdW5kIGluIHBvcnRmb2xpby5cXG5cXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5SNICoqU2VhcmNoZWQgaW4gYWxsIGVsZW1lbnQgdHlwZXMqKjogJHthdmFpbGFibGVUeXBlc31cXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGDwn5KhICoqRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT8qKlxcbmA7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zLnNsaWNlKDAsIFNFQVJDSF9DT05GSUcuTUFYX1NVR0dFU1RJT05TKSkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBgICDigKIgXCIke3N1Z2dlc3Rpb24ubmFtZX1cIiAoJHtzdWdnZXN0aW9uLnR5cGV9KVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfm6DvuI8gKipUcm91Ymxlc2hvb3RpbmcgU3RlcHMqKjpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAxLiDwn5OdIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSBjb250ZW50XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgMi4g8J+UjSBDaGVjayBleGFjdCBzcGVsbGluZyBhbmQgdHJ5IHZhcmlhdGlvbnM6XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS50b0xvd2VyQ2FzZSgpfVwiIChsb3dlcmNhc2UpXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlQWxsKC9bXmEtejAtOV0vZ2ksICctJykudG9Mb3dlckNhc2UoKX1cIiAobm9ybWFsaXplZClcXG5gO1xuICAgICAgICBpZiAoKG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYCAgIOKAoiBcIiR7KG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkucmVwbGFjZUFsbCgnLicsICcnKX1cIiAobm8gZG90cylcXG5gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gYDMuIPCfjq8gU3BlY2lmeSBlbGVtZW50IHR5cGU6IFxcYHN1Ym1pdF9jb2xsZWN0aW9uX2NvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiAtLXR5cGU9cGVyc29uYXNcXGBcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGA0LiDwn5OBIENoZWNrIGlmIGZpbGUgZXhpc3RzIGluIHBvcnRmb2xpbyBkaXJlY3Rvcmllc1xcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk50gKipUaXAqKjogVGhlIHN5c3RlbSBzZWFyY2hlcyBmaWxlbmFtZXMgQU5EIG1ldGFkYXRhIG5hbWVzIHdpdGggZnV6enkgbWF0Y2hpbmcuYDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBNdWx0aXBsZSBtYXRjaGVzIGZvdW5kIC0gYXNrIHVzZXIgdG8gc3BlY2lmeSB0eXBlXG4gICAgICAgIGNvbnN0IG1hdGNoRGV0YWlscyA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzLm1hcChtID0+IGAtICR7bS50eXBlfTogJHttLnBhdGh9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBmb3VuZCBpbiBtdWx0aXBsZSBlbGVtZW50IHR5cGVzOlxcblxcbiR7bWF0Y2hEZXRhaWxzfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIHNwZWNpZnkgdGhlIGVsZW1lbnQgdHlwZSB1c2luZyB0aGUgLS10eXBlIHBhcmFtZXRlciB0byBhdm9pZCBhbWJpZ3VpdHkuYCxcbiAgICAgICAgICAgIGVycm9yOiAnTVVMVElQTEVfTUFUQ0hFU19GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNpbmdsZSBtYXRjaCBmb3VuZCAtIHVzZSBpdFxuICAgICAgY29uc3QgbWF0Y2ggPSBkZXRlY3Rpb25SZXN1bHQubWF0Y2hlc1swXTtcbiAgICAgIGVsZW1lbnRUeXBlID0gbWF0Y2gudHlwZTtcbiAgICAgIGxvY2FsUGF0aCA9IG1hdGNoLnBhdGg7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBTbWFydCBkZXRlY3Rpb246IEZvdW5kIFwiJHtzYWZlTmFtZX1cIiBhcyAke2VsZW1lbnRUeXBlfWAsIHsgXG4gICAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgICBkZXRlY3RlZFR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBwYXRoOiBsb2NhbFBhdGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsb2NhbFBhdGhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBmaWxlIHNpemUgYW5kIGNvbnRlbnQgc2VjdXJpdHkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICogQHBhcmFtIGxvY2FsUGF0aCBQYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggY29udGVudCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpbGVBbmRDb250ZW50KGxvY2FsUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBjb250ZW50Pzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNyk6IFZhbGlkYXRlIGZpbGUgcGF0aCBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IHBhdGhWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBvcnRmb2xpb1BhdGgobG9jYWxQYXRoKTtcbiAgICBpZiAoIXBhdGhWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogcGF0aFZhbGlkYXRpb24uZXJyb3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB2YWxpZGF0ZWQgc2FmZSBwYXRoIGZvciBhbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zXG4gICAgY29uc3Qgc2FmZVBhdGggPSBwYXRoVmFsaWRhdGlvbi5zYWZlUGF0aCE7XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIHNpemUgYmVmb3JlIHJlYWRpbmdcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuc3RhdChzYWZlUGF0aCk7XG4gICAgaWYgKHN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgb2YgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBzaXplIGV4Y2VlZHMgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVfTUJ9TUIgbGltaXRgLFxuICAgICAgICAgIGVycm9yOiAnRklMRV9UT09fTEFSR0UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHNhZmVQYXRoLCB7IHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZUZpbGVBbmRDb250ZW50JyB9KTtcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQpO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQgJiYgdmFsaWRhdGlvblJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYENyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBkZXRlY3RlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCxcbiAgICAgICAgICBlcnJvcjogJ1ZBTElEQVRJT05fRkFJTEVEJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgY29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgbWV0YWRhdGEgZm9yIHRoZSBwb3J0Zm9saW8gZWxlbWVudFxuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWVcbiAgICogQHJldHVybnMgTWV0YWRhdGEgb2JqZWN0IGZvciB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlRWxlbWVudE1ldGFkYXRhKFxuICAgIHNhZmVOYW1lOiBzdHJpbmcsIFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgXG4gICAgYXV0aFN0YXR1czogYW55LFxuICAgIGZpbGVQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8UG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhPiB7XG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbSB0aGUgZmlsZSBpZiBwYXRoIGlzIHByb3ZpZGVkXG4gICAgbGV0IGZpbGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xuICAgIFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgZmlsZU1ldGFkYXRhID0gYXdhaXQgdGhpcy5leHRyYWN0RWxlbWVudE1ldGFkYXRhKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVFlQRSBTQUZFVFk6IERlZmluZSBleHRlbmRlZCBtZXRhZGF0YSBpbnRlcmZhY2UgZm9yIGJldHRlciB0eXBlIHNhZmV0eVxuICAgIGludGVyZmFjZSBFeHRlbmRlZE1ldGFkYXRhIGV4dGVuZHMgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhIHtcbiAgICAgIHRyaWdnZXJzPzogc3RyaW5nW107XG4gICAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICAgIGFnZV9yYXRpbmc/OiBzdHJpbmc7XG4gICAgICBhaV9nZW5lcmF0ZWQ/OiBib29sZWFuO1xuICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q/OiBzdHJpbmc7XG4gICAgICBsaWNlbnNlPzogc3RyaW5nO1xuICAgICAgdGFncz86IHN0cmluZ1tdO1xuICAgIH1cbiAgICBcbiAgICAvLyBCdWlsZCBtZXRhZGF0YSB3aXRoIHJlYWwgdmFsdWVzIGZyb20gZmlsZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzXG4gICAgY29uc3QgbWV0YWRhdGE6IEV4dGVuZGVkTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBzYWZlTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmaWxlTWV0YWRhdGE/LmRlc2NyaXB0aW9uIHx8IFxuICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhZGF0YT8uc3VtbWFyeSB8fCBcbiAgICAgICAgICAgICAgICAgICBgJHtlbGVtZW50VHlwZX0gc3VibWl0dGVkIGZyb20gbG9jYWwgcG9ydGZvbGlvYCxcbiAgICAgIGF1dGhvcjogYXV0aFN0YXR1cy51c2VybmFtZSB8fCBmaWxlTWV0YWRhdGE/LmF1dGhvciB8fCAndW5rbm93bicsXG4gICAgICBjcmVhdGVkOiBmaWxlTWV0YWRhdGE/LmNyZWF0ZWQgfHwgXG4gICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/LmNyZWF0ZWRfZGF0ZSB8fCBcbiAgICAgICAgICAgICAgIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHVwZGF0ZWQ6IGZpbGVNZXRhZGF0YT8udXBkYXRlZCB8fCBcbiAgICAgICAgICAgICAgIGZpbGVNZXRhZGF0YT8ubW9kaWZpZWQgfHwgXG4gICAgICAgICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB2ZXJzaW9uOiBmaWxlTWV0YWRhdGE/LnZlcnNpb24gfHwgJzEuMC4wJ1xuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGFkZGl0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGlmIHByZXNlbnQgKHdpdGggdHlwZSBzYWZldHkpXG4gICAgaWYgKGZpbGVNZXRhZGF0YSkge1xuICAgICAgLy8gUHJlc2VydmUgb3RoZXIgbWV0YWRhdGEgZmllbGRzIHRoYXQgbWlnaHQgYmUgdXNlZnVsXG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkoZmlsZU1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IGZpbGVNZXRhZGF0YS50cmlnZ2VycztcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuY2F0ZWdvcnkgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5jYXRlZ29yeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuY2F0ZWdvcnkgPSBmaWxlTWV0YWRhdGEuY2F0ZWdvcnk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmFnZV9yYXRpbmcgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5hZ2VfcmF0aW5nID0gZmlsZU1ldGFkYXRhLmFnZV9yYXRpbmc7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmFpX2dlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhLmFpX2dlbmVyYXRlZCA9IEJvb2xlYW4oZmlsZU1ldGFkYXRhLmFpX2dlbmVyYXRlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID0gZmlsZU1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5saWNlbnNlICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEubGljZW5zZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEubGljZW5zZSA9IGZpbGVNZXRhZGF0YS5saWNlbnNlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoZmlsZU1ldGFkYXRhLnRhZ3MpKSB7XG4gICAgICAgIG1ldGFkYXRhLnRhZ3MgPSBmaWxlTWV0YWRhdGEudGFncztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmVkIGVsZW1lbnQgbWV0YWRhdGEnLCB7XG4gICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWUsXG4gICAgICBoYXNGaWxlTWV0YWRhdGE6ICEhZmlsZU1ldGFkYXRhLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCAxMDApIC8vIExvZyBmaXJzdCAxMDAgY2hhcnNcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBtZXRhZGF0YSBhcyBZQU1MIHN0cmluZyBmb3IgZGlzcGxheVxuICAgKiBQRVJGT1JNQU5DRTogVXNlcyBhcnJheSBqb2luIGluc3RlYWQgb2Ygc3RyaW5nIGNvbmNhdGVuYXRpb24gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRNZXRhZGF0YUFzWWFtbChiYXNlTWV0YWRhdGE6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSwgZXh0ZW5kZWRNZXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHlhbWxMaW5lczogc3RyaW5nW10gPSBbXG4gICAgICBgbmFtZTogJHtiYXNlTWV0YWRhdGEubmFtZX1gLFxuICAgICAgYGRlc2NyaXB0aW9uOiAke2Jhc2VNZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgYGF1dGhvcjogJHtiYXNlTWV0YWRhdGEuYXV0aG9yfWAsXG4gICAgICBgdmVyc2lvbjogJHtiYXNlTWV0YWRhdGEudmVyc2lvbn1gLFxuICAgICAgYGNyZWF0ZWQ6ICR7YmFzZU1ldGFkYXRhLmNyZWF0ZWR9YCxcbiAgICAgIGB1cGRhdGVkOiAke2Jhc2VNZXRhZGF0YS51cGRhdGVkfWBcbiAgICBdO1xuICAgIFxuICAgIC8vIEFkZCBvcHRpb25hbCBmaWVsZHMgaWYgcHJlc2VudFxuICAgIGlmIChleHRlbmRlZE1ldGEuY2F0ZWdvcnkpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBjYXRlZ29yeTogJHtleHRlbmRlZE1ldGEuY2F0ZWdvcnl9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShleHRlbmRlZE1ldGEudHJpZ2dlcnMpICYmIGV4dGVuZGVkTWV0YS50cmlnZ2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgdHJpZ2dlcnM6IFske2V4dGVuZGVkTWV0YS50cmlnZ2Vycy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5hZ2VfcmF0aW5nKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgYWdlX3JhdGluZzogJHtleHRlbmRlZE1ldGEuYWdlX3JhdGluZ31gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5haV9nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGFpX2dlbmVyYXRlZDogJHtleHRlbmRlZE1ldGEuYWlfZ2VuZXJhdGVkfWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmdlbmVyYXRpb25fbWV0aG9kKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgZ2VuZXJhdGlvbl9tZXRob2Q6ICR7ZXh0ZW5kZWRNZXRhLmdlbmVyYXRpb25fbWV0aG9kfWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmxpY2Vuc2UpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBsaWNlbnNlOiAke2V4dGVuZGVkTWV0YS5saWNlbnNlfWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShleHRlbmRlZE1ldGEudGFncykgJiYgZXh0ZW5kZWRNZXRhLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYHRhZ3M6IFske2V4dGVuZGVkTWV0YS50YWdzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geWFtbExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG4gIFxuICAvKipcbiAgICogRXh0cmFjdHMgbWV0YWRhdGEgZnJvbSBhbiBlbGVtZW50IGZpbGVcbiAgICogUGFyc2VzIFlBTUwgZnJvbnRtYXR0ZXIgdG8gZ2V0IHRoZSBhY3R1YWwgbWV0YWRhdGFcbiAgICogU0VDVVJJVFk6IFVzZXMgU2VjdXJlWWFtbFBhcnNlciBpbnN0ZWFkIG9mIHlhbWwubG9hZCB0byBwcmV2ZW50IGNvZGUgZXhlY3V0aW9uIChETUNQLVNFQy0wMDUpXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBlbGVtZW50IGZpbGVcbiAgICogQHJldHVybnMgRXh0cmFjdGVkIG1ldGFkYXRhIG9yIG51bGwgaWYgcGFyc2luZyBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleHRyYWN0RWxlbWVudE1ldGFkYXRhKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZpbGVQYXRoLCB7IHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leHRyYWN0RWxlbWVudE1ldGFkYXRhJyB9KTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgZGVzZXJpYWxpemF0aW9uIGF0dGFja3NcbiAgICAgIC8vIFByZXZpb3VzbHkgd291bGQgaGF2ZSB1c2VkOiB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIHdoaWNoIGlzIHZ1bG5lcmFibGVcbiAgICAgIC8vIE5vdzogVXNlcyBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkgd2hpY2ggdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoY29udGVudCwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsICAvLyA2NEtCIGxpbWl0IGZvciBZQU1MXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSwgICAgLy8gRG9uJ3QgdmFsaWRhdGUgY29udGVudCBmaWVsZCAoanVzdCBtZXRhZGF0YSlcbiAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAgICAvLyBEb24ndCBlbmZvcmNlIHBlcnNvbmEtc3BlY2lmaWMgcnVsZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgd2UgZ290IGFuIG9iamVjdCBiYWNrXG4gICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGVkIG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBtZXRhZGF0YUtleXM6IE9iamVjdC5rZXlzKHBhcnNlZC5kYXRhKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXJzZWQgZGF0YSBpcyBub3QgYSB2YWxpZCBtZXRhZGF0YSBvYmplY3QnLCB7IHBhdGg6IGZpbGVQYXRoIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciB0aHJvd3Mgb24gaW52YWxpZCBZQU1MLCB0cnkgYWx0ZXJuYXRlIGZyb250bWF0dGVyIHBhdHRlcm5cbiAgICAgICAgLy8gSGFuZGxlIGZpbGVzIHRoYXQgbWlnaHQgaGF2ZSBmcm9udG1hdHRlciB3aXRob3V0IGZ1bGwgZG9jdW1lbnQgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmcm9udG1hdHRlck1hdGNoICYmIGZyb250bWF0dGVyTWF0Y2hbMV0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgZnVsbCBkb2N1bWVudCBmb3IgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSBgLS0tXFxuJHtmcm9udG1hdHRlck1hdGNoWzFdfVxcbi0tLVxcbmA7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxDb250ZW50LCB7XG4gICAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChpbm5lckVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBwYXJzZSBmcm9udG1hdHRlciB3aXRoIFNlY3VyZVlhbWxQYXJzZXInLCB7XG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogaW5uZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gaW5uZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKGlubmVyRXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmQgaW4gZWxlbWVudCBmaWxlJywgeyBwYXRoOiBmaWxlUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEdpdEh1YiB0b2tlbiBhbmQgY2hlY2tzIGZvciBleHBpcmF0aW9uIGJlZm9yZSB1c2FnZVxuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNSk6IFRva2VuIGV4cGlyYXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHN0YWxlIHRva2VuIHVzYWdlXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgR2l0SHViIHRva2VuIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc3RhdHVzIGFuZCBleHBpcmF0aW9uIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGlzTmVhckV4cGlyeT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayB0b2tlbiBmb3JtYXQgZmlyc3QgKGJhc2ljIHZhbGlkYXRpb24pXG4gICAgICBpZiAoIXRoaXMudG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZScsXG4gICAgICAgICAgZGV0YWlsczogJ1Rva2VuIGhhcyBpbnZhbGlkIGZvcm1hdCdcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHRva2VuIGZvcm1hdC4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX1RPS0VOX0ZPUk1BVCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIHdpdGggR2l0SHViIEFQSSB0byBjaGVjayBleHBpcmF0aW9uIGFuZCBwZXJtaXNzaW9uc1xuICAgICAgLy8gTk9URTogT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIHNjb3BlLCBub3QgJ3JlcG8nXG4gICAgICAvLyBVc2luZyBjZW50cmFsaXplZCBzY29wZSBtYW5hZ2VtZW50IGZvciBjb25zaXN0ZW5jeVxuICAgICAgY29uc3QgcmVxdWlyZWRTY29wZXMgPSB0aGlzLnRva2VuTWFuYWdlci5nZXRSZXF1aXJlZFNjb3BlcygnY29sbGVjdGlvbicpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcn1gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIE9BdXRoLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMudG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICAgIGxldCBlcnJvckNvZGU6IENvbGxlY3Rpb25FcnJvckNvZGU7XG4gICAgICAgIGxldCBlbmhhbmNlZERldGFpbHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgICAgIFxuICAgICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5lcnJvcj8uaW5jbHVkZXMoJ01pc3NpbmcgcmVxdWlyZWQgc2NvcGVzJykpIHtcbiAgICAgICAgICBlcnJvckNvZGUgPSBDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVVUSF8wMDI7XG4gICAgICAgICAgLy8gUHJvdmlkZSBPQXV0aC1zcGVjaWZpYyBndWlkYW5jZSBpZiBpdCdzIGFuIE9BdXRoIHRva2VuXG4gICAgICAgICAgaWYgKHRva2VuVHlwZSA9PT0gJ09BdXRoIEFjY2VzcyBUb2tlbicpIHtcbiAgICAgICAgICAgIGVuaGFuY2VkRGV0YWlscyA9IGBPQXV0aCB0b2tlbiBtaXNzaW5nICdwdWJsaWNfcmVwbycgc2NvcGUuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUgd2l0aCAnc2V0dXBfZ2l0aHViX2F1dGgnIHRvIGdldCB0aGUgY29ycmVjdCBzY29wZS5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvckNvZGUgPSBDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQVVUSF8wMDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdENvbGxlY3Rpb25FcnJvcihlcnJvckNvZGUsIDMsIDUsIGVuaGFuY2VkRGV0YWlscyksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JDb2RlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0b2tlbiBpcyBuZWFyIGV4cGlyYXRpb24gKHJhdGUgbGltaXQgcmVzZXQgdGltZSBjYW4gaW5kaWNhdGUgdG9rZW4gZnJlc2huZXNzKVxuICAgICAgbGV0IGlzTmVhckV4cGlyeSA9IGZhbHNlO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0Py5yZXNldFRpbWUpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgdGltZVVudGlsUmVzZXQgPSB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdC5yZXNldFRpbWUuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKTtcbiAgICAgICAgY29uc3Qgb25lSG91ciA9IDYwICogNjAgKiAxMDAwO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29uc2lkZXIgdG9rZW4gXCJuZWFyIGV4cGlyeVwiIGlmIHJhdGUgbGltaXQgcmVzZXQgaXMgbW9yZSB0aGFuIDIzIGhvdXJzIGF3YXlcbiAgICAgICAgLy8gKEdpdEh1YiByYXRlIGxpbWl0cyByZXNldCBldmVyeSBob3VyLCBzbyB0aGlzIHN1Z2dlc3RzIHRva2VuIGFnZSlcbiAgICAgICAgaWYgKHRpbWVVbnRpbFJlc2V0ID4gMjMgKiBvbmVIb3VyKSB7XG4gICAgICAgICAgaXNOZWFyRXhwaXJ5ID0gdHJ1ZTtcbiAgICAgICAgICBsb2dnZXIud2FybignR2l0SHViIHRva2VuIG1heSBiZSBuZWFyIGV4cGlyYXRpb24nLCB7XG4gICAgICAgICAgICB0b2tlblByZWZpeDogdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRUaW1lOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdC5yZXNldFRpbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlLWF1dGhlbnRpY2F0aW5nIGZvciBsb25nIG9wZXJhdGlvbnMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlZm9yZSB1c2FnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiB0aGlzLnRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHNjb3BlczogdmFsaWRhdGlvblJlc3VsdC5zY29wZXMsXG4gICAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVtYWluaW5nLFxuICAgICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXQgZXhjZWVkZWQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3I/LmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGFsbG93aW5nIG9wZXJhdGlvbiB0byBwcm9jZWVkIHdpdGggY2FjaGVkIHN0YXR1cycpO1xuICAgICAgICAvLyBTdGlsbCBhbGxvdyBvcGVyYXRpb24gYnV0IGxvZyB3aXRoIENPTExfQVBJXzAwMVxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlZCBidXQgcHJvY2VlZGluZyB3aXRoIGNhY2hlZCBzdGF0dXMnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07IC8vIEFsbG93IHRvIHByb2NlZWQgaWYgcmF0ZSBsaW1pdGVkLCBhcyBiYXNpYyBmb3JtYXQgY2hlY2sgcGFzc2VkXG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBHaXRIdWIgdG9rZW4uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgcGF0aCB2YWxpZGF0aW9uIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucyB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgY2hlY2tzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNlY3VyZSBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUG9ydGZvbGlvUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBzYWZlUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIG51bGwvdW5kZWZpbmVkIGNoZWNrXG4gICAgICBpZiAoIWZpbGVQYXRoIHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgcGF0aCBwcm92aWRlZCAtIG51bGwsIHVuZGVmaW5lZCwgb3Igbm9uLXN0cmluZydcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZpbGUgcGF0aCBwcm92aWRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfUEFUSCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zIHRoYXQgY291bGQgaW5kaWNhdGUgcGF0aCB0cmF2ZXJzYWwgb3IgaW5qZWN0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSBbXG4gICAgICAgIC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gVW5peCBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFxcXFxcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBJbnRlbnRpb25hbGx5IGRldGVjdGluZyBudWxsIGJ5dGVzIGZvciBzZWN1cml0eVxuICAgICAgICAvXFx1MDAwMC8sICAgICAgICAgICAgICAgICAgICAvLyBOT1NPTkFSIC0gTnVsbCBieXRlcyBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgZGV0ZWN0aW5nIGNvbnRyb2wgY2hhcnMgZm9yIHNlY3VyaXR5XG4gICAgICAgIC9bXFx1MDAwMS1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXS8sICAgIC8vIE5PU09OQVIgLSBDb250cm9sIGNoYXJhY3RlcnMgZGV0ZWN0aW9uIGZvciBzZWN1cml0eVxuICAgICAgICAvWzw+OlwifD8qXS8sICAgICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3NcbiAgICAgICAgL14oQ09OfFBSTnxBVVh8TlVMfENPTVsxLTldfExQVFsxLTldKSQvaSwgLy8gUmVzZXJ2ZWQgV2luZG93cyBuYW1lc1xuICAgICAgICAvXlxcLi8sICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZGVuIGZpbGVzIChzdGFydGluZyB3aXRoIGRvdClcbiAgICAgICAgL1xccyskLywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgL15bXFxzXSokLywgICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZVxuICAgICAgICAvJVswLTlhLWZBLUZdezJ9LywgICAgICAgICAvLyBVUkwgZW5jb2RpbmcgKHBvdGVudGlhbCBieXBhc3MgYXR0ZW1wdClcbiAgICAgICAgL1xcXFx4WzAtOWEtZkEtRl17Mn0vLCAgICAgICAvLyBIZXggZW5jb2RpbmdcbiAgICAgICAgL1xcJFxcey4qXFx9LywgICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCBpbmplY3Rpb25cbiAgICAgICAgL2AuKmAvLCAgICAgICAgICAgICAgICAgICAgLy8gQmFja3RpY2sgaW5qZWN0aW9uXG4gICAgICAgIC9bXFxcXFxcL117Mix9LyAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoZXNcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzdXNwaWNpb3VzUGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBwYXR0ZXJuIGRldGVjdGVkIGluIGZpbGUgcGF0aDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvbnRhaW5zIGludmFsaWQgb3Igc3VzcGljaW91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdTVVNQSUNJT1VTX1BBVEhfUEFUVEVSTidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHBhdGggbGVuZ3RoIChwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0cylcbiAgICAgIGNvbnN0IE1BWF9QQVRIX0xFTkdUSCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAyNjAgOiA0MDk2O1xuICAgICAgaWYgKGZpbGVQYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0xFTkdUSCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7ZmlsZVBhdGgubGVuZ3RofSA+ICR7TUFYX1BBVEhfTEVOR1RIfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggaXMgdG9vIGxvbmcnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX1RPT19MT05HJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIHBhdGggdG8gcmVzb2x2ZSBhbnkgcmVsYXRpdmUgY29tcG9uZW50cyBzYWZlbHlcbiAgICAgIGxldCBub3JtYWxpemVkUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVtb3ZlIG51bGwgYnl0ZXMgYW5kIG5vcm1hbGl6ZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBJbnRlbnRpb25hbGx5IHJlbW92aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IGNsZWFuUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2VBbGwoL1xcdTAwMDAvZywgJycpOyAvLyBOT1NPTkFSIC0gUmVtb3ZpbmcgbnVsbCBieXRlcyBmb3Igc2VjdXJpdHlcbiAgICAgICAgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShjbGVhblBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgcGF0aCBpcyB3aXRoaW4gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0Jhc2UgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0QmFzZURpcigpO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIGFic29sdXRlIHBhdGhzLCB2ZXJpZnkgdGhleSdyZSB3aXRoaW4gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShwb3J0Zm9saW9CYXNlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggaXMgb3V0c2lkZSBwb3J0Zm9saW8gZGlyZWN0b3J5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgcGF0aHMgd2l0aCAuLiBhcmUgbm90IGFsbG93ZWRcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggY29udGFpbnMgZGlyZWN0b3J5IHRyYXZlcnNhbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogYFBhdGggbm9ybWFsaXphdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGUgcGF0aCBjb3VsZCBub3QgYmUgc2FmZWx5IHByb2Nlc3NlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ1BBVEhfTk9STUFMSVpBVElPTl9GQUlMRUQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4dGVuc2lvbiAob25seSBhbGxvdyBzYWZlIGV4dGVuc2lvbnMgZm9yIHBvcnRmb2xpbyBjb250ZW50KVxuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJywgJy5qc29uJ107XG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICBpZiAoZmlsZUV4dGVuc2lvbiAmJiAhYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogYERpc2FsbG93ZWQgZmlsZSBleHRlbnNpb246ICR7ZmlsZUV4dGVuc2lvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9uczogYWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBGaWxlIGV4dGVuc2lvbiAnJHtmaWxlRXh0ZW5zaW9ufScgaXMgbm90IGFsbG93ZWQuIEFsbG93ZWQgZXh0ZW5zaW9uczogJHthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRV9FWFRFTlNJT04nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmaWxlbmFtZSBjaGFyYWN0ZXJzIChvbmx5IGFsbG93IHNhZmUgY2hhcmFjdGVycylcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCk7XG4gICAgICBjb25zdCBzYWZlRmlsZW5hbWVQYXR0ZXJuID0gL15bYS16QS1aMC05XFwtXy5cXHMoKVtcXF17fV0rJC87XG4gICAgICBcbiAgICAgIGlmIChiYXNlbmFtZSAmJiAhc2FmZUZpbGVuYW1lUGF0dGVybi50ZXN0KGJhc2VuYW1lKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRmlsZW5hbWUgY29udGFpbnMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBmaWxlbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICBhbGxvd2VkUGF0dGVybjogc2FmZUZpbGVuYW1lUGF0dGVybi5zb3VyY2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmlsZW5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiBPbmx5IGxldHRlcnMsIG51bWJlcnMsIHNwYWNlcywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMsIGFuZCBjb21tb24gYnJhY2tldHMgYXJlIGFsbG93ZWQuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvbiB3aXRoIGNvcnJlY3QgZXZlbnQgdHlwZSBmb3IgcGF0aCB2YWxpZGF0aW9uXG4gICAgICAvLyBGaXhlZDogV2FzIHVzaW5nIFRPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUyB3aGljaCBpcyBzZW1hbnRpY2FsbHkgaW5jb3JyZWN0IGZvciBwYXRoIHZhbGlkYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgZGV0YWlsczogJ0ZpbGUgcGF0aCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWwnLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG9yaWdpbmFsUGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoTGVuZ3RoOiBub3JtYWxpemVkUGF0aC5sZW5ndGgsXG4gICAgICAgICAgZmlsZUV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiB8fCAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhZmVQYXRoOiBub3JtYWxpemVkUGF0aFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gdmFsaWRhdGUgZmlsZSBwYXRoLiBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aCBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgZXJyb3I6ICdQQVRIX1ZBTElEQVRJT05fRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IHRva2VuIG1hbmFnZW1lbnQgZm9yIGxvbmcgb3BlcmF0aW9ucyB3aXRoIHJlZnJlc2gtbGlrZSBjYXBhYmlsaXRpZXNcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogVG9rZW4gcmVmcmVzaCBsb2dpYyBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBOb3RlOiBHaXRIdWIgT0F1dGggZGV2aWNlIGZsb3cgdG9rZW5zIGRvbid0IGhhdmUgdHJhZGl0aW9uYWwgcmVmcmVzaCB0b2tlbnMsXG4gICAqIGJ1dCB3ZSBjYW4gaW1wbGVtZW50IHNtYXJ0IHZhbGlkYXRpb24gYW5kIGd1aWRhbmNlIGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICogXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIFR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcmV0dXJucyBUb2tlbiBtYW5hZ2VtZW50IHJlc3VsdCB3aXRoIHJlY29tbWVuZGF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24ob3BlcmF0aW9uVHlwZTogJ3BvcnRmb2xpb19jcmVhdGlvbicgfCAnY29sbGVjdGlvbl9zdWJtaXNzaW9uJyB8ICdmaWxlX3VwbG9hZCcpOiBQcm9taXNlPHtcbiAgICBjYW5Qcm9jZWVkOiBib29sZWFuO1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIHJlZnJlc2hSZWNvbW1lbmRlZD86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgY3VycmVudCB0b2tlblxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QuJyxcbiAgICAgICAgICAgIGVycm9yOiAnTk9fVE9LRU4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiBmb3IgdGhlIHNwZWNpZmljIG9wZXJhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuKTtcbiAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHZhbGlkYXRpb24uZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxvbmcgb3BlcmF0aW9uIHRoYXQgbWlnaHQgYmVuZWZpdCBmcm9tIGZyZXNoIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCBsb25nT3BlcmF0aW9ucyA9IFsncG9ydGZvbGlvX2NyZWF0aW9uJywgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbiddO1xuICAgICAgY29uc3QgaXNMb25nT3BlcmF0aW9uID0gbG9uZ09wZXJhdGlvbnMuaW5jbHVkZXMob3BlcmF0aW9uVHlwZSk7XG5cbiAgICAgIC8vIEdldCB0b2tlbiB0eXBlIHRvIGRldGVybWluZSByZWZyZXNoIGNhcGFiaWxpdGllc1xuICAgICAgLy8gY29kZXFsW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10g4oCUIE9ubHkgdG9rZW5UeXBlIChhIGRlc2NyaXB0aXZlIHN0cmluZyBsaWtlIFwiT0F1dGggQWNjZXNzIFRva2VuXCIpIGlzIGxvZ2dlZCwgbmV2ZXIgdGhlIGFjdHVhbCB0b2tlbiB2YWx1ZVxuICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgIGxldCByZWZyZXNoUmVjb21tZW5kZWQgPSBmYWxzZTtcblxuICAgICAgLy8gRm9yIGxvbmcgb3BlcmF0aW9ucywgY2hlY2sgdG9rZW4gYWdlIGFuZCByZWNvbW1lbmQgcmVmcmVzaCBpZiBuZWVkZWRcbiAgICAgIGlmIChpc0xvbmdPcGVyYXRpb24gJiYgdmFsaWRhdGlvbi5pc05lYXJFeHBpcnkpIHtcbiAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogJ0xvbmcgb3BlcmF0aW9uIGRldGVjdGVkIHdpdGggYWdpbmcgdG9rZW4gLSByZWZyZXNoIHJlY29tbWVuZGVkJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9nZ2VyLndhcm4oJ0xvbmcgb3BlcmF0aW9uIHdpdGggcG90ZW50aWFsbHkgYWdpbmcgdG9rZW4gZGV0ZWN0ZWQnLCB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZS1hdXRoZW50aWNhdGluZyBpZiBvcGVyYXRpb24gZmFpbHMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgT0F1dGggdG9rZW5zIGluIGxvbmcgb3BlcmF0aW9ucywgd2UgY2FuIHByb3ZpZGUgZ3VpZGFuY2VcbiAgICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nICYmIGlzTG9uZ09wZXJhdGlvbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnT0F1dGggdG9rZW4gZGV0ZWN0ZWQgZm9yIGxvbmcgb3BlcmF0aW9uJywge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIGd1aWRhbmNlOiAnT0F1dGggdG9rZW5zIGFyZSB0aW1lLWxpbWl0ZWQuIElmIG9wZXJhdGlvbiBmYWlscywgcmUtYXV0aGVudGljYXRlIHVzaW5nIHNldHVwX2dpdGh1Yl9hdXRoJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdG9rZW4gbWFuYWdlbWVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogJ1Rva2VuIG1hbmFnZW1lbnQgc3VjY2Vzc2Z1bCBmb3IgbG9uZyBvcGVyYXRpb24nLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIGlzTG9uZ09wZXJhdGlvbixcbiAgICAgICAgICByZWZyZXNoUmVjb21tZW5kZWRcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhblByb2NlZWQ6IHRydWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICByZWZyZXNoUmVjb21tZW5kZWRcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gbWFuYWdlbWVudCBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byBtYW5hZ2UgdG9rZW4gZm9yIG9wZXJhdGlvbi4gUGxlYXNlIGNoZWNrIHlvdXIgYXV0aGVudGljYXRpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fTUFOQUdFTUVOVF9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdXNlciBndWlkYW5jZSBmb3IgdG9rZW4gcmVmcmVzaCB3aGVuIG9wZXJhdGlvbnMgZmFpbCBkdWUgdG8gdG9rZW4gaXNzdWVzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFVzZXIgZ3VpZGFuY2UgZm9yIGF1dGhlbnRpY2F0aW9uIHJlZnJlc2hcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0VG9rZW5SZWZyZXNoR3VpZGFuY2Uob3BlcmF0aW9uVHlwZTogc3RyaW5nLCB0b2tlblR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGd1aWRhbmNlID0gJ1xcblxcbvCflIQgKipUb2tlbiBSZWZyZXNoIEd1aWRhbmNlKio6XFxuJztcbiAgICBcbiAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJykge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIE9BdXRoIHRva2VuIG1heSBoYXZlIGV4cGlyZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBSdW4gYHNldHVwX2dpdGh1Yl9hdXRoYCB0byBhdXRoZW50aWNhdGUgYWdhaW5cXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBmcmVzaCB0b2tlbiBmb3IgY29udGludWVkIGFjY2Vzc1xcbic7XG4gICAgfSBlbHNlIGlmICh0b2tlblR5cGUgPT09ICdQZXJzb25hbCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgUGVyc29uYWwgQWNjZXNzIFRva2VuIG1heSBoYXZlIGV4cGlyZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBDaGVjayB5b3VyIEdpdEh1YiBzZXR0aW5nczogaHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL3Rva2Vuc1xcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIEdlbmVyYXRlIGEgbmV3IHRva2VuIGlmIG5lZWRlZCBhbmQgdXBkYXRlIEdJVEhVQl9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBHaXRIdWIgdG9rZW4gbWF5IGhhdmUgZXhwaXJlZCBvciBiZWVuIHJldm9rZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBSZS1hdXRoZW50aWNhdGUgdXNpbmcgYHNldHVwX2dpdGh1Yl9hdXRoYFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIEVuc3VyZSB5b3VyIHRva2VuIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnNcXG4nO1xuICAgIH1cblxuICAgIGd1aWRhbmNlICs9IGBcXG4qKk9wZXJhdGlvbioqOiAke29wZXJhdGlvblR5cGV9XFxuYDtcbiAgICBndWlkYW5jZSArPSAnKipSZXF1aXJlZCBzY29wZXMqKjogcmVwbywgdXNlcjplbWFpbFxcblxcbic7XG4gICAgZ3VpZGFuY2UgKz0gJ/CfkqEgKipUaXAqKjogRnJlc2ggdG9rZW5zIHdvcmsgYmV0dGVyIGZvciBjb21wbGV4IG9wZXJhdGlvbnMgbGlrZSBwb3J0Zm9saW8gY3JlYXRpb24uJztcblxuICAgIHJldHVybiBndWlkYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIEdpdEh1YiByZXBvc2l0b3J5IGFjY2VzcyBhbmQgZW5zdXJlcyBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHNcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWVcbiAgICogQHJldHVybnMgU2V0dXAgcmVzdWx0IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzOiBhbnkpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICBjb25zdCB0b2tlbk1hbmFnZW1lbnQgPSBhd2FpdCB0aGlzLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbigncG9ydGZvbGlvX2NyZWF0aW9uJyk7XG4gICAgaWYgKCF0b2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB0b2tlbk1hbmFnZW1lbnQuZXJyb3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSB1c2VyIGd1aWRhbmNlIGlmIHJlZnJlc2ggaXMgcmVjb21tZW5kZWQgZm9yIHRoaXMgbG9uZyBvcGVyYXRpb25cbiAgICBpZiAodG9rZW5NYW5hZ2VtZW50LnJlZnJlc2hSZWNvbW1lbmRlZCkge1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgIGNvbnN0IGd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIGNyZWF0aW9uJywgdG9rZW5UeXBlKTtcbiAgICAgIGxvZ2dlci53YXJuKGBUb2tlbiByZWZyZXNoIHJlY29tbWVuZGVkIGZvciBwb3J0Zm9saW8gY3JlYXRpb246JHtndWlkYW5jZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLnNldFRva2VuKHRva2VuKTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCB1c2VybmFtZSA9IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IHBvcnRmb2xpb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuICAgIFxuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIHJlcG9zaXRvcnkuLi4nKTtcbiAgICAgIC8vIFJlcXVlc3QgY29uc2VudCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uXG4gICAgICBjb25zdCByZXBvVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5jcmVhdGVQb3J0Zm9saW8odXNlcm5hbWUsIHRydWUpO1xuICAgICAgaWYgKCFyZXBvVXJsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnknLFxuICAgICAgICAgICAgZXJyb3I6ICdDUkVBVEVfRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICogUHJldmVudHMgZHVwbGljYXRlIHVwbG9hZHMgYnkgY29tcGFyaW5nIGNvbnRlbnQgaGFzaGVzXG4gICAqIEBwYXJhbSByZXBvRnVsbE5hbWUgR2l0SHViIHJlcG9zaXRvcnkgZnVsbCBuYW1lIChvd25lci9yZXBvKVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeVxuICAgKiBAcGFyYW0gY29udGVudCBDb250ZW50IHRvIGNoZWNrIGFnYWluc3QgZXhpc3RpbmdcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBpZGVudGljYWwgY29udGVudCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0V4aXN0aW5nQ29udGVudChcbiAgICByZXBvRnVsbE5hbWU6IHN0cmluZywgXG4gICAgZmlsZVBhdGg6IHN0cmluZywgXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gZmV0Y2ggZXhpc3RpbmcgZmlsZSBmcm9tIEdpdEh1YlxuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvRnVsbE5hbWV9L2NvbnRlbnRzLyR7ZmlsZVBhdGh9YDtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYSBkdXBsaWNhdGVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gY2hlY2sgZXhpc3RpbmcgY29udGVudCcsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT24gZXJyb3IsIGFsbG93IHVwbG9hZCB0byBwcm9jZWVkXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8gR2l0SHViIHJldHVybnMgY29udGVudCBhcyBiYXNlNjRcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IEJ1ZmZlci5mcm9tKGRhdGEuY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBDb21wYXJlIGNvbnRlbnQgaGFzaGVzXG4gICAgICBjb25zdCBleGlzdGluZ0hhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoZXhpc3RpbmdDb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgY29uc3QgbmV3SGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgXG4gICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGV4aXN0aW5nSGFzaCA9PT0gbmV3SGFzaDtcbiAgICAgIFxuICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEdXBsaWNhdGUgY29udGVudCBkZXRlY3RlZCwgc2tpcHBpbmcgdXBsb2FkJywge1xuICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIGhhc2g6IG5ld0hhc2guc3Vic3RyaW5nKDAsIDgpIC8vIExvZyBwYXJ0aWFsIGhhc2ggZm9yIGRlYnVnZ2luZ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGlzRHVwbGljYXRlO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdFcnJvciBjaGVja2luZyBmb3IgZXhpc3RpbmcgY29udGVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcGF0aDogZmlsZVBhdGhcbiAgICAgIH0pO1xuICAgICAgLy8gT24gZXJyb3IsIGFsbG93IHVwbG9hZCB0byBwcm9jZWVkIHJhdGhlciB0aGFuIGJsb2NraW5nXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGlzc3VlIGZvciB0aGlzIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGVsZW1lbnROYW1lIE5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXIgc3VibWl0dGluZyB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gdG9rZW4gR2l0SHViIHRva2VuIGZvciBBUEkgYWNjZXNzXG4gICAqIEByZXR1cm5zIFVSTCBvZiBleGlzdGluZyBpc3N1ZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tFeGlzdGluZ0lzc3VlKFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTZWFyY2ggZm9yIGV4aXN0aW5nIGlzc3VlcyB3aXRoIHRoaXMgZWxlbWVudCBuYW1lXG4gICAgICAvLyBVc2luZyBib3RoIHRpdGxlIGFuZCBhdXRob3IgdG8gZW5zdXJlIGl0J3MgdGhlIHNhbWUgc3VibWlzc2lvblxuICAgICAgY29uc3QgcXVlcnkgPSBgcmVwbzpEb2xsaG91c2VNQ1AvY29sbGVjdGlvbiBpczppc3N1ZSBcIiR7ZWxlbWVudE5hbWV9XCIgaW46dGl0bGUgYXV0aG9yOiR7dXNlcm5hbWV9YDtcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3NlYXJjaC9pc3N1ZXM/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JnNvcnQ9Y3JlYXRlZCZvcmRlcj1kZXNjYDtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gc2VhcmNoIGZvciBleGlzdGluZyBpc3N1ZXMnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRm91bmQgZXhpc3RpbmcgaXNzdWUocylcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJc3N1ZSA9IGRhdGEuaXRlbXNbMF07XG4gICAgICAgIGxvZ2dlci5pbmZvKCdGb3VuZCBleGlzdGluZyBjb2xsZWN0aW9uIGlzc3VlJywge1xuICAgICAgICAgIGlzc3VlVXJsOiBleGlzdGluZ0lzc3VlLmh0bWxfdXJsLFxuICAgICAgICAgIGVsZW1lbnROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJc3N1ZS5odG1sX3VybDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGNoZWNraW5nIGZvciBleGlzdGluZyBjb2xsZWN0aW9uIGlzc3VlJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlbGVtZW50TmFtZVxuICAgICAgfSk7XG4gICAgICAvLyBPbiBlcnJvciwgYWxsb3cgc3VibWlzc2lvbiB0byBwcm9jZWVkXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBlbGVtZW50IHRvIHBvcnRmb2xpbyBhbmQgaGFuZGxlcyB0aGUgY29tcGxldGUgcmVzcG9uc2Ugd29ya2Zsb3dcbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBDb21wbGV0ZSBzdWJtaXNzaW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3MgbWVzc2FnZSBvciBlcnJvclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgc2FmZU5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWV0YWRhdGE6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgYXV0aFN0YXR1czogYW55LFxuICAgIGxvY2FsUGF0aD86IHN0cmluZyAgLy8gTG9jYWwgZmlsZSBwYXRoIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgKTogUHJvbWlzZTxTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdD4ge1xuICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT046IENoZWNrIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMgaW4gcG9ydGZvbGlvXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gYCR7YXV0aFN0YXR1cy51c2VybmFtZX0vJHt0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdldFJlcG9zaXRvcnlOYW1lKCl9YDtcbiAgICAvLyBJc3N1ZSAjODE1OiBVc2UgY29ycmVjdCBmaWxlIGV4dGVuc2lvbiBwZXIgZWxlbWVudCB0eXBlXG4gICAgY29uc3QgZmlsZVBhdGggPSBgJHtlbGVtZW50VHlwZX0vJHtzYWZlTmFtZX0ke2dldEVsZW1lbnRGaWxlRXh0ZW5zaW9uKGVsZW1lbnRUeXBlKX1gO1xuICAgIFxuICAgIC8vIFByZXBhcmUgdGhlIGZ1bGwgY29udGVudCB0aGF0IHdvdWxkIGJlIHNhdmVkXG4gICAgLy8gSXNzdWUgIzg1MjogTWVtb3JpZXMgYXJlIHB1cmUgWUFNTCDigJQgZG9uJ3Qgd3JhcCBpbiBtYXJrZG93biBmcm9udG1hdHRlclxuICAgIGNvbnN0IGlzWWFtbFR5cGUgPSBnZXRFbGVtZW50RmlsZUV4dGVuc2lvbihlbGVtZW50VHlwZSkgPT09ICcueWFtbCc7XG4gICAgY29uc3QgZnVsbENvbnRlbnQgPSBpc1lhbWxUeXBlXG4gICAgICA/IGNvbnRlbnQgIC8vIFlBTUwgZWxlbWVudHM6IHVzZSByYXcgY29udGVudCAobWF0Y2hlcyBzZXJpYWxpemUoKSBvdXRwdXQpXG4gICAgICA6IGAtLS1cXG4ke0pTT04uc3RyaW5naWZ5KG1ldGFkYXRhLCBudWxsLCAyKX1cXG4tLS1cXG5cXG4ke2NvbnRlbnR9YDtcbiAgICBcbiAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGF3YWl0IHRoaXMuY2hlY2tFeGlzdGluZ0NvbnRlbnQoXG4gICAgICByZXBvRnVsbE5hbWUsIFxuICAgICAgZmlsZVBhdGgsIFxuICAgICAgZnVsbENvbnRlbnQsXG4gICAgICBhdXRoU3RhdHVzLnRva2VuXG4gICAgKTtcbiAgICBcbiAgICBsZXQgZmlsZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAvLyBDb250ZW50IGFscmVhZHkgZXhpc3RzLCBjb25zdHJ1Y3QgdGhlIFVSTCB3aXRob3V0IHVwbG9hZGluZ1xuICAgICAgZmlsZVVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvRnVsbE5hbWV9L2Jsb2IvbWFpbi8ke2ZpbGVQYXRofWA7XG4gICAgICBsb2dnZXIuaW5mbygnU2tpcHBlZCBkdXBsaWNhdGUgdXBsb2FkIHRvIHBvcnRmb2xpbycsIHtcbiAgICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBlbGVtZW50IHN0cnVjdHVyZSB0byBzYXZlXG4gICAgICBjb25zdCBlbGVtZW50OiBQb3J0Zm9saW9FbGVtZW50ID0ge1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFRZUEUgU0FGRVRZIEZJWCAjMjogVXNlIGFkYXB0ZXIgcGF0dGVybiBpbnN0ZWFkIG9mIGNvbXBsZXggdHlwZSBjYXN0aW5nXG4gICAgICAvLyBQcmV2aW91c2x5OiBlbGVtZW50IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2YgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudD5bMF1cbiAgICAgIC8vIE5vdzogQ2xlYW4gYWRhcHRlciBwYXR0ZXJuIHRoYXQgaW1wbGVtZW50cyBJRWxlbWVudCBpbnRlcmZhY2UgcHJvcGVybHlcbiAgICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIoZWxlbWVudCk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBBZGQgcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgICAgZmlsZVVybCA9IGF3YWl0IHRoaXMuc2F2ZUVsZW1lbnRXaXRoUmV0cnkoYWRhcHRlciwgc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFmaWxlVXJsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gR2l0SHViIHBvcnRmb2xpbyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy5cXG5cXG4nICtcbiAgICAgICAgICAgICAgICAn8J+SoSAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayB5b3VyIEdpdEh1YiBhdXRoZW50aWNhdGlvbjogYGdoIGF1dGggc3RhdHVzYFxcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVmVyaWZ5IHJlcG9zaXRvcnkgcGVybWlzc2lvbnNcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIFRyeSBhZ2FpbiBpbiBhIGZldyBtaW51dGVzIChHaXRIdWIgQVBJIHJhdGUgbGltaXRzKVxcbicgK1xuICAgICAgICAgICAgICAgICfigKIgQ2hlY2sgR2l0SHViIHN0YXR1czogaHR0cHM6Ly9zdGF0dXMuZ2l0aHViLmNvbScsXG4gICAgICAgIGVycm9yOiAnU0FWRV9GQUlMRUQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIExvZyBzdWJtaXNzaW9uIHJlc3VsdCAoRE1DUC1TRUMtMDA2KVxuICAgIC8vIENoZWNrIGlmIHRoaXMgd2FzIGEgZHVwbGljYXRlIHNraXAgb3IgYWN0dWFsIHVwbG9hZFxuICAgIGNvbnN0IHdhc0R1cGxpY2F0ZSA9IGZpbGVVcmwgJiYgZmlsZVVybC5pbmNsdWRlcygnYmxvYi9tYWluLycpICYmICFmaWxlVXJsLmluY2x1ZGVzKCcvY29tbWl0LycpO1xuICAgIFxuICAgIGlmICh3YXNEdXBsaWNhdGUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTa2lwcGVkIGR1cGxpY2F0ZSB1cGxvYWQgZm9yICR7c2FmZU5hbWV9IC0gYWxyZWFkeSBpbiBwb3J0Zm9saW9gLCB7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICB1c2VybmFtZTogYXV0aFN0YXR1cy51c2VybmFtZSxcbiAgICAgICAgZmlsZVVybFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgc3VibWl0dGVkICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gLCB7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICB1c2VybmFtZTogYXV0aFN0YXR1cy51c2VybmFtZSxcbiAgICAgICAgZmlsZVVybFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgY29uc3QgY29sbGVjdGlvblRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nKTtcbiAgICBpZiAoIWNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgLy8gVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgYnV0IG1haW4gc3VibWlzc2lvbiBzdWNjZWVkZWRcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Rva2VuIG1hbmFnZW1lbnQgZmFpbGVkJztcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01lc3NhZ2UgPSB3YXNEdXBsaWNhdGUgPyBcbiAgICAgICAgYOKchSAke3NhZmVOYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiB5b3VyIEdpdEh1YiBwb3J0Zm9saW8gKG5vIGNoYW5nZXMgbmVlZGVkKWAgOlxuICAgICAgICBg4pyFIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAke3NhZmVOYW1lfSB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW8hYDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYCR7cG9ydGZvbGlvTWVzc2FnZX1cXG7wn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG7imqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHNraXBwZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIHVybDogZmlsZVVybFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlIGlmIHJlY29tbWVuZGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBpZiAoY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMudG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHByb2NlZWRpbmcgd2l0aCBhZ2luZyB0b2tlbicsIHtcbiAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0lmIGNvbGxlY3Rpb24gc3VibWlzc2lvbiBmYWlscywgdHJ5IHJlLWF1dGhlbnRpY2F0aW5nIHdpdGggc2V0dXBfZ2l0aHViX2F1dGgnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IEFzayB1c2VyIGlmIHRoZXkgd2FudCB0byBzdWJtaXQgdG8gY29sbGVjdGlvblxuICAgIC8vIFRoaXMgY29tcGxldGVzIHRoZSBjb21tdW5pdHkgY29udHJpYnV0aW9uIHdvcmtmbG93XG4gICAgY29uc3QgY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQgPSBhd2FpdCB0aGlzLnByb21wdEZvckNvbGxlY3Rpb25TdWJtaXNzaW9uKHtcbiAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZSxcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgcG9ydGZvbGlvVXJsOiBmaWxlVXJsLFxuICAgICAgdXNlcm5hbWU6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgJ3Vua25vd24nLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICB0b2tlbixcbiAgICAgIGxvY2FsUGF0aCAgLy8gUGFzcyB0aGUgbG9jYWwgZmlsZSBwYXRoIGZvciByZWFkaW5nIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhc2VkIG9uIHdoYXQgaGFwcGVuZWRcbiAgICBjb25zdCBwb3J0Zm9saW9NZXNzYWdlID0gd2FzRHVwbGljYXRlID8gXG4gICAgICBg4pyFICR7c2FmZU5hbWV9IGFscmVhZHkgZXhpc3RzIGluIHlvdXIgR2l0SHViIHBvcnRmb2xpbyAobm8gY2hhbmdlcyBuZWVkZWQpYCA6XG4gICAgICBg4pyFIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAke3NhZmVOYW1lfSB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW8hYDtcbiAgICBcbiAgICBsZXQgbWVzc2FnZSA9IGAke3BvcnRmb2xpb01lc3NhZ2V9XFxuYDtcbiAgICBtZXNzYWdlICs9IGDwn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG5gO1xuICAgIFxuICAgIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5zdWJtaXR0ZWQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc0R1cGxpY2F0ZSkge1xuICAgICAgICBtZXNzYWdlICs9IGDwn5OLIENvbGxlY3Rpb24gaXNzdWUgYWxyZWFkeSBleGlzdHMgKG5vIG5ldyBzdWJtaXNzaW9uIG5lZWRlZClcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5SXIElzc3VlOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0Lmlzc3VlVXJsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlICs9IGDwn46JIEFsc28gc3VibWl0dGVkIHRvIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGZvciBjb21tdW5pdHkgcmV2aWV3IVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk4sgSXNzdWU6ICR7Y29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuaXNzdWVVcmx9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmRlY2xpbmVkKSB7XG4gICAgICBtZXNzYWdlICs9IGDwn5KhIFlvdSBjYW4gc3VibWl0IHRvIHRoZSBjb2xsZWN0aW9uIGxhdGVyIHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQuYDtcbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBtZXNzYWdlICs9IGDimqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIGZhaWxlZDogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5lcnJvcn1cXG5gO1xuICAgICAgbWVzc2FnZSArPSBg8J+SoSBZb3UgY2FuIG1hbnVhbGx5IHN1Ym1pdCBhdDogaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcy9uZXdgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHVybDogZmlsZVVybFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMpOiBQcm9taXNlPFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1pbmdzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ/CfmoAgU1VCTUlTU0lPTiBXT1JLRkxPVyBTVEFSVElORycsIHtcbiAgICAgIHBhcmFtczogSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFN0ZXAgMTogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbnB1dCBwYXJhbWV0ZXJzXG4gICAgICBsb2dnZXIuaW5mbygn8J+TiyBTdGVwIDEvODogVmFsaWRhdGluZyBwYXJhbWV0ZXJzLi4uJyk7XG4gICAgICBjb25zdCBzdGVwMVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kTm9ybWFsaXplUGFyYW1zKHBhcmFtcyk7XG4gICAgICB0aW1pbmdzWyd2YWxpZGF0aW9uJ10gPSBEYXRlLm5vdygpIC0gc3RlcDFTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCAxIGNvbXBsZXRlICgke3RpbWluZ3NbJ3ZhbGlkYXRpb24nXX1tcylgKTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gdmFsaWRhdGlvblJlc3VsdC5zYWZlTmFtZSE7XG5cbiAgICAgIC8vIFN0ZXAgMjogRmluZCBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgICAgbG9nZ2VyLmluZm8oJ/CflI0gU3RlcCAyLzg6IEZpbmRpbmcgY29udGVudCBsb2NhbGx5Li4uJyk7XG4gICAgICBjb25zdCBzdGVwMlN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRSZXN1bHQgPSBhd2FpdCB0aGlzLmRpc2NvdmVyQ29udGVudFdpdGhUeXBlRGV0ZWN0aW9uKHNhZmVOYW1lISwgcGFyYW1zLnR5cGUsIHBhcmFtcy5uYW1lKTtcbiAgICAgIHRpbWluZ3NbJ2NvbnRlbnREaXNjb3ZlcnknXSA9IERhdGUubm93KCkgLSBzdGVwMlN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDIgY29tcGxldGUgKCR7dGltaW5nc1snY29udGVudERpc2NvdmVyeSddfW1zKWAsIHtcbiAgICAgICAgZm91bmQ6IGNvbnRlbnRSZXN1bHQuc3VjY2VzcyxcbiAgICAgICAgZWxlbWVudFR5cGU6IGNvbnRlbnRSZXN1bHQuZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdGg6IGNvbnRlbnRSZXN1bHQubG9jYWxQYXRoXG4gICAgICB9KTtcbiAgICAgIGlmICghY29udGVudFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBjb250ZW50UmVzdWx0LmVycm9yITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gY29udGVudFJlc3VsdC5lbGVtZW50VHlwZSE7XG4gICAgICBjb25zdCBsb2NhbFBhdGggPSBjb250ZW50UmVzdWx0LmxvY2FsUGF0aCE7XG5cbiAgICAgIC8vIFN0ZXAgMzogVmFsaWRhdGUgZmlsZSBhbmQgY29udGVudCBzZWN1cml0eSAoaW5jbHVkaW5nIHNpemUgY2hlY2spXG4gICAgICAvLyBUaGlzIGhhcHBlbnMgQkVGT1JFIGF1dGhlbnRpY2F0aW9uIHNvIHVzZXJzIGdldCBpbW1lZGlhdGUgZmVlZGJhY2sgYWJvdXQgZmlsZSBpc3N1ZXNcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SSIFN0ZXAgMy84OiBWYWxpZGF0aW5nIHNlY3VyaXR5IGFuZCBmaWxlIHNpemUuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXAzU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2VjdXJpdHlSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoKTtcbiAgICAgIHRpbWluZ3NbJ3NlY3VyaXR5J10gPSBEYXRlLm5vdygpIC0gc3RlcDNTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCAzIGNvbXBsZXRlICgke3RpbWluZ3NbJ3NlY3VyaXR5J119bXMpYCk7XG4gICAgICBpZiAoIXNlY3VyaXR5UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHNlY3VyaXR5UmVzdWx0LmVycm9yITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBzZWN1cml0eVJlc3VsdC5jb250ZW50ITtcblxuICAgICAgLy8gU3RlcCA0OiBDaGVjayBhdXRoZW50aWNhdGlvbiBzdGF0dXNcbiAgICAgIC8vIFRoaXMgaGFwcGVucyBBRlRFUiBmaWxlIHZhbGlkYXRpb24gc28gdXNlcnMgZG9uJ3QgbmVlZCB0byBhdXRoIGp1c3QgdG8gbGVhcm4gdGhlaXIgZmlsZSBpcyB0b28gbGFyZ2VcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SQIFN0ZXAgNC84OiBDaGVja2luZyBhdXRoZW50aWNhdGlvbi4uLicpO1xuICAgICAgY29uc3Qgc3RlcDRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBhdXRoUmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja0F1dGhlbnRpY2F0aW9uKCk7XG4gICAgICB0aW1pbmdzWydhdXRoZW50aWNhdGlvbiddID0gRGF0ZS5ub3coKSAtIHN0ZXA0U3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgNCBjb21wbGV0ZSAoJHt0aW1pbmdzWydhdXRoZW50aWNhdGlvbiddfW1zKWAsIHtcbiAgICAgICAgdXNlcm5hbWU6IGF1dGhSZXN1bHQuYXV0aFN0YXR1cz8udXNlcm5hbWUsXG4gICAgICAgIGhhc1Rva2VuOiAhIWF1dGhSZXN1bHQuYXV0aFN0YXR1cz8uaGFzVG9rZW5cbiAgICAgIH0pO1xuICAgICAgaWYgKCFhdXRoUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGF1dGhSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgYXV0aFN0YXR1cyA9IGF1dGhSZXN1bHQuYXV0aFN0YXR1cyE7XG5cbiAgICAgIC8vIFN0ZXAgNTogUHJlcGFyZSBtZXRhZGF0YSBmb3IgZWxlbWVudFxuICAgICAgbG9nZ2VyLmluZm8oJ/Cfk50gU3RlcCA1Lzg6IFByZXBhcmluZyBtZXRhZGF0YS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDVTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucHJlcGFyZUVsZW1lbnRNZXRhZGF0YShzYWZlTmFtZSEsIGVsZW1lbnRUeXBlLCBhdXRoU3RhdHVzLCBsb2NhbFBhdGgpO1xuICAgICAgdGltaW5nc1snbWV0YWRhdGEnXSA9IERhdGUubm93KCkgLSBzdGVwNVN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDUgY29tcGxldGUgKCR7dGltaW5nc1snbWV0YWRhdGEnXX1tcylgLCB7XG4gICAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGVwIDY6IFNldCB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3NcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SnIFN0ZXAgNi84OiBTZXR0aW5nIHVwIEdpdEh1YiByZXBvc2l0b3J5Li4uJyk7XG4gICAgICBjb25zdCBzdGVwNlN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlcG9SZXN1bHQgPSBhd2FpdCB0aGlzLnNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzKTtcbiAgICAgIHRpbWluZ3NbJ3JlcG9TZXR1cCddID0gRGF0ZS5ub3coKSAtIHN0ZXA2U3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgNiBjb21wbGV0ZSAoJHt0aW1pbmdzWydyZXBvU2V0dXAnXX1tcylgLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHJlcG9SZXN1bHQuc3VjY2Vzc1xuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcG9SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gcmVwb1Jlc3VsdC5lcnJvciE7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgNzogU3VibWl0IGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGUgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICBsb2dnZXIuaW5mbygn8J+TpCBTdGVwIDcvODogU3VibWl0dGluZyB0byBwb3J0Zm9saW8uLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXA3U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgICAgIHNhZmVOYW1lISwgXG4gICAgICAgIGVsZW1lbnRUeXBlLCBcbiAgICAgICAgbWV0YWRhdGEsIFxuICAgICAgICBjb250ZW50LCBcbiAgICAgICAgYXV0aFN0YXR1cyxcbiAgICAgICAgbG9jYWxQYXRoICAvLyBQYXNzIGZpbGUgcGF0aCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgdGltaW5nc1snc3VibWlzc2lvbiddID0gRGF0ZS5ub3coKSAtIHN0ZXA3U3RhcnQ7XG4gICAgICBcbiAgICAgIC8vIFN0ZXAgODogRmluYWwgcmVwb3J0aW5nXG4gICAgICB0aW1pbmdzWyd0b3RhbCddID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKCfinKggU1VCTUlTU0lPTiBXT1JLRkxPVyBDT01QTEVURScsIHtcbiAgICAgICAgc3VjY2VzczogcmVzdWx0LnN1Y2Nlc3MsXG4gICAgICAgIHRpbWluZ3MsXG4gICAgICAgIHRvdGFsVGltZTogYCR7dGltaW5nc1sndG90YWwnXX1tc2BcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IEVuaGFuY2VkIGVycm9yIGhhbmRsaW5nIHdpdGggdG9rZW4gcmVmcmVzaCBndWlkYW5jZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdzdWJtaXRUb1BvcnRmb2xpbycsIGVycm9yLCB7XG4gICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy50eXBlXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZXJyb3IgaXMgdG9rZW4tcmVsYXRlZCBhbmQgcHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1Rva2VuRXJyb3IgPSBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndG9rZW4nKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F1dGgnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnNDAxJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJzQwMycpO1xuXG4gICAgICBsZXQgZm9ybWF0dGVkRXJyb3IgPSBFcnJvckhhbmRsZXIuZm9ybWF0Rm9yUmVzcG9uc2UoZXJyb3IpO1xuXG4gICAgICBpZiAoaXNUb2tlbkVycm9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gR2V0IGN1cnJlbnQgdG9rZW4gdG8gZGV0ZXJtaW5lIHR5cGUgZm9yIGd1aWRhbmNlXG4gICAgICAgICAgY29uc3QgY3VycmVudFRva2VuID0gYXdhaXQgdGhpcy50b2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMudG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZShjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgcmVmcmVzaEd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIHN1Ym1pc3Npb24nLCB0b2tlblR5cGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBlbmQgcmVmcmVzaCBndWlkYW5jZSB0byBlcnJvciBtZXNzYWdlXG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVkRXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9IHJlZnJlc2hHdWlkYW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElmIHdlIGNhbid0IGdldCB0b2tlbiBpbmZvLCBwcm92aWRlIGdlbmVyaWMgZ3VpZGFuY2VcbiAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9ICdcXG5cXG7wn5SEICoqQXV0aGVudGljYXRpb24gSXNzdWUqKjogVHJ5IHJ1bm5pbmcgYHNldHVwX2dpdGh1Yl9hdXRoYCB0byByZWZyZXNoIHlvdXIgYXV0aGVudGljYXRpb24uJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0dGVkRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb21wdHMgdXNlciB0byBzdWJtaXQgY29udGVudCB0byB0aGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb25cbiAgICogRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBDb21wbGV0ZSB0aGUgY29tbXVuaXR5IGNvbnRyaWJ1dGlvbiB3b3JrZmxvd1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9tcHRGb3JDb2xsZWN0aW9uU3VibWlzc2lvbihwYXJhbXM6IHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgICBwb3J0Zm9saW9Vcmw6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7ICAvLyBQYXRoIHRvIHRoZSBsb2NhbCBlbGVtZW50IGZpbGVcbiAgfSk6IFByb21pc2U8eyBzdWJtaXR0ZWQ6IGJvb2xlYW47IGRlY2xpbmVkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZzsgaXNzdWVVcmw/OiBzdHJpbmc7IGlzRHVwbGljYXRlPzogYm9vbGVhbiB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBwcm9tcHQgbWVzc2FnZSBmb3IgdGhlIHVzZXJcbiAgICAgIC8vIE5vdGU6IEluIE1DUCBjb250ZXh0LCB3ZSBjYW4ndCBkbyBpbnRlcmFjdGl2ZSBwcm9tcHRzLCBzbyB3ZSdsbCBuZWVkIHRvXG4gICAgICAvLyBlaXRoZXIgbWFrZSB0aGlzIGF1dG9tYXRpYyBvciByZXF1aXJlIGEgcGFyYW1ldGVyXG4gICAgICBcbiAgICAgIC8vIEZvciBub3csIGxldCdzIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICAgIC8vIHRvIGF1dG8tc3VibWl0IHRvIGNvbGxlY3Rpb24gKG9wdC1pbiBiZWhhdmlvcilcbiAgICAgIGNvbnN0IGF1dG9TdWJtaXQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTiA9PT0gJ3RydWUnO1xuICAgICAgXG4gICAgICBpZiAoIWF1dG9TdWJtaXQpIHtcbiAgICAgICAgLy8gVXNlciBoYXNuJ3Qgb3B0ZWQgaW4gdG8gYXV0by1zdWJtaXNzaW9uXG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2tpcHBlZCAoc2V0IERPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OPXRydWUgdG8gZW5hYmxlKScpO1xuICAgICAgICAvLyBVc2UgQ09MTF9DRkdfMDAxIGVycm9yIGNvZGUgZm9yIGF1dG8tc3VibWl0IGRpc2FibGVkXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGZvcm1hdENvbGxlY3Rpb25FcnJvcihDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQ0ZHXzAwMSwgNSwgNSk7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiB0cnVlLCBlcnJvcjogZXJyb3JNZXNzYWdlIH07XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdBdXRvLXN1Ym1pdHRpbmcgdG8gRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24uLi4nKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBpc3N1ZSBpbiB0aGUgY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29sbGVjdGlvbklzc3VlKHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgICBsb2NhbFBhdGg6IHBhcmFtcy5sb2NhbFBhdGggIC8vIFBhc3MgdGhyb3VnaCB0aGUgZmlsZSBwYXRoXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzc3VlVXJsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgd2FzIGFuIGV4aXN0aW5nIGlzc3VlIChkdXBsaWNhdGUpIG9yIG5ld2x5IGNyZWF0ZWRcbiAgICAgICAgLy8gVGhlIGNoZWNrRXhpc3RpbmdJc3N1ZSBtZXRob2QgcmV0dXJucyBlYXJseSB3aXRoIGV4aXN0aW5nIFVSTCBpZiBkdXBsaWNhdGUgZm91bmRcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBpc3N1ZVVybC5pbmNsdWRlcygnL2lzc3Vlcy8nKSAmJiAhaXNzdWVVcmwuaW5jbHVkZXMoJ25ldycpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gaXNzdWUgYWxyZWFkeSBleGlzdHMsIHJldHVybmluZyBleGlzdGluZyBpc3N1ZScsIHsgaXNzdWVVcmwgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBzdWJtaXR0ZWQ6IHRydWUsIFxuICAgICAgICAgICAgZGVjbGluZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIGlzc3VlVXJsLFxuICAgICAgICAgICAgaXNEdXBsaWNhdGU6IHRydWUgXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgY29sbGVjdGlvbiBzdWJtaXNzaW9uIGlzc3VlJywgeyBpc3N1ZVVybCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIHN1Ym1pdHRlZDogdHJ1ZSwgXG4gICAgICAgICAgICBkZWNsaW5lZDogZmFsc2UsIFxuICAgICAgICAgICAgaXNzdWVVcmwsXG4gICAgICAgICAgICBpc0R1cGxpY2F0ZTogZmFsc2UgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgc3VibWl0dGVkOiBmYWxzZSwgZGVjbGluZWQ6IGZhbHNlLCBlcnJvcjogJ0ZhaWxlZCB0byBjcmVhdGUgaXNzdWUnIH07XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBpbiBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gcHJvbXB0JywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Ym1pdHRlZDogZmFsc2UsXG4gICAgICAgIGRlY2xpbmVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGlzc3VlIGluIHRoZSBEb2xsaG91c2VNQ1AvY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAqIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogR2l0SHViIEFQSSBpbnRlZ3JhdGlvbiBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZShwYXJhbXM6IHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgICBwb3J0Zm9saW9Vcmw6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7ICAvLyBQYXRoIHRvIHRoZSBsb2NhbCBlbGVtZW50IGZpbGVcbiAgfSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBEVVBMSUNBVEUgREVURUNUSU9OOiBDaGVjayBpZiBpc3N1ZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZXhpc3RpbmdJc3N1ZVVybCA9IGF3YWl0IHRoaXMuY2hlY2tFeGlzdGluZ0lzc3VlKFxuICAgICAgICBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgIHBhcmFtcy51c2VybmFtZSxcbiAgICAgICAgcGFyYW1zLnRva2VuXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoZXhpc3RpbmdJc3N1ZVVybCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBpc3N1ZSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgY3JlYXRpb24nLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICBpc3N1ZVVybDogZXhpc3RpbmdJc3N1ZVVybFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSXNzdWVVcmw7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcm1hdCB0aGUgaXNzdWUgdGl0bGVcbiAgICAgIGNvbnN0IHRpdGxlID0gYFske3BhcmFtcy5lbGVtZW50VHlwZX1dIEFkZCAke3BhcmFtcy5lbGVtZW50TmFtZX0gYnkgQCR7cGFyYW1zLnVzZXJuYW1lfWA7XG5cbiAgICAgIC8vIEZvcm1hdCB0aGUgaXNzdWUgYm9keSB3aXRoIGFsbCByZWxldmFudCBpbmZvcm1hdGlvblxuICAgICAgLy8gQnVpbGQgYWRkaXRpb25hbCBtZXRhZGF0YSBmaWVsZHMgZm9yIGRpc3BsYXlcbiAgICAgIC8vIFRZUEUgU0FGRVRZOiBEZWZpbmUgaW50ZXJmYWNlIGZvciBleHRlbmRlZCBtZXRhZGF0YVxuICAgICAgaW50ZXJmYWNlIEV4dGVuZGVkTWV0YSBleHRlbmRzIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgICAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgICAgICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICAgICAgICBhaV9nZW5lcmF0ZWQ/OiBib29sZWFuO1xuICAgICAgICBnZW5lcmF0aW9uX21ldGhvZD86IHN0cmluZztcbiAgICAgICAgbGljZW5zZT86IHN0cmluZztcbiAgICAgICAgdGFncz86IHN0cmluZ1tdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgbWV0YSA9IHBhcmFtcy5tZXRhZGF0YSBhcyBFeHRlbmRlZE1ldGE7XG4gICAgICBcbiAgICAgIGlmIChtZXRhLmNhdGVnb3J5KSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqQ2F0ZWdvcnkqKjogJHttZXRhLmNhdGVnb3J5fWApO1xuICAgICAgaWYgKG1ldGEudmVyc2lvbikgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKlZlcnNpb24qKjogJHttZXRhLnZlcnNpb259YCk7XG4gICAgICBpZiAobWV0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGEudHJpZ2dlcnMpICYmIG1ldGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqVHJpZ2dlcnMqKjogJHttZXRhLnRyaWdnZXJzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBpZiAobWV0YS5hZ2VfcmF0aW5nKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqQWdlIFJhdGluZyoqOiAke21ldGEuYWdlX3JhdGluZ31gKTtcbiAgICAgIGlmIChtZXRhLmFpX2dlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipBSSBHZW5lcmF0ZWQqKjogJHttZXRhLmFpX2dlbmVyYXRlZCA/ICdZZXMnIDogJ05vJ31gKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhLmdlbmVyYXRpb25fbWV0aG9kKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqR2VuZXJhdGlvbiBNZXRob2QqKjogJHttZXRhLmdlbmVyYXRpb25fbWV0aG9kfWApO1xuICAgICAgaWYgKG1ldGEubGljZW5zZSkgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkxpY2Vuc2UqKjogJHttZXRhLmxpY2Vuc2V9YCk7XG4gICAgICBpZiAobWV0YS50YWdzICYmIEFycmF5LmlzQXJyYXkobWV0YS50YWdzKSAmJiBtZXRhLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqVGFncyoqOiAke21ldGEudGFncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZWFkIHRoZSBmdWxsIGVsZW1lbnQgZmlsZSBjb250ZW50IGlmIHBhdGggaXMgcHJvdmlkZWRcbiAgICAgIGxldCBlbGVtZW50Q29udGVudCA9ICcnO1xuICAgICAgaWYgKHBhcmFtcy5sb2NhbFBhdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nIHRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb25cbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuc3RhdChwYXJhbXMubG9jYWxQYXRoKTtcbiAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA+IEZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgLy8gRE8gTk9UIHRydW5jYXRlIHVzZXIgY29udGVudCAtIHJlamVjdCBpZiB0b28gbGFyZ2VcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRWxlbWVudCBmaWxlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uJywge1xuICAgICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZScsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBGaWxlIHNpemUgJHtzdGF0cy5zaXplfSBleGNlZWRzIGxpbWl0IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25gLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZVNpemU6IHN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbGltaXQ6IEZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiB0cnVuY2F0aW5nXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBmdWxsIG1hcmtkb3duIGZpbGUgd2l0aCBmcm9udG1hdHRlciBhbmQgY29udGVudFxuICAgICAgICAgIGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShwYXJhbXMubG9jYWxQYXRoLCB7IHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5jcmVhdGVDb2xsZWN0aW9uSXNzdWUnIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBjb250ZW50IGZvciBzZWN1cml0eSBpc3N1ZXNcbiAgICAgICAgICAvLyBOb3RlOiBXZSBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzIGNvbnRlbnQgaW4gdmFsaWRhdGVGaWxlQW5kQ29udGVudCgpXG4gICAgICAgICAgLy8gYnV0IHdlIHJlLXZhbGlkYXRlIGhlcmUgc2luY2UgdGhpcyBpcyBiZWluZyBwb3N0ZWQgdG8gYSBwdWJsaWMgaXNzdWVcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGVsZW1lbnRDb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0VsZW1lbnQgY29udGVudCBmYWlsZWQgc2VjdXJpdHkgdmFsaWRhdGlvbiBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uJywge1xuICAgICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBpc3N1ZXM6IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJuc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuY3JlYXRlQ29sbGVjdGlvbklzc3VlJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYENyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBkZXRlY3RlZCBpbiBjb2xsZWN0aW9uIHN1Ym1pc3Npb25gLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJuczogdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBETyBOT1Qgc3VibWl0IGNvbnRlbnQgd2l0aCBzZWN1cml0eSBpc3N1ZXNcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBVc2UgdGhlIHNhbml0aXplZCBjb250ZW50IChidXQgTk9UIHRydW5jYXRlZClcbiAgICAgICAgICBlbGVtZW50Q29udGVudCA9IHZhbGlkYXRpb25SZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCBlbGVtZW50Q29udGVudDtcbiAgICAgICAgICBcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlYWQgYW5kIHZhbGlkYXRlZCBlbGVtZW50IGZpbGUgY29udGVudCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uJywge1xuICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGVsZW1lbnRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgICAgIHNlY3VyaXR5SXNzdWVzOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICAgICAgYnVpbGRWZXJzaW9uOiBgdiR7UEFDS0FHRV9WRVJTSU9OfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZWFkIGVsZW1lbnQgZmlsZSBjb250ZW50LCBmYWxsaW5nIGJhY2sgdG8gbWV0YWRhdGEgb25seScsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGp1c3QgdGhlIG1ldGFkYXRhIGlmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGVcbiAgICAgICAgICBlbGVtZW50Q29udGVudCA9IHRoaXMuZm9ybWF0TWV0YWRhdGFBc1lhbWwocGFyYW1zLm1ldGFkYXRhLCBtZXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gZmlsZSBwYXRoIHByb3ZpZGVkLCB1c2UgbWV0YWRhdGEgYXMgZmFsbGJhY2tcbiAgICAgICAgbG9nZ2VyLndhcm4oJ05vIGZpbGUgcGF0aCBwcm92aWRlZCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uLCB1c2luZyBtZXRhZGF0YSBvbmx5Jywge1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRDb250ZW50ID0gdGhpcy5mb3JtYXRNZXRhZGF0YUFzWWFtbChwYXJhbXMubWV0YWRhdGEsIG1ldGEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBib2R5ID0gYCMjIE5ldyAke3BhcmFtcy5lbGVtZW50VHlwZX0gU3VibWlzc2lvblxuXG4qKk5hbWUqKjogJHtwYXJhbXMuZWxlbWVudE5hbWV9XG4qKkF1dGhvcioqOiBAJHtwYXJhbXMudXNlcm5hbWV9XG4qKlR5cGUqKjogJHtwYXJhbXMuZWxlbWVudFR5cGV9XG5cbiMjIyBEZXNjcmlwdGlvblxuJHtwYXJhbXMubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkJ31cblxuIyMjIEVsZW1lbnQgRGV0YWlsc1xuJHthZGRpdGlvbmFsRmllbGRzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsRmllbGRzLmpvaW4oJ1xcbicpIDogJypObyBhZGRpdGlvbmFsIG1ldGFkYXRhIGF2YWlsYWJsZSonfVxuXG4jIyMgUG9ydGZvbGlvIExpbmtcbiR7cGFyYW1zLnBvcnRmb2xpb1VybH1cblxuIyMjIEVsZW1lbnQgQ29udGVudFxuXFxgXFxgXFxgeWFtbFxuJHtlbGVtZW50Q29udGVudH1cblxcYFxcYFxcYFxuXG4jIyMgUmV2aWV3IENoZWNrbGlzdFxuLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xuLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xuLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXG4tIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxuLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxuXG4tLS1cbipUaGlzIHN1Ym1pc3Npb24gd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIERvbGxob3VzZU1DUCBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IHRvb2wgKHYke1BBQ0tBR0VfVkVSU0lPTn0pLipgO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgbGFiZWxzIGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgY29uc3QgbGFiZWxzID0gW1xuICAgICAgICAnZWxlbWVudC1zdWJtaXNzaW9uJywgIC8vIENSSVRJQ0FMOiBUcmlnZ2VycyBhdXRvbWF0aW9uIHdvcmtmbG93XG4gICAgICAgICdjb2xsZWN0aW9uLXJlcG8nLCAgICAgLy8gSW5kaWNhdGVzIHRoaXMgaXMgZm9yIHRoZSBjb2xsZWN0aW9uXG4gICAgICAgICdjb250cmlidXRpb24nLCAgICAgICAgLy8gQWxsIHN1Ym1pc3Npb25zIGdldCB0aGlzXG4gICAgICAgICdwZW5kaW5nLXJldmlldycsICAgICAgLy8gTmVlZHMgcmV2aWV3XG4gICAgICAgIHBhcmFtcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpIC8vIEVsZW1lbnQgdHlwZSBsYWJlbCAoZS5nLiwgJ3BlcnNvbmFzJylcbiAgICAgIF07XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjNik6IFVzZSBHaXRIdWIgcmF0ZSBsaW1pdGVyIGZvciBBUEkgY2FsbHNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgaGl0dGluZyBHaXRIdWIgcmF0ZSBsaW1pdHMgYW5kIHByb3ZpZGVzIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgICAgY29uc3QgaXNzdWVVcmwgPSBhd2FpdCB0aGlzLnJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgd2FybmluZyBpZiBhcHByb2FjaGluZyByYXRlIGxpbWl0XG4gICAgICAgICAgICBpZiAocmF0ZUxpbWl0UmVtYWluaW5nICYmIE51bWJlci5wYXJzZUludChyYXRlTGltaXRSZW1haW5pbmcpIDwgMTAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdBcHByb2FjaGluZyBHaXRIdWIgQVBJIHJhdGUgbGltaXQnLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlLWNvbGxlY3Rpb24taXNzdWUnLFxuICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnaGlnaCcgLy8gSGlnaCBwcmlvcml0eSBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4gaXNzdWVVcmw7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBIYW5kbGUgdGltZW91dCBzcGVjaWZpY2FsbHlcbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBHaXRIdWIgQVBJIHJlcXVlc3QgdGltZW91dCBhZnRlciAke2dldFZhbGlkYXRlZFRpbWVvdXQoKX1tc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbGxlY3Rpb24gaXNzdWUnLCB7IFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTG9jYWxDb250ZW50KG5hbWU6IHN0cmluZywgdHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gTUVUQURBVEEgSU5ERVggRklYOiBVc2UgcG9ydGZvbGlvIGluZGV4IGZvciBmYXN0IG1ldGFkYXRhLWJhc2VkIGxvb2t1cHNcbiAgICAgIC8vIFRoaXMgc29sdmVzIHRoZSBjcml0aWNhbCBpc3N1ZSB3aGVyZSBcIlNhZmUgUm91bmR0cmlwIFRlc3RlclwiIGNvdWxkbid0IGJlIGZvdW5kXG4gICAgICAvLyBiZWNhdXNlIGZpbmRMb2NhbENvbnRlbnQgb25seSBzZWFyY2hlZCBmaWxlbmFtZXMsIG5vdCBtZXRhZGF0YSBuYW1lc1xuICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gdGhpcy5wb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBFbmhhbmNlZCBzZWFyY2ggd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgICAgY29uc3QgaW5kZXhFbnRyeSA9IGF3YWl0IGluZGV4TWFuYWdlci5maW5kQnlOYW1lKG5hbWUsIHsgXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgICBmdXp6eU1hdGNoOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGluZGV4RW50cnkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHZpYSBtZXRhZGF0YSBpbmRleCcsIHsgXG4gICAgICAgICAgc2VhcmNoTmFtZTogbmFtZSwgXG4gICAgICAgICAgbWV0YWRhdGFOYW1lOiBpbmRleEVudHJ5Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgZmlsZW5hbWU6IGluZGV4RW50cnkuZmlsZW5hbWUsXG4gICAgICAgICAgZmlsZVBhdGg6IGluZGV4RW50cnkuZmlsZVBhdGgsXG4gICAgICAgICAgdHlwZSBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmRleEVudHJ5LmZpbGVQYXRoO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGQUxMQkFDSzogVXNlIG9yaWdpbmFsIGZpbGUgZGlzY292ZXJ5IGlmIGluZGV4IGxvb2t1cCBmYWlsc1xuICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgaGFuZGxlcyBlZGdlIGNhc2VzXG4gICAgICBsb2dnZXIuZGVidWcoJ0luZGV4IGxvb2t1cCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBmaWxlIGRpc2NvdmVyeScsIHsgbmFtZSwgdHlwZSB9KTtcbiAgICAgIFxuICAgICAgY29uc3QgcG9ydGZvbGlvRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJc3N1ZSAjODE1OiBNZW1vcnkgZmlsZXMgYXJlIHN0b3JlZCBpbiBkYXRlZCBzdWJkaXJlY3RvcmllcyAoWVlZWS1NTS1ERC8pLlxuICAgICAgLy8gRmlsZURpc2NvdmVyeVV0aWwgb25seSBzZWFyY2hlcyBmbGF0IGRpcmVjdG9yaWVzLCBzbyB0cmF2ZXJzZSBzdWJkaXJzIGZvciBtZW1vcmllcy5cbiAgICAgIGlmICghZmlsZSAmJiB0eXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBVc2UgcmVhZGRpciB3aXRoIHdpdGhGaWxlVHlwZXMgdG8gaWRlbnRpZnkgZGF0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCB7IHJlYWRkaXI6IHJlYWRkaXJGcyB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXJGcyhwb3J0Zm9saW9EaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zdCBzdWJkaXJzID0gZW50cmllcy5maWx0ZXIoZSA9PiBlLmlzRGlyZWN0b3J5KCkgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoZS5uYW1lKSk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKC9bXmEtejAtOV0vZywgJy0nKS5yZXBsYWNlQWxsKC8tKy9nLCAnLScpLnJlcGxhY2VBbGwoLyheLSl8KC0kKS9nLCAnJyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJkaXJQYXRoID0gcGF0aC5qb2luKHBvcnRmb2xpb0Rpciwgc3ViZGlyLm5hbWUpO1xuICAgICAgICAgICAgLy8gVXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgZmlsZSBsaXN0aW5nIChyZXNwZWN0cyBzYW5kYm94aW5nKVxuICAgICAgICAgICAgY29uc3Qgc3ViZGlyRmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3Rvcnkoc3ViZGlyUGF0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2Ygc3ViZGlyRmlsZXMpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBiYWNrdXAgZmlsZXMgKHNhbWUgZmlsdGVyaW5nIGFzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKVxuICAgICAgICAgICAgICBpZiAoZi5pbmNsdWRlcygnLmJhY2t1cC0nKSB8fCBmLmluY2x1ZGVzKCcuYmFja3VwLicpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShmKTtcbiAgICAgICAgICAgICAgaWYgKCFbJy55YW1sJywgJy55bWwnLCAnLm1kJ10uaW5jbHVkZXMoZmlsZUV4dCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZi5zbGljZSgwLCAtZmlsZUV4dC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChiYXNlID09PSBub3JtYWxpemVkU2VhcmNoIHx8IGJhc2UgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoLmpvaW4oc3ViZGlyUGF0aCwgZik7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBtZW1vcnkgaW4gZGF0ZWQgc3ViZGlyZWN0b3J5JywgeyBuYW1lLCBzdWJkaXI6IHN1YmRpci5uYW1lLCBmaWxlIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZSkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeSBzdWJkaXJlY3RvcnkgdHJhdmVyc2FsIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIG5hbWUsIHR5cGUsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZUFsbCgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZUFsbCgvKF4tKXwoLSQpL2csICcnKTsgICAgICAvLyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBkYXNoZXNcbiAgICAgICAgICBcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lICE9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyeWluZyBub3JtYWxpemVkIG5hbWUgc2VhcmNoJywgeyBcbiAgICAgICAgICAgIG9yaWdpbmFsOiBuYW1lLCBcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgdHlwZSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBub3JtYWxpemVkTmFtZSwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgc2VhcmNoaW5nIGJ5IGRpc3BsYXkgbmFtZSBwYXR0ZXJuc1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIC8vIFRyeSBjb21tb24gdmFyaWF0aW9ucyBsaWtlIHJlbW92aW5nIGRvdHMsIHNwYWNlcywgZXRjLlxuICAgICAgICBjb25zdCB2YXJpYXRpb25zID0gW1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgnLicsICcnKSwgICAgICAgIC8vIFJlbW92ZSBkb3RzOiBcIkouQS5SLlYuSS5TLlwiIC0+IFwiSkFSVklTXCJcbiAgICAgICAgICBuYW1lLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKSwgICAgICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgvW1xcc1xcLl0vZywgJycpLCAgICAvLyBSZW1vdmUgc3BhY2VzIGFuZCBkb3RzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlQWxsKC9bXFxzXFwuXS9nLCAnLScpLCAgIC8vIFJlcGxhY2Ugc3BhY2VzIGFuZCBkb3RzIHdpdGggZGFzaGVzXG4gICAgICAgIF0uZmlsdGVyKHYgPT4gdiAhPT0gbmFtZSAmJiB2Lmxlbmd0aCA+IDApO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucykge1xuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIHZhcmlhdGlvbiwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB1c2luZyBuYW1lIHZhcmlhdGlvbicsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsXG4gICAgICAgICAgICAgIHZhcmlhdGlvbixcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBsb2NhbCBjb250ZW50IGZpbGUgdmlhIGZhbGxiYWNrJywgeyBuYW1lLCB0eXBlLCBmaWxlIH0pO1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjb250ZW50IGZvdW5kJywgeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBmaW5kaW5nIGxvY2FsIGNvbnRlbnQnLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24gLSBzZWFyY2hlcyBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXMgZm9yIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlcyBlYXJseSB0ZXJtaW5hdGlvbiBmb3IgZXhhY3QgbWF0Y2hlc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgZGVmYXVsdCB0byBQRVJTT05BIGFuZCBlbmFibGVzIHByb3BlciB0eXBlIGRldGVjdGlvblxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRlbnQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIERldGVjdGlvbiByZXN1bHQgd2l0aCBmb3VuZCBtYXRjaGVzIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RFbGVtZW50VHlwZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEVsZW1lbnREZXRlY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlIGVhcmx5IHRlcm1pbmF0aW9uIHNlYXJjaCB1dGlsaXR5XG4gICAgICAvLyBDcmVhdGUgc2VhcmNoIGZ1bmN0aW9ucyBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zID0gZWxlbWVudFR5cGVzLm1hcCgodHlwZSkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KG5hbWUsIHR5cGUpO1xuICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSBhcyBFbGVtZW50VHlwZSwgcGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBMb2cgdW5leHBlY3RlZCBlcnJvcnMgYnV0IGRvbid0IGZhaWwgdGhlIHNlYXJjaFxuICAgICAgICAgIGlmIChlcnJvcj8uY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3I/LmNvZGUgIT09ICdFTk9URElSJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBzZWFyY2hpbmcgJHt0eXBlfSBkaXJlY3RvcnkgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uYCwgeyBcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgIGNvZGU6IGVycm9yPy5jb2RlIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHVybiBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IG90aGVyIHNlYXJjaGVzIGNvbnRpbnVlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBEZWZpbmUgZXhhY3QgbWF0Y2ggY3JpdGVyaWFcbiAgICAgIGNvbnN0IGlzRXhhY3RNYXRjaCA9IChtYXRjaDogRWxlbWVudERldGVjdGlvbk1hdGNoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShtYXRjaC5wYXRoLCBwYXRoLmV4dG5hbWUobWF0Y2gucGF0aCkpO1xuICAgICAgICByZXR1cm4gZmlsZW5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRXhlY3V0ZSBzZWFyY2hlcyB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGF3YWl0IEVhcmx5VGVybWluYXRpb25TZWFyY2guZXhlY3V0ZVdpdGhFYXJseVRlcm1pbmF0aW9uKFxuICAgICAgICBzZWFyY2hGdW5jdGlvbnMsXG4gICAgICAgIGlzRXhhY3RNYXRjaCxcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdlbGVtZW50LXR5cGUtZGV0ZWN0aW9uJyxcbiAgICAgICAgICB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoOiAxMDAwLCAvLyBXYWl0IDEgc2Vjb25kIGZvciBvdGhlciBzZWFyY2hlcyBhZnRlciBleGFjdCBtYXRjaFxuICAgICAgICAgIG1heFBhcmFsbGVsU2VhcmNoZXM6IDggLy8gTGltaXQgY29uY3VycmVudCBzZWFyY2hlcyB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBFbmhhbmNlZCBiYXRjaCBvcGVyYXRpb24gcmVwb3J0aW5nXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgY29tcGxldGVkU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgZXhhY3RNYXRjaEZvdW5kOiAhIXNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaCxcbiAgICAgICAgZXhhY3RNYXRjaFR5cGU6IHNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaD8udHlwZSxcbiAgICAgICAgZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZDogc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkLFxuICAgICAgICBwZXJmb3JtYW5jZUdhaW46IHNlYXJjaFJlc3VsdHMucGVyZm9ybWFuY2VHYWluLFxuICAgICAgICBtYXRjaGVkVHlwZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5tYXAobSA9PiBtLnR5cGUpLFxuICAgICAgICBmYWlsZWRUeXBlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5tYXAoZiA9PiBlbGVtZW50VHlwZXNbZi5pbmRleF0pLmZpbHRlcihCb29sZWFuKVxuICAgICAgfTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50IHR5cGUgZGV0ZWN0aW9uIGNvbXBsZXRlZCB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbicsIGJhdGNoUmVzdWx0cyk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENsZWFyIHJlcG9ydGluZyBvZiBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzZWFyY2hlcyBmYWlsZWQgZHVyaW5nIGJhdGNoIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+ICh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZXNbZi5pbmRleF0gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgZXJyb3I6IGYuZXJyb3Iuc3Vic3RyaW5nKDAsIDEwMCkgLy8gVHJ1bmNhdGUgbG9uZyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdWNjZXNzUmF0ZTogYCR7c2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlc30vJHtzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXN9YCxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPiAwIFxuICAgICAgICAgICAgPyAnTm8gaW1wYWN0IC0gbWF0Y2hlcyBmb3VuZCBpbiBzdWNjZXNzZnVsIHNlYXJjaGVzJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBtYXRjaGVzIGZvdW5kJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGZhaWx1cmVzIGFuZCBubyBtYXRjaGVzLCBwcm92aWRlIGFjdGlvbmFibGUgZ3VpZGFuY2VcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPT09IDAgJiYgc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0JhdGNoIG9wZXJhdGlvbiBoYWQgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMgZm91bmQnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciBjaGVja2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIGVhcmx5IHRlcm1pbmF0aW9uXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb24gYXBwbGllZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgICAgc2VhcmNoZXNDb21wbGV0ZWQ6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgICAgc2VhcmNoZXNUb3RhbDogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24nLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgcmVzdWx0IG9uIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogZmFsc2UsXG4gICAgICAgIG1hdGNoZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogR2VuZXJhdGUgbmFtZSBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiBoYW5kbGluZyB3aXRoIGNsZWFyIHBhcnRpYWwgZmFpbHVyZSByZXBvcnRpbmdcbiAgICogSGVscHMgdXNlcnMgZmluZCBjb250ZW50IHdoZW4gZXhhY3QgbWF0Y2hlcyBmYWlsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+ID0gW107XG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgXG4gICAgICAvLyBUcmFjayBiYXRjaCBvcGVyYXRpb24gcmVzdWx0cyBmb3IgYmV0dGVyIGRpYWdub3N0aWNzXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsVHlwZXM6IGVsZW1lbnRUeXBlcy5sZW5ndGgsXG4gICAgICAgIHN1Y2Nlc3NmdWxTY2FuczogMCxcbiAgICAgICAgZmFpbGVkU2NhbnM6IDAsXG4gICAgICAgIGZhaWx1cmVEZXRhaWxzOiBbXSBhcyBBcnJheTx7IHR5cGU6IEVsZW1lbnRUeXBlOyBlcnJvcjogc3RyaW5nIH0+LFxuICAgICAgICB0b3RhbFN1Z2dlc3Rpb25zOiAwLFxuICAgICAgICBzdWdnZXN0aW9uc0J5VHlwZToge30gYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBhbGwgZWxlbWVudCB0eXBlcyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKGVsZW1lbnREaXIsICcqJywge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGxldCB0eXBlU3VnZ2VzdGlvbnMgPSAwO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHBhdGguZXh0bmFtZShmaWxlUGF0aCkpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgdXNpbmcgc2ltcGxlIG1ldHJpY3NcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHlwZVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZXMsIHBhdGguZXh0bmFtZShmaWxlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucysrO1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5zdWdnZXN0aW9uc0J5VHlwZVtlbGVtZW50VHlwZV0gPSB0eXBlU3VnZ2VzdGlvbnM7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogVHJhY2sgYW5kIHJlcG9ydCBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWx1cmVEZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIGluZGl2aWR1YWwgZmFpbHVyZXMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gc2NhbiBlbGVtZW50IHR5cGUgZm9yIHN1Z2dlc3Rpb25zJywge1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubGVuZ3RoO1xuICAgICAgXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBDb21wcmVoZW5zaXZlIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTmFtZSBzdWdnZXN0aW9uIGJhdGNoIG9wZXJhdGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgIC4uLmJhdGNoUmVzdWx0cyxcbiAgICAgICAgc3VjY2Vzc1JhdGU6IGAke2JhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnN9LyR7YmF0Y2hSZXN1bHRzLnRvdGFsVHlwZXN9YCxcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGZ1bGwgZmFpbHVyZSBkZXRhaWxzIGF0IGRlYnVnIGxldmVsIHRvIGF2b2lkIHNwYW1cbiAgICAgICAgaGFzRmFpbHVyZXM6IGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXBvcnQgZmFpbHVyZXMgY2xlYXJseSBpZiB0aGV5IG9jY3VycmVkXG4gICAgICBpZiAoYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBlbGVtZW50IHR5cGUgc2NhbnMgZmFpbGVkIGR1cmluZyBuYW1lIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbicsIHtcbiAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgIGZhaWxlZFR5cGVzOiBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMubWFwKGYgPT4gZi50eXBlKSxcbiAgICAgICAgICBzdWNjZXNzZnVsVHlwZXM6IGJhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnMsXG4gICAgICAgICAgaW1wYWN0T25SZXN1bHRzOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA+IDAgXG4gICAgICAgICAgICA/ICdQYXJ0aWFsIGltcGFjdCAtIHN1Z2dlc3Rpb25zIGZvdW5kIGZyb20gc3VjY2Vzc2Z1bCBzY2FucycgXG4gICAgICAgICAgICA6ICdQb3RlbnRpYWwgaW1wYWN0IC0gbm8gc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkJyxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPT09IDAgJiYgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgICAgICAgPyAnQ2hlY2sgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGZpbGUgcGVybWlzc2lvbnMnXG4gICAgICAgICAgICA6ICdTdWdnZXN0aW9uIGdlbmVyYXRpb24gcGFydGlhbGx5IHN1Y2Nlc3NmdWwgZGVzcGl0ZSBzb21lIGZhaWx1cmVzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU29ydCBieSBzaW1pbGFyaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhbmQgcmV0dXJuIHRvcCBzdWdnZXN0aW9uc1xuICAgICAgY29uc3Qgc29ydGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpbUEgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGEubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qgc2ltQiA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICByZXR1cm4gc2ltQiAtIHNpbUE7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLmxlbmd0aCxcbiAgICAgICAgdG9wU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLnNsaWNlKDAsIDMpLm1hcChzID0+IHMubmFtZSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gc29ydGVkU3VnZ2VzdGlvbnM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIC0gYmF0Y2ggb3BlcmF0aW9uIGZhaWxlZCBjb21wbGV0ZWx5JywgeyBcbiAgICAgICAgc2VhcmNoTmFtZSwgXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ2hlY2sgcG9ydGZvbGlvIHN0cnVjdHVyZSBhbmQgcGVybWlzc2lvbnMnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTaW1wbGUgc2ltaWxhcml0eSBjYWxjdWxhdGlvbiB1c2luZyBMZXZlbnNodGVpbi1saWtlIGFwcHJvYWNoXG4gICAqIFJldHVybnMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAxIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTaW1pbGFyaXR5KHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBIYW5kbGUgZXhhY3QgbWF0Y2hlc1xuICAgIGlmIChzdHIxID09PSBzdHIyKSByZXR1cm4gMTtcbiAgICBcbiAgICAvLyBIYW5kbGUgc3Vic3RyaW5nIG1hdGNoZXNcbiAgICBpZiAoc3RyMS5pbmNsdWRlcyhzdHIyKSB8fCBzdHIyLmluY2x1ZGVzKHN0cjEpKSByZXR1cm4gMC44O1xuICAgIFxuICAgIC8vIEhhbmRsZSBwYXJ0aWFsIG1hdGNoZXNcbiAgICBjb25zdCBsb25nZXIgPSBzdHIxLmxlbmd0aCA+IHN0cjIubGVuZ3RoID8gc3RyMSA6IHN0cjI7XG4gICAgY29uc3Qgc2hvcnRlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIyIDogc3RyMTtcbiAgICBcbiAgICBpZiAobG9uZ2VyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgXG4gICAgLy8gQ291bnQgY29tbW9uIGNoYXJhY3RlcnNcbiAgICBsZXQgY29tbW9uID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNob3J0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb25nZXIuaW5jbHVkZXMoc2hvcnRlcltpXSkpIHtcbiAgICAgICAgY29tbW9uKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb21tb24gLyBsb25nZXIubGVuZ3RoO1xuICB9XG4gIFxuICAvKipcbiAgICogVVggSU1QUk9WRU1FTlQ6IFNhdmUgZWxlbWVudCB3aXRoIGF1dG9tYXRpYyByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqIEhhbmRsZXMgY29tbW9uIEdpdEh1YiBBUEkgaXNzdWVzIGxpa2UgcmF0ZSBsaW1pdHMgYW5kIHRlbXBvcmFyeSBuZXR3b3JrIHByb2JsZW1zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVFbGVtZW50V2l0aFJldHJ5KFxuICAgIGFkYXB0ZXI6IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLCBcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gUkVUUllfQ09ORklHLk1BWF9BVFRFTVBUU1xuICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBhbnkgPSBudWxsO1xuICAgIFxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBBdHRlbXB0aW5nIHRvIHNhdmUgZWxlbWVudCAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHRcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5zYXZlRWxlbWVudChhZGFwdGVyLCB0cnVlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmaWxlVXJsKSB7XG4gICAgICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgRWxlbWVudCBzYXZlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0c2AsIHtcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlVXJsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbGVVcmw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHNhdmVFbGVtZW50IHJldHVybnMgbnVsbCwgdHJlYXQgYXMgYSBmYWlsdXJlIGJ1dCBkb24ndCByZXRyeSBpbW1lZGlhdGVseVxuICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYHNhdmVFbGVtZW50IHJldHVybmVkIG51bGwgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSB0aGlzLmlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNhdmUgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZGAsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGlzUmV0cnlhYmxlLFxuICAgICAgICAgIHdpbGxSZXRyeTogaXNSZXRyeWFibGUgJiYgYXR0ZW1wdCA8IG1heFJldHJpZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHJldHJ5YWJsZSBlcnJvciwgZmFpbCBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdOb24tcmV0cnlhYmxlIGVycm9yIGVuY291bnRlcmVkLCBhYm9ydGluZyByZXRyaWVzJywge1xuICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgYXR0ZW1wdHMsIHdhaXQgYmVmb3JlIHJldHJ5aW5nXG4gICAgICAgIGlmIChhdHRlbXB0IDwgbWF4UmV0cmllcykge1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gY2FsY3VsYXRlUmV0cnlEZWxheShhdHRlbXB0KTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFdhaXRpbmcgJHtkZWxheX1tcyBiZWZvcmUgcmV0cnlgLCB7IGF0dGVtcHQsIGRlbGF5IH0pO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICBsb2dnZXIuZXJyb3IoYEFsbCAke21heFJldHJpZXN9IHNhdmUgYXR0ZW1wdHMgZmFpbGVkYCwge1xuICAgICAgZWxlbWVudE5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxhc3RFcnJvcjogbGFzdEVycm9yPy5tZXNzYWdlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYW4gZXJyb3IgaXMgd29ydGggcmV0cnlpbmdcbiAgICogUmV0cnlhYmxlOiBuZXR3b3JrIGlzc3VlcywgcmF0ZSBsaW1pdHMsIHRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAqIE5vbi1yZXRyeWFibGU6IGF1dGhlbnRpY2F0aW9uIGlzc3VlcywgdmFsaWRhdGlvbiBlcnJvcnMsIHBlcm1hbmVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBpc1JldHJ5YWJsZUVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCBlcnJvckNvZGUgPSBlcnJvcj8uY29kZTtcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZXJyb3I/LnN0YXR1cyB8fCBlcnJvcj8uc3RhdHVzQ29kZTtcbiAgICBcbiAgICAvLyBOZXR3b3JrIGFuZCB0aW1lb3V0IGVycm9yc1xuICAgIGlmIChlcnJvckNvZGUgPT09ICdFTk9URk9VTkQnIHx8IGVycm9yQ29kZSA9PT0gJ0VDT05OUkVTRVQnIHx8IGVycm9yQ29kZSA9PT0gJ0VUSU1FRE9VVCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBHaXRIdWIgQVBJIHJhdGUgbGltaXRzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIGlzc3Vlc1xuICAgIGlmIChzdGF0dXNDb2RlID49IDUwMCAmJiBzdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGVtcG9yYXJ5IEdpdEh1YiBBUEkgcHJvYmxlbXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3NlcnZpY2UgdW5hdmFpbGFibGUnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludGVybmFsIHNlcnZlciBlcnJvcicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29ubmVjdGlvbiBpc3N1ZXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdjb25uZWN0aW9uJykgJiYgXG4gICAgICAgIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3Jlc2V0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgYXV0aGVudGljYXRpb24gb3IgcGVybWlzc2lvbiBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAxIHx8IHN0YXR1c0NvZGUgPT09IDQwMyB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd1bmF1dGhvcml6ZWQnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdmb3JiaWRkZW4nKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2F1dGhlbnRpY2F0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAwIHx8IHN0YXR1c0NvZGUgPT09IDQyMiB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3ZhbGlkYXRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRvIG5vdCByZXRyeWluZyBmb3IgdW5rbm93biBlcnJvcnMgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==