@brainfish-ai/devdoc 0.1.43 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/create.js +2 -2
- package/package.json +1 -1
- package/renderer/app/api/collections/route.js +35 -4
- package/renderer/app/api/docs/route.js +9 -4
- package/renderer/app/api/suggestions/route.js +33 -13
- package/renderer/app/globals.css +69 -0
- package/renderer/app/layout.js +2 -2
- package/renderer/app/llms-full.txt/route.js +10 -1
- package/renderer/app/llms.txt/route.js +10 -1
- package/renderer/app/sitemap.xml/route.js +11 -1
- package/renderer/components/docs/mdx/cards.js +1 -1
- package/renderer/components/docs/mdx/landing.js +7 -5
- package/renderer/components/docs-viewer/agent/agent-chat.js +13 -112
- package/renderer/components/docs-viewer/agent/agent-popup-button.js +99 -0
- package/renderer/components/docs-viewer/agent/index.js +3 -0
- package/renderer/components/docs-viewer/content/content-router.js +182 -0
- package/renderer/components/docs-viewer/content/doc-page.js +73 -37
- package/renderer/components/docs-viewer/content/index.js +2 -0
- package/renderer/components/docs-viewer/content/mdx-error-boundary.js +184 -0
- package/renderer/components/docs-viewer/index.js +381 -485
- package/renderer/components/docs-viewer/playground/graphql-playground.js +205 -3
- package/renderer/components/docs-viewer/sidebar/right-sidebar.js +35 -39
- package/renderer/components/theme-toggle.js +1 -21
- package/renderer/hooks/use-route-state.js +159 -0
- package/renderer/lib/api-docs/agent/use-suggestions.js +97 -0
- package/renderer/lib/api-docs/code-editor/mode-context.js +61 -89
- package/renderer/lib/api-docs/mobile-context.js +40 -3
- package/renderer/lib/docs/config/environment.js +38 -0
- package/renderer/lib/docs/config/index.js +1 -0
- package/renderer/lib/docs/config/schema.js +17 -5
- package/renderer/lib/docs/mdx/compiler.js +5 -2
- package/renderer/lib/docs/mdx/index.js +2 -0
- package/renderer/lib/docs/mdx/remark-mermaid.js +63 -0
- package/renderer/lib/docs/navigation/index.js +1 -2
- package/renderer/lib/docs/navigation/types.js +3 -1
- package/renderer/lib/docs-navigation.js +140 -0
- package/renderer/package.json +1 -0
|
@@ -281,7 +281,7 @@ function generateDocsConfig(projectName, templateType) {
|
|
|
281
281
|
type: 'graphql',
|
|
282
282
|
path: '/graphql-api',
|
|
283
283
|
schema: 'api-reference/schema.graphql',
|
|
284
|
-
endpoint: 'https://
|
|
284
|
+
endpoint: 'https://countries.trevorblades.com/graphql',
|
|
285
285
|
groups: [
|
|
286
286
|
{
|
|
287
287
|
group: 'Overview',
|
|
@@ -712,4 +712,4 @@ async function create(projectDirectory, options) {
|
|
|
712
712
|
console.log('Happy documenting!');
|
|
713
713
|
console.log();
|
|
714
714
|
}
|
|
715
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpZEEsd0JBeVVDO0FBMXhCRCxpREFBeUM7QUFDekMsZ0RBQXdCO0FBQ3hCLHdEQUEwQjtBQUMxQixpQ0FBeUM7QUFDekMsK0NBQTRDO0FBQzVDLCtDQUFrRDtBQUVsRCx1REFBdUQ7QUFDdkQsTUFBTSxhQUFhLEdBQUcsOENBQThDLENBQUM7QUFFckUsdUZBQXVGO0FBQ3ZGLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHlEQUF5RDtRQUN0RSxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLDJDQUEyQztRQUN4RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNPLENBQUM7QUFJWCxzQkFBc0I7QUFDdEIsTUFBTSxTQUFTLEdBQUc7SUFDaEIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsdURBQXVEO0tBQ3JFO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLFVBQVU7UUFDaEIsV0FBVyxFQUFFLDREQUE0RDtLQUMxRTtDQUNPLENBQUM7QUFtQlgsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxD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LENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxpQ0FBaUM7SUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JDLElBQUksTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRWQsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7R0FPWCxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZG93bmxvYWRUZW1wbGF0ZSB9IGZyb20gJ2dpZ2V0JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG4vLyBSZW1vdGUgdGVtcGxhdGUgcmVwb3NpdG9yeSAtIHNpbmdsZSBzdGFydGVyIHRlbXBsYXRlXG5jb25zdCBURU1QTEFURV9SRVBPID0gJ2dpdGh1YjpicmFpbmZpc2gtYWkvZGV2ZG9jL3RlbXBsYXRlcy9zdGFydGVyJztcblxuLy8gQXZhaWxhYmxlIHRlbXBsYXRlIHR5cGVzIChhbGwgdXNlIHRoZSBzYW1lIHN0YXJ0ZXIgdGVtcGxhdGUsIGp1c3QgZGlmZmVyZW50IGNvbmZpZ3MpXG5jb25zdCBURU1QTEFURVMgPSB7XG4gIGJhc2ljOiB7XG4gICAgbmFtZTogJ0Jhc2ljJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBkb2N1bWVudGF0aW9uIHNpdGUgd2l0aCBndWlkZXMgYW5kIHBhZ2VzJyxcbiAgICBjb2xvcjogJyMxMGI5ODEnLFxuICB9LFxuICBvcGVuYXBpOiB7XG4gICAgbmFtZTogJ09wZW5BUEknLFxuICAgIGRlc2NyaXB0aW9uOiAnRG9jdW1lbnRhdGlvbiB3aXRoIFJFU1QgQVBJIHJlZmVyZW5jZSAoT3BlbkFQSS9Td2FnZ2VyKScsXG4gICAgY29sb3I6ICcjMTBiOTgxJyxcbiAgfSxcbiAgZ3JhcGhxbDoge1xuICAgIG5hbWU6ICdHcmFwaFFMJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gd2l0aCBHcmFwaFFMIEFQSSBwbGF5Z3JvdW5kJyxcbiAgICBjb2xvcjogJyNlNTM1YWInLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZW1wbGF0ZVR5cGUgPSBrZXlvZiB0eXBlb2YgVEVNUExBVEVTO1xuXG4vLyBEb2N1bWVudGF0aW9uIHR5cGVzXG5jb25zdCBET0NfVFlQRVMgPSB7XG4gIHB1YmxpYzoge1xuICAgIG5hbWU6ICdQdWJsaWMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVXNlci1mYWNpbmcgZG9jcyB3aXRoIGN1c3RvbSBzdWJkb21haW4gYW5kIGRlcGxveW1lbnQnLFxuICB9LFxuICBpbnRlcm5hbDoge1xuICAgIG5hbWU6ICdJbnRlcm5hbCcsXG4gICAgZGVzY3JpcHRpb246ICdEZXZlbG9wZXIgZG9jcyBmb3IgbG9jYWwvcHJpdmF0ZSB1c2UgKG5vIHN1YmRvbWFpbiBuZWVkZWQpJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgRG9jVHlwZSA9IGtleW9mIHR5cGVvZiBET0NfVFlQRVM7XG5cbmludGVyZmFjZSBDcmVhdGVPcHRpb25zIHtcbiAgdGVtcGxhdGU/OiBUZW1wbGF0ZVR5cGU7XG4gIGRvY1R5cGU/OiBEb2NUeXBlO1xuICBnaXQ/OiBib29sZWFuO1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDaGVja1N1YmRvbWFpblJlc3BvbnNlIHtcbiAgYXZhaWxhYmxlOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgc3VnZ2VzdGlvbj86IHN0cmluZztcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0Q29uZmlybShxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGhpbnQgPSBkZWZhdWx0VmFsdWUgPyAnW1kvbl0nIDogJ1t5L05dJztcbiAgICBybC5xdWVzdGlvbihgJHtxdWVzdGlvbn0gJHtoaW50fTogYCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gJycpIHtcbiAgICAgICAgcmVzb2x2ZShkZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShub3JtYWxpemVkID09PSAneScgfHwgbm9ybWFsaXplZCA9PT0gJ3llcycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1Byb2plY3QgbmFtZSBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIHZhbGlkIG5wbSBwYWNrYWdlIG5hbWVcbiAgaWYgKCEvXlthLXowLTldW2EtejAtOS0uX10qJC9pLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnSW52YWxpZCBwcm9qZWN0IG5hbWUuIFVzZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcy4nIH07XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uIChzZXJ2ZXIgZG9lcyBmdWxsIHZhbGlkYXRpb24gaW5jbHVkaW5nIGJsYWNrbGlzdClcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW46IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgNjMgY2hhcmFjdGVycyBvciBsZXNzJyB9O1xuICB9XG4gIFxuICBpZiAoIS9eW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8kLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYywgY2FuIGNvbnRhaW4gaHlwaGVucycgfTtcbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9O1xuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSSAoYWxzbyB2YWxpZGF0ZXMgYWdhaW5zdCBzZXJ2ZXIgYmxhY2tsaXN0KVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShcbiAgc3ViZG9tYWluOiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nXG4pOiBQcm9taXNlPENoZWNrU3ViZG9tYWluUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3N1YmRvbWFpbnMvY2hlY2tgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHN1YmRvbWFpbiB9KSxcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBBUEkgaXMgdW5hdmFpbGFibGUsIGFsbG93IHByb2NlZWRpbmcgKHdpbGwgZmFpbCBhdCByZWdpc3RyYXRpb24gaWYgaW52YWxpZClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKC8tL2csICcgJylcbiAgICAucmVwbGFjZSgvXFxiXFx3L2csIChjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlcigpOiBzdHJpbmcge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgJyc7XG4gIFxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoJ3lhcm4nKSkge1xuICAgIHJldHVybiAneWFybic7XG4gIH1cbiAgXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aCgncG5wbScpKSB7XG4gICAgcmV0dXJuICdwbnBtJztcbiAgfVxuICBcbiAgcmV0dXJuICducG0nO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGRvY3MuanNvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRlbXBsYXRlIHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVEb2NzQ29uZmlnKHByb2plY3ROYW1lOiBzdHJpbmcsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogb2JqZWN0IHtcbiAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGZvcm1hdFByb2plY3ROYW1lKHByb2plY3ROYW1lKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBURU1QTEFURVNbdGVtcGxhdGVUeXBlXTtcbiAgXG4gIC8vIEJhc2UgY29uZmlndXJhdGlvbiAoc2hhcmVkIGFjcm9zcyBhbGwgdGVtcGxhdGVzKVxuICAvLyBOb3RlOiBBc3NldHMgYXJlIHN0b3JlZCBpbiB0aGUgL2Fzc2V0cyBmb2xkZXIgYW5kIHNlcnZlZCB2aWEgL2FwaS9sb2NhbC1hc3NldHMgaW4gZGV2IG1vZGVcbiAgLy8gVGhlbWUgc2V0dGluZ3MgKGNvbG9ycywgbG9nbykgYXJlIGluIHRoZW1lLmpzb25cbiAgY29uc3QgYmFzZUNvbmZpZyA9IHtcbiAgICAkc2NoZW1hOiAnaHR0cHM6Ly9kZXZkb2Muc2gvZG9jcy5qc29uJyxcbiAgICBuYW1lOiBmb3JtYXR0ZWROYW1lLFxuICAgIGZhdmljb246ICcvYXNzZXRzL2Zhdmljb24uc3ZnJyxcbiAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICB0YWJzOiBbXSBhcyBvYmplY3RbXSxcbiAgICAgIGdsb2JhbDoge1xuICAgICAgICBhbmNob3JzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5jaG9yOiAnR2l0SHViJyxcbiAgICAgICAgICAgIGhyZWY6ICdodHRwczovL2dpdGh1Yi5jb20veW91ci1vcmcveW91ci1yZXBvJyxcbiAgICAgICAgICAgIGljb246ICdnaXRodWItbG9nbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICAvLyBEb2N1bWVudGF0aW9uIHRhYiAoYWx3YXlzIHByZXNlbnQpXG4gIGNvbnN0IGRvY3NUYWIgPSB7XG4gICAgdGFiOiAnRG9jdW1lbnRhdGlvbicsXG4gICAgdHlwZTogJ2RvY3MnLFxuICAgIGdyb3VwczogW1xuICAgICAge1xuICAgICAgICBncm91cDogJ0dldHRpbmcgU3RhcnRlZCcsXG4gICAgICAgIGljb246ICdyb2NrZXQtbGF1bmNoJyxcbiAgICAgICAgcGFnZXM6IFsnaW5kZXgnLCAncXVpY2tzdGFydCddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZ3JvdXA6ICdHdWlkZXMnLFxuICAgICAgICBpY29uOiAnYm9vay1vcGVuJyxcbiAgICAgICAgcGFnZXM6IFsnZ3VpZGVzL292ZXJ2aWV3JywgJ2d1aWRlcy9jb25maWd1cmF0aW9uJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgYmFzZUNvbmZpZy5uYXZpZ2F0aW9uLnRhYnMucHVzaChkb2NzVGFiKTtcblxuICAvLyBBZGQgQVBJIHJlZmVyZW5jZSB0YWIgYmFzZWQgb24gdGVtcGxhdGUgdHlwZVxuICBpZiAodGVtcGxhdGVUeXBlID09PSAnb3BlbmFwaScpIHtcbiAgICBiYXNlQ29uZmlnLm5hdmlnYXRpb24udGFicy5wdXNoKHtcbiAgICAgIHRhYjogJ0FQSSBSZWZlcmVuY2UnLFxuICAgICAgdHlwZTogJ29wZW5hcGknLFxuICAgICAgcGF0aDogJy9hcGktcmVmZXJlbmNlJyxcbiAgICAgIHZlcnNpb25zOiBbXG4gICAgICAgIHsgdmVyc2lvbjogJ3YxJywgc3BlYzogJ2FwaS1yZWZlcmVuY2Uvb3BlbmFwaS5qc29uJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIGdyb3VwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZ3JvdXA6ICdPdmVydmlldycsXG4gICAgICAgICAgaWNvbjogJ2Jvb2stb3BlbicsXG4gICAgICAgICAgcGFnZXM6IFtcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2ludHJvZHVjdGlvbicsXG4gICAgICAgICAgICAnYXBpLXJlZmVyZW5jZS9hdXRoZW50aWNhdGlvbicsXG4gICAgICAgICAgICAnYXBpLXJlZmVyZW5jZS9lcnJvcnMnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIEFQSSBwbGF5Z3JvdW5kIGNvbmZpZ1xuICAgIChiYXNlQ29uZmlnIGFzIGFueSkuYXBpID0ge1xuICAgICAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAgICAgIHBsYXlncm91bmQ6IHtcbiAgICAgICAgbW9kZTogJ3Nob3cnLFxuICAgICAgfSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2dyYXBocWwnKSB7XG4gICAgYmFzZUNvbmZpZy5uYXZpZ2F0aW9uLnRhYnMucHVzaCh7XG4gICAgICB0YWI6ICdHcmFwaFFMIEFQSScsXG4gICAgICB0eXBlOiAnZ3JhcGhxbCcsXG4gICAgICBwYXRoOiAnL2dyYXBocWwtYXBpJyxcbiAgICAgIHNjaGVtYTogJ2FwaS1yZWZlcmVuY2Uvc2NoZW1hLmdyYXBocWwnLFxuICAgICAgZW5kcG9pbnQ6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbS9ncmFwaHFsJyxcbiAgICAgIGdyb3VwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZ3JvdXA6ICdPdmVydmlldycsXG4gICAgICAgICAgaWNvbjogJ2Jvb2stb3BlbicsXG4gICAgICAgICAgcGFnZXM6IFtcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2ludHJvZHVjdGlvbicsXG4gICAgICAgICAgICAnYXBpLXJlZmVyZW5jZS9hdXRoZW50aWNhdGlvbicsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gYmFzZUNvbmZpZztcbn1cblxuLy8gQ2xhdWRlIENvZGUgc2tpbGxzIHRvIGNyZWF0ZVxuY29uc3QgQ0xBVURFX1NLSUxMUyA9IFtcbiAgJ2Jvb3RzdHJhcC1kb2NzJyxcbiAgJ3doaXNrLXRoZW1lJyxcbiAgJ21pZ3JhdGUtZG9jcycsXG4gICdpbXBvcnQtYXBpLXNwZWMnLFxuICAnY2hlY2stZG9jcycsXG4gICdibGFtZS1kb2MnLFxuICAnY3JlYXRlLWRvYycsXG4gICd1cGRhdGUtZG9jJyxcbiAgJ2RlbGV0ZS1kb2MnLFxuICAnY29tbWl0LWRvYycsXG5dO1xuXG4vLyBDdXJzb3IgcnVsZXMgdG8gY3JlYXRlXG5jb25zdCBDVVJTT1JfUlVMRVMgPSBbXG4gICdkZXZkb2MubWRjJyxcbiAgJ2RldmRvYy1ib290c3RyYXAubWRjJyxcbiAgJ2RldmRvYy13aGlzay10aGVtZS5tZGMnLFxuICAnZGV2ZG9jLW1pZ3JhdGUubWRjJyxcbiAgJ2RldmRvYy1ibGFtZS5tZGMnLFxuICAnZGV2ZG9jLWNyZWF0ZS5tZGMnLFxuICAnZGV2ZG9jLXVwZGF0ZS5tZGMnLFxuICAnZGV2ZG9jLWRlbGV0ZS5tZGMnLFxuICAnZGV2ZG9jLWNvbW1pdC5tZGMnLFxuXTtcblxuLyoqXG4gKiBHZXQgdGhlIEFJIGFnZW50cyB0ZW1wbGF0ZSBkaXJlY3RvcnkgcGF0aFxuICovXG5mdW5jdGlvbiBnZXRBSUFnZW50c0RpcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gVHJ5IHJlbGF0aXZlIHRvIGNvbXBpbGVkIGRpc3QgKHBhY2thZ2VzL2RldmRvYy9kaXN0L2NsaS9jb21tYW5kcyAtPiBwYWNrYWdlcy9kZXZkb2MvYWktYWdlbnRzKVxuICBsZXQgYWdlbnRzRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ2FpLWFnZW50cycpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGlyKSkge1xuICAgIHJldHVybiBhZ2VudHNEaXI7XG4gIH1cbiAgXG4gIC8vIFRyeSBkZXZkb2MvdGVtcGxhdGVzIGF0IHJlcG8gcm9vdCAoZGV2ZWxvcG1lbnQpXG4gIGFnZW50c0RpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICcuLicsICcuLicsICdkZXZkb2MnLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICByZXR1cm4gYWdlbnRzRGlyO1xuICB9XG4gIFxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIEFJIGFnZW50IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiAqL1xuZnVuY3Rpb24gaW5zdGFsbEFJQWdlbnRzKFxuICBwcm9qZWN0UGF0aDogc3RyaW5nLCBcbiAgdG9vbDogJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJ1xuKTogeyBjbGF1ZGVNZDogYm9vbGVhbjsgY2xhdWRlU2tpbGxzOiBzdHJpbmdbXTsgY3Vyc29yUnVsZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGNsYXVkZU1kOiBmYWxzZSxcbiAgICBjbGF1ZGVTa2lsbHM6IFtdIGFzIHN0cmluZ1tdLFxuICAgIGN1cnNvclJ1bGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgfTtcblxuICBjb25zdCBhZ2VudHNEaXIgPSBnZXRBSUFnZW50c0RpcigpO1xuICBpZiAoIWFnZW50c0Rpcikge1xuICAgIGxvZ2dlci53YXJuKCdBSSBhZ2VudCB0ZW1wbGF0ZXMgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvLyBJbnN0YWxsIENsYXVkZSBDb2RlIGZpbGVzXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIGNvbnN0IGNsYXVkZU1kU291cmNlID0gcGF0aC5qb2luKGFnZW50c0RpciwgJ0NMQVVERS5tZCcpO1xuICAgIGNvbnN0IGNsYXVkZU1kRGVzdCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ0NMQVVERS5tZCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNsYXVkZU1kU291cmNlKSkge1xuICAgICAgZnMuY29weVN5bmMoY2xhdWRlTWRTb3VyY2UsIGNsYXVkZU1kRGVzdCk7XG4gICAgICByZXN1bHRzLmNsYXVkZU1kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHNraWxsc1xuICAgIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbihhZ2VudHNEaXIsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICAgIGNvbnN0IGRlc3RTa2lsbHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZVNraWxsc0RpcikpIHtcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGVzdFNraWxsc0Rpcik7XG4gICAgICBcbiAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgQ0xBVURFX1NLSUxMUykge1xuICAgICAgICBjb25zdCBzb3VyY2VEaXIgPSBwYXRoLmpvaW4oc291cmNlU2tpbGxzRGlyLCBza2lsbCk7XG4gICAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc291cmNlRGlyKSkge1xuICAgICAgICAgIGZzLmNvcHlTeW5jKHNvdXJjZURpciwgZGVzdERpcik7XG4gICAgICAgICAgcmVzdWx0cy5jbGF1ZGVTa2lsbHMucHVzaChza2lsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJbnN0YWxsIEN1cnNvciBmaWxlc1xuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc3Qgc291cmNlUnVsZXNEaXIgPSBwYXRoLmpvaW4oYWdlbnRzRGlyLCAnLmN1cnNvcicsICdydWxlcycpO1xuICAgIGNvbnN0IGRlc3RSdWxlc0RpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VSdWxlc0RpcikpIHtcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGVzdFJ1bGVzRGlyKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIENVUlNPUl9SVUxFUykge1xuICAgICAgICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHNvdXJjZVJ1bGVzRGlyLCBydWxlKTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdFJ1bGVzRGlyLCBydWxlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZVBhdGgpKSB7XG4gICAgICAgICAgZnMuY29weVN5bmMoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIHJlc3VsdHMuY3Vyc29yUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIENsZWFuIHVwIHVudXNlZCBBUEkgZmlsZXMgYmFzZWQgb24gdGVtcGxhdGUgdHlwZVxuICovXG5mdW5jdGlvbiBjbGVhbnVwVW51c2VkRmlsZXMocmVzb2x2ZWRQYXRoOiBzdHJpbmcsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogdm9pZCB7XG4gIGNvbnN0IGFwaVJlZlBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnYXBpLXJlZmVyZW5jZScpO1xuICBcbiAgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIFJlbW92ZSBlbnRpcmUgYXBpLXJlZmVyZW5jZSBmb2xkZXIgZm9yIGJhc2ljIHRlbXBsYXRlXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBpUmVmUGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoYXBpUmVmUGF0aCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZWQgYXBpLXJlZmVyZW5jZSBmb2xkZXIgKG5vdCBuZWVkZWQgZm9yIGJhc2ljIHRlbXBsYXRlKScpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0ZW1wbGF0ZVR5cGUgPT09ICdvcGVuYXBpJykge1xuICAgIC8vIFJlbW92ZSBHcmFwaFFMIHNjaGVtYSBmb3IgT3BlbkFQSSB0ZW1wbGF0ZVxuICAgIGNvbnN0IGdyYXBocWxTY2hlbWEgPSBwYXRoLmpvaW4oYXBpUmVmUGF0aCwgJ3NjaGVtYS5ncmFwaHFsJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZ3JhcGhxbFNjaGVtYSkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoZ3JhcGhxbFNjaGVtYSk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZWQgc2NoZW1hLmdyYXBocWwgKG5vdCBuZWVkZWQgZm9yIE9wZW5BUEkgdGVtcGxhdGUpJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2dyYXBocWwnKSB7XG4gICAgLy8gUmVtb3ZlIE9wZW5BUEkgc3BlYyBhbmQgZXJyb3JzLm1keCBmb3IgR3JhcGhRTCB0ZW1wbGF0ZVxuICAgIGNvbnN0IG9wZW5hcGlTcGVjID0gcGF0aC5qb2luKGFwaVJlZlBhdGgsICdvcGVuYXBpLmpzb24nKTtcbiAgICBjb25zdCBlcnJvcnNGaWxlID0gcGF0aC5qb2luKGFwaVJlZlBhdGgsICdlcnJvcnMubWR4Jyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMob3BlbmFwaVNwZWMpKSB7XG4gICAgICBmcy5yZW1vdmVTeW5jKG9wZW5hcGlTcGVjKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlZCBvcGVuYXBpLmpzb24gKG5vdCBuZWVkZWQgZm9yIEdyYXBoUUwgdGVtcGxhdGUpJyk7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKGVycm9yc0ZpbGUpKSB7XG4gICAgICBmcy5yZW1vdmVTeW5jKGVycm9yc0ZpbGUpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmVkIGVycm9ycy5tZHggKG5vdCBuZWVkZWQgZm9yIEdyYXBoUUwgdGVtcGxhdGUpJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGUocHJvamVjdERpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zOiBDcmVhdGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5pbmZvKCfwn5CfIENyZWF0ZSBEZXZEb2MgRG9jJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc3QgYXBpVXJsID0gb3B0aW9ucy51cmwgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9VUkwgfHwgREVGQVVMVF9BUElfVVJMO1xuXG4gIC8vIEdldCBwcm9qZWN0IG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gIGxldCBwcm9qZWN0UGF0aCA9IHByb2plY3REaXJlY3Rvcnk7XG5cbiAgaWYgKCFwcm9qZWN0UGF0aCkge1xuICAgIHByb2plY3RQYXRoID0gYXdhaXQgcHJvbXB0KCdXaGF0IGlzIHlvdXIgcHJvamVjdCBuYW1lZD8nLCAnbXktZG9jcycpO1xuICAgIFxuICAgIGlmICghcHJvamVjdFBhdGgpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUHJvamVjdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgcHJvamVjdCBuYW1lXG4gIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVByb2plY3ROYW1lKHByb2plY3RQYXRoKTtcbiAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgbG9nZ2VyLmVycm9yKHZhbGlkYXRpb24uZXJyb3IgfHwgJ0ludmFsaWQgcHJvamVjdCBuYW1lJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gR2V0IGRvYyB0eXBlIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IGRvY1R5cGU6IERvY1R5cGUgPSBvcHRpb25zLmRvY1R5cGUgfHwgJ3B1YmxpYyc7XG4gIFxuICBpZiAoIW9wdGlvbnMuZG9jVHlwZSkge1xuICAgIGNvbnN0IGRvY1R5cGVDaG9pY2VzID0gT2JqZWN0LmVudHJpZXMoRE9DX1RZUEVTKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICBsYWJlbDogYCR7dmFsdWUubmFtZX0gLSAke3ZhbHVlLmRlc2NyaXB0aW9ufWAsXG4gICAgfSkpO1xuXG4gICAgZG9jVHlwZSA9IGF3YWl0IHByb21wdFNlbGVjdCgnV2hhdCB0eXBlIG9mIGRvY3VtZW50YXRpb24gYXJlIHlvdSBjcmVhdGluZz8nLCBkb2NUeXBlQ2hvaWNlcykgYXMgRG9jVHlwZTtcbiAgfVxuXG4gIGNvbnN0IGlzSW50ZXJuYWxEb2NzID0gZG9jVHlwZSA9PT0gJ2ludGVybmFsJztcblxuICAvLyBHZXQgdGVtcGxhdGUgc2VsZWN0aW9uIGlmIG5vdCBwcm92aWRlZFxuICBsZXQgdGVtcGxhdGU6IFRlbXBsYXRlVHlwZSA9IG9wdGlvbnMudGVtcGxhdGUgfHwgJ2Jhc2ljJztcbiAgXG4gIGlmICghb3B0aW9ucy50ZW1wbGF0ZSkge1xuICAgIGNvbnN0IHRlbXBsYXRlQ2hvaWNlcyA9IE9iamVjdC5lbnRyaWVzKFRFTVBMQVRFUykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICB2YWx1ZToga2V5LFxuICAgICAgbGFiZWw6IGAke3ZhbHVlLm5hbWV9IC0gJHt2YWx1ZS5kZXNjcmlwdGlvbn1gLFxuICAgIH0pKTtcblxuICAgIHRlbXBsYXRlID0gYXdhaXQgcHJvbXB0U2VsZWN0KCdXaGljaCB0ZW1wbGF0ZSB3b3VsZCB5b3UgbGlrZSB0byB1c2U/JywgdGVtcGxhdGVDaG9pY2VzKSBhcyBUZW1wbGF0ZVR5cGU7XG4gIH1cblxuICAvLyBSZXNvbHZlIGZ1bGwgcGF0aFxuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFBhdGgpO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgY29uc3Qgc2x1ZyA9IHByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcblxuICAvLyBHZXQgc3ViZG9tYWluIC0gb25seSBmb3IgcHVibGljIGRvY3NcbiAgbGV0IHN1YmRvbWFpbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucy5zdWJkb21haW47XG4gIFxuICBpZiAoIWlzSW50ZXJuYWxEb2NzKSB7XG4gICAgaWYgKCFzdWJkb21haW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBzdWJkb21haW4gPSBhd2FpdCBwcm9tcHQoYEVudGVyIHN1YmRvbWFpbiBmb3IgeW91ciBkb2NzICgke3NsdWd9LmRldmRvYy5zaClgLCBzbHVnKTtcbiAgICAgIHN1YmRvbWFpbiA9IHN1YmRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc3ViZG9tYWluIGZvcm1hdCBsb2NhbGx5XG4gICAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KHN1YmRvbWFpbik7XG4gICAgaWYgKCFmb3JtYXRDaGVjay52YWxpZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGZvcm1hdENoZWNrLmVycm9yISk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3ViZG9tYWluIGF2YWlsYWJpbGl0eSB2aWEgQVBJIChzZXJ2ZXIgdmFsaWRhdGVzIGJsYWNrbGlzdClcbiAgICAvLyBMb29wIHVudGlsIHdlIGZpbmQgYW4gYXZhaWxhYmxlIHN1YmRvbWFpblxuICAgIGxldCBzdWJkb21haW5BdmFpbGFibGUgPSBmYWxzZTtcbiAgICB3aGlsZSAoIXN1YmRvbWFpbkF2YWlsYWJsZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYENoZWNraW5nIGlmICR7c3ViZG9tYWlufS5kZXZkb2Muc2ggaXMgYXZhaWxhYmxlLi4uYCk7XG4gICAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSBhd2FpdCBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShzdWJkb21haW4sIGFwaVVybCk7XG4gICAgICBcbiAgICAgIGlmICghYXZhaWxhYmlsaXR5LmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICBsb2dnZXIud2FybihhdmFpbGFiaWxpdHkuZXJyb3IgfHwgYFN1YmRvbWFpbiBcIiR7c3ViZG9tYWlufVwiIGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb24gPSBhdmFpbGFiaWxpdHkuc3VnZ2VzdGlvbiB8fCBgJHtzdWJkb21haW59LWRvY3NgO1xuICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgU3VnZ2VzdGlvbjogJHtzdWdnZXN0aW9ufS5kZXZkb2Muc2hgKTtcbiAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFByb21wdCBmb3IgbmV3IHN1YmRvbWFpblxuICAgICAgICBzdWJkb21haW4gPSBhd2FpdCBwcm9tcHQoJ0VudGVyIGEgZGlmZmVyZW50IHN1YmRvbWFpbicsIHN1Z2dlc3Rpb24pO1xuICAgICAgICBzdWJkb21haW4gPSBzdWJkb21haW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgICAgIGNvbnN0IGZvcm1hdENoZWNrID0gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW4pO1xuICAgICAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGZvcm1hdENoZWNrLmVycm9yISk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJkb21haW5BdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICBsb2dnZXIuc3VjY2Vzcyhg4pyTICR7c3ViZG9tYWlufS5kZXZkb2Muc2ggaXMgYXZhaWxhYmxlIWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMocmVzb2x2ZWRQYXRoKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3ZlcndyaXRlID0gYXdhaXQgcHJvbXB0Q29uZmlybShgRGlyZWN0b3J5ICR7cHJvamVjdE5hbWV9IGlzIG5vdCBlbXB0eS4gQ29udGludWUgYW55d2F5P2AsIGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdPcGVyYXRpb24gY2FuY2VsbGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWxlY3RlZFRlbXBsYXRlID0gVEVNUExBVEVTW3RlbXBsYXRlXTtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIGEgbmV3ICR7c2VsZWN0ZWRUZW1wbGF0ZS5uYW1lfSBEZXZEb2MgZG9jdW1lbnRhdGlvbiBzaXRlIGluICR7cmVzb2x2ZWRQYXRofWApO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIENyZWF0ZSBwcm9qZWN0IGRpcmVjdG9yeVxuICBmcy5lbnN1cmVEaXJTeW5jKHJlc29sdmVkUGF0aCk7XG5cbiAgLy8gRG93bmxvYWQgdGVtcGxhdGUgZnJvbSByZW1vdGUgcmVwb3NpdG9yeSAoYWx3YXlzIHVzZSBzdGFydGVyIHRlbXBsYXRlKVxuICBsb2dnZXIuaW5mbygnRG93bmxvYWRpbmcgdGVtcGxhdGUuLi4nKTtcbiAgXG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGRvd25sb2FkIGZyb20gcmVtb3RlIHJlcG9zaXRvcnkgZmlyc3RcbiAgICBhd2FpdCBkb3dubG9hZFRlbXBsYXRlKFRFTVBMQVRFX1JFUE8sIHtcbiAgICAgIGRpcjogcmVzb2x2ZWRQYXRoLFxuICAgICAgZm9yY2U6IHRydWUsXG4gICAgfSk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0Rvd25sb2FkZWQgc3RhcnRlciB0ZW1wbGF0ZScpO1xuICB9IGNhdGNoIChkb3dubG9hZEVycm9yKSB7XG4gICAgLy8gRmFsbCBiYWNrIHRvIGxvY2FsIHRlbXBsYXRlcyAoZm9yIGRldmVsb3BtZW50IG9yIG9mZmxpbmUgdXNhZ2UpXG4gICAgbG9nZ2VyLmRlYnVnKGBSZW1vdGUgZG93bmxvYWQgZmFpbGVkOiAke2Rvd25sb2FkRXJyb3J9YCk7XG4gICAgbG9nZ2VyLmluZm8oJ0ZhbGxpbmcgYmFjayB0byBsb2NhbCB0ZW1wbGF0ZS4uLicpO1xuICAgIFxuICAgIGNvbnN0IHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3RlbXBsYXRlcycsICdzdGFydGVyJyk7XG4gICAgXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdUZW1wbGF0ZSBcInN0YXJ0ZXJcIiBub3QgZm91bmQnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTG9va2VkIGZvciB0ZW1wbGF0ZSBhdDogJHt0ZW1wbGF0ZURpcn1gKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3RlIHNvdXJjZTogJyArIFRFTVBMQVRFX1JFUE8pO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlRGlyLCByZXNvbHZlZFBhdGgsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIGxvZ2dlci5zdWNjZXNzKCdDb3BpZWQgbG9jYWwgdGVtcGxhdGUnKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCBwcm9qZWN0IG5hbWVcbiAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICBjb25zdCBwa2cgPSBmcy5yZWFkSnNvblN5bmMocGtnUGF0aCk7XG4gICAgcGtnLm5hbWUgPSBwcm9qZWN0TmFtZTtcbiAgICBmcy53cml0ZUpzb25TeW5jKHBrZ1BhdGgsIHBrZywgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBkb2NzLmpzb24gYmFzZWQgb24gdGVtcGxhdGUgdHlwZVxuICBjb25zdCBkb2NzQ29uZmlnID0gZ2VuZXJhdGVEb2NzQ29uZmlnKHByb2plY3ROYW1lLCB0ZW1wbGF0ZSk7XG4gIGNvbnN0IGRvY3NQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ2RvY3MuanNvbicpO1xuICBmcy53cml0ZUpzb25TeW5jKGRvY3NQYXRoLCBkb2NzQ29uZmlnLCB7IHNwYWNlczogMiB9KTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoYEdlbmVyYXRlZCBkb2NzLmpzb24gZm9yICR7c2VsZWN0ZWRUZW1wbGF0ZS5uYW1lfSB0ZW1wbGF0ZWApO1xuXG4gIC8vIFVwZGF0ZSB0aGVtZS5qc29uIHdpdGggdGVtcGxhdGUgY29sb3JcbiAgY29uc3QgdGhlbWVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ3RoZW1lLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmModGhlbWVQYXRoKSkge1xuICAgIGNvbnN0IHRoZW1lID0gZnMucmVhZEpzb25TeW5jKHRoZW1lUGF0aCk7XG4gICAgdGhlbWUuY29sb3JzID0ge1xuICAgICAgcHJpbWFyeTogc2VsZWN0ZWRUZW1wbGF0ZS5jb2xvcixcbiAgICAgIHByaW1hcnlMaWdodDogc2VsZWN0ZWRUZW1wbGF0ZS5jb2xvcixcbiAgICAgIHByaW1hcnlEYXJrOiBzZWxlY3RlZFRlbXBsYXRlLmNvbG9yLFxuICAgIH07XG4gICAgZnMud3JpdGVKc29uU3luYyh0aGVtZVBhdGgsIHRoZW1lLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIC8vIENsZWFuIHVwIHVudXNlZCBmaWxlcyBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gIGNsZWFudXBVbnVzZWRGaWxlcyhyZXNvbHZlZFBhdGgsIHRlbXBsYXRlKTtcblxuICAvLyBDcmVhdGUgLmRldmRvYy5qc29uIHdpdGggcHJvamVjdCBjb25maWdcbiAgLy8gRm9yIHB1YmxpYyBkb2NzOiBzdWJkb21haW4gd2lsbCBvbmx5IGJlIHJlc2VydmVkIHdoZW4gdGhlIHVzZXIgYWN0dWFsbHkgZGVwbG95c1xuICAvLyBGb3IgaW50ZXJuYWwgZG9jczogbm8gc3ViZG9tYWluIG5lZWRlZFxuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJy5kZXZkb2MuanNvbicpO1xuICBcbiAgY29uc3QgZGV2ZG9jQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICBwcm9qZWN0SWQ6IGAke3NsdWd9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpfWAsXG4gICAgbmFtZTogZm9ybWF0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpLFxuICAgIHNsdWc6IHNsdWcsXG4gICAgZG9jVHlwZTogZG9jVHlwZSxcbiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgfTtcblxuICAvLyBPbmx5IGFkZCBzdWJkb21haW4gZm9yIHB1YmxpYyBkb2NzXG4gIGlmICghaXNJbnRlcm5hbERvY3MgJiYgc3ViZG9tYWluKSB7XG4gICAgZGV2ZG9jQ29uZmlnLnN1YmRvbWFpbiA9IHN1YmRvbWFpbjtcbiAgfVxuXG4gIGZzLndyaXRlSnNvblN5bmMoZGV2ZG9jQ29uZmlnUGF0aCwgZGV2ZG9jQ29uZmlnLCB7IHNwYWNlczogMiB9KTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgLmRldmRvYy5qc29uJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIERvYyBUeXBlOicsIERPQ19UWVBFU1tkb2NUeXBlXS5uYW1lKTtcbiAgaWYgKCFpc0ludGVybmFsRG9jcyAmJiBzdWJkb21haW4pIHtcbiAgICBjb25zb2xlLmxvZygnICBTdWJkb21haW46JywgYCR7c3ViZG9tYWlufS5kZXZkb2Muc2hgKTtcbiAgICBjb25zb2xlLmxvZygnICBTdGF0dXM6JywgJ05vdCB5ZXQgZGVwbG95ZWQgKHN1YmRvbWFpbiB3aWxsIGJlIHJlc2VydmVkIG9uIGZpcnN0IGRlcGxveSknKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnICBTdGF0dXM6JywgJ0ludGVybmFsIGRvY3MgKGxvY2FsIGRldmVsb3BtZW50IG9ubHkpJyk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGdpdFxuICBpZiAob3B0aW9ucy5naXQgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyBnaXQgcmVwb3NpdG9yeS4uLicpO1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGluaXQnLCB7IGN3ZDogcmVzb2x2ZWRQYXRoLCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gICAgICBleGVjU3luYygnZ2l0IGFkZCAtQScsIHsgY3dkOiByZXNvbHZlZFBhdGgsIHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgY29tbWl0IC1tIFwiSW5pdGlhbCBjb21taXQgZnJvbSBkZXZkb2MgY3JlYXRlXCInLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdHaXQgcmVwb3NpdG9yeSBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbml0aWFsaXplIGdpdCByZXBvc2l0b3J5Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5zdGFsbCBkZXBlbmRlbmNpZXNcbiAgaWYgKG9wdGlvbnMuaW5zdGFsbCAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIuaW5mbygnSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi4nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlcigpO1xuICAgICAgZXhlY1N5bmMoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnRGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbnN0YWxsIGRlcGVuZGVuY2llcycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluc3RhbGwgQUkgYWdlbnRzIC0gYWx3YXlzIHByb21wdCBhcyBwYXJ0IG9mIGNyZWF0ZSBmbG93XG4gIGxldCBhaVRvb2w6ICdjbGF1ZGUnIHwgJ2N1cnNvcicgfCAnYm90aCcgfCBudWxsID0gbnVsbDtcbiAgXG4gIGNvbnN0IGFpQ2hvaWNlcyA9IFtcbiAgICB7IHZhbHVlOiAnYm90aCcsIGxhYmVsOiAnQm90aCAtIENsYXVkZSBDb2RlIGFuZCBDdXJzb3IgKHJlY29tbWVuZGVkKScgfSxcbiAgICB7IHZhbHVlOiAnY3Vyc29yJywgbGFiZWw6ICdDdXJzb3IgLSBSdWxlcyBmb3IgQ3Vyc29yIElERScgfSxcbiAgICB7IHZhbHVlOiAnY2xhdWRlJywgbGFiZWw6ICdDbGF1ZGUgQ29kZSAtIFNraWxscyBhbmQgQ0xBVURFLm1kJyB9LFxuICBdO1xuICBjb25zdCBhaVNlbGVjdGlvbiA9IGF3YWl0IHByb21wdFNlbGVjdCgnV2hpY2ggQUkgY29kaW5nIGFzc2lzdGFudCBkbyB5b3UgdXNlPycsIGFpQ2hvaWNlcyk7XG4gIGFpVG9vbCA9IGFpU2VsZWN0aW9uIGFzICdjbGF1ZGUnIHwgJ2N1cnNvcicgfCAnYm90aCc7XG5cbiAgaWYgKGFpVG9vbCkge1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICAgIGNvbnN0IGFpUmVzdWx0cyA9IGluc3RhbGxBSUFnZW50cyhyZXNvbHZlZFBhdGgsIGFpVG9vbCk7XG4gICAgXG4gICAgaWYgKGFpUmVzdWx0cy5jbGF1ZGVNZCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgQ0xBVURFLm1kJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgYWlSZXN1bHRzLmNsYXVkZVNraWxscykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBydWxlIG9mIGFpUmVzdWx0cy5jdXJzb3JSdWxlcykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmN1cnNvci9ydWxlcy8ke3J1bGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3VjY2VzcyBtZXNzYWdlXG4gIGNvbnNvbGUubG9nKCk7XG4gIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkICR7cHJvamVjdE5hbWV9IGF0ICR7cmVzb2x2ZWRQYXRofWApO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGlmICghaXNJbnRlcm5hbERvY3MgJiYgc3ViZG9tYWluKSB7XG4gICAgY29uc29sZS5sb2coJ1lvdXIgZG9jcyB3aWxsIGJlIGF2YWlsYWJsZSBhdDonKTtcbiAgICBjb25zb2xlLmxvZyhgICBodHRwczovLyR7c3ViZG9tYWlufS5kZXZkb2Muc2hgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGxvZ2dlci5pbmZvKCdOb3RlOiBUaGUgc3ViZG9tYWluIHdpbGwgYmUgcmVzZXJ2ZWQgd2hlbiB5b3UgcnVuIFwibnBtIHJ1biBkZXBsb3lcIicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ1RoaXMgaXMgYW4gaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBwcm9qZWN0IGZvciBsb2NhbCBkZXZlbG9wbWVudC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSBjb21tYW5kczonKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biBkZXYgICAgICAgU3RhcnQgdGhlIGRldmVsb3BtZW50IHNlcnZlcicpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGJ1aWxkICAgICBCdWlsZCBmb3IgcHJvZHVjdGlvbicpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIHN0YXJ0ICAgICBTdGFydCBwcm9kdWN0aW9uIHNlcnZlcicpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGNoZWNrICAgICBWYWxpZGF0ZSBkb2NzLmpzb24gYW5kIE1EWCBmaWxlcycpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGRlcGxveSAgICBEZXBsb3kgdG8gRGV2RG9jIHBsYXRmb3JtJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gYWkgICAgICAgIFNldCB1cCBBSSBhZ2VudCBjb25maWd1cmF0aW9uJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gd2hvYW1pICAgIFNob3cgY3VycmVudCBwcm9qZWN0IGluZm8nKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biB1cGdyYWRlICAgVXBkYXRlIGRldmRvYyB0byBsYXRlc3QgdmVyc2lvbicpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnNvbGUubG9nKCdXZSBzdWdnZXN0IHRoYXQgeW91IGJlZ2luIGJ5IHR5cGluZzonKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coYCAgY2QgJHtwcm9qZWN0TmFtZX1gKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biBkZXYnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICAvLyBTaG93IEFJIGFnZW50IHF1aWNrIHN0YXJ0IHRpcHNcbiAgY29uc29sZS5sb2coJ0FJIEFnZW50IFF1aWNrIFN0YXJ0OicpO1xuICBpZiAoYWlUb29sID09PSAnY2xhdWRlJyB8fCBhaVRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIENsYXVkZSBDb2RlOiAvYm9vdHN0cmFwLWRvY3MnKTtcbiAgfVxuICBpZiAoYWlUb29sID09PSAnY3Vyc29yJyB8fCBhaVRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIEN1cnNvcjogQXNrIFwiZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uIGZyb20gdGhpcyByZXBvXCInKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIEFTQ0lJIGFydCBiYW5uZXJcbiAgY29uc29sZS5sb2coYFxuICBfX19fICAgICAgICAgICAgICBfX19fICAgICAgICAgICAgIFxuIHwgIF8gXFxcXCAgX19fX18gICBfX3wgIF8gXFxcXCAgX19fICAgX19fIFxuIHwgfCB8IHwvIF8gXFxcXCBcXFxcIC8gL3wgfCB8IHwvIF8gXFxcXCAvIF9ffFxuIHwgfF98IHwgIF9fL1xcXFwgViAvIHwgfF98IHwgKF8pIHwgKF9fIFxuIHxfX19fLyBcXFxcX19ffCBcXFxcXy8gIHxfX19fLyBcXFxcX19fLyBcXFxcX19ffFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgYCk7XG4gIGNvbnNvbGUubG9nKCdIYXBweSBkb2N1bWVudGluZyEnKTtcbiAgY29uc29sZS5sb2coKTtcbn1cbiJdfQ==
|
|
715
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpZEEsd0JBeVVDO0FBMXhCRCxpREFBeUM7QUFDekMsZ0RBQXdCO0FBQ3hCLHdEQUEwQjtBQUMxQixpQ0FBeUM7QUFDekMsK0NBQTRDO0FBQzVDLCtDQUFrRDtBQUVsRCx1REFBdUQ7QUFDdkQsTUFBTSxhQUFhLEdBQUcsOENBQThDLENBQUM7QUFFckUsdUZBQXVGO0FBQ3ZGLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHlEQUF5RDtRQUN0RSxLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLDJDQUEyQztRQUN4RCxLQUFLLEVBQUUsU0FBUztLQUNqQjtDQUNPLENBQUM7QUFJWCxzQkFBc0I7QUFDdEIsTUFBTSxTQUFTLEdBQUc7SUFDaEIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsdURBQXVEO0tBQ3JFO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLFVBQVU7UUFDaEIsV0FBVyxFQUFFLDREQUE0RDtLQUMxRTtDQUNPLENBQUM7QUFtQlgsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sZUFBZSxHQUFHLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLFlBQVksS0FBSztZQUNuQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQztRQUVwQixFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBQyxRQUFnQixFQUFFLE9BQTJDO0lBQ3ZGLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2QyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEJBQTBCO2dCQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxZQUFZLEdBQUcsS0FBSztJQUNqRSxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDOUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZO0lBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxtRUFBbUUsRUFBRSxDQUFDO0lBQ3RHLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsc0JBQXNCLENBQUMsU0FBaUI7SUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUseUNBQXlDLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHFFQUFxRSxFQUFFLENBQUM7SUFDeEcsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSw4Q0FBOEMsRUFBRSxDQUFDO0lBQ2pGLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSwwQkFBMEIsQ0FDdkMsU0FBaUIsRUFDakIsTUFBYztJQUVkLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSx1QkFBdUIsRUFBRTtZQUM3RCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQTRCLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlGQUFpRjtRQUNqRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztJQUUxRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxXQUFtQixFQUFFLFlBQTBCO0lBQ3pFLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV6QyxtREFBbUQ7SUFDbkQsNkZBQTZGO0lBQzdGLGtEQUFrRDtJQUNsRCxNQUFNLFVBQVUsR0FBRztRQUNqQixPQUFPLEVBQUUsNkJBQTZCO1FBQ3RDLElBQUksRUFBRSxhQUFhO1FBQ25CLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFLEVBQWM7WUFDcEIsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxNQUFNLEVBQUUsUUFBUTt3QkFDaEIsSUFBSSxFQUFFLHVDQUF1Qzt3QkFDN0MsSUFBSSxFQUFFLGFBQWE7cUJBQ3BCO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGLENBQUM7SUFFRixxQ0FBcUM7SUFDckMsTUFBTSxPQUFPLEdBQUc7UUFDZCxHQUFHLEVBQUUsZUFBZTtRQUNwQixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRTtZQUNOO2dCQUNFLEtBQUssRUFBRSxpQkFBaUI7Z0JBQ3hCLElBQUksRUFBRSxlQUFlO2dCQUNyQixLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO2FBQy9CO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDO2FBQ25EO1NBQ0Y7S0FDRixDQUFDO0lBRUYsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpDLCtDQUErQztJQUMvQyxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQixVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDOUIsR0FBRyxFQUFFLGVBQWU7WUFDcEIsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFFBQVEsRUFBRTtnQkFDUixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7YUFDckU7WUFDRCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUU7d0JBQ0wsNEJBQTRCO3dCQUM1Qiw4QkFBOEI7d0JBQzlCLHNCQUFzQjtxQkFDdkI7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUMzQixVQUFrQixDQUFDLEdBQUcsR0FBRztZQUN4QixPQUFPLEVBQUUseUJBQXlCO1lBQ2xDLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsTUFBTTthQUNiO1NBQ0YsQ0FBQztJQUNKLENBQUM7U0FBTSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDOUIsR0FBRyxFQUFFLGFBQWE7WUFDbEIsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsY0FBYztZQUNwQixNQUFNLEVBQUUsOEJBQThCO1lBQ3RDLFFBQVEsRUFBRSw0Q0FBNEM7WUFDdEQsTUFBTSxFQUFFO2dCQUNOO29CQUNFLEtBQUssRUFBRSxVQUFVO29CQUNqQixJQUFJLEVBQUUsV0FBVztvQkFDakIsS0FBSyxFQUFFO3dCQUNMLDRCQUE0Qjt3QkFDNUIsOEJBQThCO3FCQUMvQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCwrQkFBK0I7QUFDL0IsTUFBTSxhQUFhLEdBQUc7SUFDcEIsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osWUFBWTtDQUNiLENBQUM7QUFFRix5QkFBeUI7QUFDekIsTUFBTSxZQUFZLEdBQUc7SUFDbkIsWUFBWTtJQUNaLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7Q0FDcEIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsU0FBUyxjQUFjO0lBQ3JCLGlHQUFpRztJQUNqRyxJQUFJLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVwRSxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWpHLElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FDdEIsV0FBbUIsRUFDbkIsSUFBa0M7SUFFbEMsTUFBTSxPQUFPLEdBQUc7UUFDZCxRQUFRLEVBQUUsS0FBSztRQUNmLFlBQVksRUFBRSxFQUFjO1FBQzVCLFdBQVcsRUFBRSxFQUFjO0tBQzVCLENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNuQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLGlCQUFpQjtRQUNqQixNQUFNLGNBQWMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN6RCxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsa0JBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFFRCxjQUFjO1FBQ2QsTUFBTSxlQUFlLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sYUFBYSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRSxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsa0JBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLGtCQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLGtCQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsTUFBTSxZQUFZLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWhFLElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxrQkFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUvQixLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNoQyxNQUFNLFVBQVUsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRS9DLElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsa0JBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsa0JBQWtCLENBQUMsWUFBb0IsRUFBRSxZQUEwQjtJQUMxRSxNQUFNLFVBQVUsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUU1RCxJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM3Qix3REFBd0Q7UUFDeEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzlCLGtCQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLGVBQU0sQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztTQUFNLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLDZDQUE2QztRQUM3QyxNQUFNLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlELElBQUksa0JBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QywwREFBMEQ7UUFDMUQsTUFBTSxXQUFXLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDMUQsTUFBTSxVQUFVLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLGtCQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNCLGVBQU0sQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzlCLGtCQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLGVBQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsTUFBTSxDQUFDLGdCQUFvQyxFQUFFLE9BQXNCO0lBQ3ZGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLGVBQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLDJCQUFlLENBQUM7SUFFNUUsbUNBQW1DO0lBQ25DLElBQUksV0FBVyxHQUFHLGdCQUFnQixDQUFDO0lBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLGVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsZUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLHNCQUFzQixDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLElBQUksT0FBTyxHQUFZLE9BQU8sQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDO0lBRW5ELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RSxLQUFLLEVBQUUsR0FBRztZQUNWLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLFdBQVcsRUFBRTtTQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyw4Q0FBOEMsRUFBRSxjQUFjLENBQVksQ0FBQztJQUMxRyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxLQUFLLFVBQVUsQ0FBQztJQUU5Qyx5Q0FBeUM7SUFDekMsSUFBSSxRQUFRLEdBQWlCLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDO0lBRXpELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RSxLQUFLLEVBQUUsR0FBRztZQUNWLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLFdBQVcsRUFBRTtTQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVKLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyx1Q0FBdUMsRUFBRSxlQUFlLENBQWlCLENBQUM7SUFDMUcsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGNBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV6Rix1Q0FBdUM7SUFDdkMsSUFBSSxTQUFTLEdBQXVCLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFFdEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQ0FBa0MsSUFBSSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEYsU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLGVBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQU0sQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSw0Q0FBNEM7UUFDNUMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDL0IsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0IsZUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztZQUNsRSxNQUFNLFlBQVksR0FBRyxNQUFNLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsZUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLGNBQWMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUUvRSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxJQUFJLEdBQUcsU0FBUyxPQUFPLENBQUM7Z0JBQ2xFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsVUFBVSxZQUFZLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVkLDJCQUEyQjtnQkFDM0IsU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLDZCQUE2QixFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRSxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFdEYsa0JBQWtCO2dCQUNsQixNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDdkIsZUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBTSxDQUFDLENBQUM7b0JBQ2pDLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFDMUIsZUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsMEJBQTBCLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLGtCQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxhQUFhLFdBQVcsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFeEcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLGVBQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixnQkFBZ0IsQ0FBQyxJQUFJLGlDQUFpQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLDJCQUEyQjtJQUMzQixrQkFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUvQix5RUFBeUU7SUFDekUsZUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRXZDLElBQUksQ0FBQztRQUNILCtDQUErQztRQUMvQyxNQUFNLElBQUEsd0JBQWdCLEVBQUMsYUFBYSxFQUFFO1lBQ3BDLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsZUFBTSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLGtFQUFrRTtRQUNsRSxlQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELGVBQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUVqRCxNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLGtCQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsZUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzdDLGVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDdkQsZUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUQsZUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsTUFBTSxPQUFPLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLGtCQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RCxrQkFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsZUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQztJQUU1RSx3Q0FBd0M7SUFDeEMsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEQsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztZQUMvQixZQUFZLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztZQUNwQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztTQUNwQyxDQUFDO1FBQ0Ysa0JBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwrQ0FBK0M7SUFDL0Msa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTNDLDBDQUEwQztJQUMxQyxrRkFBa0Y7SUFDbEYseUNBQXlDO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFakUsTUFBTSxZQUFZLEdBQTRCO1FBQzVDLFNBQVMsRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDbEUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLEVBQUUsSUFBSTtRQUNWLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtLQUNwQyxDQUFDO0lBRUYscUNBQXFDO0lBQ3JDLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakMsWUFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELGtCQUFFLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLGVBQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN2QyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLFNBQVMsWUFBWSxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsK0RBQStELENBQUMsQ0FBQztJQUM1RixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFJLE9BQU8sQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDMUIsZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQztZQUNILElBQUEsd0JBQVEsRUFBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUEsd0JBQVEsRUFBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELElBQUEsd0JBQVEsRUFBQyxtREFBbUQsRUFBRTtnQkFDNUQsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUMsQ0FBQztZQUNILGVBQU0sQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM5QixlQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQyxJQUFBLHdCQUFRLEVBQUMsR0FBRyxjQUFjLFVBQVUsRUFBRTtnQkFDcEMsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLEtBQUssRUFBRSxTQUFTO2FBQ2pCLENBQUMsQ0FBQztZQUNILGVBQU0sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksTUFBTSxHQUF3QyxJQUFJLENBQUM7SUFFdkQsTUFBTSxTQUFTLEdBQUc7UUFDaEIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSw2Q0FBNkMsRUFBRTtRQUN2RSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLCtCQUErQixFQUFFO1FBQzNELEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsb0NBQW9DLEVBQUU7S0FDakUsQ0FBQztJQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sWUFBWSxDQUFDLHVDQUF1QyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNGLE1BQU0sR0FBRyxXQUEyQyxDQUFDO0lBRXJELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxlQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixlQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzNDLGVBQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pDLGVBQU0sQ0FBQyxPQUFPLENBQUMseUJBQXlCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsZUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLFdBQVcsT0FBTyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxTQUFTLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLGVBQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUNsRixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDaEYsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbkMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxpQ0FBaUM7SUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JDLElBQUksTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRWQsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7R0FPWCxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZG93bmxvYWRUZW1wbGF0ZSB9IGZyb20gJ2dpZ2V0JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG4vLyBSZW1vdGUgdGVtcGxhdGUgcmVwb3NpdG9yeSAtIHNpbmdsZSBzdGFydGVyIHRlbXBsYXRlXG5jb25zdCBURU1QTEFURV9SRVBPID0gJ2dpdGh1YjpicmFpbmZpc2gtYWkvZGV2ZG9jL3RlbXBsYXRlcy9zdGFydGVyJztcblxuLy8gQXZhaWxhYmxlIHRlbXBsYXRlIHR5cGVzIChhbGwgdXNlIHRoZSBzYW1lIHN0YXJ0ZXIgdGVtcGxhdGUsIGp1c3QgZGlmZmVyZW50IGNvbmZpZ3MpXG5jb25zdCBURU1QTEFURVMgPSB7XG4gIGJhc2ljOiB7XG4gICAgbmFtZTogJ0Jhc2ljJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBkb2N1bWVudGF0aW9uIHNpdGUgd2l0aCBndWlkZXMgYW5kIHBhZ2VzJyxcbiAgICBjb2xvcjogJyMxMGI5ODEnLFxuICB9LFxuICBvcGVuYXBpOiB7XG4gICAgbmFtZTogJ09wZW5BUEknLFxuICAgIGRlc2NyaXB0aW9uOiAnRG9jdW1lbnRhdGlvbiB3aXRoIFJFU1QgQVBJIHJlZmVyZW5jZSAoT3BlbkFQSS9Td2FnZ2VyKScsXG4gICAgY29sb3I6ICcjMTBiOTgxJyxcbiAgfSxcbiAgZ3JhcGhxbDoge1xuICAgIG5hbWU6ICdHcmFwaFFMJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gd2l0aCBHcmFwaFFMIEFQSSBwbGF5Z3JvdW5kJyxcbiAgICBjb2xvcjogJyNlNTM1YWInLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZW1wbGF0ZVR5cGUgPSBrZXlvZiB0eXBlb2YgVEVNUExBVEVTO1xuXG4vLyBEb2N1bWVudGF0aW9uIHR5cGVzXG5jb25zdCBET0NfVFlQRVMgPSB7XG4gIHB1YmxpYzoge1xuICAgIG5hbWU6ICdQdWJsaWMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVXNlci1mYWNpbmcgZG9jcyB3aXRoIGN1c3RvbSBzdWJkb21haW4gYW5kIGRlcGxveW1lbnQnLFxuICB9LFxuICBpbnRlcm5hbDoge1xuICAgIG5hbWU6ICdJbnRlcm5hbCcsXG4gICAgZGVzY3JpcHRpb246ICdEZXZlbG9wZXIgZG9jcyBmb3IgbG9jYWwvcHJpdmF0ZSB1c2UgKG5vIHN1YmRvbWFpbiBuZWVkZWQpJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgRG9jVHlwZSA9IGtleW9mIHR5cGVvZiBET0NfVFlQRVM7XG5cbmludGVyZmFjZSBDcmVhdGVPcHRpb25zIHtcbiAgdGVtcGxhdGU/OiBUZW1wbGF0ZVR5cGU7XG4gIGRvY1R5cGU/OiBEb2NUeXBlO1xuICBnaXQ/OiBib29sZWFuO1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDaGVja1N1YmRvbWFpblJlc3BvbnNlIHtcbiAgYXZhaWxhYmxlOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgc3VnZ2VzdGlvbj86IHN0cmluZztcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0Q29uZmlybShxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGhpbnQgPSBkZWZhdWx0VmFsdWUgPyAnW1kvbl0nIDogJ1t5L05dJztcbiAgICBybC5xdWVzdGlvbihgJHtxdWVzdGlvbn0gJHtoaW50fTogYCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gJycpIHtcbiAgICAgICAgcmVzb2x2ZShkZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShub3JtYWxpemVkID09PSAneScgfHwgbm9ybWFsaXplZCA9PT0gJ3llcycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1Byb2plY3QgbmFtZSBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIHZhbGlkIG5wbSBwYWNrYWdlIG5hbWVcbiAgaWYgKCEvXlthLXowLTldW2EtejAtOS0uX10qJC9pLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnSW52YWxpZCBwcm9qZWN0IG5hbWUuIFVzZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcy4nIH07XG4gIH1cbiAgXG4gIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG59XG5cbi8qKlxuICogQmFzaWMgc3ViZG9tYWluIGZvcm1hdCB2YWxpZGF0aW9uIChzZXJ2ZXIgZG9lcyBmdWxsIHZhbGlkYXRpb24gaW5jbHVkaW5nIGJsYWNrbGlzdClcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YmRvbWFpbkZvcm1hdChzdWJkb21haW46IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnIH07XG4gIH1cbiAgXG4gIGlmIChzdWJkb21haW4ubGVuZ3RoID4gNjMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgNjMgY2hhcmFjdGVycyBvciBsZXNzJyB9O1xuICB9XG4gIFxuICBpZiAoIS9eW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8kLy50ZXN0KHN1YmRvbWFpbikpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYywgY2FuIGNvbnRhaW4gaHlwaGVucycgfTtcbiAgfVxuICBcbiAgaWYgKC8tLS8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBjYW5ub3QgY29udGFpbiBjb25zZWN1dGl2ZSBoeXBoZW5zJyB9O1xuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSSAoYWxzbyB2YWxpZGF0ZXMgYWdhaW5zdCBzZXJ2ZXIgYmxhY2tsaXN0KVxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShcbiAgc3ViZG9tYWluOiBzdHJpbmcsXG4gIGFwaVVybDogc3RyaW5nXG4pOiBQcm9taXNlPENoZWNrU3ViZG9tYWluUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3N1YmRvbWFpbnMvY2hlY2tgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHN1YmRvbWFpbiB9KSxcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2hlY2tTdWJkb21haW5SZXNwb25zZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBBUEkgaXMgdW5hdmFpbGFibGUsIGFsbG93IHByb2NlZWRpbmcgKHdpbGwgZmFpbCBhdCByZWdpc3RyYXRpb24gaWYgaW52YWxpZClcbiAgICByZXR1cm4geyBhdmFpbGFibGU6IHRydWUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9qZWN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKC8tL2csICcgJylcbiAgICAucmVwbGFjZSgvXFxiXFx3L2csIChjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlcigpOiBzdHJpbmcge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgJyc7XG4gIFxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoJ3lhcm4nKSkge1xuICAgIHJldHVybiAneWFybic7XG4gIH1cbiAgXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aCgncG5wbScpKSB7XG4gICAgcmV0dXJuICdwbnBtJztcbiAgfVxuICBcbiAgcmV0dXJuICducG0nO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGRvY3MuanNvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRlbXBsYXRlIHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVEb2NzQ29uZmlnKHByb2plY3ROYW1lOiBzdHJpbmcsIHRlbXBsYXRlVHlwZTogVGVtcGxhdGVUeXBlKTogb2JqZWN0IHtcbiAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGZvcm1hdFByb2plY3ROYW1lKHByb2plY3ROYW1lKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBURU1QTEFURVNbdGVtcGxhdGVUeXBlXTtcbiAgXG4gIC8vIEJhc2UgY29uZmlndXJhdGlvbiAoc2hhcmVkIGFjcm9zcyBhbGwgdGVtcGxhdGVzKVxuICAvLyBOb3RlOiBBc3NldHMgYXJlIHN0b3JlZCBpbiB0aGUgL2Fzc2V0cyBmb2xkZXIgYW5kIHNlcnZlZCB2aWEgL2FwaS9sb2NhbC1hc3NldHMgaW4gZGV2IG1vZGVcbiAgLy8gVGhlbWUgc2V0dGluZ3MgKGNvbG9ycywgbG9nbykgYXJlIGluIHRoZW1lLmpzb25cbiAgY29uc3QgYmFzZUNvbmZpZyA9IHtcbiAgICAkc2NoZW1hOiAnaHR0cHM6Ly9kZXZkb2Muc2gvZG9jcy5qc29uJyxcbiAgICBuYW1lOiBmb3JtYXR0ZWROYW1lLFxuICAgIGZhdmljb246ICcvYXNzZXRzL2Zhdmljb24uc3ZnJyxcbiAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICB0YWJzOiBbXSBhcyBvYmplY3RbXSxcbiAgICAgIGdsb2JhbDoge1xuICAgICAgICBhbmNob3JzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5jaG9yOiAnR2l0SHViJyxcbiAgICAgICAgICAgIGhyZWY6ICdodHRwczovL2dpdGh1Yi5jb20veW91ci1vcmcveW91ci1yZXBvJyxcbiAgICAgICAgICAgIGljb246ICdnaXRodWItbG9nbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICAvLyBEb2N1bWVudGF0aW9uIHRhYiAoYWx3YXlzIHByZXNlbnQpXG4gIGNvbnN0IGRvY3NUYWIgPSB7XG4gICAgdGFiOiAnRG9jdW1lbnRhdGlvbicsXG4gICAgdHlwZTogJ2RvY3MnLFxuICAgIGdyb3VwczogW1xuICAgICAge1xuICAgICAgICBncm91cDogJ0dldHRpbmcgU3RhcnRlZCcsXG4gICAgICAgIGljb246ICdyb2NrZXQtbGF1bmNoJyxcbiAgICAgICAgcGFnZXM6IFsnaW5kZXgnLCAncXVpY2tzdGFydCddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZ3JvdXA6ICdHdWlkZXMnLFxuICAgICAgICBpY29uOiAnYm9vay1vcGVuJyxcbiAgICAgICAgcGFnZXM6IFsnZ3VpZGVzL292ZXJ2aWV3JywgJ2d1aWRlcy9jb25maWd1cmF0aW9uJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgYmFzZUNvbmZpZy5uYXZpZ2F0aW9uLnRhYnMucHVzaChkb2NzVGFiKTtcblxuICAvLyBBZGQgQVBJIHJlZmVyZW5jZSB0YWIgYmFzZWQgb24gdGVtcGxhdGUgdHlwZVxuICBpZiAodGVtcGxhdGVUeXBlID09PSAnb3BlbmFwaScpIHtcbiAgICBiYXNlQ29uZmlnLm5hdmlnYXRpb24udGFicy5wdXNoKHtcbiAgICAgIHRhYjogJ0FQSSBSZWZlcmVuY2UnLFxuICAgICAgdHlwZTogJ29wZW5hcGknLFxuICAgICAgcGF0aDogJy9hcGktcmVmZXJlbmNlJyxcbiAgICAgIHZlcnNpb25zOiBbXG4gICAgICAgIHsgdmVyc2lvbjogJ3YxJywgc3BlYzogJ2FwaS1yZWZlcmVuY2Uvb3BlbmFwaS5qc29uJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIGdyb3VwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZ3JvdXA6ICdPdmVydmlldycsXG4gICAgICAgICAgaWNvbjogJ2Jvb2stb3BlbicsXG4gICAgICAgICAgcGFnZXM6IFtcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2ludHJvZHVjdGlvbicsXG4gICAgICAgICAgICAnYXBpLXJlZmVyZW5jZS9hdXRoZW50aWNhdGlvbicsXG4gICAgICAgICAgICAnYXBpLXJlZmVyZW5jZS9lcnJvcnMnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIEFQSSBwbGF5Z3JvdW5kIGNvbmZpZ1xuICAgIChiYXNlQ29uZmlnIGFzIGFueSkuYXBpID0ge1xuICAgICAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAgICAgIHBsYXlncm91bmQ6IHtcbiAgICAgICAgbW9kZTogJ3Nob3cnLFxuICAgICAgfSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ2dyYXBocWwnKSB7XG4gICAgYmFzZUNvbmZpZy5uYXZpZ2F0aW9uLnRhYnMucHVzaCh7XG4gICAgICB0YWI6ICdHcmFwaFFMIEFQSScsXG4gICAgICB0eXBlOiAnZ3JhcGhxbCcsXG4gICAgICBwYXRoOiAnL2dyYXBocWwtYXBpJyxcbiAgICAgIHNjaGVtYTogJ2FwaS1yZWZlcmVuY2Uvc2NoZW1hLmdyYXBocWwnLFxuICAgICAgZW5kcG9pbnQ6ICdodHRwczovL2NvdW50cmllcy50cmV2b3JibGFkZXMuY29tL2dyYXBocWwnLFxuICAgICAgZ3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBncm91cDogJ092ZXJ2aWV3JyxcbiAgICAgICAgICBpY29uOiAnYm9vay1vcGVuJyxcbiAgICAgICAgICBwYWdlczogW1xuICAgICAgICAgICAgJ2FwaS1yZWZlcmVuY2UvaW50cm9kdWN0aW9uJyxcbiAgICAgICAgICAgICdhcGktcmVmZXJlbmNlL2F1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBiYXNlQ29uZmlnO1xufVxuXG4vLyBDbGF1ZGUgQ29kZSBza2lsbHMgdG8gY3JlYXRlXG5jb25zdCBDTEFVREVfU0tJTExTID0gW1xuICAnYm9vdHN0cmFwLWRvY3MnLFxuICAnd2hpc2stdGhlbWUnLFxuICAnbWlncmF0ZS1kb2NzJyxcbiAgJ2ltcG9ydC1hcGktc3BlYycsXG4gICdjaGVjay1kb2NzJyxcbiAgJ2JsYW1lLWRvYycsXG4gICdjcmVhdGUtZG9jJyxcbiAgJ3VwZGF0ZS1kb2MnLFxuICAnZGVsZXRlLWRvYycsXG4gICdjb21taXQtZG9jJyxcbl07XG5cbi8vIEN1cnNvciBydWxlcyB0byBjcmVhdGVcbmNvbnN0IENVUlNPUl9SVUxFUyA9IFtcbiAgJ2RldmRvYy5tZGMnLFxuICAnZGV2ZG9jLWJvb3RzdHJhcC5tZGMnLFxuICAnZGV2ZG9jLXdoaXNrLXRoZW1lLm1kYycsXG4gICdkZXZkb2MtbWlncmF0ZS5tZGMnLFxuICAnZGV2ZG9jLWJsYW1lLm1kYycsXG4gICdkZXZkb2MtY3JlYXRlLm1kYycsXG4gICdkZXZkb2MtdXBkYXRlLm1kYycsXG4gICdkZXZkb2MtZGVsZXRlLm1kYycsXG4gICdkZXZkb2MtY29tbWl0Lm1kYycsXG5dO1xuXG4vKipcbiAqIEdldCB0aGUgQUkgYWdlbnRzIHRlbXBsYXRlIGRpcmVjdG9yeSBwYXRoXG4gKi9cbmZ1bmN0aW9uIGdldEFJQWdlbnRzRGlyKCk6IHN0cmluZyB8IG51bGwge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gY29tcGlsZWQgZGlzdCAocGFja2FnZXMvZGV2ZG9jL2Rpc3QvY2xpL2NvbW1hbmRzIC0+IHBhY2thZ2VzL2RldmRvYy9haS1hZ2VudHMpXG4gIGxldCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnYWktYWdlbnRzJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgcmV0dXJuIGFnZW50c0RpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IGRldmRvYy90ZW1wbGF0ZXMgYXQgcmVwbyByb290IChkZXZlbG9wbWVudClcbiAgYWdlbnRzRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ2RldmRvYycsICd0ZW1wbGF0ZXMnLCAnc3RhcnRlcicpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGlyKSkge1xuICAgIHJldHVybiBhZ2VudHNEaXI7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEluc3RhbGwgQUkgYWdlbnQgY29uZmlndXJhdGlvbiBmaWxlc1xuICovXG5mdW5jdGlvbiBpbnN0YWxsQUlBZ2VudHMoXG4gIHByb2plY3RQYXRoOiBzdHJpbmcsIFxuICB0b29sOiAnY2xhdWRlJyB8ICdjdXJzb3InIHwgJ2JvdGgnXG4pOiB7IGNsYXVkZU1kOiBib29sZWFuOyBjbGF1ZGVTa2lsbHM6IHN0cmluZ1tdOyBjdXJzb3JSdWxlczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgY2xhdWRlTWQ6IGZhbHNlLFxuICAgIGNsYXVkZVNraWxsczogW10gYXMgc3RyaW5nW10sXG4gICAgY3Vyc29yUnVsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICB9O1xuXG4gIGNvbnN0IGFnZW50c0RpciA9IGdldEFJQWdlbnRzRGlyKCk7XG4gIGlmICghYWdlbnRzRGlyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0FJIGFnZW50IHRlbXBsYXRlcyBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8vIEluc3RhbGwgQ2xhdWRlIENvZGUgZmlsZXNcbiAgaWYgKHRvb2wgPT09ICdjbGF1ZGUnIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIC8vIENvcHkgQ0xBVURFLm1kXG4gICAgY29uc3QgY2xhdWRlTWRTb3VyY2UgPSBwYXRoLmpvaW4oYWdlbnRzRGlyLCAnQ0xBVURFLm1kJyk7XG4gICAgY29uc3QgY2xhdWRlTWREZXN0ID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnQ0xBVURFLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2xhdWRlTWRTb3VyY2UpKSB7XG4gICAgICBmcy5jb3B5U3luYyhjbGF1ZGVNZFNvdXJjZSwgY2xhdWRlTWREZXN0KTtcbiAgICAgIHJlc3VsdHMuY2xhdWRlTWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIENvcHkgc2tpbGxzXG4gICAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKGFnZW50c0RpciwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gICAgY29uc3QgZGVzdFNraWxsc0RpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gICAgXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc291cmNlU2tpbGxzRGlyKSkge1xuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkZXN0U2tpbGxzRGlyKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihzb3VyY2VTa2lsbHNEaXIsIHNraWxsKTtcbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguam9pbihkZXN0U2tpbGxzRGlyLCBza2lsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VEaXIpKSB7XG4gICAgICAgICAgZnMuY29weVN5bmMoc291cmNlRGlyLCBkZXN0RGlyKTtcbiAgICAgICAgICByZXN1bHRzLmNsYXVkZVNraWxscy5wdXNoKHNraWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluc3RhbGwgQ3Vyc29yIGZpbGVzXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBzb3VyY2VSdWxlc0RpciA9IHBhdGguam9pbihhZ2VudHNEaXIsICcuY3Vyc29yJywgJ3J1bGVzJyk7XG4gICAgY29uc3QgZGVzdFJ1bGVzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmN1cnNvcicsICdydWxlcycpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZVJ1bGVzRGlyKSkge1xuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkZXN0UnVsZXNEaXIpO1xuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ1VSU09SX1JVTEVTKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUnVsZXNEaXIsIHJ1bGUpO1xuICAgICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0UnVsZXNEaXIsIHJ1bGUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICAgICAgICBmcy5jb3B5U3luYyhzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gICAgICAgICAgcmVzdWx0cy5jdXJzb3JSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgdW51c2VkIEFQSSBmaWxlcyBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBVbnVzZWRGaWxlcyhyZXNvbHZlZFBhdGg6IHN0cmluZywgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUpOiB2b2lkIHtcbiAgY29uc3QgYXBpUmVmUGF0aCA9IHBhdGguam9pbihyZXNvbHZlZFBhdGgsICdhcGktcmVmZXJlbmNlJyk7XG4gIFxuICBpZiAodGVtcGxhdGVUeXBlID09PSAnYmFzaWMnKSB7XG4gICAgLy8gUmVtb3ZlIGVudGlyZSBhcGktcmVmZXJlbmNlIGZvbGRlciBmb3IgYmFzaWMgdGVtcGxhdGVcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhhcGlSZWZQYXRoKSkge1xuICAgICAgZnMucmVtb3ZlU3luYyhhcGlSZWZQYXRoKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlZCBhcGktcmVmZXJlbmNlIGZvbGRlciAobm90IG5lZWRlZCBmb3IgYmFzaWMgdGVtcGxhdGUpJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRlbXBsYXRlVHlwZSA9PT0gJ29wZW5hcGknKSB7XG4gICAgLy8gUmVtb3ZlIEdyYXBoUUwgc2NoZW1hIGZvciBPcGVuQVBJIHRlbXBsYXRlXG4gICAgY29uc3QgZ3JhcGhxbFNjaGVtYSA9IHBhdGguam9pbihhcGlSZWZQYXRoLCAnc2NoZW1hLmdyYXBocWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhncmFwaHFsU2NoZW1hKSkge1xuICAgICAgZnMucmVtb3ZlU3luYyhncmFwaHFsU2NoZW1hKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlZCBzY2hlbWEuZ3JhcGhxbCAobm90IG5lZWRlZCBmb3IgT3BlbkFQSSB0ZW1wbGF0ZSknKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGVtcGxhdGVUeXBlID09PSAnZ3JhcGhxbCcpIHtcbiAgICAvLyBSZW1vdmUgT3BlbkFQSSBzcGVjIGFuZCBlcnJvcnMubWR4IGZvciBHcmFwaFFMIHRlbXBsYXRlXG4gICAgY29uc3Qgb3BlbmFwaVNwZWMgPSBwYXRoLmpvaW4oYXBpUmVmUGF0aCwgJ29wZW5hcGkuanNvbicpO1xuICAgIGNvbnN0IGVycm9yc0ZpbGUgPSBwYXRoLmpvaW4oYXBpUmVmUGF0aCwgJ2Vycm9ycy5tZHgnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhvcGVuYXBpU3BlYykpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMob3BlbmFwaVNwZWMpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmVkIG9wZW5hcGkuanNvbiAobm90IG5lZWRlZCBmb3IgR3JhcGhRTCB0ZW1wbGF0ZSknKTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZXJyb3JzRmlsZSkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoZXJyb3JzRmlsZSk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1JlbW92ZWQgZXJyb3JzLm1keCAobm90IG5lZWRlZCBmb3IgR3JhcGhRTCB0ZW1wbGF0ZSknKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbnM6IENyZWF0ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ/CfkJ8gQ3JlYXRlIERldkRvYyBEb2MnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkw7XG5cbiAgLy8gR2V0IHByb2plY3QgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHByb2plY3RQYXRoID0gcHJvamVjdERpcmVjdG9yeTtcblxuICBpZiAoIXByb2plY3RQYXRoKSB7XG4gICAgcHJvamVjdFBhdGggPSBhd2FpdCBwcm9tcHQoJ1doYXQgaXMgeW91ciBwcm9qZWN0IG5hbWVkPycsICdteS1kb2NzJyk7XG4gICAgXG4gICAgaWYgKCFwcm9qZWN0UGF0aCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBwcm9qZWN0IG5hbWVcbiAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlUHJvamVjdE5hbWUocHJvamVjdFBhdGgpO1xuICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICBsb2dnZXIuZXJyb3IodmFsaWRhdGlvbi5lcnJvciB8fCAnSW52YWxpZCBwcm9qZWN0IG5hbWUnKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBHZXQgZG9jIHR5cGUgc2VsZWN0aW9uIGlmIG5vdCBwcm92aWRlZFxuICBsZXQgZG9jVHlwZTogRG9jVHlwZSA9IG9wdGlvbnMuZG9jVHlwZSB8fCAncHVibGljJztcbiAgXG4gIGlmICghb3B0aW9ucy5kb2NUeXBlKSB7XG4gICAgY29uc3QgZG9jVHlwZUNob2ljZXMgPSBPYmplY3QuZW50cmllcyhET0NfVFlQRVMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgdmFsdWU6IGtleSxcbiAgICAgIGxhYmVsOiBgJHt2YWx1ZS5uYW1lfSAtICR7dmFsdWUuZGVzY3JpcHRpb259YCxcbiAgICB9KSk7XG5cbiAgICBkb2NUeXBlID0gYXdhaXQgcHJvbXB0U2VsZWN0KCdXaGF0IHR5cGUgb2YgZG9jdW1lbnRhdGlvbiBhcmUgeW91IGNyZWF0aW5nPycsIGRvY1R5cGVDaG9pY2VzKSBhcyBEb2NUeXBlO1xuICB9XG5cbiAgY29uc3QgaXNJbnRlcm5hbERvY3MgPSBkb2NUeXBlID09PSAnaW50ZXJuYWwnO1xuXG4gIC8vIEdldCB0ZW1wbGF0ZSBzZWxlY3Rpb24gaWYgbm90IHByb3ZpZGVkXG4gIGxldCB0ZW1wbGF0ZTogVGVtcGxhdGVUeXBlID0gb3B0aW9ucy50ZW1wbGF0ZSB8fCAnYmFzaWMnO1xuICBcbiAgaWYgKCFvcHRpb25zLnRlbXBsYXRlKSB7XG4gICAgY29uc3QgdGVtcGxhdGVDaG9pY2VzID0gT2JqZWN0LmVudHJpZXMoVEVNUExBVEVTKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICBsYWJlbDogYCR7dmFsdWUubmFtZX0gLSAke3ZhbHVlLmRlc2NyaXB0aW9ufWAsXG4gICAgfSkpO1xuXG4gICAgdGVtcGxhdGUgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIHRlbXBsYXRlIHdvdWxkIHlvdSBsaWtlIHRvIHVzZT8nLCB0ZW1wbGF0ZUNob2ljZXMpIGFzIFRlbXBsYXRlVHlwZTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgZnVsbCBwYXRoXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0UGF0aCk7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcGF0aC5iYXNlbmFtZShyZXNvbHZlZFBhdGgpO1xuICBjb25zdCBzbHVnID0gcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuXG4gIC8vIEdldCBzdWJkb21haW4gLSBvbmx5IGZvciBwdWJsaWMgZG9jc1xuICBsZXQgc3ViZG9tYWluOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zLnN1YmRvbWFpbjtcbiAgXG4gIGlmICghaXNJbnRlcm5hbERvY3MpIHtcbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIHN1YmRvbWFpbiA9IGF3YWl0IHByb21wdChgRW50ZXIgc3ViZG9tYWluIGZvciB5b3VyIGRvY3MgKCR7c2x1Z30uZGV2ZG9jLnNoKWAsIHNsdWcpO1xuICAgICAgc3ViZG9tYWluID0gc3ViZG9tYWluLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzdWJkb21haW4gZm9ybWF0IGxvY2FsbHlcbiAgICBjb25zdCBmb3JtYXRDaGVjayA9IGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluKTtcbiAgICBpZiAoIWZvcm1hdENoZWNrLnZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZm9ybWF0Q2hlY2suZXJyb3IhKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUEkgKHNlcnZlciB2YWxpZGF0ZXMgYmxhY2tsaXN0KVxuICAgIC8vIExvb3AgdW50aWwgd2UgZmluZCBhbiBhdmFpbGFibGUgc3ViZG9tYWluXG4gICAgbGV0IHN1YmRvbWFpbkF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIHdoaWxlICghc3ViZG9tYWluQXZhaWxhYmxlKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgQ2hlY2tpbmcgaWYgJHtzdWJkb21haW59LmRldmRvYy5zaCBpcyBhdmFpbGFibGUuLi5gKTtcbiAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eSA9IGF3YWl0IGNoZWNrU3ViZG9tYWluQXZhaWxhYmlsaXR5KHN1YmRvbWFpbiwgYXBpVXJsKTtcbiAgICAgIFxuICAgICAgaWYgKCFhdmFpbGFiaWxpdHkuYXZhaWxhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIGxvZ2dlci53YXJuKGF2YWlsYWJpbGl0eS5lcnJvciB8fCBgU3ViZG9tYWluIFwiJHtzdWJkb21haW59XCIgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF2YWlsYWJpbGl0eS5zdWdnZXN0aW9uIHx8IGAke3N1YmRvbWFpbn0tZG9jc2A7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWdnZXN0aW9uOiAke3N1Z2dlc3Rpb259LmRldmRvYy5zaGApO1xuICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICBcbiAgICAgICAgLy8gUHJvbXB0IGZvciBuZXcgc3ViZG9tYWluXG4gICAgICAgIHN1YmRvbWFpbiA9IGF3YWl0IHByb21wdCgnRW50ZXIgYSBkaWZmZXJlbnQgc3ViZG9tYWluJywgc3VnZ2VzdGlvbik7XG4gICAgICAgIHN1YmRvbWFpbiA9IHN1YmRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICAgICAgY29uc3QgZm9ybWF0Q2hlY2sgPSBpc1ZhbGlkU3ViZG9tYWluRm9ybWF0KHN1YmRvbWFpbik7XG4gICAgICAgIGlmICghZm9ybWF0Q2hlY2sudmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZm9ybWF0Q2hlY2suZXJyb3IhKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YmRvbWFpbkF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgJHtzdWJkb21haW59LmRldmRvYy5zaCBpcyBhdmFpbGFibGUhYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhyZXNvbHZlZFBhdGgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdmVyd3JpdGUgPSBhd2FpdCBwcm9tcHRDb25maXJtKGBEaXJlY3RvcnkgJHtwcm9qZWN0TmFtZX0gaXMgbm90IGVtcHR5LiBDb250aW51ZSBhbnl3YXk/YCwgZmFsc2UpO1xuICAgICAgXG4gICAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlbGVjdGVkVGVtcGxhdGUgPSBURU1QTEFURVNbdGVtcGxhdGVdO1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgYSBuZXcgJHtzZWxlY3RlZFRlbXBsYXRlLm5hbWV9IERldkRvYyBkb2N1bWVudGF0aW9uIHNpdGUgaW4gJHtyZXNvbHZlZFBhdGh9YCk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ3JlYXRlIHByb2plY3QgZGlyZWN0b3J5XG4gIGZzLmVuc3VyZURpclN5bmMocmVzb2x2ZWRQYXRoKTtcblxuICAvLyBEb3dubG9hZCB0ZW1wbGF0ZSBmcm9tIHJlbW90ZSByZXBvc2l0b3J5IChhbHdheXMgdXNlIHN0YXJ0ZXIgdGVtcGxhdGUpXG4gIGxvZ2dlci5pbmZvKCdEb3dubG9hZGluZyB0ZW1wbGF0ZS4uLicpO1xuICBcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gZG93bmxvYWQgZnJvbSByZW1vdGUgcmVwb3NpdG9yeSBmaXJzdFxuICAgIGF3YWl0IGRvd25sb2FkVGVtcGxhdGUoVEVNUExBVEVfUkVQTywge1xuICAgICAgZGlyOiByZXNvbHZlZFBhdGgsXG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBsb2dnZXIuc3VjY2VzcygnRG93bmxvYWRlZCBzdGFydGVyIHRlbXBsYXRlJyk7XG4gIH0gY2F0Y2ggKGRvd25sb2FkRXJyb3IpIHtcbiAgICAvLyBGYWxsIGJhY2sgdG8gbG9jYWwgdGVtcGxhdGVzIChmb3IgZGV2ZWxvcG1lbnQgb3Igb2ZmbGluZSB1c2FnZSlcbiAgICBsb2dnZXIuZGVidWcoYFJlbW90ZSBkb3dubG9hZCBmYWlsZWQ6ICR7ZG93bmxvYWRFcnJvcn1gKTtcbiAgICBsb2dnZXIuaW5mbygnRmFsbGluZyBiYWNrIHRvIGxvY2FsIHRlbXBsYXRlLi4uJyk7XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgICBcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1RlbXBsYXRlIFwic3RhcnRlclwiIG5vdCBmb3VuZCcpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBMb29rZWQgZm9yIHRlbXBsYXRlIGF0OiAke3RlbXBsYXRlRGlyfWApO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdGUgc291cmNlOiAnICsgVEVNUExBVEVfUkVQTyk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZnMuY29weVN5bmModGVtcGxhdGVEaXIsIHJlc29sdmVkUGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NvcGllZCBsb2NhbCB0ZW1wbGF0ZScpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHBhY2thZ2UuanNvbiB3aXRoIHByb2plY3QgbmFtZVxuICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKc29uU3luYyhwa2dQYXRoKTtcbiAgICBwa2cubmFtZSA9IHByb2plY3ROYW1lO1xuICAgIGZzLndyaXRlSnNvblN5bmMocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGRvY3MuanNvbiBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlXG4gIGNvbnN0IGRvY3NDb25maWcgPSBnZW5lcmF0ZURvY3NDb25maWcocHJvamVjdE5hbWUsIHRlbXBsYXRlKTtcbiAgY29uc3QgZG9jc1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnZG9jcy5qc29uJyk7XG4gIGZzLndyaXRlSnNvblN5bmMoZG9jc1BhdGgsIGRvY3NDb25maWcsIHsgc3BhY2VzOiAyIH0pO1xuICBsb2dnZXIuc3VjY2VzcyhgR2VuZXJhdGVkIGRvY3MuanNvbiBmb3IgJHtzZWxlY3RlZFRlbXBsYXRlLm5hbWV9IHRlbXBsYXRlYCk7XG5cbiAgLy8gVXBkYXRlIHRoZW1lLmpzb24gd2l0aCB0ZW1wbGF0ZSBjb2xvclxuICBjb25zdCB0aGVtZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAndGhlbWUuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyh0aGVtZVBhdGgpKSB7XG4gICAgY29uc3QgdGhlbWUgPSBmcy5yZWFkSnNvblN5bmModGhlbWVQYXRoKTtcbiAgICB0aGVtZS5jb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5OiBzZWxlY3RlZFRlbXBsYXRlLmNvbG9yLFxuICAgICAgcHJpbWFyeUxpZ2h0OiBzZWxlY3RlZFRlbXBsYXRlLmNvbG9yLFxuICAgICAgcHJpbWFyeURhcms6IHNlbGVjdGVkVGVtcGxhdGUuY29sb3IsXG4gICAgfTtcbiAgICBmcy53cml0ZUpzb25TeW5jKHRoZW1lUGF0aCwgdGhlbWUsIHsgc3BhY2VzOiAyIH0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgdW51c2VkIGZpbGVzIGJhc2VkIG9uIHRlbXBsYXRlIHR5cGVcbiAgY2xlYW51cFVudXNlZEZpbGVzKHJlc29sdmVkUGF0aCwgdGVtcGxhdGUpO1xuXG4gIC8vIENyZWF0ZSAuZGV2ZG9jLmpzb24gd2l0aCBwcm9qZWN0IGNvbmZpZ1xuICAvLyBGb3IgcHVibGljIGRvY3M6IHN1YmRvbWFpbiB3aWxsIG9ubHkgYmUgcmVzZXJ2ZWQgd2hlbiB0aGUgdXNlciBhY3R1YWxseSBkZXBsb3lzXG4gIC8vIEZvciBpbnRlcm5hbCBkb2NzOiBubyBzdWJkb21haW4gbmVlZGVkXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnLmRldmRvYy5qc29uJyk7XG4gIFxuICBjb25zdCBkZXZkb2NDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHByb2plY3RJZDogYCR7c2x1Z30tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCl9YCxcbiAgICBuYW1lOiBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSksXG4gICAgc2x1Zzogc2x1ZyxcbiAgICBkb2NUeXBlOiBkb2NUeXBlLFxuICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICB9O1xuXG4gIC8vIE9ubHkgYWRkIHN1YmRvbWFpbiBmb3IgcHVibGljIGRvY3NcbiAgaWYgKCFpc0ludGVybmFsRG9jcyAmJiBzdWJkb21haW4pIHtcbiAgICBkZXZkb2NDb25maWcuc3ViZG9tYWluID0gc3ViZG9tYWluO1xuICB9XG5cbiAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCBkZXZkb2NDb25maWcsIHsgc3BhY2VzOiAyIH0pO1xuICBsb2dnZXIuc3VjY2VzcygnQ3JlYXRlZCAuZGV2ZG9jLmpzb24nKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJyAgRG9jIFR5cGU6JywgRE9DX1RZUEVTW2RvY1R5cGVdLm5hbWUpO1xuICBpZiAoIWlzSW50ZXJuYWxEb2NzICYmIHN1YmRvbWFpbikge1xuICAgIGNvbnNvbGUubG9nKCcgIFN1YmRvbWFpbjonLCBgJHtzdWJkb21haW59LmRldmRvYy5zaGApO1xuICAgIGNvbnNvbGUubG9nKCcgIFN0YXR1czonLCAnTm90IHlldCBkZXBsb3llZCAoc3ViZG9tYWluIHdpbGwgYmUgcmVzZXJ2ZWQgb24gZmlyc3QgZGVwbG95KScpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCcgIFN0YXR1czonLCAnSW50ZXJuYWwgZG9jcyAobG9jYWwgZGV2ZWxvcG1lbnQgb25seSknKTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgZ2l0XG4gIGlmIChvcHRpb25zLmdpdCAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIGdpdCByZXBvc2l0b3J5Li4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgaW5pdCcsIHsgY3dkOiByZXNvbHZlZFBhdGgsIHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgYWRkIC1BJywgeyBjd2Q6IHJlc29sdmVkUGF0aCwgc3RkaW86ICdpZ25vcmUnIH0pO1xuICAgICAgZXhlY1N5bmMoJ2dpdCBjb21taXQgLW0gXCJJbml0aWFsIGNvbW1pdCBmcm9tIGRldmRvYyBjcmVhdGVcIicsIHtcbiAgICAgICAgY3dkOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0dpdCByZXBvc2l0b3J5IGluaXRpYWxpemVkJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGluaXRpYWxpemUgZ2l0IHJlcG9zaXRvcnknKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnN0YWxsIGRlcGVuZGVuY2llc1xuICBpZiAob3B0aW9ucy5pbnN0YWxsICE9PSBmYWxzZSkge1xuICAgIGxvZ2dlci5pbmZvKCdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7XG4gICAgICBleGVjU3luYyhgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAsIHtcbiAgICAgICAgY3dkOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdEZXBlbmRlbmNpZXMgaW5zdGFsbGVkJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGluc3RhbGwgZGVwZW5kZW5jaWVzJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5zdGFsbCBBSSBhZ2VudHMgLSBhbHdheXMgcHJvbXB0IGFzIHBhcnQgb2YgY3JlYXRlIGZsb3dcbiAgbGV0IGFpVG9vbDogJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJyB8IG51bGwgPSBudWxsO1xuICBcbiAgY29uc3QgYWlDaG9pY2VzID0gW1xuICAgIHsgdmFsdWU6ICdib3RoJywgbGFiZWw6ICdCb3RoIC0gQ2xhdWRlIENvZGUgYW5kIEN1cnNvciAocmVjb21tZW5kZWQpJyB9LFxuICAgIHsgdmFsdWU6ICdjdXJzb3InLCBsYWJlbDogJ0N1cnNvciAtIFJ1bGVzIGZvciBDdXJzb3IgSURFJyB9LFxuICAgIHsgdmFsdWU6ICdjbGF1ZGUnLCBsYWJlbDogJ0NsYXVkZSBDb2RlIC0gU2tpbGxzIGFuZCBDTEFVREUubWQnIH0sXG4gIF07XG4gIGNvbnN0IGFpU2VsZWN0aW9uID0gYXdhaXQgcHJvbXB0U2VsZWN0KCdXaGljaCBBSSBjb2RpbmcgYXNzaXN0YW50IGRvIHlvdSB1c2U/JywgYWlDaG9pY2VzKTtcbiAgYWlUb29sID0gYWlTZWxlY3Rpb24gYXMgJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJztcblxuICBpZiAoYWlUb29sKSB7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBsb2dnZXIuaW5mbygnU2V0dGluZyB1cCBBSSBhZ2VudCBjb25maWd1cmF0aW9uLi4uJyk7XG4gICAgY29uc3QgYWlSZXN1bHRzID0gaW5zdGFsbEFJQWdlbnRzKHJlc29sdmVkUGF0aCwgYWlUb29sKTtcbiAgICBcbiAgICBpZiAoYWlSZXN1bHRzLmNsYXVkZU1kKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnQ3JlYXRlZCBDTEFVREUubWQnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBhaVJlc3VsdHMuY2xhdWRlU2tpbGxzKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcyhgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy8ke3NraWxsfS9TS0lMTC5tZGApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgYWlSZXN1bHRzLmN1cnNvclJ1bGVzKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcyhgQ3JlYXRlZCAuY3Vyc29yL3J1bGVzLyR7cnVsZX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWNjZXNzIG1lc3NhZ2VcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgJHtwcm9qZWN0TmFtZX0gYXQgJHtyZXNvbHZlZFBhdGh9YCk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgaWYgKCFpc0ludGVybmFsRG9jcyAmJiBzdWJkb21haW4pIHtcbiAgICBjb25zb2xlLmxvZygnWW91ciBkb2NzIHdpbGwgYmUgYXZhaWxhYmxlIGF0OicpO1xuICAgIGNvbnNvbGUubG9nKGAgIGh0dHBzOi8vJHtzdWJkb21haW59LmRldmRvYy5zaGApO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgbG9nZ2VyLmluZm8oJ05vdGU6IFRoZSBzdWJkb21haW4gd2lsbCBiZSByZXNlcnZlZCB3aGVuIHlvdSBydW4gXCJucG0gcnVuIGRlcGxveVwiJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnVGhpcyBpcyBhbiBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIHByb2plY3QgZm9yIGxvY2FsIGRldmVsb3BtZW50LicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIGNvbW1hbmRzOicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGRldiAgICAgICBTdGFydCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gYnVpbGQgICAgIEJ1aWxkIGZvciBwcm9kdWN0aW9uJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gc3RhcnQgICAgIFN0YXJ0IHByb2R1Y3Rpb24gc2VydmVyJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gY2hlY2sgICAgIFZhbGlkYXRlIGRvY3MuanNvbiBhbmQgTURYIGZpbGVzJyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gZGVwbG95ICAgIERlcGxveSB0byBEZXZEb2MgcGxhdGZvcm0nKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biBhaSAgICAgICAgU2V0IHVwIEFJIGFnZW50IGNvbmZpZ3VyYXRpb24nKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biB3aG9hbWkgICAgU2hvdyBjdXJyZW50IHByb2plY3QgaW5mbycpO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIHVwZ3JhZGUgICBVcGRhdGUgZGV2ZG9jIHRvIGxhdGVzdCB2ZXJzaW9uJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc29sZS5sb2coJ1dlIHN1Z2dlc3QgdGhhdCB5b3UgYmVnaW4gYnkgdHlwaW5nOicpO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhgICBjZCAke3Byb2plY3ROYW1lfWApO1xuICBjb25zb2xlLmxvZygnICBucG0gcnVuIGRldicpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIFNob3cgQUkgYWdlbnQgcXVpY2sgc3RhcnQgdGlwc1xuICBjb25zb2xlLmxvZygnQUkgQWdlbnQgUXVpY2sgU3RhcnQ6Jyk7XG4gIGlmIChhaVRvb2wgPT09ICdjbGF1ZGUnIHx8IGFpVG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ2xhdWRlIENvZGU6IC9ib290c3RyYXAtZG9jcycpO1xuICB9XG4gIGlmIChhaVRvb2wgPT09ICdjdXJzb3InIHx8IGFpVG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ3Vyc29yOiBBc2sgXCJnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb24gZnJvbSB0aGlzIHJlcG9cIicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQVNDSUkgYXJ0IGJhbm5lclxuICBjb25zb2xlLmxvZyhgXG4gIF9fX18gICAgICAgICAgICAgIF9fX18gICAgICAgICAgICAgXG4gfCAgXyBcXFxcICBfX19fXyAgIF9ffCAgXyBcXFxcICBfX18gICBfX18gXG4gfCB8IHwgfC8gXyBcXFxcIFxcXFwgLyAvfCB8IHwgfC8gXyBcXFxcIC8gX198XG4gfCB8X3wgfCAgX18vXFxcXCBWIC8gfCB8X3wgfCAoXykgfCAoX18gXG4gfF9fX18vIFxcXFxfX198IFxcXFxfLyAgfF9fX18vIFxcXFxfX18vIFxcXFxfX198XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBgKTtcbiAgY29uc29sZS5sb2coJ0hhcHB5IGRvY3VtZW50aW5nIScpO1xuICBjb25zb2xlLmxvZygpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -6,6 +6,7 @@ import { CacheUtils } from '@/lib/cache';
|
|
|
6
6
|
import { importOpenAPISpec } from '@/lib/api-docs/parsers/openapi';
|
|
7
7
|
import { generateAPISummary, formatAPISummaryForPrompt } from '@/lib/api-docs/agent/spec-summary';
|
|
8
8
|
import { getProjectContent } from '@/lib/storage/blob';
|
|
9
|
+
import { isDevMode, shouldShowItem } from '@/lib/docs/config/environment';
|
|
9
10
|
// Configuration
|
|
10
11
|
const STARTER_PATH = process.env.STARTER_PATH || 'devdoc-docs';
|
|
11
12
|
const LOCAL_SPEC_PATH = process.env.LOCAL_SPEC_PATH || `${STARTER_PATH}/api-reference/openapi.json`;
|
|
@@ -139,12 +140,18 @@ function loadPageMeta(pagePath) {
|
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
142
|
// Extract navigation tabs from docs.json in order
|
|
142
|
-
|
|
143
|
+
// Filters out private tabs when in production mode
|
|
144
|
+
function buildNavigationTabs(config, devMode) {
|
|
143
145
|
const tabs = [];
|
|
146
|
+
const isDev = devMode ?? isDevMode();
|
|
144
147
|
if (!config.navigation?.tabs) {
|
|
145
148
|
return tabs;
|
|
146
149
|
}
|
|
147
150
|
config.navigation.tabs.forEach((tab, index)=>{
|
|
151
|
+
// Skip private tabs in production mode
|
|
152
|
+
if (!shouldShowItem(tab.visibility, isDev)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
148
155
|
// Convert tab name to id (e.g., "API Reference" -> "api-reference")
|
|
149
156
|
const id = tab.tab.toLowerCase().replace(/\s+/g, '-');
|
|
150
157
|
// Determine the type (default to 'docs' if not specified)
|
|
@@ -196,14 +203,17 @@ function buildNavigationTabs(config) {
|
|
|
196
203
|
path: tab.path,
|
|
197
204
|
order: index,
|
|
198
205
|
versions,
|
|
199
|
-
graphqlSchemas
|
|
206
|
+
graphqlSchemas,
|
|
207
|
+
visibility: tab.visibility
|
|
200
208
|
});
|
|
201
209
|
});
|
|
202
210
|
return tabs;
|
|
203
211
|
}
|
|
204
212
|
// Build documentation groups from docs.json
|
|
205
|
-
|
|
213
|
+
// Filters out private tabs and groups when in production mode
|
|
214
|
+
function buildDocGroups(config, devMode) {
|
|
206
215
|
const groups = [];
|
|
216
|
+
const isDev = devMode ?? isDevMode();
|
|
207
217
|
if (!config.navigation?.tabs) {
|
|
208
218
|
return groups;
|
|
209
219
|
}
|
|
@@ -265,11 +275,19 @@ function buildDocGroups(config) {
|
|
|
265
275
|
};
|
|
266
276
|
// Iterate through all tabs and their groups
|
|
267
277
|
for (const tab of config.navigation.tabs){
|
|
278
|
+
// Skip private tabs in production mode
|
|
279
|
+
if (!shouldShowItem(tab.visibility, isDev)) {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
268
282
|
// Skip tabs without groups (like API Reference with just href)
|
|
269
283
|
if (!tab.groups) {
|
|
270
284
|
continue;
|
|
271
285
|
}
|
|
272
286
|
for (const group of tab.groups){
|
|
287
|
+
// Skip private groups in production mode
|
|
288
|
+
if (!shouldShowItem(group.visibility, isDev)) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
273
291
|
const pages = [];
|
|
274
292
|
for(let i = 0; i < group.pages.length; i++){
|
|
275
293
|
const pageItem = group.pages[i];
|
|
@@ -351,7 +369,8 @@ function getOpenApiSpec(specPath) {
|
|
|
351
369
|
// Parse docs.json from project content
|
|
352
370
|
const docsConfig = JSON.parse(projectContent.docsJson);
|
|
353
371
|
// Build navigation tabs and doc groups from config
|
|
354
|
-
|
|
372
|
+
// Multi-tenant projects are always in production mode (deployed), so devMode=false
|
|
373
|
+
const navigationTabs = buildNavigationTabs(docsConfig, false);
|
|
355
374
|
const docGroups = buildDocGroupsFromBlob(docsConfig, projectContent);
|
|
356
375
|
// For now, return docs-only response (no OpenAPI spec from blob)
|
|
357
376
|
return NextResponse.json({
|
|
@@ -400,8 +419,12 @@ function getOpenApiSpec(specPath) {
|
|
|
400
419
|
}
|
|
401
420
|
/**
|
|
402
421
|
* Build doc groups from Blob storage content
|
|
422
|
+
* Note: Multi-tenant (deployed) projects are always in production mode,
|
|
423
|
+
* so private tabs and groups are always filtered out
|
|
403
424
|
*/ function buildDocGroupsFromBlob(config, content) {
|
|
404
425
|
const groups = [];
|
|
426
|
+
// Multi-tenant projects are always in production mode (deployed)
|
|
427
|
+
const isDev = false;
|
|
405
428
|
if (!config.navigation?.tabs) {
|
|
406
429
|
return groups;
|
|
407
430
|
}
|
|
@@ -426,8 +449,16 @@ function getOpenApiSpec(specPath) {
|
|
|
426
449
|
};
|
|
427
450
|
// Process tabs and groups
|
|
428
451
|
for (const tab of config.navigation.tabs){
|
|
452
|
+
// Skip private tabs (multi-tenant is always production)
|
|
453
|
+
if (!shouldShowItem(tab.visibility, isDev)) {
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
429
456
|
if (!tab.groups) continue;
|
|
430
457
|
for (const group of tab.groups){
|
|
458
|
+
// Skip private groups (multi-tenant is always production)
|
|
459
|
+
if (!shouldShowItem(group.visibility, isDev)) {
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
431
462
|
const pages = [];
|
|
432
463
|
for(let i = 0; i < group.pages.length; i++){
|
|
433
464
|
const pageItem = group.pages[i];
|
|
@@ -8,6 +8,7 @@ import rehypeSlug from 'rehype-slug';
|
|
|
8
8
|
// Note: rehype-pretty-code is dynamically imported to handle serverless environments
|
|
9
9
|
// where shiki may not be fully available
|
|
10
10
|
import { getProjectFile } from '@/lib/storage/blob';
|
|
11
|
+
import { remarkMermaid } from '@/lib/docs/mdx/remark-mermaid';
|
|
11
12
|
const STARTER_PATH = process.env.STARTER_PATH || 'devdoc-docs';
|
|
12
13
|
// Helper to get content root - supports both relative and absolute paths
|
|
13
14
|
function getContentRoot() {
|
|
@@ -68,7 +69,8 @@ export async function GET(request) {
|
|
|
68
69
|
mdxSource = await serialize(content, {
|
|
69
70
|
mdxOptions: {
|
|
70
71
|
remarkPlugins: [
|
|
71
|
-
remarkGfm
|
|
72
|
+
remarkGfm,
|
|
73
|
+
remarkMermaid
|
|
72
74
|
],
|
|
73
75
|
rehypePlugins: [
|
|
74
76
|
rehypeSlug,
|
|
@@ -86,7 +88,8 @@ export async function GET(request) {
|
|
|
86
88
|
mdxSource = await serialize(content, {
|
|
87
89
|
mdxOptions: {
|
|
88
90
|
remarkPlugins: [
|
|
89
|
-
remarkGfm
|
|
91
|
+
remarkGfm,
|
|
92
|
+
remarkMermaid
|
|
90
93
|
],
|
|
91
94
|
rehypePlugins: [
|
|
92
95
|
rehypeSlug
|
|
@@ -149,7 +152,8 @@ export async function GET(request) {
|
|
|
149
152
|
mdxSource = await serialize(content, {
|
|
150
153
|
mdxOptions: {
|
|
151
154
|
remarkPlugins: [
|
|
152
|
-
remarkGfm
|
|
155
|
+
remarkGfm,
|
|
156
|
+
remarkMermaid
|
|
153
157
|
],
|
|
154
158
|
rehypePlugins: [
|
|
155
159
|
rehypeSlug,
|
|
@@ -167,7 +171,8 @@ export async function GET(request) {
|
|
|
167
171
|
mdxSource = await serialize(content, {
|
|
168
172
|
mdxOptions: {
|
|
169
173
|
remarkPlugins: [
|
|
170
|
-
remarkGfm
|
|
174
|
+
remarkGfm,
|
|
175
|
+
remarkMermaid
|
|
171
176
|
],
|
|
172
177
|
rehypePlugins: [
|
|
173
178
|
rehypeSlug
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { generateObject } from 'ai';
|
|
2
2
|
import { anthropic } from '@ai-sdk/anthropic';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
import crypto from 'crypto';
|
|
5
|
+
import { CacheUtils } from '@/lib/cache';
|
|
4
6
|
export const runtime = 'nodejs';
|
|
5
|
-
//
|
|
6
|
-
const
|
|
7
|
-
const CACHE_TTL = 1000 * 60 * 60 // 1 hour
|
|
7
|
+
// Cache TTL: 1 week in seconds
|
|
8
|
+
const CACHE_TTL_SECONDS = 60 * 60 * 24 * 7 // 7 days
|
|
8
9
|
;
|
|
9
10
|
const SuggestionsSchema = z.object({
|
|
10
11
|
suggestions: z.array(z.object({
|
|
@@ -13,6 +14,23 @@ const SuggestionsSchema = z.object({
|
|
|
13
14
|
prompt: z.string().describe('Full question the user would ask')
|
|
14
15
|
})).length(4)
|
|
15
16
|
});
|
|
17
|
+
/**
|
|
18
|
+
* Generate a hash key for caching based on page context
|
|
19
|
+
* Uses SHA-256 hash of endpoint details or general API info
|
|
20
|
+
*/ function generateCacheKey(endpointIndex, currentEndpointId) {
|
|
21
|
+
let content;
|
|
22
|
+
if (currentEndpointId) {
|
|
23
|
+
// For specific endpoint: hash the endpoint details
|
|
24
|
+
const endpoint = endpointIndex.find((e)=>e.id === currentEndpointId);
|
|
25
|
+
content = endpoint ? `endpoint:${endpoint.id}:${endpoint.name}:${endpoint.method}:${endpoint.path}` : `endpoint:${currentEndpointId}`;
|
|
26
|
+
} else {
|
|
27
|
+
// For general API: hash based on endpoint count and first few endpoint signatures
|
|
28
|
+
const signature = endpointIndex.slice(0, 10).map((e)=>`${e.method}:${e.path}`).join('|');
|
|
29
|
+
content = `general:${endpointIndex.length}:${signature}`;
|
|
30
|
+
}
|
|
31
|
+
const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
32
|
+
return `suggestions:${hash}`;
|
|
33
|
+
}
|
|
16
34
|
function buildSuggestionPrompt(endpoints, currentEndpointId) {
|
|
17
35
|
const currentEndpoint = currentEndpointId ? endpoints.find((e)=>e.id === currentEndpointId) : null;
|
|
18
36
|
if (currentEndpoint) {
|
|
@@ -64,16 +82,18 @@ export async function POST(req) {
|
|
|
64
82
|
try {
|
|
65
83
|
const body = await req.json();
|
|
66
84
|
const { endpointIndex, currentEndpointId } = body;
|
|
67
|
-
//
|
|
68
|
-
const cacheKey =
|
|
69
|
-
// Check cache
|
|
70
|
-
const cached =
|
|
71
|
-
if (cached
|
|
85
|
+
// Generate hash-based cache key
|
|
86
|
+
const cacheKey = generateCacheKey(endpointIndex, currentEndpointId);
|
|
87
|
+
// Check KV cache first (1 week TTL)
|
|
88
|
+
const cached = await CacheUtils.get(cacheKey);
|
|
89
|
+
if (cached) {
|
|
90
|
+
console.log(`[Suggestions API] Cache HIT: ${cacheKey}`);
|
|
72
91
|
return Response.json({
|
|
73
|
-
suggestions: cached
|
|
92
|
+
suggestions: cached,
|
|
74
93
|
cached: true
|
|
75
94
|
});
|
|
76
95
|
}
|
|
96
|
+
console.log(`[Suggestions API] Cache MISS: ${cacheKey}`);
|
|
77
97
|
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
78
98
|
if (!apiKey) {
|
|
79
99
|
// Return fallback suggestions if no API key
|
|
@@ -120,6 +140,7 @@ export async function POST(req) {
|
|
|
120
140
|
prompt: 'Show me all GET endpoints'
|
|
121
141
|
}
|
|
122
142
|
];
|
|
143
|
+
// Don't cache fallback suggestions - allow real suggestions to be generated later
|
|
123
144
|
return Response.json({
|
|
124
145
|
suggestions: fallback,
|
|
125
146
|
cached: false,
|
|
@@ -132,10 +153,9 @@ export async function POST(req) {
|
|
|
132
153
|
schema: SuggestionsSchema,
|
|
133
154
|
prompt
|
|
134
155
|
});
|
|
135
|
-
// Cache the result
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
timestamp: Date.now()
|
|
156
|
+
// Cache the result in KV with 1 week TTL
|
|
157
|
+
await CacheUtils.set(cacheKey, object.suggestions, CACHE_TTL_SECONDS, {
|
|
158
|
+
log: true
|
|
139
159
|
});
|
|
140
160
|
return Response.json({
|
|
141
161
|
suggestions: object.suggestions,
|
package/renderer/app/globals.css
CHANGED
|
@@ -1197,4 +1197,73 @@ code[data-line-numbers] > [data-line]::before {
|
|
|
1197
1197
|
.landing-section {
|
|
1198
1198
|
width: 100%;
|
|
1199
1199
|
margin: 0;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/* ============================================
|
|
1203
|
+
Agent Popup Button Animations
|
|
1204
|
+
============================================ */
|
|
1205
|
+
|
|
1206
|
+
/* Scale in animation for popup button appearing */
|
|
1207
|
+
@keyframes popup-scale-in {
|
|
1208
|
+
from {
|
|
1209
|
+
transform: scale(0.8);
|
|
1210
|
+
opacity: 0;
|
|
1211
|
+
}
|
|
1212
|
+
to {
|
|
1213
|
+
transform: scale(1);
|
|
1214
|
+
opacity: 1;
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
/* Scale out animation for popup button disappearing */
|
|
1219
|
+
@keyframes popup-scale-out {
|
|
1220
|
+
from {
|
|
1221
|
+
transform: scale(1);
|
|
1222
|
+
opacity: 1;
|
|
1223
|
+
}
|
|
1224
|
+
to {
|
|
1225
|
+
transform: scale(0.8);
|
|
1226
|
+
opacity: 0;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
.agent-popup-enter {
|
|
1231
|
+
animation: popup-scale-in 0.2s ease-out forwards;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
.agent-popup-exit {
|
|
1235
|
+
animation: popup-scale-out 0.15s ease-in forwards;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
/* Suggestions container slide up animation */
|
|
1239
|
+
@keyframes suggestions-slide-up {
|
|
1240
|
+
from {
|
|
1241
|
+
transform: translateY(10px);
|
|
1242
|
+
opacity: 0;
|
|
1243
|
+
}
|
|
1244
|
+
to {
|
|
1245
|
+
transform: translateY(0);
|
|
1246
|
+
opacity: 1;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
.agent-suggestions-enter {
|
|
1251
|
+
animation: suggestions-slide-up 0.3s ease-out forwards;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
/* Individual suggestion item staggered animation */
|
|
1255
|
+
@keyframes suggestion-fade-in {
|
|
1256
|
+
from {
|
|
1257
|
+
transform: translateX(10px);
|
|
1258
|
+
opacity: 0;
|
|
1259
|
+
}
|
|
1260
|
+
to {
|
|
1261
|
+
transform: translateX(0);
|
|
1262
|
+
opacity: 1;
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
.agent-suggestion-item {
|
|
1267
|
+
animation: suggestion-fade-in 0.2s ease-out forwards;
|
|
1268
|
+
animation-fill-mode: both;
|
|
1200
1269
|
}
|
package/renderer/app/layout.js
CHANGED
|
@@ -37,8 +37,8 @@ export default function RootLayout({ children }) {
|
|
|
37
37
|
className: `${geistSans.variable} ${geistMono.variable} antialiased`,
|
|
38
38
|
children: /*#__PURE__*/ _jsx(ThemeProvider, {
|
|
39
39
|
attribute: "class",
|
|
40
|
-
defaultTheme: "
|
|
41
|
-
enableSystem:
|
|
40
|
+
defaultTheme: "dark",
|
|
41
|
+
enableSystem: false,
|
|
42
42
|
disableTransitionOnChange: true,
|
|
43
43
|
children: children
|
|
44
44
|
})
|